Why are meta-interpreters interesting? They give us greater insight into the computation mechanism of the language. They also afford us the opportunity to examine in detail and perhaps change the computation mechanism of the language.
A very simple meta-interpreter for Prolog is
solve(Goal) :- Goal.A slightly more interesting one is
solve(true). solve((A,B)) :- solve(A), solve(B). solve(Goal) :- rule(Goal,Body), solve(Body).To deal with Prolog builtin predicates:
solve(true). solve((A,B)) :- solve(A), solve(B). solve(Goal) :- builtin(Goal), Goal. solve(Goal) :- rule(Goal,Body), solve(Body). builtin(_ \== _). rule(member1(X,[X|_]),true). rule(member1(X,[Head|Tail]),(X \== Head, member1(X,Tail))). rule(member(X,[X|_]),true). rule(member(X,[_|Tail]),(member(X,Tail))).To build a proof tree:
solve(true,true). solve((A,B),(ProofA,ProofB)) :- solve(A,ProofA), solve(B,ProofB). solve(G,(G:-builtin)) :- builtin(G), call(G). solve(Goal,(Goal:-Proof)) :- rule(Goal,Body), solve(Body,Proof). builtin(_ \== _). rule(member1(X,[X|_]),true). rule(member1(X,[Head|Tail]),(X \== Head, member1(X,Tail))). rule(member(X,[X|_]),true). rule(member(X,[_|Tail]),(member(X,Tail))).In the assignment you need to keep track of the resolvent: the set of goals which remain to be proved at each node in the search tree.