更新:正如@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] ? ; 不
我想知道上述差异是否是故意的......感谢您的帮助!