/* solve_trace(Goal) :- Goal is true given the pure Prolog program defined by clause/2. The program traces the proof by side effects. */ solve_trace(Goal) :- solve_trace(Goal,0). solve_trace(true,Depth) :- !. solve_trace((A,B),Depth) :- !, solve_trace(A,Depth), solve_trace(B,Depth). solve_trace(A,Depth) :- builtin(A), !, A, display(A,Depth), nl. solve_trace(A,Depth) :- clause(A,B), display(A,Depth), nl, Depth1 is Depth + 1, solve_trace(B,Depth1). display(A,Depth) :- Spacing is 3*Depth, put_spaces(Spacing), write(A). put_spaces(N) :- between(1,N,I), put_char(' '), fail. put_spaces(N). between(I,J,I) :- I =< J. between(I,J,K) :- I < J, I1 is I + 1, between(I1,J,K). % Program 17.7 A tracer for Prolog