我在阅读 ISO / IEC 13211-1 ,子条款7.6.3和7.6.4时遗漏了一些内容:
7.6.3将条款的头部转换为术语
带有谓词指标
H
的头P/N
可以转换为字词T
:a)如果
N
为零,那么T
就是原子P
。b)如果
N
非零,那么T
是TT
的重命名副本(7.1.6.2),其中TT
是其主要函子的复合词P/N
以及H
和TT
的参数相同。7.6.4将条款正文转换为术语
目标
G
是预测指标P/N
的预测,可以转换为字词T
:a)如果
N
为零,那么T
就是原子P
。b)如果
N
非零,那么T
是TT
的重命名副本(7.1.6.2),其中TT
是其主要函子的复合词P/N
以及G
和TT
的参数相同。c)如果
G
是表9中出现的控制结构,则T
是具有相应主要函子的术语。如果T
的主要仿函数为call/1
或catch/3
或throw/1
,则G
和T
的参数相同,否则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)
统一H
与Head
和3)
B
与Body
统一。
将上述条款的头部转换为术语7.6.3 b),我们创建a(A)
的重命名副本a(X)
。同样,转换子句的主体,7.6.4 b)适用,我们创建b(B)
的重命名副本b(X)
。
问题是a(A)
和b(B)
是单独重命名的副本。如我们所期望的那样,A
和B
如何是相同的变量?
同样的问题可以被要求提供一个条款
p :- q(X), r(X).
当我们将此子句的主体转换为术语时,7.6.4 c)适用,该术语的主要仿函数应为(',')/2
,其中两个参数为目标q(X)
和r(X)
已转换为条款。但这些是预测,而且7.6.4 b)适用,因此两个结果术语再次分别重命名为副本。
我错过了什么?