隐藏跟踪

时间:2017-06-19 15:29:58

标签: prolog trace swi-prolog

有没有办法隐藏跟踪中的各个谓词?在这样的规则中:

p(<Stuff>) :-
    q(),
    p(<ModifiedStuff>);
    s(),
    p(<ModifiedStuff>);
    p(<ModifiedStuff>).

我希望在跟踪中隐藏q()s(),因为我只对p()的调用感兴趣。 q()s()可能会调用许多其他谓词,这些谓词会完全阻塞跟踪,并且很难在其中找到相关的调用。

编辑1

我现在尝试从命令行执行而不是从解释器内部执行并将跟踪管道传输到grep以获取包含p的grepping行...但令我失望的是我从命令行运行时必须意识到,它仍然会打开一个prolog shell,因此输出管道根本不起作用。只有print实际上会发送到运行prolog进程的shell。

编辑2(使用trace(p,all)时的输出)

?- 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]  ?-

2 个答案:

答案 0 :(得分:4)

在SWI-Prolog中,您可以使用trace/2之类的:

trace(p, all)这将启用与p相关的信息,这也将激活调试模式。

当您进入调试模式时,您可以致电:

p(<Stuff>).

现在只显示p。

的信息

答案 1 :(得分:1)

在调试器中按回车键时,调试器通常会崩溃。经典方法是设置间谍点您想看到的东西。然后在间谍点之间飞跃。许多调试器提供了一个jump命令。

这是示例代码:

incoming.[extension]

跟踪和爬行时,会得到以下跟踪:

p :- q, s, p.
q.
s.

调试时,在p / 0上使用间谍点并跳跃,将得到以下跟踪:

?- 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 ? 

您可以将以上内容与leash/1指令结合使用,以使调试器不会提示。