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

Let's define:
- $x_1$ as the number of sleeper class tickets sold.
- $x_2$ as the number of regular tickets sold.

The objective is to maximize profit. Given that each sleeper class ticket yields a $500 profit and each regular ticket yields a $200 profit, the objective function can be written as:
\[ \text{Maximize} \quad 500x_1 + 200x_2 \]

The constraints are as follows:
1. The total number of passengers cannot exceed 400: 
\[ x_1 + x_2 \leq 400 \]
2. More than 5 times as many passengers prefer regular seating over sleeper class:
\[ x_2 > 5x_1 \]
However, since we are dealing with linear programming and need to ensure the problem is feasible for all possible scenarios (including when $x_1 = 0$), this constraint can be adjusted to be:
\[ x_2 \geq 5x_1 \]
3. There must be at least 50 seats reserved for sleeper class passengers:
\[ x_1 \geq 50 \]

All variables are non-negative since they represent the number of tickets sold:
\[ x_1, x_2 \geq 0 \]

The symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'number of sleeper class tickets'), ('x2', 'number of regular tickets')],
    'objective_function': '500*x1 + 200*x2',
    'constraints': ['x1 + x2 <= 400', 'x2 >= 5*x1', 'x1 >= 50', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement the solution using Gurobi in Python:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(name='sleeper_class_tickets', vtype=GRB.INTEGER, lb=0)
x2 = m.addVar(name='regular_tickets', vtype=GRB.INTEGER, lb=0)

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

# Add constraints
m.addConstr(x1 + x2 <= 400, name='total_passengers')
m.addConstr(x2 >= 5*x1, name='regular_vs_sleeper')
m.addConstr(x1 >= 50, name='min_sleeper_class')

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found. Maximum profit: {m.objVal}")
    print(f"Sleeper class tickets to sell: {x1.x}")
    print(f"Regular tickets to sell: {x2.x}")
else:
    print("No optimal solution found.")
```

This code sets up the linear programming problem as described, optimizes it using Gurobi, and then prints out the results, including the maximum profit achievable and how many of each type of ticket should be sold.