To solve the given problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of fish caught as $x_1$ and the number of birds caught as $x_2$. The objective is to maximize the total points, which can be represented as $4x_1 + 6x_2$. 

The constraints given are:
- Catch at least 6 fishes: $x_1 \geq 6$
- Catch at least 2 birds: $x_2 \geq 2$
- Catch at most 9 fishes: $x_1 \leq 9$
- Catch at most 4 birds: $x_2 \leq 4$
- Catch no more than 12 animals in total: $x_1 + x_2 \leq 12$

All variables are non-negative since you cannot catch a negative number of animals.

The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of fish caught'), ('x2', 'number of birds caught')],
    'objective_function': '4*x1 + 6*x2',
    'constraints': ['x1 >= 6', 'x2 >= 2', 'x1 <= 9', 'x2 <= 4', 'x1 + x2 <= 12']
}
```

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

```python
from gurobipy import *

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

# Add variables
x1 = m.addVar(lb=6, ub=9, vtype=GRB.INTEGER, name="fish_caught")
x2 = m.addVar(lb=2, ub=4, vtype=GRB.INTEGER, name="birds_caught")

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

# Add constraints
m.addConstr(x1 + x2 <= 12, "total_animals")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Fish caught: {x1.x}")
    print(f"Birds caught: {x2.x}")
    print(f"Total points: {4*x1.x + 6*x2.x}")
else:
    print("No optimal solution found")
```