SICStus Prolog: статистика /2 значения, затронутые 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]). Но никто не ?- boolsB([0,0]).

Числа, которые я получаю сразу после запуска JIT, отличаются от тех, которые я получаю, как только это будет сделано:

  • С JIT

    $ export 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 = отключено && 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]?;
    нет
    

Интересно, если вышеуказанное расхождение является преднамеренным... Спасибо за вашу помощь!

1 ответ

Решение

Разница не была преднамеренной. Этого не должно быть в последней версии SICStus Prolog (4.3.3).

Обратите внимание, что choice_used не отличался даже до SICStus 4.3.3, и эту статистику, вероятно, следует использовать для "количественного определения недетерминированности".

Другие вопросы по тегам