GNU Prolog断言错误

时间:2013-11-17 04:25:55

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

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

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

我到底缺少什么?赞赏。

1 个答案:

答案 0 :(得分: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逻辑数据库更新

     

由于结果而发生的数据库中的任何更改   执行目标(例如,当一个目标的激活者   subgoal是assertz/1retract/1的调用,会影响到   只是之后执行的激活。该
  更改不得影响当前的任何激活   被执行。

     

注 - 因此数据库在执行期间被冻结   目标,定义预测的条款列表固定为
  执行的那一刻(见7.7.7 e)。

请注意,在DECsystem 10 Prolog中,手册在assert/1assertz/1之间产生了很大的差异。在1978年DECsystem 10用户指南的以下引用中,术语实现定义只能表示标准中已知的实现依赖(意思是基本上未定义)。 / p>

  

5.5元逻辑

     

...

     

assert(C)

     
    

C的当前实例被解释为一个子句并添加了
    到当前的解释程序(使用新的私有变量
    替换任何未实例化的变量)。新的位置     有关程序中的条款是实施定义的     C必须实例化为非变量。

  
     

asserta(C)

     
    

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

  
     

assertz(C)

     
    

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

  

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