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).

には 2 つの選択ポイントがあると予想しています?- 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 ] ? ;
    番号
    | | ?- 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