Our approach

Villager data comes from extensionals — our input tables, the initial facts:

extensional villager(name: string, age: integer, height: integer).
extensional hairColour(name: string, colour: string).
extensional location(name: string, location: string).

We want to define an intensional predicate:

suspect(Name) :- villager(Name, _, _), ….