Aggregates

Aggregates group and summarise. From Part 3, the average fare per class:

fare_by_class(Class, avg(Fare)) :- passenger(_, _, Class, _, Fare).

First project passenger onto the columns that matter, Class (#3) and Fare (#5). Then γ averages Fare, grouping by everything else, here Class:

fare_by_class := γ#2 : avg( π#3, #5( passenger ) )
The grouping column comes first, then the aggregate, giving rows (Class, avg), matching the head fare_by_class(Class, avg(Fare)).