## Problem Description and Formulation

The taco restaurant sells two products: burritos and tacos. The goal is to maximize profit given the constraints on available beef and toppings.

### Variables
- Let \(B\) be the number of burritos sold.
- Let \(T\) be the number of tacos sold.

### Objective Function
The profit per burrito is $3, and the profit per taco is $3.50. The objective function to maximize profit (\(P\)) is:
\[ P = 3B + 3.50T \]

### Constraints
1. **Beef Constraint**: Each burrito contains 4 units of beef, and each taco contains 4.5 units of beef. The restaurant has 500 units of beef available.
\[ 4B + 4.5T \leq 500 \]

2. **Toppings Constraint**: Each burrito contains 4 units of toppings, and each taco contains 3 units of toppings. The restaurant has 400 units of toppings available.
\[ 4B + 3T \leq 400 \]

3. **Non-Negativity Constraint**: The number of burritos and tacos sold cannot be negative.
\[ B \geq 0, T \geq 0 \]

## Gurobi Code

```python
import gurobi

def solve_taco_restaurant_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    B = model.addVar(lb=0, name="Burritos", vtype=gurobi.GRB.CONTINUOUS)
    T = model.addVar(lb=0, name="Tacos", vtype=gurobi.GRB.CONTINUOUS)

    # Objective function: Maximize profit
    model.setObjective(3*B + 3.50*T, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(4*B + 4.5*T <= 500, name="Beef_Constraint")
    model.addConstr(4*B + 3*T <= 400, name="Toppings_Constraint")

    # Optimize model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found. Burritos: {B.varValue}, Tacos: {T.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_taco_restaurant_problem()
```