Prolog 内部谓词evaluate/2和evaluate2/2

Prolog 内部谓词evaluate/2和evaluate2/2,prolog,sicstus-prolog,Prolog,Sicstus Prolog,SICStus Prolog 4.5.1的执行分析器向我报告了以下内容: | ?- print_profile. insns try/retry called name ---------------------------------------------------------------- ... -------------------------------------------------

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 ---------------------------------------------------------------- ... |?打印您的个人资料。 insns尝试/重试调用的名称 ---------------------------------------------------------------- ... ---------------------------------------------------------------- 1769156/8845768序言:评估/2 7076612/8845768序言:评估2/2 76073600 7076616 8845768序言:评估2/2 7076612/8845768序言:评估2/2 ---------------------------------------------------------------- ... 出于好奇:什么是
evaluate2/2
,我如何找出Prolog代码的哪些部分调用它


(我的最佳猜测是:
evaluate/2
evaluate2/2
计算算术表达式,当编译了一些
(is)/2
目标时,这些表达式仍然是可变的…

您的猜测是正确的。
prolog:evaluate/2
prolog:evaluate2/2
谓词是无法在C(或JIT编译器的汇编)中直接计算表达式时使用的助手。通常是因为(子)表达式在编译时是变量,然后在运行时是复合项

当解释代码(断言或参考)使用
is/2
和其他谓词计算算术表达式时,也会调用它们


除了询问SICStus开发人员(比如我),没有办法知道这些事情

非常有帮助!显然,
library(clpz)
中这些调用的很大一部分来自方便的谓词/语法,如
X是E-->{X是E}。
这使得一些代码可读性更强,尽管在运行时会付出一些代价。。。现在是时候找出
evaluate/2
的其他(容易避免的)用途了!