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