Predicatep/1
正在使用内置的 predicate (is)/2
。请注意,这X is 5
是一种语法上更方便的书写方式is(X,5)
。但是您的元解释器只期望用户定义的谓词和控制结构(',')/2
和true/0
. 如果你想处理(is)/2
你必须为它引入一个单独的子句。
sol(X is Y) :- !, X is Y.
在 ISO Prolog 中,目标predicate_property(Goal,built_in)
可用于测试是否Goal
是内置谓词。这适用于许多系统,如 B、GNU、SICStus、SWI、XSB、YAP。所以你可以写:
sol(Bip) :- predicate_property(Bip, built_in), !, Bip.
在 ECLiPSe 中,这个内置不是直接可用的。你必须加载一个库。手册的索引建议使用 libraryswi
或quintus
. 由于某些(不清楚)原因,它不是 ECLiPSe 库的一部分iso
,但它是 ISO。所以状态
:- use_module(library(swi)).
首先在您的文件中(或在顶层)。
如果您希望元解释器涵盖完整的 Prolog 语言,则必须明确处理所有控制结构。它们在这里 - 如标准中所定义(7.8 控制结构)。
true/0
fail/0
call/1
!/0
(',')/2
(;)/2
- 析取
(->)/2
(;)/2
- 如果-那么-否则
catch/3
throw/1
Please be aware that only a few of them can be handled by directly calling the goal. Most of them must be handled explicitly!