是否有可以绘制Prolog查询搜索树的程序?

IDD*_*DQD 9 prolog swi-prolog search-tree

我想知道是否存在可以绘制Prolog程序的逐步搜索树的工具?谢谢.

Tra*_*ers 13

如果您的Prolog系统具有可自定义的调试器,您可以轻松编写自己的运行时图形收集代码.假设你的Prolog系统有一个回调挂钩goal_tracing/2,如Jekejeke Prolog.然后我们可以继续检查当前帧和父帧以在图中创建链接.这是代码:

goal_tracing(call, F) :-
    frame_property(F, sys_call_indicator(N, A)),
    frame_property(F, sys_parent_frame(G)),
    frame_property(G, sys_call_indicator(M, B)),
    !,
    update_link(N / A, M / B).
goal_tracing(_, _).

:- dynamic link/2.
update_link(A, B) :-
    link(A, B),
    !.
update_link(A, B) :-
    assertz(link(A, B)).
Run Code Online (Sandbox Code Playgroud)

可以看出,我们只检查调用端口,我们只查看谓词指标.但是也可以采用其他方法来收集更多数据.现在我们需要一些实用程序来显示结果.在集合之前只调用一个重置,并在集合之后调用一个show:

reset :-
    retract(link(_, _)), fail.
reset.

show :-
    write('http://yuml.me/diagram/scruffy/class/'),
    link(A, B),
    write(([B] -> [A])),
    write(', '),
    fail.
show.
Run Code Online (Sandbox Code Playgroud)

我们生成yuml.me理解的链接.让我们尝试一下peano factorial程序.程序代码如下:

add(n, X, X).
add(s(X), Y, Z) :-
    add(X, s(Y), Z).

mul(n, _, n).
mul(s(X), Y, Z) :-
    mul(X, Y, H),
    add(Y, H, Z).

fac(n, s(n)).
fac(s(X), Y) :-
    fac(X, H),
    mul(s(X), H, Y).
Run Code Online (Sandbox Code Playgroud)

我们可以按如下方式运行收集器:

?- reset.
?- trace.
?- fac(s(s(n)),X).
X = s(s(n))
?- nodebug.
?- show.
http://yuml.me/diagram/scruffy/class/[fac / 2] -> [fac / 2], [fac / 2] -> [mul / 3], [mul / 3] -> [mul / 3], [mul / 3] -> [add / 3], [add / 3] -> [add / 3], Yes
Run Code Online (Sandbox Code Playgroud)

然后可以将URL粘贴到浏览器中并查看图表.删除URL末尾的",是".结果如下:

调用图

最好的祝福