/* Logical rules for passing an exam */ pass_exam(X) :- prepared_for_exam(X). pass_exam(X) :- easy_exam, person(X). /* Three ways to be prepared for exam */ prepared_for_exam(X) :- knows_it_all(X). prepared_for_exam(X) :- read_book(X), attended_lectures(X), \+ slept_during_lectures(X), worked_problems(X). prepared_for_exam(X) :- tutored_by(X, Y), prepared_for_exam(Y). :- dynamic easy_exam/0, attended_lectures/1, slept_during_lectures/1. /* The facts */ person(mary). person(john). person(tom). person(sally). person(fred). read_book(fred). read_book(mary). worked_problems(fred). worked_problems(mary). attended_lectures(fred). attended_lectures(mary). slept_during_lectures(fred). knows_it_all(tom). tutored_by(john, mary). tutored_by(sally, john). % auxiliary routines % show shows an enumerated relation, one tuple per line show(Relation) :- enumerate(Relation, List), list(List). % enumerate enumerates a named relation to produce a list enumerate(Relation, List) :- current_predicate(Relation, Form), Form =.. [Relation | Args], (setof(Args, Form, List) ; List = []). % list shows a list, one element per line list([]). list([A | X]) :- write(A), nl, list(X).