GNU Prolog断言错误

bel*_*ace 7 prolog gnu-prolog iso-prolog prolog-assert

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

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
Run Code Online (Sandbox Code Playgroud)

我究竟缺少什么?赞赏.

fal*_*lse 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逻辑数据库更新

由于
执行目标而发生的数据库中的任何更改(例如,当
子目标的激活器是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/1assertz/1不同.例如,.

  • 在XSB中,assertz/1为trie发出警告,而assert/1则不发出警告(第6.14节).进一步的陌生感在文档中提到了逻辑视图没有被使用,并且asserta/1可以比assertz/1更快. (2认同)