Recursion: the effects of changing the order of clauses and goals
In today's lecture, we saw the following definition of
ancestor_of/2"
.
ancestor_of(X,Y) :- parent_of(X,Y). ancestor_of(X,Y) :- parent_of(X,Z), ancestor_of(Z,Y).(Download the knowledge base.)
What if we had defined this predicate as
ancestor_of(X,Y) :- ancestor_of(Z,Y), parent_of(X,Z). ancestor_of(X,Y) :- parent_of(X,Y).(Download knowledge base.)
or as
ancestor_of(X,Y) :- parent_of(X,Y). ancestor_of(X,Y) :- ancestor_of(Z,Y), parent_of(X,Z).(Download knowledge base.)
or as
ancestor_of(X,Y) :- parent_of(X,Z), ancestor_of(Z,Y). ancestor_of(X,Y) :- parent_of(X,Y).(Download knowledge base.)
From a purely logical point of view, all of these definitions
should be equivalent. After all, logically X and Y is
equivalent to Y and X. The way that Prolog treats them
differs, though. Ask some queries to all of the different
knowledge bases and see how Prologs reactions differ. Ask
queries where Prolog should answer yes
, queries
where it should answer no
and queries which involve
variables.
Try to understand why Prolog behaves in the ways it does. Do traces and draw the search trees that correspond to the different queries.
Ctrl-c
. Then type a
to abort.