To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of interest and formulating the objective function and constraints using these variables.

Let's denote:
- $x_1$ as the number of batches of maple pecan ice cream.
- $x_2$ as the number of batches of mint chocolate ice cream.

The objective is to maximize profit. Given that the profit per batch of maple pecan ice cream is $400 and the profit per batch of mint chocolate ice cream is $250, the objective function can be written as:
\[ \text{Maximize:} \quad 400x_1 + 250x_2 \]

The constraints are based on the time availability of the mixing and freezing machines. For the mixing machine, each batch of maple pecan ice cream requires 50 minutes, and each batch of mint chocolate ice cream requires 30 minutes, with a total availability of 8000 minutes per month. This gives us the constraint:
\[ 50x_1 + 30x_2 \leq 8000 \]

For the freezing machine, each batch of maple pecan ice cream requires 80 minutes, and each batch of mint chocolate ice cream requires 70 minutes, with a total availability of 10000 minutes per month. This gives us the constraint:
\[ 80x_1 + 70x_2 \leq 10000 \]

Additionally, we have non-negativity constraints since the number of batches cannot be negative:
\[ x_1 \geq 0 \]
\[ x_2 \geq 0 \]

Now, let's represent this problem in the requested JSON format:

```json
{
    'sym_variables': [('x1', 'number of batches of maple pecan ice cream'), ('x2', 'number of batches of mint chocolate ice cream')],
    'objective_function': '400*x1 + 250*x2',
    'constraints': ['50*x1 + 30*x2 <= 8000', '80*x1 + 70*x2 <= 10000', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this problem using Gurobi in Python, we can use the following code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="maple_pecan_batches", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="mint_chocolate_batches", lb=0)

# Set the objective function
m.setObjective(400*x1 + 250*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(50*x1 + 30*x2 <= 8000, "mixing_machine_time")
m.addConstr(80*x1 + 70*x2 <= 10000, "freezing_machine_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: x1 = {x1.x}, x2 = {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```