## Step 1: Define the symbolic representation of the problem

Let's denote the number of Pizza A to be made as $x_1$ and the number of Pizza B to be made as $x_2$. The objective is to maximize profit, where the profit per Pizza A is $3 and per Pizza B is $4. Therefore, the objective function can be represented as $3x_1 + 4x_2$.

## Step 2: Define the constraints based on the given resources

The shop has 600 units of mozzarella cheese and 500 units of American cheese available. Pizza A requires 4 units of mozzarella cheese and 5 units of American cheese, while Pizza B requires 5 units of mozzarella cheese and 3 units of American cheese. This gives us the following constraints:
- $4x_1 + 5x_2 \leq 600$ (mozzarella cheese constraint)
- $5x_1 + 3x_2 \leq 500$ (American cheese constraint)
Additionally, $x_1 \geq 0$ and $x_2 \geq 0$ because the number of pizzas cannot be negative.

## 3: Symbolic representation in the required format

The symbolic variables are:
- $x_1$ for Pizza A
- $x_2$ for Pizza B

The objective function is: $3x_1 + 4x_2$

The constraints are:
- $4x_1 + 5x_2 \leq 600$
- $5x_1 + 3x_2 \leq 500$
- $x_1 \geq 0$
- $x_2 \geq 0$

In the required JSON format:
```json
{
'sym_variables': [('x1', 'Pizza A'), ('x2', 'Pizza B')],
'objective_function': '3*x1 + 4*x2',
'constraints': ['4*x1 + 5*x2 <= 600', '5*x1 + 3*x2 <= 500', 'x1 >= 0', 'x2 >= 0']
}
```

## 4: Convert the problem into Gurobi code

Now, let's implement this problem using Gurobi in Python:
```python
import gurobi

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

    # Define the variables
    x1 = model.addVar(name="Pizza_A", lb=0, vtype=gurobi.GRB.CONTINUOUS)
    x2 = model.addVar(name="Pizza_B", lb=0, vtype=gurobi.GRB.CONTINUOUS)

    # Set the objective function
    model.setObjective(3*x1 + 4*x2, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(4*x1 + 5*x2 <= 600, name="mozzarella_constraint")
    model.addConstr(5*x1 + 3*x2 <= 500, name="american_cheese_constraint")

    # Optimize the model
    model.optimize()

    # Print the results
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Pizza A: {x1.varValue}")
        print(f"Pizza B: {x2.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

pizza_shop_problem()
```