我想知道是否存在可以绘制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/