GNU Prolog 断言错误
-
21-12-2019 - |
题
我是 Prolog 新手,但我被这个看似简单的命令困住了。我已经加载了一个没有错误的知识库,每当我尝试做时 断言 (乃至 帮助)我收到以下消息:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
我究竟缺少什么?赞赏。
解决方案
使用 assertz/1
或者 asserta/1
反而。GNU-Prolog 不提供 assert/1
因为只有 asserta/1
和 assertz/1
标准中定义。
请注意,虽然 asserta/1
总是有一个明确的解释意义 在开头添加子句, , 的含义 assertz/1
更难以解决,因为“在末尾添加一个子句”并不能完全确定在断言该子句之前调用的目标的语义。
使用 ISO-Prolog,之前已调用的目标 assertz/1
(但是也 retract/1
)不受影响。这被称为 逻辑更新视图. 。引用标准 (ISO/IEC 13211-1:1995):
7.5.4 逻辑数据库更新
由于以下原因而发生的数据库中的任何更改
执行一个目标(例如,当一个目标的激活者
子目标是调用assertz/1
或者retract/1
)将影响
仅是随后开始执行的激活。这
更改不应影响当前的任何激活
正在被处决。注意 - 因此数据库在执行期间被冻结
一个目标,定义谓词的子句列表固定为
执行的时刻(见 7.7.7 e)。
请注意,在 DECsystem 10 Prolog 中,手册在 assert/1
和 assertz/1
. 。在以下引用自 1978 年 DECsystem 10 用户指南的内容中,术语 实施定义 只能表示标准中已知的内容 依赖于实现 (本质上是未定义的)。
5.5 元逻辑
...
assert(C)
当前实例
C
被解释为子句并添加
到当前解释的程序(带有新的私有变量
替换任何未实例化的变量)。新人的地位
相关过程中的子句是实现定义的。
C
必须实例化为非变量。
asserta(C)
喜欢
assert(C)
, ,除了新子句成为第一个子句
有关程序的条款。
assertz(C)
喜欢
assert(C)
, ,除了新子句成为最后一个子句
有关程序的条款。
今天还有一些系统 assert/1
和 assertz/1
不同。例如。, xsb.