执行树元解释

时间:2014-12-09 22:39:10

标签: prolog interpreter execution

我跟踪了我以前的问题here制作的元解释器,我想制作类似的元解释器,但这次是制作执行树。 我使用类似于网络上的相同代码和我以前的问题中的技术,制作了类似下面的内容。

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这样的文字形式。

0 个答案:

没有答案