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末尾的",是".结果如下:
最好的祝福