SICStus Prolog:statistics/2 个值受 JIT 影响
SICStus Prolog: statistics/2 values affected by JIT
更新: 据@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]).
的两个选择点——但是 none 的 ?- 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
我想知道上面的差异是否是故意的...感谢您的帮助!
差异不是故意的。它应该在最新版本的 SICStus Prolog (4.3.3) 中消失。
请注意,即使在 SICStus 4.3.3 之前,choice_used
也没有什么不同,并且该统计数据可能是您应该使用的 "quantify non-determinacy"。
更新: 据@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]).
的两个选择点——但是 none 的 ?- 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
我想知道上面的差异是否是故意的...感谢您的帮助!
差异不是故意的。它应该在最新版本的 SICStus Prolog (4.3.3) 中消失。
请注意,即使在 SICStus 4.3.3 之前,choice_used
也没有什么不同,并且该统计数据可能是您应该使用的 "quantify non-determinacy"。