Prolog execution

Most Prolog clauses have both a declarative reading and a procedural reading. Whenever possible, the declarative reading is to be preferred.

	mother(X, Y) :- parent(X, Y), female(X).
Declarative reading: X is the mother of Y if X is a parent of Y and X is female.

Approximate procedural reading: To show that X is the mother of Y, first show that X is a parent of Y, then show that X is female.

Suppose we have the additional base clauses:

	parent(john, bill).
	parent(jane, bill).
	female(jane).

Now if we inquire:
	| ?- mother(M, bill).
the clause of mother/2 will be located, and the unifications X=M, Y=bill will occur. (Parameter transmission is by unification.) Then parent(M, bill) will be attempted, resulting in the unification M=john. Next, female(john) will be attempted, but will fail. Prolog will backtrack to parent(M, bill) and look for another solution for this; it will succeed and unify M=jane. Finally, it will attempt female(jane), and succeed; so the inquiry will succeed, having performed the unification M=jane.

Typically Prolog predicates work regardless of which arguments are instantiated, and may instantiate the others. Thus mother/2 works equally well for the calls mother(jane,C), mother(M,C), and mother(jane,bill) [but the procedural reading is different in each case.] Injudicious use of control predicates, particularly ``cut,'', can destroy this property.

Previous page
Table of contents
Next page


Copyright © 1995 by David Matuszek
All rights reserved.
Last updated July 15, 1995