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)
我究竟缺少什么?赞赏.
使用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逻辑数据库更新
由于
执行目标而发生的数据库中的任何更改(例如,当
子目标的激活器是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/1
和assertz/1
不同.例如,xsb.