home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Archive Magazine 1996
/
ARCHIVE_96.iso
/
discs
/
mag_discs
/
volume_3
/
issue10
/
extras
/
prolog
/
Trace
< prev
Wrap
Text File
|
1990-01-15
|
3KB
|
175 lines
/* ><PrologX$Dir>.Trace */
/* trace(Goal) if Goal is deducible from the Prolog program
defined by clause/2. The program traces
the prooof by side effects.
Modified from Sterling & Shapiro: 'The Art of Prolog'
page 310, program 19.5
NOTES:
======
(1) Works OK for everything except cuts (!).
(2) The rest of the built-in predicates need to be entered.
*/
/* built_in(X) if X is a built-in predicate.
(Sterling & Shapiro use system(X), but this is
used by Archimedes Prolog for OS calls.
*/
built_in((P:-Q)).
built_in((P-->Q)).
built_in(('!')).
built_in((P->Q;R)).
built_in((P->Q)).
built_in(:-(P)).
built_in(?-(P)).
built_in((P;Q)).
built_in((P,Q)).
built_in(not(P)).
built_in(\+(P)).
built_in((X=Y)).
built_in((X is Y)).
built_in((T=..L)).
built_in((X==Y)).
built_in((X\==Y)).
built_in((X\=Y)).
built_in((X@<Y)).
built_in((X@>Y)).
built_in((X@=<Y)).
built_in((X@>=Y)).
built_in((X=:=Y)).
built_in((X<Y)).
built_in((X>Y)).
built_in((X=<Y)).
built_in((X>=Y)).
built_in((X=\=Y)).
built_in((X+Y)).
built_in((X-Y)).
built_in((X/\Y)).
built_in((X\/Y)).
built_in(+(X)).
built_in(-(X)).
built_in((X*Y)).
built_in((X/Y)).
built_in((X<<Y)).
built_in((X>>Y)).
built_in((X mod Y)).
built_in((X^Y)).
built_in(abolish(F,N)).
built_in(abort).
built_in(arg(N,T,A)).
built_in(assert(C)).
built_in(asserta(C)).
built_in(assertz(C)).
built_in(atom(T)).
built_in(atomic(T)).
built_in(bagof(X,P,B)).
built_in(break_handler).
built_in(call(P)).
built_in(clause(P,Q)).
built_in(clause(P,Q,R)).
built_in(compare(C,X,Y)).
built_in(compile(F)).
built_in(consult(F)).
built_in(display(T)).
built_in(endmodule(A)).
built_in(erase(R)).
built_in(error_handler(N,T)).
built_in(fail).
built_in(findall(T,G,L)).
built_in(findall(T,G,S,L)).
built_in(forall(P,Q)).
built_in(functor(T,F,N)).
built_in(get(C)).
built_in(get0(C)).
built_in(halt).
built_in(import(P,M)).
built_in(integer(T)).
built_in(keysort(L,S)).
built_in(length(L,M)).
built_in(listing(F,A)).
built_in(name(A,L)).
built_in(nl).
built_in(nonvar(T)).
built_in(numbervars(T,M,N)).
built_in(op(P,T,A)).
built_in(put(C)).
built_in(read(T)).
built_in(read(T,L)).
built_in(recorda(K,T,R)).
built_in(recorded(K,T,R)).
built_in(recordz(K,T,R)).
built_in(repeat).
built_in(retract(T)).
built_in(save(F)).
built_in(see(F)).
built_in(seeing(F)).
built_in(seen).
built_in(setof(X,P,S)).
built_in(simpleterm(T)).
built_in(skip(C)).
built_in(sort(L,S)).
built_in(statistics(X,Y)).
built_in(succ(M,N)).
built_in(system(L)).
built_in(tab(N)).
built_in(tell(F)).
built_in(telling(F)).
built_in(told).
built_in(true).
built_in(ttyflush).
built_in(unknown(O,N)).
built_in(var(T)).
built_in(visa(A,F)).
built_in(write(T)).
built_in(writedepth(O,N)).
built_in(writeq(T)).
built_in(writewidth(O,N)).
/******************************************************/
trace(Goal) :-
trace(Goal, 0).
trace(true, Depth) :-
!.
trace((A,B), Depth) :-
!, trace(A, Depth),
trace(B, Depth).
trace(A, Depth) :-
built_in(A),
A,
trace_display(A,Depth),nl.
trace(A, Depth) :-
clause(A, B),
trace_display(A, Depth), nl,
Depth1 is Depth+1,
trace(B, Depth1).
trace(A, Depth) :-
\+ clause(A, B),
trace_display(A, Depth),
tab(8), write('fail'),nl,
fail.
trace_display(A, Depth) :-
Spacing is 2*Depth,
tab(Spacing),
write(A).