内部谓词 evaluate/2 和 evaluate2/2

Internal predicates evaluate/2 and evaluate2/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 以及如何找出 Prolog 代码的哪些部分调用了它?

(我最好的猜测是:evaluate/2evaluate2/2 计算在某些 (is)/2 目标被编译时仍然可变的算术表达式...)

你猜对了。 prolog:evaluate/2prolog:evaluate2/2 谓词是当无法在 C 中直接评估表达式(或在使用 JIT 编译器的汇编中)时使用的帮助器。通常是因为(子)表达式在编译时是一个变量,然后在运行时是一个复合项。

当解释代码(断言或咨询)计算带有 is/2 和其他谓词的算术表达式时,它们也会被调用。

除了询问 SICStus 开发人员(像我)之外,没有办法知道这些事情。