To solve Emma's diet problem using linear programming, we first need to define the decision variables, objective function, and constraints based on the given information.

- **Decision Variables**: Let \(x_1\) be the number of units of pork Emma eats, and \(x_2\) be the number of units of shrimp she eats.
- **Objective Function**: The goal is to minimize the total cost. Since pork costs $3 per unit and shrimp costs $5.5 per unit, the objective function can be written as: Minimize \(3x_1 + 5.5x_2\).
- **Constraints**:
  - Emma needs at least 120 units of proteins. Given that one unit of pork has 15 units of proteins and one unit of shrimp has 22 units of proteins, the protein constraint can be written as: \(15x_1 + 22x_2 \geq 120\).
  - She also needs a minimum of 30 units of fat. With one unit of pork containing 4 units of fat and one unit of shrimp containing 7 units of fat, the fat constraint is: \(4x_1 + 7x_2 \geq 30\).
  - Since Emma cannot eat negative amounts of food, both \(x_1\) and \(x_2\) must be non-negative.

With these components defined, we can formulate the linear programming problem as follows:

Minimize: \(3x_1 + 5.5x_2\)

Subject to:
- \(15x_1 + 22x_2 \geq 120\)
- \(4x_1 + 7x_2 \geq 30\)
- \(x_1, x_2 \geq 0\)

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the decision variables
pork = m.addVar(lb=0, name="pork")
shrimp = m.addVar(lb=0, name="shrimp")

# Set the objective function
m.setObjective(3*pork + 5.5*shrimp, GRB.MINIMIZE)

# Add constraints
m.addConstr(15*pork + 22*shrimp >= 120, "Protein_Requirement")
m.addConstr(4*pork + 7*shrimp >= 30, "Fat_Requirement")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Pork: {pork.x}")
    print(f"Shrimp: {shrimp.x}")
    print(f"Total Cost: ${3*pork.x + 5.5*shrimp.x:.2f}")
else:
    print("No optimal solution found")
```