## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the number of pairs of skis
- $x_2$ represents the number of snowboards

## Step 2: Formulate the objective function
The profit from selling $x_1$ pairs of skis is $200x_1$ and from selling $x_2$ snowboards is $175x_2$. The total profit is $200x_1 + 175x_2$.

## 3: Define the constraints
1. Budget constraint: The store has a budget of $20,000. Each pair of skis costs $500 and each snowboard costs $400. So, $500x_1 + 400x_2 \leq 20000$.
2. Skis sales constraint: At least 10 but at most 30 pairs of skis will be sold. So, $10 \leq x_1 \leq 30$.
3. Snowboards sales constraint: The number of snowboards sold is at most half the number of skis sold. So, $x_2 \leq 0.5x_1$.

## 4: Non-negativity constraints
$x_1 \geq 0$ and $x_2 \geq 0$, but these are partially covered by the skis sales constraint.

## 5: Symbolic representation
```json
{
'sym_variables': [('x1', 'pairs of skis'), ('x2', 'snowboards')],
'objective_function': '200*x1 + 175*x2',
'constraints': [
    '500*x1 + 400*x2 <= 20000',
    '10 <= x1 <= 30',
    'x2 <= 0.5*x1',
    'x1 >= 0',
    'x2 >= 0'
]
}
```

## 6: Converting to Gurobi code
We need to use the Gurobi library in Python to solve this linear programming problem.

```python
import gurobi as gp

# Create a new model
m = gp.Model()

# Define the variables
x1 = m.addVar(lb=10, ub=30, name="pairs_of_skis")  # At least 10, at most 30 pairs of skis
x2 = m.addVar(lb=0, name="snowboards")  # Non-negative number of snowboards

# Objective function: Maximize profit
m.setObjective(200 * x1 + 175 * x2, gp.GRB.MAXIMIZE)

# Budget constraint
m.addConstr(500 * x1 + 400 * x2 <= 20000, name="budget_constraint")

# Snowboards sales constraint
m.addConstr(x2 <= 0.5 * x1, name="snowboards_sales_constraint")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of pairs of skis to buy and sell: {x1.varValue}")
    print(f"Number of snowboards to buy and sell: {x2.varValue}")
    print(f"Maximal profit: {m.objVal}")
else:
    print("No optimal solution found.")
```

The final answer is: 
```python
import gurobi as gp

# Create a new model
m = gp.Model()

# Define the variables
x1 = m.addVar(lb=10, ub=30, name="pairs_of_skis")  # At least 10, at most 30 pairs of skis
x2 = m.addVar(lb=0, name="snowboards")  # Non-negative number of snowboards

# Objective function: Maximize profit
m.setObjective(200 * x1 + 175 * x2, gp.GRB.MAXIMIZE)

# Budget constraint
m.addConstr(500 * x1 + 400 * x2 <= 20000, name="budget_constraint")

# Snowboards sales constraint
m.addConstr(x2 <= 0.5 * x1, name="snowboards_sales_constraint")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of pairs of skis to buy and sell: {x1.varValue}")
    print(f"Number of snowboards to buy and sell: {x2.varValue}")
    print(f"Maximal profit: {m.objVal}")
else:
    print("No optimal solution found.")
```