软件学报
JOURNAL OF SOFTWARE
1999年 第10卷 第7期　No.7 Vol.10 1999



一阶反合一研究
许满武　潘光睿　周荣国　宋晓梁　刘东升
　　摘要　文章讨论一阶反合一问题以及求反合一子完备集的算法.在合一问题中,有多种求解合一问题的方法,其中研究得较为彻底的是用转换规则进行求解的方法.在研究反合一问题的过程中,人们也陆续提出了许多转换规则,这样做的结果是最终给出的是已解出形.该文在已解出形的基础上讨论一种方法，以给出具体解的完备集（反合一子完备集）.通过引入Gθ和Z函数，使求解更为方便、直观.
　　关键词　反合一,反合一子,最一般反合一子,反合一子完备集.
　　中图法分类号　TP18
First-Order Disunification
XU Man-wu　PAN Guang-rui　ZHOU Rong-guo　SONG Xiao-liang LIU Dong-sheng
(Department of Computer Science and Technology　Nanjing University　Nanjing　210093)
(State Key Laboratory for Novel Software Technology　Nanjing University　Nanjing　210093)
　　Abstract　In this paper, the authors discuss the first-order disunification and the algorithm for computing the complete set of disunifiers. There are many methods for solving unification problem, the method by using translation rules has been thoroughly studied. Many translation rules are also given out in the study of disunification problem. By using translation rules, people usually get some solved forms for the problem. In this paper, the authors are concerted with the method for giving out the complete set of disunifiers based on solved forms. The method becomes more convenient and direct by using functions Gθand Z.
　　Key words　Disunification, disunifier, most general disunifier, complete set of disunifiers.
　　合一是一类重要的计算问题,它广泛地应用于计算机科学的各个分支领域.随着研究领域的拓宽,合一问题的种类也逐渐丰富起来.其中比较典型的有方程式合一（E-unification）、高阶合一（high-order unification）以及半合一（semi-unification）.总的说来,在研究这些合一时,人们主要关心的是“相等”或“弱相等”的问题.后来,人们在研究函数式语言的模式匹配时,需要讨论一些从反例中学习的问题；在研究重写系统时,需要讨论有关充分完备性的问题,等等,这些都牵涉到了“不等”.于是人们又把一部分目光由“相等”转向了“不等”,这就导致了“反合一问题”的研究.
　　简单说来,对于合一问题〈s=t〉,我们关心的是求合一子θ,使得θs=θt；而对于反合一问题〈s≠t〉,我们关心的是那些使不等式成立的替换σ,使得σs≠σt.
　　在对反合一问题进行研究的过程中,人们不可避免地要参照和借鉴合一问题中的一些概念、方法.在合一问题中,有多种求解合一问题的方法,其中比较典型的是用转换规则进行求解［1］.在研究反合一问题的过程中,人们也陆续提出了许多转换规则［2］,这样做的结果是最终给出的是已解出形.而在本文中,我们关心的是在已解出形的基础上讨论一种方法,以给出具体解的完备集（反合一子完备集）.通过引入Gθ和Z函数,使求解更为方便、直观.在下文展开前,我们先作一些约定.
　　在本文中所涉及的项均是一阶项,合一中的等价关系是指字面等价关系,“≠”是指字面不等价关系.
　　Var（□）表示由□中所有变量组成的集合,其中□可以是项,可以是替换,也可以是Gθ和Z(s,t)（这两个函数将在下文中定义）.
　　以“。”表示替换的复合运算.例如,σ和θ的复合运算记为σ。θ,对任意t∈T,σ。θ(t)=θ(σ(t)).
　　其他有关的概念请参考文献［1,3,4］.
1 基本概念
　　定义1.1. 反合一问题,反合一子.
　　任给项对〈s,t〉,问是否存在替换σ,使得σs≠σt,且对任意的替换δ总有.这就是反合一问题,记为〈s≠t〉.若存在这样的σ,则σ称为反合一子.
　　定义1.2. 最一般反合一子,最一般反合一子的集合,反合一子的完备集,最一般反合一子的完备集.
　　(1) 对于任意给定的反合一问题〈s≠t〉,其所有反合一子构成的集合记为DU(s,t),在不引起混淆的情况下简记为DU.
　　(2) MGDU(s,t)（简记为MGDU）表示〈s≠t〉的最一般反合一子：
　　若σ∈DU,则σ是MGDU当且仅当对于任意θ∈DU,若θ≤σ,则σ=θ（此处,θ≤σ,是指存在ρ使得ρ。θ=σ）.
　　(3) cDU称为〈s≠t〉的反合一子完备集,满足：
　　(3.1) cDUDU；
　　(3.2) 对任意θ∈DU,存在σ∈cDU使σ≤θ.
　　(4) μDU表示最一般反合一子的集合：由最一般反合一子构成的集合.
　　(5) μcDU最一般反合一子的完备集：既是cDU又是μDU的集合.
2 相关定理
　　为了便于讨论,我们在此做一些必要的准备工作.
　　首先,由于在讨论替换间的关系以及构造新替换时,直接使用替换来讨论不如把它先转化为项的形式更为方便,所以我们将引入一个与某替换θ对应的函数Gθ,Gθ“独立于”项集T.众所周知,项集T是定义在函数集F和可数变量集V之上的.说Gθ“独立于”项集T,意思是GθF.
　　Gθ与θ有如下关系：s,t∈T,
　　　　　　　　　　Var(s)∪Var(t)={x1,x2,...,xn}.
　　当θ为恒等替换(Id)时,θ对应着GId(x1,x2,...,xn).
　　当θ形如{t1/y1,...,tm/ym}时,θ对应着
　　　　　　Gθ=θGId=GId(θ(x1),θ(x2),...,θ(xn))=Gθ(s1,s2,...,sn),
其中si=θ(xi).
　　为了方便，可将Gθ(s1,s2,...,sn)简记为Gθ.
　　当已有θ及其所对应的Gθ(s1,s2,...,sn),在作复合运算θ。ρ=σ时,σ对应着
　　　　Gσ=Gθ。ρ=ρGθ=Gθ(ρ(s1),ρ(s2),...,ρ(sn))=Gσ(r1,r2,...,rn),
其中ri=ρ(si).
　　此外,Gθ(s1,s2,...,sn)=Gσ(r1,r2,...,rm)当且仅当m=n且ri＝si.
　　其次,既然讨论替换间的关系,我们关心的是当不同的替换作用在项对〈s,t〉上时产生的效果有何不同,故此,我们把s,t作为一个整体来对待,于是我们引入另一个与s,t有关的、独立于项集T的二元函数Z(s,t),Z的两个变目的位置分别放入s和t,并且对任意替换ρ有
　　　　　　　　　　　　ρ(Z(s,t))=Z(ρ(s),ρ(t)).
　　此外,Z(s1,t1)=Z(s2,t2)当且仅当s1=s2且t1=t2.这样一来,替换对〈s,t〉的作用就变成了对项Z(s,t)的作用,处理起来更为方便.需要注意的是,尽管我们引入了G,Z两个函数,但由于它们独立于T,所以在下文中,G,Z不会像T里的那些函数那样出现在替换里.
　　至此,我们的准备工作就完成了.下面进入相关定理的研究.
　　定理2.1. 给定项对〈s,t〉,若θ为〈s,t〉的合一子,σ为〈s,t〉的反合一子,则必有
　　　　　　　　　　　
证明:用反证法.假设存在δ1,δ2,使得
　　　　　　　　　　　　　　　　　　　　(1)
由式(1)　　　　　
　　　　　　　　
由于θ为〈s,t〉的合一子,故
　　　　　　　　　　　　　　　
由式(2）、(3）得
　　　　　　　　　　　　　　　
式(4）与σ为〈s,t〉的反合一子矛盾.反证完成.　　□
　　推论2.2. 给定项对〈s,t〉,若θ为〈s,t〉的最一般合一子（MGU）,则σ为〈s,t〉的反合一子,当且仅当ρ1ρ2(θ
　　证明:先证,这由定理2.1可以得到.再证,用反证法.
　　假设σ不为〈s,t〉的反合一子,则必存在δ,使得,即是合一子.由于θ为MGU,所以存在τ,使得
　　　　　　　　　　　　　　　　
即　　　　　　　　　　　　
这与矛盾,故σ为〈s,t〉的反合一子.　　□
　　需要注意的是,在推论2.2的条件中θ必须为MGU,这要比定理2.1的条件严格一些,否则,推论2.2不成立.例如,有项对〈s,t〉,其中s=x,t=y,还有〈s,t〉的一个合一子θ={g(a)/x,g(a)/y}以及替换σ={h(a)/x,h(a)/y},尽管,但σ却不是反合一子,它是合一子.
　　定理2.3. 已知项对〈s,t〉及其上的两个替换θ和σ,对于任意替换ρ1,ρ2,
　　　　　　　　　　　当且仅当ρ1Gθ≠ρ2Gσ.
　　证明:先证.
　　令　　　　　　　　　　　
　　由已知可得：必存在某个xi∈Var(s)∪Var(t),
　　　　　　　　　　　τ1(xi)≠τ2(xi).　　　　　　　　　　　　　(5)
由式(5)可得GId(τ1(x1),...,τ1(xi),...,τ1(xn))≠GId(τ2(x1),...,τ2(xi),...,τ2(xn)),
即　　　　　　　　　　　　　　Gτ1≠Gτ2,
即　　　　　　　　　　　　　Gθ。ρ1≠Gσ。ρ2,
即　　　　　　　　　　　　　　ρ1Gθ≠ρ2Gσ.
　　再证.
由已知ρ1Gθ≠ρ2Gσ可得
　　　　　　　　　　□
定理2.4. 已知项对〈s,t〉及其上的两个替换θ和σ,
　　　　　　当且仅当ρ1ρ2(ρ1Gθ≠ρ2Gσ).
证明:先证,用反证法.假设存在τ1,τ2,使得τ1Gθ=τ2Gθ,即
　　　　　　　　　　　　
　　由式(6)得：任给xi∈Var(s)∪Var(t),
　　　　　　　　　　θ。τ1(xi)=σ。τ2(xi).　　　　　　　　　　(7)
由式(7)可得
　　　　　　　　　　　　　　　　　　　　　　　　(8)
和
　　　　　　　　　　　　　　　　　　　　　　　 (9)
由式(8)、(9)得
　　　　　　　　　　
这与矛盾.
　　再证,用反证法.
　　假设存在τ1,τ2,使得,则任给xi∈Var(s)∪Var(t),
　　　　　　　　　　　　　　　　　　　　　　(10)
由式(10)得　　　　　
即　　　　　　　　　　τ1Gθ=τ2Gσ,
这与ρ1ρ2(ρ1Gθ≠ρ2Gσ)矛盾.
　　综上所述,命题成立.　　　□
　　定理2.5. 已知项对〈s,t〉及其上的两个替换θ和σ,若Var(Gθ)∪Var(Gσ)=,则ρ(ρGθ≠ρGσ)当且仅当ρ1ρ2(ρ1Gθ≠ρ2Gσ).
　　证明：先证,用反证法.
　　假设存在τ1,τ2,使得τ1Gθ=τ2Gθ,其中τ1形如{t1/x1,...,tn/xn},τ2形如{r1/y1,...,rm/ym},我们用τ1,τ2构造如下替换：
　　　　　　　　　　
　　　　　　　　　　τ=τ′1∪τ′2.
　　由于τ1中{ti/xi｜xiVar(Gθ)}对Gθ不会起作用；同样地,τ2中{ri/ yi｜yiVar(Gσ)}对Gσ不会起作用,所以
　　　　　　　　τ1Gθ=τ′1Gθ,τ2Gσ=τ′2Gσ.　　　　　　　　　　(11)
　　又由于Var(Gθ)∩Var(Gσ)=,所以,任给ti/xi∈τ′1,xiVar(Gσ).同样地,任给ri/yi∈τ′2,yiVar(Gθ),所以,
　　　　　　　　　　τGθ=τ′1Gθ,τGσ=τ′2Gσ　　　　　　　　　　(12)
由式(11)、(12)得
　　　　　　　　　τGθ=τ′1Gθ=τ1Gθ,τGσ=τ′2Gσ=τ2Gθ.　　　　(13)
由式(13)和反证假设得
　　　　　　　　　　　　　　τGθ=τGσ,
这与ρ(ρGθ≠ρGσ)矛盾.
　　再证,用反证法.假设存在ρ使得ρGθ=ρGσ,其中ρ形如{t1/x1,...,tn/xn}.我们构造如下替换：
　　　　　　　　　　
由于{ti/xi｜xiVar(Gθ)}在替换中对Gθ不起作用,故
　　　　　　　　　　ρGθ=ρ1Gθ.　　　　　　　　　　　　　　　　　(14)
同理
　　　　　　　　　　ρGσ=ρ2Gσ.　　　　　　　　　　　　　　　　　(15)
由式(14)、(15)可得
　　　　　　　　　　ρ1Gθ=ρ2Gσ,
这与ρ1ρ2(ρ1Gθ≠ρ2Gσ)矛盾.
　　综上所述,定理成立.　　□
　　定理2.6. 已知项对〈s,t〉及其最一般合一子θ,函数集中至少含有1个元数大于等于1的函数.若存在r/x∈θ,r∈T且r中含有不同于x的变量（比如说是y）,则〈s,t〉必有无穷多个最一般反合一子.
　　证明：由已知：存在f∈F,arity(f)=k(k≥1),
　　　　　　　　　　　　r/x∈θ,y∈Var(r).
　　我们构造如下一系列替换：
　　　　　　　　　　
　　不难验证,诸σi都是反合一子,且诸σi之间（即σi与σj(i≠j)之间）不存在σi≤σj或σj≤σi的关系.利用诸σi之间在x处的替换的模式不同,可以构造出不同的最一般反合一子,此处不再赘述.由于σi的构造过程可无限递推下去,故〈s,t〉的最一般反合一子有无穷多个.
　　推论2.7. 已知项对〈s,t〉,函数集F中不含零元函数,但至少含有1个元数大于等于1的函数.若〈s,t〉仅有唯一的最一般反合一子σ,则σ必为恒等替换.
　　证明:假设σ不为恒等替换,则〈s,t〉必存在最一般合一子θ（因为〈s,t〉不存在最一般合一子当且仅当最一般反合一子为恒等替换）.又由于F中不含零元函数,故存在r/x∈θ,r中含有不同于x的变量y,y∈Var(s)∪Var(t).由定理1.6可知,〈s,t〉必有无穷多个最一般反合一子,这与已知条件中的〈s,t〉仅有唯一的最一般反合一子σ矛盾.故σ只能是恒等替换.　　□
　　注意,F中不能含有零元函数,否则定理不成立.如,已知〈s,t〉,s=x,t=a,F={f,a},arity(f)=1,arity(a)=0,通过观察可知〈x,a〉的最一般反合一子唯一,为σ={f(x)/x},而非恒等替换ρ={x/x}.
3 进一步讨论
　　下面我们将利用前面的结果来求反合一子的完备集.由推论2.2可知反合一子σ与最一般合一子θ的关系,即
　　　　　　　　　　
其中θ是可求的,现在要求的是σ.可是ρ1,ρ2都是任意的,不等式两边都不确定,如何去求σ并保证尽管ρ1,ρ2 随意变动而不等式又始终成立呢?
　　由于在前文我们引入了与θ对应的函数Gθ,再由定理2.3和定理2.4,我们可以把θ与σ的关系转化成Gθ与Gσ的关系.这样一来,我们希望通过构造Gσ,使得ρ1ρ2(ρ1Gθ≠ρ2Gσ),也就使得ρ2(Z(s,t))),从而得到与Gσ对应的σ,σ就是反合一子.
　　下面通过一个小小的转化来摆脱ρ1和ρ2随意变动所带来的不便.
　　考察一下合一子就可以看出,最一般合一子θ相当于一个模式,其他的合一子只是在其上作某种代入罢了.假如我们能找到另一些完全不同于最一般合一子θ模式的替换,则这些替换必为反合一子,这也正是定理2.1和推论2.2的含义.
　　既然最一般合一子θ是一种模式,我们就把它对应的Gθ中的所有变量改写成一些完全不同于项集T的符号系统S的符号.如，S中含有变量,我们可以把Gθ(f(x),y)改写成Gθ′(f(),而在构造其他替换σ所对应的Gσ时仍用项集T的符号系统.这样一来，Var(Gθ′)∩Var(Gσ)=.
　　我们只要使Gσ与Gθ′不能合一（合一过程是在符号系统T∪S下进行的）,借助于定理2.5可得ρ1ρ2(ρ1Gθ′≠ρ2Gσ).这样,ρ1和ρ2随意变动所带来的问题就解决了.至此,构造Gσ只找到了排列的方法,即在GId的所有位置代入项的所有可能情形,并与Gθ′进行合一检测,留下与Gθ′不可合一的Gσ,所有对应的σ就构成反合一子的完备集.
4 结束语
　　本文是以一阶项和字面合一为基础来讨论反合一问题的,至于以高阶项和方程式合一为基础来探讨反合一还是相当复杂的,有关这类问题,我们将在以后的工作中进一步去探索.
　　本文研究得到国家自然科学基金和国家863高科技项目基金资助.作者许满武,1944年生,博士,教授,主要研究领域为计算机软件,算法理论.潘光睿,1972年生,硕士,主要研究领域为计算机软件,算法理论.周荣国,1976年生,硕士生,主要研究领域为计算机软件,算法理论.宋晓梁,1974年生,硕士生,主要研究领域为计算机软件,算法理论.刘东升,1971年生,硕士生,主要研究领域为计算机软件,算法理论.
　　本文通讯联系人:许满武,南京210093,南京大学计算机科学与技术系
　　作者单位：南京大学计算机科学与技术系　南京　210093；南京大学计算机软件新技术国家重点实验室　南京　210093
　　E-mail: mwxu@netra.nju.edu.cn
参考文献
　1　Gallier Jean H, Snyder Wayne. Complete sets of transformations for general E-unification. Theorem Computer Science, 1989,67:203～260
　2　Comon Hubert, Lescanne Pierre. Equational problems and disunification. Journal of Symbolic Computation,1989,7(3&4):371～425
　3　Siekmann Jrgh. Unification theory. Journal of Symbolic Computation. 1989,7(3&4):207～274
　4　Mitchell John C. Foundations for programming languages. Cambridge, MA: MIT Press, 1996
1998-04-07收到原稿 
1998-08-03收到修改稿
