我有根据我之前的问题制作的跟踪元解释器here https://stackoverflow.com/questions/27235148/implementing-cut-in-tracing-meta-interpreter-prolog/我想做类似的元解释器,但这次是为了制作执行树。
我使用类似于在网上找到的相同代码和我之前问题中的技术做了如下类似的事情。
clause_tree(true,_,true) :- !, true.
clause_tree((G,R),Trail,(TG,TR)) :-
!,
clause_tree(G,Trail,TG),
clause_tree(R,Trail,TR).
clause_tree(G,_,prolog(G)) :-
(predicate_property(G,built_in) ;
predicate_property(G,compiled) ),
call(G).
clause_tree(G,Trail,tree(G,T)) :-
clause(G,Body),
clause_tree(Body,[G|Trail],T).
why(G) :-
call_with_depth_limit(
catch(
clause_tree(G,[],T),
cut,
fail),
30,
_Message),
nl,
draw_tree(T,0).
draw_tree(tree(Root,Branches),Tab) :- !,
tab(Tab),
write(Tab),
write(': '),
write(Root),
nl,
Tab1 is Tab + 1,
draw_tree(Branches,Tab1).
draw_tree((B,Bs),Tab) :- !,
draw_tree(B,Tab),
draw_tree(Bs,Tab).
draw_tree(Node,Tab) :-
tab(Tab),
write(Tab),
write(': '),
write(Node),
nl.
%example program for testing
%?-p(X).
p(X) :- a(X).
p(X) :- b(X),c(X), d(X),e(X).
p(X) :- f(X).
b(Y) :- g(Y), h(Y).
b(1).
b(2).
a(1).
c(1).
c(2).
d(1).
d(2).
e(2).
f(3).
g(2).
g(1).
h(2).
我如何改变这个解释器,让它显示失败的分支,并且该树只是一个包含所有解决方案的树?考虑到树仅针对类似的程序(例如用代码编写的示例程序)来完成,如果这很重要的话。
我正在使用 swi-prolog。
编辑:我正在努力实现类似的目标this https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/f3_1_1.gif但以文本形式。