## Step 1: Define the symbolic representation of the variables
The variables are 'corn cobs', 'protein bars', 'strips of bacon', and 'steaks'. Let's denote them as $x_1$, $x_2$, $x_3$, and $x_4$ respectively.

## Step 2: Convert the objective function into symbolic notation
The objective function to maximize is $6x_1 + 1x_2 + 8x_3 + 4x_4$.

## Step 3: Define the constraints in symbolic notation
1. $3x_1 + 5x_2 + 4x_3 + 6x_4 \leq 98$
2. $5x_2 + 4x_3 + 6x_4 \geq 21$
3. $3x_1 + 4x_3 + 6x_4 \geq 21$
4. $5x_2 + 4x_3 + 6x_4 \geq 21$
5. $3x_1 + 4x_3 + 6x_4 \geq 15$
6. $3x_1 + 5x_2 + 6x_4 \geq 15$
7. $5x_2 + 4x_3 + 6x_4 \geq 19$
8. $3x_1 + 4x_3 + 6x_4 \geq 19$
9. $3x_1 + 5x_2 + 6x_4 \geq 19$
10. $2x_1 - 10x_2 \geq 0$
11. $5x_2 + 6x_4 \leq 97$
12. $3x_1 + 6x_4 \leq 47$
13. $3x_1 + 4x_3 \leq 89$
14. $5x_2 + 4x_3 \leq 98$
15. $4x_3 + 6x_4 \leq 30$
16. $3x_1 + 5x_2 + 4x_3 + 6x_4 \leq 30$

## 4: Determine the variable types
- $x_1$ (corn cobs) can be non-integer.
- $x_2$ (protein bars) can be non-integer.
- $x_3$ (strips of bacon) must be an integer.
- $x_4$ (steaks) can be non-integer.

## 5: Write the Gurobi code
```python
import gurobi

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

# Define the variables
x1 = m.addVar(name="corn_cobs", lb=0, ub=None, vtype=gurobi.GRB.CONTINUOUS)
x2 = m.addVar(name="protein_bars", lb=0, ub=None, vtype=gurobi.GRB.CONTINUOUS)
x3 = m.addVar(name="strips_of_bacon", lb=0, ub=None, vtype=gurobi.GRB.INTEGER)
x4 = m.addVar(name="steaks", lb=0, ub=None, vtype=gurobi.GRB.CONTINUOUS)

# Define the objective function
m.setObjective(6*x1 + x2 + 8*x3 + 4*x4, gurobi.GRB.MAXIMIZE)

# Add constraints
m.addConstr(3*x1 + 5*x2 + 4*x3 + 6*x4 <= 98)
m.addConstr(5*x2 + 4*x3 + 6*x4 >= 21)
m.addConstr(3*x1 + 4*x3 + 6*x4 >= 21)
m.addConstr(5*x2 + 4*x3 + 6*x4 >= 15)
m.addConstr(3*x1 + 4*x3 + 6*x4 >= 15)
m.addConstr(3*x1 + 5*x2 + 6*x4 >= 15)
m.addConstr(5*x2 + 4*x3 + 6*x4 >= 19)
m.addConstr(3*x1 + 4*x3 + 6*x4 >= 19)
m.addConstr(3*x1 + 5*x2 + 6*x4 >= 19)
m.addConstr(2*x1 - 10*x2 >= 0)
m.addConstr(5*x2 + 6*x4 <= 97)
m.addConstr(3*x1 + 6*x4 <= 47)
m.addConstr(3*x1 + 4*x3 <= 89)
m.addConstr(5*x2 + 4*x3 <= 98)
m.addConstr(4*x3 + 6*x4 <= 30)
m.addConstr(3*x1 + 5*x2 + 4*x3 + 6*x4 <= 30)

# Optimize the model
m.optimize()

# Print the solution
if m.status == gurobi.GRB.OPTIMAL:
    print("Objective: ", m.objVal)
    print("Corn cobs: ", x1.varValue)
    print("Protein bars: ", x2.varValue)
    print("Strips of bacon: ", x3.varValue)
    print("Steaks: ", x4.varValue)
else:
    print("The model is infeasible")
```

## 6: Symbolic representation of the problem
```json
{
    'sym_variables': [
        ('x1', 'corn cobs'),
        ('x2', 'protein bars'),
        ('x3', 'strips of bacon'),
        ('x4', 'steaks')
    ],
    'objective_function': '6*x1 + x2 + 8*x3 + 4*x4',
    'constraints': [
        '3*x1 + 5*x2 + 4*x3 + 6*x4 <= 98',
        '5*x2 + 4*x3 + 6*x4 >= 21',
        '3*x1 + 4*x3 + 6*x4 >= 21',
        '5*x2 + 4*x3 + 6*x4 >= 21',
        '3*x1 + 4*x3 + 6*x4 >= 15',
        '3*x1 + 5*x2 + 6*x4 >= 15',
        '5*x2 + 4*x3 + 6*x4 >= 19',
        '3*x1 + 4*x3 + 6*x4 >= 19',
        '3*x1 + 5*x2 + 6*x4 >= 19',
        '2*x1 - 10*x2 >= 0',
        '5*x2 + 6*x4 <= 97',
        '3*x1 + 6*x4 <= 47',
        '3*x1 + 4*x3 <= 89',
        '5*x2 + 4*x3 <= 98',
        '4*x3 + 6*x4 <= 30',
        '3*x1 + 5*x2 + 4*x3 + 6*x4 <= 30'
    ]
}
```