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

Given:
- Variables: `x1` represents 'hours worked by John', `x2` represents 'hours worked by Mary'.
- Objective Function: Minimize `7.35*x1 + 9.07*x2`.
- Constraints:
  1. `0.51*x1 + 0.47*x2 >= 42` (Total combined likelihood to quit index must be at least 42).
  2. `0.51*x1 + 0.47*x2 <= 79` (Total combined likelihood to quit index must not exceed 79).
  3. `x1 - 3*x2 >= 0` (Constraint involving hours worked by John and Mary).
  4. `x1` and `x2` must be whole numbers (Integer constraints).

The symbolic representation of the problem is:
```json
{
  'sym_variables': [('x1', 'hours worked by John'), ('x2', 'hours worked by Mary')],
  'objective_function': '7.35*x1 + 9.07*x2',
  'constraints': [
    '0.51*x1 + 0.47*x2 >= 42',
    '0.51*x1 + 0.47*x2 <= 79',
    'x1 - 3*x2 >= 0',
    'x1 == int(x1)',
    'x2 == int(x2)'
  ]
}
```

Now, let's implement this problem using Gurobi Python API:

```python
from gurobipy import *

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

# Add variables to the model
x1 = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_John")
x2 = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Mary")

# Set the objective function
m.setObjective(7.35*x1 + 9.07*x2, GRB.MINIMIZE)

# Add constraints to the model
m.addConstr(0.51*x1 + 0.47*x2 >= 42, name="min_likelihood_constraint")
m.addConstr(0.51*x1 + 0.47*x2 <= 79, name="max_likelihood_constraint")
m.addConstr(x1 - 3*x2 >= 0, name="hours_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Hours worked by John: {x1.x}")
    print(f"Hours worked by Mary: {x2.x}")
else:
    print("No optimal solution found.")
```