内部谓词 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/2
和 evaluate2/2
计算在某些 (is)/2
目标被编译时仍然可变的算术表达式...)
你猜对了。 prolog:evaluate/2
和 prolog:evaluate2/2
谓词是当无法在 C 中直接评估表达式(或在使用 JIT 编译器的汇编中)时使用的帮助器。通常是因为(子)表达式在编译时是一个变量,然后在运行时是一个复合项。
当解释代码(断言或咨询)计算带有 is/2
和其他谓词的算术表达式时,它们也会被调用。
除了询问 SICStus 开发人员(像我)之外,没有办法知道这些事情。
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/2
和 evaluate2/2
计算在某些 (is)/2
目标被编译时仍然可变的算术表达式...)
你猜对了。 prolog:evaluate/2
和 prolog:evaluate2/2
谓词是当无法在 C 中直接评估表达式(或在使用 JIT 编译器的汇编中)时使用的帮助器。通常是因为(子)表达式在编译时是一个变量,然后在运行时是一个复合项。
当解释代码(断言或咨询)计算带有 is/2
和其他谓词的算术表达式时,它们也会被调用。
除了询问 SICStus 开发人员(像我)之外,没有办法知道这些事情。