我是Prolog的新手,但我被困在这个简单的命令上。我已经装好了
一个没有错误的知识库,每当我尝试声明(甚至帮助)时,我
得到以下消息:

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


我到底想念什么?感激。

最佳答案

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

由于以下原因导致的数据库中的任何更改
执行目标(例如,当
subgoal是assertz/1retract/1的调用)
仅激活之后开始执行。的
更改不应影响当前的任何激活
被执行。

注—因此,数据库在执行过程中被冻结
一个目标,并且定义谓词的子句列表固定为
它执行的时刻(见7.7.7 e)。


请注意,在DECsystem 10 Prolog中,该手册在assert/1assertz/1之间产生了很大的不同。在1978年DECsystem 10用户指南的以下引用中,术语“实现定义”只能表示标准中称为“依赖于实现”的含义(本质上是未定义的)。


5.5元逻辑

...

assert(C)


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


asserta(C)


assert(C)相似,不同之处在于new子句成为第一个
有关程序的条款。


assertz(C)


assert(C)相似,只是new子句成为最后一个子句
有关程序的条款。



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

10-06 10:47