更新: @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] ? ; 番号
上記の不一致は意図的なものなのだろうか... ありがとうございます!