p(a).
p(b).

q(b).

% ?- p(X), q(X).

% Meta-Interpretierer fuer Prolog mit Tracing: tprove(G)  <=> ?- G.
tprove(true) :- !.
tprove( (A,B) ) :- !,
        tprove(A),
        tprove(B).
tprove(A) :-
        callfail(A),
        clause(A,Body),
        tprove(Body),
        exitredo(A).

callfail(L) :- write('Call: '), write(L), nl.
callfail(L) :- write('Fail: '), write(L), nl, fail.

exitredo(L) :- write('Exit: '), write(L), nl.
exitredo(L) :- write('Redo: '), write(L), nl, fail.
