我是 Prolog 新手,但我被这个看似简单的命令困住了。我已经加载了一个没有错误的知识库,每当我尝试做时 断言 (乃至 帮助)我收到以下消息:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}

我究竟缺少什么?赞赏。

有帮助吗?

解决方案

使用 assertz/1 或者 asserta/1 反而。GNU-Prolog 不提供 assert/1 因为只有 asserta/1assertz/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/1assertz/1. 。在以下引用自 1978 年 DECsystem 10 用户指南的内容中,术语 实施定义 只能表示标准中已知的内容 依赖于实现 (本质上是未定义的)。

5.5 元逻辑

...

assert(C)

当前实例 C 被解释为子句并添加
到当前解释的程序(带有新的私有变量
替换任何未实例化的变量)。新人的地位
相关过程中的子句是实现定义的。
C 必须实例化为非变量。

asserta(C)

喜欢 assert(C), ,除了新子句成为第一个子句
有关程序的条款。

assertz(C)

喜欢 assert(C), ,除了新子句成为最后一个子句
有关程序的条款。

今天还有一些系统 assert/1assertz/1 不同。例如。, .

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top