Prolog in Prolog

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).