从跟踪中隐藏谓词
Hide Predicates from Trace
有没有办法从跟踪中隐藏单个谓词?在这样的规则中:
p(<Stuff>) :-
q(),
p(<ModifiedStuff>);
s(),
p(<ModifiedStuff>);
p(<ModifiedStuff>).
例如,我想从跟踪中隐藏 q()
和 s()
,因为我只对 p()
的调用感兴趣。
q()
和 s()
可能会调用很多其他谓词,这完全阻塞了跟踪并使得很难在其中找到相关调用。
编辑 1
我现在尝试从命令行执行而不是从解释器内部执行,并将跟踪通过管道传递给 grep 以查找包含 p
的行...但令我失望的是我不得不意识到什么时候 运行,它仍然会打开序言 shell,因此管道输出根本不起作用。只有 print
会实际发送到 shell 运行 prolog 进程。
编辑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] ?-
在 SWI-Prolog 中,您可以使用 trace/2
如:
trace(p, all)
这将启用与 p 相关的信息,这也将激活调试模式。
当您处于调试模式时,您可以调用:
p(<Stuff>).
现在将只显示 p 的信息。
当您在调试器中按下 return 时,调试器通常会 creaps。经典的做法是设置你想看到的间谍点。然后从间谍点跳跃到间谍点。许多调试器提供跳跃命令。
这是一个示例代码:
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指令结合起来,这样调试器就不会提示了。
有没有办法从跟踪中隐藏单个谓词?在这样的规则中:
p(<Stuff>) :-
q(),
p(<ModifiedStuff>);
s(),
p(<ModifiedStuff>);
p(<ModifiedStuff>).
例如,我想从跟踪中隐藏 q()
和 s()
,因为我只对 p()
的调用感兴趣。
q()
和 s()
可能会调用很多其他谓词,这完全阻塞了跟踪并使得很难在其中找到相关调用。
编辑 1
我现在尝试从命令行执行而不是从解释器内部执行,并将跟踪通过管道传递给 grep 以查找包含 p
的行...但令我失望的是我不得不意识到什么时候 运行,它仍然会打开序言 shell,因此管道输出根本不起作用。只有 print
会实际发送到 shell 运行 prolog 进程。
编辑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] ?-
在 SWI-Prolog 中,您可以使用 trace/2
如:
trace(p, all)
这将启用与 p 相关的信息,这也将激活调试模式。
当您处于调试模式时,您可以调用:
p(<Stuff>).
现在将只显示 p 的信息。
当您在调试器中按下 return 时,调试器通常会 creaps。经典的做法是设置你想看到的间谍点。然后从间谍点跳跃到间谍点。许多调试器提供跳跃命令。
这是一个示例代码:
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指令结合起来,这样调试器就不会提示了。