home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / mag_discs / volume_3 / issue10 / extras / prolog / Trace < prev   
Text File  |  1990-01-15  |  3KB  |  175 lines

  1. /*   ><PrologX$Dir>.Trace   */
  2.  
  3.  
  4. /*  trace(Goal) if Goal is deducible from the Prolog program
  5.                    defined by clause/2.  The program traces
  6.                    the prooof by side effects.
  7.  
  8.                    Modified from Sterling & Shapiro: 'The Art of Prolog'
  9.                         page 310, program 19.5
  10.  
  11.      NOTES:
  12.      ======
  13.         (1)  Works OK for everything except cuts (!).
  14.         (2)  The rest of the built-in predicates need to be entered.
  15.  
  16. */
  17.  
  18.  
  19.  
  20. /*  built_in(X) if X is a built-in predicate.
  21.                 (Sterling & Shapiro use system(X), but this is
  22.                  used by Archimedes Prolog for OS calls.
  23. */
  24.  
  25.  
  26. built_in((P:-Q)).
  27. built_in((P-->Q)).
  28. built_in(('!')).
  29. built_in((P->Q;R)).
  30. built_in((P->Q)).
  31. built_in(:-(P)).
  32. built_in(?-(P)).
  33. built_in((P;Q)).
  34. built_in((P,Q)).
  35. built_in(not(P)).
  36. built_in(\+(P)).
  37. built_in((X=Y)).
  38.  
  39. built_in((X is Y)).
  40. built_in((T=..L)).
  41. built_in((X==Y)).
  42. built_in((X\==Y)).
  43. built_in((X\=Y)).
  44. built_in((X@<Y)).
  45. built_in((X@>Y)).
  46. built_in((X@=<Y)).
  47. built_in((X@>=Y)).
  48. built_in((X=:=Y)).
  49. built_in((X<Y)).
  50. built_in((X>Y)).
  51. built_in((X=<Y)).
  52. built_in((X>=Y)).
  53. built_in((X=\=Y)).
  54. built_in((X+Y)).
  55. built_in((X-Y)).
  56. built_in((X/\Y)).
  57. built_in((X\/Y)).
  58. built_in(+(X)).
  59. built_in(-(X)).
  60. built_in((X*Y)).
  61. built_in((X/Y)).
  62. built_in((X<<Y)).
  63. built_in((X>>Y)).
  64. built_in((X mod Y)).
  65. built_in((X^Y)).
  66.  
  67. built_in(abolish(F,N)).
  68. built_in(abort).
  69. built_in(arg(N,T,A)).
  70. built_in(assert(C)).
  71. built_in(asserta(C)).
  72. built_in(assertz(C)).
  73. built_in(atom(T)).
  74. built_in(atomic(T)).
  75. built_in(bagof(X,P,B)).
  76. built_in(break_handler).
  77. built_in(call(P)).
  78. built_in(clause(P,Q)).
  79. built_in(clause(P,Q,R)).
  80. built_in(compare(C,X,Y)).
  81. built_in(compile(F)).
  82. built_in(consult(F)).
  83. built_in(display(T)).
  84. built_in(endmodule(A)).
  85. built_in(erase(R)).
  86. built_in(error_handler(N,T)).
  87. built_in(fail).
  88. built_in(findall(T,G,L)).
  89. built_in(findall(T,G,S,L)).
  90. built_in(forall(P,Q)).
  91. built_in(functor(T,F,N)).
  92. built_in(get(C)).
  93. built_in(get0(C)).
  94. built_in(halt).
  95. built_in(import(P,M)).
  96. built_in(integer(T)).
  97. built_in(keysort(L,S)).
  98. built_in(length(L,M)).
  99. built_in(listing(F,A)).
  100. built_in(name(A,L)).
  101. built_in(nl).
  102. built_in(nonvar(T)).
  103. built_in(numbervars(T,M,N)).
  104. built_in(op(P,T,A)).
  105. built_in(put(C)).
  106. built_in(read(T)).
  107. built_in(read(T,L)).
  108. built_in(recorda(K,T,R)).
  109. built_in(recorded(K,T,R)).
  110. built_in(recordz(K,T,R)).
  111. built_in(repeat).
  112. built_in(retract(T)).
  113. built_in(save(F)).
  114. built_in(see(F)).
  115. built_in(seeing(F)).
  116. built_in(seen).
  117. built_in(setof(X,P,S)).
  118. built_in(simpleterm(T)).
  119. built_in(skip(C)).
  120. built_in(sort(L,S)).
  121. built_in(statistics(X,Y)).
  122. built_in(succ(M,N)).
  123. built_in(system(L)).
  124. built_in(tab(N)).
  125. built_in(tell(F)).
  126. built_in(telling(F)).
  127. built_in(told).
  128. built_in(true).
  129. built_in(ttyflush).
  130. built_in(unknown(O,N)).
  131. built_in(var(T)).
  132. built_in(visa(A,F)).
  133. built_in(write(T)).
  134. built_in(writedepth(O,N)).
  135. built_in(writeq(T)).
  136. built_in(writewidth(O,N)).
  137.  
  138.  
  139.  
  140. /******************************************************/
  141.  
  142.  
  143. trace(Goal) :-
  144.   trace(Goal, 0).
  145.  
  146. trace(true, Depth) :-
  147.   !.
  148.  
  149. trace((A,B), Depth) :-
  150.   !, trace(A, Depth),
  151.   trace(B, Depth).
  152.  
  153. trace(A, Depth) :-
  154.   built_in(A),
  155.   A,
  156.   trace_display(A,Depth),nl.
  157.  
  158. trace(A, Depth) :-
  159.   clause(A, B),
  160.   trace_display(A, Depth), nl,
  161.   Depth1 is Depth+1,
  162.   trace(B, Depth1).
  163.  
  164. trace(A, Depth) :-
  165.   \+ clause(A, B),
  166.   trace_display(A, Depth),
  167.   tab(8), write('fail'),nl,
  168.   fail.
  169.  
  170. trace_display(A, Depth) :-
  171.   Spacing is 2*Depth,
  172.   tab(Spacing),
  173.   write(A).
  174.  
  175.