To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of fish caught as \(F\) and the number of birds caught as \(B\). The objective is to maximize the total points earned from catching fish and birds, where each fish contributes 4 points and each bird contributes 6 points.

The constraints given are:
1. Catch at least 6 fish: \(F \geq 6\)
2. Catch at least 2 birds: \(B \geq 2\)
3. Catch no more than 9 fish: \(F \leq 9\)
4. Catch no more than 4 birds: \(B \leq 4\)
5. The total number of animals caught should not exceed 12: \(F + B \leq 12\)

The objective function to maximize is: \(4F + 6B\)

We will use Gurobi, a linear programming solver, implemented in Python to solve this problem.

```python
from gurobipy import *

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

# Define the decision variables
F = m.addVar(name='Fish', vtype=GRB.INTEGER, lb=6, ub=9)  # At least 6 fish and at most 9 fish
B = m.addVar(name='Birds', vtype=GRB.INTEGER, lb=2, ub=4)  # At least 2 birds and at most 4 birds

# Define the objective function: Maximize points from catching fish and birds
m.setObjective(4*F + 6*B, GRB.MAXIMIZE)

# Add the constraint for the total number of animals caught
m.addConstr(F + B <= 12, name='Total_Animals')

# Optimize the model
m.optimize()

# Print out the solution
if m.status == GRB.OPTIMAL:
    print('Optimal solution found:')
    print(f'Catch {F.x} fish')
    print(f'Catch {B.x} birds')
    print(f'Total points: {4*F.x + 6*B.x}')
else:
    print('No optimal solution found')

```