У меня есть мета-интерпретатор трассировки, сделанный из моих предыдущих вопросов здесь и Я хотел бы сделать аналогичный мета-интерпретатор, но на этот раз для создания деревьев выполнения. Я сделал что-то подобное ниже, используя аналогичный код, найденный в Интернете, и методы из моих предыдущих вопросов.
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-пролог.
Изменить: я пытаюсь добиться чего-то вроде этого, но в текстовом виде форма.