【问题标题】:GNU Prolog assert errorGNU Prolog 断言错误
【发布时间】:2013-11-17 04:25:55
【问题描述】:

我是 Prolog 的新手,但我被这个所谓的简单命令困住了。我已经加载 一个没有错误的知识库,每当我尝试做 assert(甚至是 help)我 收到以下消息:

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

我到底错过了什么?赞赏。

【问题讨论】:

  • assert/1 在 GNU Prolog 中不存在。 (这就是“existence_error”的意思。)您需要使用asserta/1assertz/1

标签: prolog gnu-prolog iso-prolog prolog-assert


【解决方案1】:

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

由于
而导致的数据库中的任何更改 执行一个目标(例如,当 a
子目标是调用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),只是新子句成为第一个
有关程序的条款。

assertz(C)

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

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

【讨论】:

  • 在 XSB 中,assertz/1 给出了一个 trie 警告,而 assert/1 没有(第 6.14 节)。更奇怪的是,文档中提到了没有使用逻辑视图并且 asserta/1 可以比 assertz/1 更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2018-05-19
  • 2014-09-27
相关资源
最近更新 更多