有没有办法隐藏跟踪中的单个谓词?在这样的规则中:
p(<Stuff>) :-
q(),
p(<ModifiedStuff>);
s(),
p(<ModifiedStuff>);
p(<ModifiedStuff>).
我想例如隐藏q()
和s()
,因为我只对p()
的调用感兴趣。 q()
和s()
可能会调用许多其他谓词,这些谓词完全阻塞了跟踪,并且很难在其中找到相关的调用。
我现在尝试从命令行执行而不是从解释器内部执行并将跟踪管道转换为grep以获取包含p
的行...但令我失望的是,我必须意识到从命令行运行时,它仍会打开一个prolog shell ,所以管道输出根本不起作用。只有print
实际上会发送到运行prolog进程的shell。
?- trace(shift_reduce, all).
% shift_reduce/2: [call,redo,exit,fail]
true.
[debug] ?- shift_reduce([λ,x,x], T).
T Call: (8) shift_reduce([λ, x, x], _7344)
T Exit: (8) shift_reduce([λ, x, x], [e, [λ], [v, [x]], [e, [v, [...]]]])
T = [e, [λ], [v, [x]], [e, [v, [x]]]] ;
T Exit: (8) shift_reduce([λ, x, x], [e, [λ], [v, [x]], [e, [v, [...]]]])
T = [e, [λ], [v, [x]], [e, [v, [x]]]] ;
T Fail: (8) shift_reduce([λ, x, x], _7344)
false.
[debug] ?-
在SWI-Prolog中你可以使用trace/2
:
trace(p, all)
这将启用与p相关的信息,这也将激活调试模式。
当你处于调试模式时,你可以调用:
p(<Stuff>).
现在这将只显示p的信息。
当您在调试器中按return时,调试器通常会重叠。经典的评论是设置你想看到的间谍点。然后从间谍点跳到间谍点。许多调试器提供了一个leap命令。
这是一个示例代码:
p :- q, s, p.
q.
s.
当您跟踪并折叠时,您将获得以下跟踪:
?- trace.
true.
[trace] ?- p.
Call: (8) p ? creep
Call: (9) q ? creep
Exit: (9) q ? creep
Call: (9) s ? creep
Exit: (9) s ? creep
Call: (9) p ? creep
Call: (10) q ?
调试时,在p / 0上使用间谍点并跳跃得到以下跟踪:
?- debug.
true.
[debug] ?- spy(p/0).
% Spy point on p/0
true.
[debug] ?- p.
* Call: (8) p ? leap
* Call: (9) p ? leap
* Call: (10) p ? leap
* Call: (11) p ?
您可以将上述内容与leash/1指令结合使用,以便调试器不会提示。