7

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

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

我到底错过了什么?赞赏。

4

1 回答 1

8

使用assertz/1asserta/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 逻辑数据库更新

由于
执行目标而发生的数据库中的任何更改(例如,当子目标的激活器是对or
的调用时)应 仅影响随后开始执行的激活。 更改不应影响当前 正在执行的任何激活。assertz/1retract/1


注意——因此数据库在目标执行期间被冻结
,并且定义谓词的子句列表在其执行时是固定
的(见 7.7.7 e)。

assert/1请注意,在 DECsystem 10 Prolog 中,手册在和之间有很大的不同assertz/1。在以下引自 1978 年 DECsystem 10 用户指南的引文中,术语实现定义只能表示标准中称为实现相关的内容(意味着本质上未定义)。

5.5 元逻辑

...

assert(C)

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

asserta(C)

与 类似assert(C),只是新子句成为相关
过程的第一个子句。

assertz(C)

与 类似assert(C),只是新子句成为相关
过程的最后一个子句。

assert/1今天也有assertz/1不同的系统。例如,

于 2013-11-17T04:36:21.413 回答