我是Prolog的新手,但我仍然坚持这个简单的命令。我装了 一个没有错误的知识库,每当我尝试断言(甚至帮助)我 得到以下消息:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
我到底缺少什么?赞赏。
答案 0 :(得分:8)
改为使用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逻辑数据库更新
由于结果而发生的数据库中的任何更改 执行目标(例如,当一个目标的激活者 subgoal是
assertz/1
或retract/1
的调用,会影响到 只是之后执行的激活。该
更改不得影响当前的任何激活 被执行。注 - 因此数据库在执行期间被冻结 目标,定义预测的条款列表固定为
执行的那一刻(见7.7.7 e)。
请注意,在DECsystem 10 Prolog中,手册在assert/1
和assertz/1
之间产生了很大的差异。在1978年DECsystem 10用户指南的以下引用中,术语实现定义只能表示标准中已知的实现依赖(意思是基本上未定义)。 / p>
5.5元逻辑
...
assert(C)
C
的当前实例被解释为一个子句并添加了
到当前的解释程序(使用新的私有变量
替换任何未实例化的变量)。新的位置 有关程序中的条款是实施定义的C
必须实例化为非变量。
asserta(C)
与
assert(C)
类似,只是新条款成为第一个 有关程序的条款。
assertz(C)
与
assert(C)
类似,但新条款成为最后一个 有关程序的条款。
今天还有assert/1
和assertz/1
不同的系统。例如,xsb。