This example shows how simple it is to write a Prolog interpreter in
Prolog, and illustrates the use of a variable goal.  In this
mini-interpreter, goals and clauses are represented as ordinary Prolog
data structures (i.e. terms).  Terms representing clauses are specified
using the predicate my_clause/1, e.g.
     my_clause( (grandparent(X, Z) :- parent(X, Y), parent(Y, Z)) ).
     
   A unit clause will be represented by a term such as
     my_clause( (parent(john, mary) :- true) ).
     
   The mini-interpreter consists of three clauses:
     execute((P,Q)) :- !, execute(P), execute(Q).
     execute(P) :- predicate_property(P, built_in), !, P.
     execute(P) :- my_clause((P :- Q)), execute(Q).
     
   The second clause enables the mini-interpreter to cope with calls to
ordinary Prolog predicates, e.g. built-in predicates.  The
mini-interpreter needs to be extended to cope with the other control
structures, i.e. !, (P;Q), (P->Q),
(P->Q;R), (\+ P), and if(P,Q,R).