To solve this optimization problem, we will first define the symbolic representation of the variables and the objective function. Then, we'll list out all the constraints in a semi-algebraic form using these symbolic variables.

The variables can be represented symbolically as follows:
- Let \(x_1\) represent 'grams of carbohydrates'.
- Let \(x_2\) represent 'grams of protein'.
- Let \(x_3\) represent 'milligrams of potassium'.

The objective function, aiming to minimize the value, is given by:
\[2.87x_1 + 8.97x_2 + 2.78x_3\]

Now, let's encode the constraints symbolically:
1. The muscle growth index for grams of carbohydrates is \(3\), implying \(3x_1\) contributes to the muscle growth index.
2. The muscle growth index for grams of protein is \(7\), so \(7x_2\) contributes to it.
3. For milligrams of potassium, the muscle growth index is \(10\), meaning \(10x_3\) is its contribution.
4. The total combined muscle growth index from grams of carbohydrates plus grams of protein must be no less than \(10\): \(3x_1 + 7x_2 \geq 10\).
5. The total combined muscle growth index from grams of carbohydrates and milligrams of potassium has to be greater than or equal to \(17\): \(3x_1 + 10x_3 \geq 17\).
6. The total combined muscle growth index from all three (grams of carbohydrates, grams of protein, and milligrams of potassium) must be greater than or equal to \(17\): \(3x_1 + 7x_2 + 10x_3 \geq 17\).
7. Another constraint is given by: \(10x_2 - 5x_3 \geq 0\).
8. And finally, the last constraint: \(x_1 - 9x_2 \geq 0\).

Given these symbolic representations and constraints, we have:
```json
{
    'sym_variables': [('x1', 'grams of carbohydrates'), ('x2', 'grams of protein'), ('x3', 'milligrams of potassium')],
    'objective_function': '2.87*x1 + 8.97*x2 + 2.78*x3',
    'constraints': [
        '3*x1 + 7*x2 >= 10',
        '3*x1 + 10*x3 >= 17',
        '3*x1 + 7*x2 + 10*x3 >= 17',
        '10*x2 - 5*x3 >= 0',
        'x1 - 9*x2 >= 0'
    ]
}
```

To solve this optimization problem using Gurobi, we'll write the Python code as follows:

```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Define variables
x1 = m.addVar(lb=0, name="grams_of_carbohydrates")
x2 = m.addVar(lb=0, name="grams_of_protein")
x3 = m.addVar(lb=0, name="milligrams_of_potassium")

# Set the objective function
m.setObjective(2.87*x1 + 8.97*x2 + 2.78*x3, GRB.MINIMIZE)

# Add constraints
m.addConstr(3*x1 + 7*x2 >= 10, "muscle_growth_index_carbs_protein")
m.addConstr(3*x1 + 10*x3 >= 17, "muscle_growth_index_carbs_potassium")
m.addConstr(3*x1 + 7*x2 + 10*x3 >= 17, "total_muscle_growth_index")
m.addConstr(10*x2 - 5*x3 >= 0, "protein_potassium_constraint")
m.addConstr(x1 - 9*x2 >= 0, "carbs_protein_constraint")

# Optimize model
m.optimize()

if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Grams of Carbohydrates: {x1.x}")
    print(f"Grams of Protein: {x2.x}")
    print(f"Milligrams of Potassium: {x3.x}")
else:
    print("No optimal solution found")
```