## Problem Description and Symbolic Representation

The problem requires finding the optimal number of servings of chicken and pork that Bob should consume per day to meet his macro nutrient requirements at minimal cost.

### Symbolic Representation

Let's define the symbolic variables:

* `x1`: servings of chicken
* `x2`: servings of pork

The objective function is to minimize the total cost:

* `10*x1 + 15*x2`

The constraints are:

* Protein: `20*x1 + 15*x2 >= 100`
* Carbs: `5*x1 + 3*x2 >= 50`
* Fat: `6*x1 + 8*x2 >= 30`
* Non-negativity: `x1 >= 0`, `x2 >= 0`

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'servings of chicken'), ('x2', 'servings of pork')],
    'objective_function': '10*x1 + 15*x2',
    'constraints': [
        '20*x1 + 15*x2 >= 100',
        '5*x1 + 3*x2 >= 50',
        '6*x1 + 8*x2 >= 30',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Bob's Nutrition Problem")

# Define the variables
x1 = model.addVar(name="chicken", lb=0)  # servings of chicken
x2 = model.addVar(name="pork", lb=0)    # servings of pork

# Define the objective function
model.setObjective(10*x1 + 15*x2, gp.GRB.MINIMIZE)

# Define the constraints
model.addConstr(20*x1 + 15*x2 >= 100, name="protein")
model.addConstr(5*x1 + 3*x2 >= 50, name="carbs")
model.addConstr(6*x1 + 8*x2 >= 30, name="fat")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Servings of chicken: {x1.varValue}")
    print(f"Servings of pork: {x2.varValue}")
    print(f"Total cost: ${model.objVal:.2f}")
else:
    print("No optimal solution found.")
```