Skip to content

算法Algorithm

一阶统一

施工中 · 内容逐步修订

First-order unification · Syntactic unification

寻找使若干一阶项在替换后相等的最一般替换。

形式陈述 ​

给定有限的一阶项方程集合 E={si≐ti},一阶替换 θ 是从变量到有限一阶项的有限映射,并按项树结构递归延拓:映射中列出的变量替换为其像,未列出的变量与常量保持不变,函数项逐个替换其子项。这是同时替换:一次命中变量后直接返回给定像,不再用同一替换递归展开该像;先后两次替换须另作复合。一阶项内部没有绑定构造,因此这里不发生变量捕获。若对每个方程都有 θ(si)=θ(ti),则 θ 是统一子;它是最一般统一子(MGU),若任一其他统一子 σ 都可写为 σ=δ∘θ。

标准统一算法反复执行分解、删除、变量消去与冲突检查:f(s1,…,sn)=f(t1,…,tn) 分解为分量方程;x=t 可把 x 替换为 t,但要求 x 不出现在 t 中;函数符号或元数不同则失败。该 occurs check 防止构造无限一阶项。若问题可统一,算法返回的解在变量改名意义下唯一最一般。

直觉

统一不是给每个变量随便猜一个值,而是在保留尽可能多自由度的前提下让两棵项树结构一致。根函数符号必须相同,随后问题递归下降到对应子树;变量则像洞,可以被一棵不含自身的项填入。MGU 只记录被方程强迫的等式,任何更具体解都由继续实例化它得到。occurs check 是有限项世界的边界:允许 x=f(x) 会要求一棵包含自身作为真子树的无限结构。

一阶统一的分解与 occurs check
例子与边界

方程 f(x,a)≐f(b,y) 分解为 x≐b 与 a≐y,得到 MGU {x↦b,y↦a}。方程 f(x,x)≐f(a,b) 在 a≠b 时失败,因为同一变量被迫同时等于两个不同常量。

x≐f(x) 的 occurs check 失败;若省略检查,某些实现会得到有环的 rational tree,但那已不是标准有限一阶项的统一。带绑定器的语法才必须采用无捕获替换,不能直接套用这里的结构替换。带交换律、结合律或高阶变量的统一也不再是这里的简单问题,复杂度与可判定性会显著改变。

推论与应用

一阶统一是Hindley–Milner 类型推断的约束求解核心:类型构造器扮演函数符号,类型变量扮演一阶变量。Algorithm W在应用处统一函数类型与实参类型,并把得到的替换传播到环境。

逻辑编程、项重写、定理证明和模式匹配也依赖统一;算法正确性需要同时证明返回替换确为统一子、最一般,并在不可统一时可靠失败。

W中的完整统一器不变量把“最一般”展开为原方程全部解与残余解的因子分解等式,并证明变量消去、构造器冲突与occurs-check的两向正确性;变量个数与类型树大小的字典序解释替换膨胀时为何仍终止。

参考资料
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系