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
目标被编译时,算术表达式仍然可变...)
答案 0 :(得分:3)
您的猜测是正确的。 prolog:evaluate/2
和prolog:evaluate2/2
谓词是无法在C中直接评估表达式(或在JIT编译器中进行汇编)时使用的辅助函数。通常是因为(子)表达式在编译时是变量,然后在运行时是复合项。
当解释后的代码(断言或查询)使用is/2
和其他谓词评估算术表达式时,也会调用它们。
除了询问SICStus开发人员(如我)之外,没有其他方法可以知道这些事情。