To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of fridges as \(x_1\) and the number of stoves as \(x_2\).

### Symbolic Representation:
- **Variables:**
  - \(x_1\): Number of fridges
  - \(x_2\): Number of stoves

- **Objective Function:**
  The objective is to maximize profit. Given that the profit per fridge is $400 and the profit per stove is $500, the objective function can be written as:
  \[
  \text{Maximize: } 400x_1 + 500x_2
  \]

- **Constraints:**
  1. **Floor Space Constraint:** Each fridge requires 10 sq ft of floor space, and each stove requires 15 sq ft. The total available floor space is 1000 sq ft.
     \[
     10x_1 + 15x_2 \leq 1000
     \]
  2. **Fridge Percentage Constraint:** At least 40% of all appliances must be fridges.
     \[
     x_1 \geq 0.4(x_1 + x_2)
     \]
     Simplifying, we get:
     \[
     0.6x_1 \geq 0.4x_2
     \]
     Or,
     \[
     1.5x_1 \geq x_2
     \]
  3. **Capital Constraint:** A fridge ties up $1000 in capital, and a stove ties up $1200. The maximum capital tied up should not exceed $40,000.
     \[
     1000x_1 + 1200x_2 \leq 40000
     \]
  4. **Non-Negativity Constraints:** Both \(x_1\) and \(x_2\) must be non-negative since they represent the number of appliances.
     \[
     x_1, x_2 \geq 0
     \]

### JSON Representation:
```json
{
  'sym_variables': [('x1', 'Number of fridges'), ('x2', 'Number of stoves')],
  'objective_function': '400*x1 + 500*x2',
  'constraints': [
    '10*x1 + 15*x2 <= 1000',
    '1.5*x1 >= x2',
    '1000*x1 + 1200*x2 <= 40000',
    'x1, x2 >= 0'
  ]
}
```

### Gurobi Code:
```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="fridges")
x2 = m.addVar(vtype=GRB.INTEGER, name="stoves")

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

# Add constraints
m.addConstr(10*x1 + 15*x2 <= 1000, "floor_space")
m.addConstr(1.5*x1 >= x2, "fridge_percentage")
m.addConstr(1000*x1 + 1200*x2 <= 40000, "capital")

# Optimize the model
m.optimize()

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