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

最佳答案

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

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)).

可以看出,我们仅检查调用端口,并且仅查看
谓词指示符。但是也有可能收集其他方法
更多数据。现在我们需要一些实用程序来显示结果。只有
重置将在集合之前被调用,而表演将在集合之后被调用
集合:
reset :-
    retract(link(_, _)), fail.
reset.

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

我们产生yuml.me可以理解的链接。
让我们尝试使用peano析因程序。程序代码看起来
如下:
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).

我们可以如下运行收集器:
?- 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

然后可以将URL粘贴到浏览器中,然后将看到该图。删除“,是”
URL的末尾。结果如下:

此致

关于prolog - 有没有可以绘制Prolog查询搜索树的程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9448148/

10-09 15:21
查看更多