SICStus Prolog:受JIT影响的统计数据/ 2个值

时间:2016-05-22 19:16:33

标签: prolog benchmarking sicstus-prolog

更新:正如@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

    $ export SP_JIT=enabled && sicstus
    % ...
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,904] ? ;
    no
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,16] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,1264] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,8] ? ;
    no
    
  • 没有 JIT

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

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

1 个答案:

答案 0 :(得分:4)

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

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