从Trace中隐藏模块/包

问题描述 投票:3回答:1

如何隐藏模块或整个包以进行跟踪。我有这个查询,我想逐步完成它,但我对CLP(X)的作用不感兴趣,只是在我的查询中出现了什么问题。

?- X in 0..5, X in 7..8.
fail.

?- dif(A, 1), A = 1.
fail.

如果我在SWI-Prolog中运行此查询,它会向我显示模块CLP(X)的每个细节,不仅是与约束相关的一些内联,还包括CLP(X)中的所有其他内容:

Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.2)

?- trace.
true.

[trace]  ?- X in 0..5, X in 7..8.
   Call: (9) clpfd:clpfd_in(_2662, 0..5) ? creep
   Call: (10) clpfd:fd_variable(_2662) ? creep
   Call: (11) var(_2662) ? creep
   Exit: (11) var(_2662) ? creep
   Call: (11) true ? creep
   Exit: (11) true ? creep

[trace]  ?- dif(A, 1), A=1.
   Call: (9) dif:dif(_3044, 1) ? creep
   Exit: (9) dif:dif(_3410{dif = ...}, 1) ? creep
   Call: (9) _3410{dif = ...}=1 ? creep

有没有办法抑制CLP(X)的内部。例如,如果我使用另一个Prolog系统,我看不到CLP(X)(预览)的任何内部:

Jekejeke Prolog 3, Development Environment 1.3.6

?- trace.
Yes

?- X in 0..5, X in 7..8.
    0 Call X in 0..5 ? 
    0 Exit X in 0..5 ? 
    0 Call X in 7..8 ? 
    0 Fail X in 7..8 ? 
No

?- neq(A, 1), A = 1.
    0 Call neq(A, 1) ? 
    0 Exit neq(A, 1) ? 
    0 Call A = 1 ? 
    0 Fail A = 1 ? 
No

是否有一种优雅的方法来禁用模块/包,但仍然可以看到模块/包的顶级调用/退出?

prolog trace swi-prolog
1个回答
1
投票

有多种方法可以控制SWI-Prolog中的调试过程,请参阅http://www.swi-prolog.org/pldoc/man?section=debugging。在这种情况下你可以使用skip选项,它将“跳过此呼叫或唤醒端口的退出端口”。在Enter的跟踪intead期间按s激活该选项。

在这种情况下,跳过所有调用会产生一个与您的Jekejeke示例非常相似的跟踪(尽管格式不太好):

?- use_module(library(clpfd)).
true.

?- trace.
true.

[trace]  ?- X in 0..5, X in 7..8.
   Call: (9) clpfd:clpfd_in(_7788, 0..5) ? skip
   Exit: (9) clpfd:clpfd_in(_8226{clpfd = ...}, 0..5) ? creep
   Call: (9) integer(_8226{clpfd = ...}) ? skip
   Fail: (9) integer(_8226{clpfd = ...}) ? creep
   Call: (9) clpfd:clpfd_in(_8226{clpfd = ...}, 7..8) ? skip
   Fail: (9) clpfd:clpfd_in(_8226{clpfd = ...}, 7..8) ? creep
false.
© www.soinside.com 2019 - 2024. All rights reserved.