在从子句转换为术语时,ISO Prolog标准如何要求保留变量标识?

时间:2016-06-05 17:13:13

标签: prolog iso-prolog

我在阅读 ISO / IEC 13211-1 ,子条款7.6.3和7.6.4时遗漏了一些内容:

  

7.6.3将条款的头部转换为术语

     

带有谓词指标H的头P/N可以转换为字词T

     

a)如果N为零,那么T就是原子P

     

b)如果N非零,那么TTT的重命名副本(7.1.6.2),其中TT是其主要函子的复合词P/N以及HTT的参数相同。

     

7.6.4将条款正文转换为术语

     

目标G是预测指标P/N的预测,可以转换为字词T

     

a)如果N为零,那么T就是原子P

     

b)如果N非零,那么TTT的重命名副本(7.1.6.2),其中TT是其主要函子的复合词P/N以及GTT的参数相同。

     

c)如果G是表9中出现的控制结构,则T是具有相应主要函子的术语。如果T的主要仿函数为call/1catch/3throw/1,则GT的参数相同,否则T的仿函数为(',')/2(;)/2(->)/2,然后G的每个参数也应转换为术语。

假设我们有一个公共(7.5.3)(例如动态)用户定义的谓词a/1,由以下单个子句定义:

a(X) :- b(X).

显然,目标

?- clause(a(A), b(B)), A == B.

应该成功。引用clause/2(8.8.1.1)的定义的一部分:

  

a)按顺序搜索数据库中的每个公共用户定义过程,并创建所有术语L的列表clause(H, B),以便

     

1)数据库包含一个子句,其头部可以转换为术语H(7.6.3),其主体可以转换为术语B(7.6.4),以及

     

2)HHead

统一      

3)BBody统一。

将上述条款的头部转换为术语7.6.3 b),我们创建a(A)的重命名副本a(X)。同样,转换子句的主体,7.6.4 b)适用,我们创建b(B)的重命名副本b(X)

问题是a(A)b(B)是单独重命名的副本。如我们所期望的那样,AB如何是相同的变量?

同样的问题可以被要求提供一个条款

p :- q(X), r(X).

当我们将此子句的主体转换为术语时,7.6.4 c)适用,该术语的主要仿函数应为(',')/2,其中两个参数为目标q(X)r(X)已转换为条款。但这些是预测,而且7.6.4 b)适用,因此两个结果术语再次分别重命名为副本。

我错过了什么?

0 个答案:

没有答案