2

更新:正如@PerMildner 所报告的,以下问题(存在于 SICStus Prolog 4.3. 2中)已随着新的 SICStus Prolog 4.3 消失。3好样的!


我正在使用 SICStus Prolog 4.3.2,并且我正在了解一些我以前没有使用过的键......这是我的代码: statistics/2

:- use_module(library(lists)).

a_is_b_minus_c(A,B,C) :-
   A is B-C.

call_keys_deltas(Goal_0, Keys, Deltas) :-
   maplist(statistics, Keys, Values0),
   call(Goal_0),
   maplist(statistics, Keys, Values1),
   maplist(a_is_b_minus_c, Deltas, Values1, Values0).

call_keys_deltas/3收集有关谓词执行的一些信息,例如:

boolsA([]).                        
boolsA([0|Bs]) :- boolsA(Bs).
boolsA([1|Bs]) :- boolsA(Bs).

%%

bool(0).
bool(1).

boolsB([]).
boolsB([B|Bs]) :- bool(B), boolsB(Bs).

我期待有两个选择点?- boolsA([0,0]).——但没有?- boolsB([0,0]).

JIT 运行后立即得到的数字与运行完成后得到的数字不同:

  • 使用 JIT

    $ 出口 SP_JIT=启用 && sicstus
    % ...
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds)。
    Ds = [112, 904 ] ? ;
    不
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds)。
    Ds = [112,16] ? ;
    不
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds)。
    Ds = [0, 1264 ] ? ;
    不
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds)。
    Ds = [0,8] ? ;
    不
    
  • 没有JIT

    $ export SP_JIT=disabled && sicstus
    % ...
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds)。
    Ds = [112,16] ? ;
    不
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds)。
    Ds = [112,16] ? ;
    不
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds)。
    Ds = [0,8] ? ;
    不
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds)。
    Ds = [0,8] ? ;
    不
    

我想知道上述差异是否是故意的......感谢您的帮助!

4

1 回答 1

4

差异不是故意的。它应该在最新版本的 SICStus Prolog (4.3.3) 中消失。

请注意choice_used,即使在 SICStus 4.3.3 之前,也没有什么不同,并且您可能应该使用该统计数据来“量化不确定性”。

于 2016-06-23T19:25:43.447 回答