我是 Prolog 的新手,但我被这个所谓的简单命令所困扰。我已经加载了一个没有错误的知识库,每当我尝试断言(甚至帮助)时,我都会收到以下消息:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
我到底错过了什么?赞赏。
我是 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 逻辑数据库更新
由于
执行目标而发生的数据库中的任何更改(例如,当子目标的激活器是对or
的调用时)应 仅影响随后开始执行的激活。 更改不应影响当前 正在执行的任何激活。assertz/1
retract/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
不同的系统。例如,xsb。