To solve this problem, we first need to translate the given natural language description into a symbolic representation of the optimization problem. This involves defining variables, an objective function, and constraints in terms of these variables.

Given:
- Variables: `sashimi` and `fruit salads`
- Resources/Attributes:
  - `r0`: grams of carbohydrates
    - `upper_bound`: 82
    - `x0` (sashimi): 21
    - `x1` (fruit salads): 3
  - `r1`: umami index
    - `upper_bound`: 121
    - `x0` (sashimi): 10
    - `x1` (fruit salads): 11

Objective Function: Minimize \(7 \times sashimi + 7 \times fruit\ salads\)

Constraints:
- Carbohydrates from sashimi and fruit salads must be at least 36 grams.
- Total umami index from both must be at least 57.
- \(8 \times sashimi - 5 \times fruit\ salads \geq 0\)
- Total carbohydrates must not exceed 77 grams.
- Total umami index must not exceed 71.

Let's denote `sashimi` as \(x_1\) and `fruit salads` as \(x_2\).

Symbolic Representation:
```json
{
  'sym_variables': [('x1', 'sashimi'), ('x2', 'fruit salads')],
  'objective_function': '7*x1 + 7*x2',
  'constraints': [
    '21*x1 + 3*x2 >= 36',  # At least 36 grams of carbohydrates
    '10*x1 + 11*x2 >= 57',  # Umami index at least 57
    '8*x1 - 5*x2 >= 0',     # Constraint on sashimi and fruit salads quantities
    '21*x1 + 3*x2 <= 77',   # No more than 77 grams of carbohydrates
    '10*x1 + 11*x2 <= 71'   # Umami index no more than 71
  ]
}
```

Now, let's write the Gurobi code to solve this optimization problem. Note that we'll use Python as our programming language for this purpose.

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="sashimi")  # Sashimi must be an integer
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="fruit_salads")  # Fruit salads can be a fraction

# Objective function: Minimize 7*x1 + 7*x2
m.setObjective(7*x1 + 7*x2, GRB.MINIMIZE)

# Constraints
m.addConstr(21*x1 + 3*x2 >= 36, name="carb_min")  # At least 36 grams of carbohydrates
m.addConstr(10*x1 + 11*x2 >= 57, name="umami_min")  # Umami index at least 57
m.addConstr(8*x1 - 5*x2 >= 0, name="quantity_constraint")  # Constraint on quantities
m.addConstr(21*x1 + 3*x2 <= 77, name="carb_max")  # No more than 77 grams of carbohydrates
m.addConstr(10*x1 + 11*x2 <= 71, name="umami_max")  # Umami index no more than 71

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Sashimi: {x1.x}")
    print(f"Fruit Salads: {x2.x}")
    print(f"Objective Function Value: {m.objVal}")
else:
    print("No optimal solution found")
```