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)).