程序验证(六):纳尔逊-欧朋算法(Nelson-Oppen Procedure)
动机
截至目前,我们学习了一些一阶理论,每一个都是关于某一种数据类型
然而,现实中的公式并不是由单一的理论组成,如:
∀ i . 0 ≤ i ≤ n → a [ i ] ≤ a [ i + 1 ] \forall i.0\le i\le n\to a[i]\le a[i+1] ∀i.0≤i≤n→a[i]≤a[i+1]
这个公式实际上包含了两个理论:等价与数组
我们需要找到一个方法,将复杂的一阶逻辑公式转化为简单的一阶逻辑公式
一些概念
复合理论
给定 T 1 , T 2 T_1,T_2 T1,T2,且 Σ 1 ∩ Σ 2 = { = } \Sigma_1\cap \Sigma_2 = \{=\} Σ1∩Σ2={ =},那么复合理论 T 1 ∪ T 2 T_1\cup T_2 T1∪T2有:
- 符号集: Σ 1 ∪ Σ 2 \Sigma_1 \cup \Sigma_2 Σ1∪Σ2
- 公理集: A 1 ∪ A 2 A_1 \cup A_2 A1∪A2
纳尔逊-欧朋(Nelson-Oppen)复合方法: T 1 ∪ T 2 T_1\cup T_2 T1∪T2是可判定的,如果 T 1 T_1 T1与 T 2 T_2 T2均满足: - 是量词自由的合取的片段(Quantifier-free, conjunctive fragments)
- 可判定的
- 稳定无限的(stably-infinite)
稳定无限的理论
一个建立在符号集 Σ \Sigma Σ上的理论 T T T是稳定无限的,如果对于每个量词自由的公式 F F F,只要 F F F是 T T T-可满足的,存在一个解释,它的大小(cardinality)是无限的
例如这样的一个理论:
- Σ = { a , b , = } \Sigma =\{a,b,=\} Σ={ a,b,=}
- 公理: ∀ x . x = a ∨ x = b \forall x.x=a\vee x=b ∀x.x=a∨x=b
这个理论不是稳定无限的,因为每个解释 ( D , I ) (D,I) (D,I)都有这样的性质: D D D包含至多两个元素,即 ∣ D ∣ ≤ 2 |D|\le 2 ∣D∣≤2
但是大多数我们关心的理论,即 T E , T A , T Z T_E,T_A,T_Z TE,TA,TZ等等,都是稳定无限的
纳尔逊-欧朋算法
概况
输入:由复合理论 T 1 ∪ T 2 T_1\cup T_2 T1∪T2得到的公式 F F F
输出:等价的公式 F 1 ∧ F 2 F_1\wedge F_2 F1∧F2,这里:
- F 1 F_1 F1是一个 T 1 T_1 T1公式
- F 2 F_2 F2是一个 T 2 T_2 T2公式
这个算法的功能: - 将 F F F净化为 F 1 F_1 F1和 F 2 F_2 F2
- 将 F 1 F_1 F1和 F 2 F_2 F2中共享的变量做等价变换
步骤1:变量抽象
理论
目标: F F F中所有的文字或者属于 T 1 T_1 T1,或者属于 T 2 T_2 T2,但不能是二者共有
方法:将以下两个转化方法不断使用,直到不能再用为止:
- 对于任何一项 f ( … , t , … ) f(\dots ,t,\dots) f(…,t,…),满足 f ∈ Σ i f\in \Sigma_i f∈Σi且 t ∉ Σ i t\not\in \Sigma_i t∈Σi,将 t t t用一个新的(fresh)变量 w w w替换,并在最后合取上 t = w t=w t=w
- 对于任一谓词 p ( … , t , … ) p(\dots ,t,\dots) p(…,t,…),满足 p ∈ Σ i p\in \Sigma_i p∈Σi且 t ∉ Σ i t\not\in \Sigma_i t