To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of small and large bowls to be sold, expressing the objective function in terms of these variables, and listing out the constraints based on the available resources.

Let's define:
- \(x_1\) as the number of small bowls to be sold,
- \(x_2\) as the number of large bowls to be sold.

The objective function, which represents the total profit to be maximized, can be written as:
\[5x_1 + 8x_2\]

Given that each small bowl contains 3 units of kiwi, 2 units of mango, and 5 units of pineapple, and each large bowl contains 5 units of kiwi, 4 units of mango, and 8 units of pineapple, we have the following constraints based on the available quantities:
1. Kiwi: \(3x_1 + 5x_2 \leq 100\)
2. Mango: \(2x_1 + 4x_2 \leq 120\)
3. Pineapple: \(5x_1 + 8x_2 \leq 150\)

Additionally, \(x_1\) and \(x_2\) must be non-negative since they represent quantities of bowls.

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of small bowls'), ('x2', 'number of large bowls')],
    'objective_function': '5*x1 + 8*x2',
    'constraints': [
        '3*x1 + 5*x2 <= 100',
        '2*x1 + 4*x2 <= 120',
        '5*x1 + 8*x2 <= 150',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

To solve this problem using Gurobi in Python, we'll use the following code:

```python
from gurobipy import *

# Create a new model
m = Model("Tropical Fruit Bowls")

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.INTEGER, name="small_bowls")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="large_bowls")

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

# Add constraints
m.addConstr(3*x1 + 5*x2 <= 100, "kiwi")
m.addConstr(2*x1 + 4*x2 <= 120, "mango")
m.addConstr(5*x1 + 8*x2 <= 150, "pineapple")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Small bowls: {x1.x}")
    print(f"Large bowls: {x2.x}")
    print(f"Total profit: {m.objVal}")
else:
    print("No optimal solution found")
```