Внутренние предикаты оценивают / 2 и оценивают2 / 2

Профилировщик выполнения SICStus Prolog 4.5.1 сообщил мне следующее:

| ?- print_profile.
       insns   try/retry      called        name
----------------------------------------------------------------
                          ...
----------------------------------------------------------------
                             1769156/8845768    prolog:evaluate/2
                             7076612/8845768    prolog:evaluate2/2
    76073600     7076616     8845768        prolog:evaluate2/2
                             7076612/8845768    prolog:evaluate2/2
----------------------------------------------------------------
                          ...

Из любопытства: что такое evaluate2/2 и как узнать, в каких частях кода Пролога он вызывается?

(Я предполагаю, что evaluate/2 и evaluate2/2 оценивают арифметические выражения, которые все еще изменяются, когда некоторые (is)/2 цели скомпилированы ...)


person repeat    schedule 21.08.2019    source источник


Ответы (1)


Ваша догадка верна. Предикаты prolog:evaluate/2 и prolog:evaluate2/2 являются помощниками, которые используются, когда выражение не может быть вычислено непосредственно в C (или в сборке с JIT-компилятором). Обычно потому, что (под) выражение было переменной во время компиляции, а затем составным термином во время выполнения.

Они также вызываются, когда интерпретируемый код (утверждаемый или запрашиваемый) оценивает арифметические выражения с is/2 и другими предикатами.

Невозможно узнать об этом, кроме как спросить разработчиков SICStus (таких как я).

person Per Mildner    schedule 21.08.2019
comment
Очень полезно! По-видимому, значительная часть этих вызовов в library(clpz) исходит из удобных предикатов / грамматик, таких как X is E --> { X is E }., что делает некоторый код немного более читаемым, хотя и с некоторыми затратами времени выполнения ... теперь пришло время выяснить другие (легко устранимые) варианты использования evaluate/2 ! - person repeat; 21.08.2019