本文主要是介绍程序验证(六):纳尔逊-欧朋算法(Nelson-Oppen Procedure),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
程序验证(六):纳尔逊-欧朋算法(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∈Σi,将 t t t用一个新的(fresh)变量 w w w替换,并在最后合取上 t = w t=w t=w
结束的时候,我们就可以把 F F F分为 F 1 F_1 F1和 F 2 F_2 F2了。
举例
考虑 T E ∪ T Z T_E\cup T_Z TE∪TZ公式 F F F:
F : 1 ≤ x ∧ x ≤ 2 ∧ f ( x ) ≠ f ( 1 ) ∧ f ( x ) ≠ f ( 2 ) F:1\le x\wedge x\le 2\wedge f(x)\ne f(1)\wedge f(x)\ne f(2) F:1≤x∧x≤2∧f(x)=f(1)∧f(x)=f(2)
- T E T_E TE中的非逻辑符是哪些? f , = f,= f,=
- T Z T_Z TZ中的非逻辑符是哪些? 1 , 2 , ≤ , = 1,2,\le,= 1,2,≤,=
- 净化:用 f ( w 1 ) f(w_1) f(w1)代替 f ( 1 ) f(1) f(1),用 f ( w 2 ) f(w_2) f(w2)代替 f ( 2 ) f(2) f(2),加入 w 1 = 1 w_1=1 w1=1, w 2 = 2 w_2=2 w2=2,得到 1 ≤ x ∧ x ≤ 2 ∧ f ( x ) ≠ f ( w 1 ) ∧ f ( x ) ≠ f ( w 2 ) ∧ w 1 = 1 ∧ w 2 = 2 1\le x\wedge x\le 2\wedge f(x)\ne f(w_1)\wedge f(x)\ne f(w_2)\wedge w_1=1\wedge w_2=2 1≤x∧x≤2∧f(x)=f(w1)∧f(x)=f(w2)∧w1=1∧w2=2
- F E : f ( x ) ≠ f ( w 1 ) ∧ f ( x ) ≠ f ( w 2 ) F_E:f(x)\ne f(w_1)\wedge f(x)\ne f(w_2) FE:f(x)=f(w1)∧f(x)=f(w2)
- F Z : 1 ≤ x ∧ x ≤ 2 ∧ w 1 = 1 ∧ w 2 = 2 F_Z:1\le x\wedge x\le 2\wedge w_1 = 1\wedge w_2 = 2 FZ:1≤x∧x≤2∧w1=1∧w2=2
步骤2:猜测与检查(guess and check)
理论
给定 F 1 F_1 F1与 F 2 F_2 F2,定义共享变量集 V V V:
V = f r e e ( F 1 ) ∩ f r e e ( F 2 ) V=free(F_1)\cap free(F_2) V=free(F1)∩free(F2)
令 E E E为 V V V上的一个等价关系,由 E E E生成的arrangement α ( V , E ) \alpha (V,E) α(V,E)即为:
α ( V , E ) : ⋀ u , v ∈ V . u E v u = v ∧ ⋀ u , v ∈ V . ¬ ( u E v ) u ¬ v \alpha (V,E): \bigwedge _{u,v\in V.uEv} u=v \wedge\bigwedge _{u,v\in V.\neg (uEv)} u\neg v α(V,E):u,v∈V.uEv⋀u=v∧u,v∈V.¬(uEv)⋀u¬v
公式 F = F 1 ∧ F 2 F=F_1 \wedge F_2 F=F1∧F2是 ( T 1 ∪ T 2 ) (T_1\cup T_2) (T1∪T2)-可满足的当且仅当存在这样的 α ( V , E ) \alpha (V,E) α(V,E)使得:
- F 1 ∧ α ( V , E ) F_1\wedge \alpha (V,E) F1∧α(V,E)是 T 1 T_1 T1-可满足的
- F 2 ∧ α ( V , E ) F_2\wedge \alpha (V,E) F2∧α(V,E)是 T 2 T_2 T2-可满足的
举例
考虑之前的净化后的两个公式
共享变量: V = { w 1 , w 2 , x } V=\{w_1,w_2,x\} V={w1,w2,x}
猜测并检查 V V V上的等价关系:
- { { w 1 } , { w 2 } , { x } } \{\{w_1\},\{w_2\},\{x\}\} {{w1},{w2},{x}}
- { { w 1 , w 2 } , { x } } \{\{w_1,w_2\},\{x\}\} {{w1,w2},{x}}
- { { w 1 } , { w 2 , x } } \{\{w_1\},\{w_2,x\}\} {{w1},{w2,x}}
- { { w 2 } , { w 1 , x } } \{\{w_2\},\{w_1,x\}\} {{w2},{w1,x}}
- { { w 1 , w 2 , x } } \{\{w_1,w_2,x\}\} {{w1,w2,x}}
效率问题
这个guess and check的时间复杂度是指数级的,所以不太实用,所以我们换个方法。
步骤2:等价推导(equality propagation)
凸理论(convex theory)
一个理论是凸的(convex),如果它对于每个变量自由的公式 F F F,都满足:
若
F ⇒ ⋁ i = 1 n u i = v i F\Rightarrow \bigvee ^n_{i=1} u_i =v_i F⇒i=1⋁nui=vi
则
F ⇒ u i = v i f o r s o m e i ∈ { 1 , … , n } F\Rightarrow u_i = v_i~for~some~i\in\{1,\dots , n\} F⇒ui=vi for some i∈{1,…,n}
T Z , T A T_Z, T_A TZ,TA不是凸的,但是 T E , T Q T_E,T_Q TE,TQ是凸的。
举例: T Z T_Z TZ不是凸的
例如,考虑这样的量词自由的合取 Σ Z \Sigma_Z ΣZ-公式
F : 1 ≤ z ∧ z ≤ 2 ∧ u = 1 ∧ v = 2 F: 1\le z\wedge z\le 2\wedge u=1\wedge v=2 F:1≤z∧z≤2∧u=1∧v=2
那么
F ⇒ z = u ∨ z = v F\Rightarrow z=u\vee z=v F⇒z=u∨z=v
但是无法推出
F ⇒ z = u F\Rightarrow z=u F⇒z=u
或
F ⇒ z = v F\Rightarrow z=v F⇒z=v
等价推导
给定 F 1 F_1 F1与 F 2 F_2 F2
- 让 T i ( i = 1 , 2 ) T_i (i=1,2) Ti(i=1,2)报告任何有关共享变量(包括 u u u, v v v)的新推出的等价关系
- 如果 T i T_i Ti是凸的,令 u = v u=v u=v为新推出的等价关系
- 如果 T i T_i Ti不是凸的,令 ⋁ i ( u i = v i ) \bigvee_i (u_i = v_i) ⋁i(ui=vi)为推出的等价关系的析取
- 将新推出的等价关系存储到 E E E中( E E E是已经发现的等价关系的集合)
- 如果 T i T_i Ti是凸的,将 u = v u=v u=v添加到 E E E
- 如果 T i T_i Ti不是凸的,将搜索过程依据不同的析取 ⋁ i ( u i = v i ) \bigvee_i(u_i = v_i) ⋁i(ui=vi)分成不同的分支(通过在 E E E中添加相应的等价关系)
- 对于每一个分支,将 E E E传播到另一个判定程序(也就是递归进行),重复以上步骤
算法返回:
- s a t sat sat如果任一分支得到一个完整的arrangement
- u n s a t unsat unsat如果所有的分支都推出矛盾
- s a t sat sat如果所有的分支都不能发现新的等价关系
举例
1
考虑 Σ E ∪ Σ Q \Sigma_E\cup \Sigma_Q ΣE∪ΣQ-公式:
F : f ( f ( x ) − f ( y ) ) ≠ f ( z ) ∧ x ≤ y ∧ y + z ≤ x ∧ 0 ≤ z F:f(f(x)-f(y))\ne f(z)\wedge x\le y\wedge y+z\le x\wedge 0\le z F:f(f(x)−f(y))=f(z)∧x≤y∧y+z≤x∧0≤z
在第一步后, F F F被分为两个公式:
- F E : f ( w ) ≠ f ( z ) ∧ u = f ( x ) ∧ v = f ( y ) F_E:f(w)\ne f(z)\wedge u=f(x)\wedge v=f(y) FE:f(w)=f(z)∧u=f(x)∧v=f(y)
- F Q : x ≤ y ∧ y + z ≤ x ∧ 0 ≤ z ∧ w = u − v F_Q:x\le y\wedge y+z\le x\wedge 0\le z\wedge w=u-v FQ:x≤y∧y+z≤x∧0≤z∧w=u−v
- V = s h a r e d ( F E , F Q ) = { x , y , z , u , v , w } V=shared(F_E,F_Q)=\{x,y,z,u,v,w\} V=shared(FE,FQ)={x,y,z,u,v,w}
注意, T E T_E TE与 T Q T_{\mathbb{Q}} TQ都是凸理论
于是
2
考虑 T E ∪ T Z T_E\cup T_{\mathbb{Z}} TE∪TZ-公式 F F F:
F : 1 ≤ x ∧ x ≤ 2 ∧ f ( x ) ≠ f ( 1 ) ∧ f ( x ) ≠ f ( 2 ) F:1\le x\wedge x\le 2\wedge f(x)\ne f(1)\wedge f(x)\ne f(2) F:1≤x∧x≤2∧f(x)=f(1)∧f(x)=f(2)
在第一步后, F F F被分为两个公式:
- F E : f ( x ) ≠ f ( w 1 ) ∧ f ( x ) ≠ f ( w 2 ) F_E:f(x)\ne f(w_1)\wedge f(x)\ne f(w_2) FE:f(x)=f(w1)∧f(x)=f(w2)
- F Z : 1 ≤ x ∧ x ≤ 2 ∧ w 1 = 1 ∧ w 2 = 2 F_{\mathbb{Z}} :1\le x\wedge x\le 2\wedge w_1=1\wedge w_2=2 FZ:1≤x∧x≤2∧w1=1∧w2=2
- V = s h a r e d ( F E , F Z ) = { w 1 , w 2 , x } V=shared(F_E,F_{\mathbb{Z}})=\{w_1,w_2,x\} V=shared(FE,FZ)={w1,w2,x}
注意, T E T_E TE是凸的, T Z T_{\mathbb{Z}} TZ不是
于是
3
考虑 T E ∪ T Z T_E\cup T_{\mathbb{Z}} TE∪TZ-公式 F F F:
F : 1 ≤ x ∧ x ≤ 3 ∧ f ( x ) ≠ f ( 1 ) ∧ f ( x ) ≠ f ( 3 ) ∧ f ( 1 ) ≠ f ( 2 ) F: 1\le x\wedge x\le 3\wedge f(x)\ne f(1)\wedge f(x)\ne f(3)\wedge f(1)\ne f(2) F:1≤x∧x≤3∧f(x)=f(1)∧f(x)=f(3)∧f(1)=f(2)
在第一步后, F F F被分为两个公式:
- F E : f ( x ) ≠ f ( w 1 ) ∧ f ( x ) ≠ f ( w 3 ) ∧ f ( w 1 ) ≠ f ( w 2 ) F_E:f(x)\ne f(w_1)\wedge f(x)\ne f(w_3)\wedge f(w_1)\ne f(w_2) FE:f(x)=f(w1)∧f(x)=f(w3)∧f(w1)=f(w2)
- F Z : 1 ≤ x ∧ x ≤ 3 ∧ w 1 = 1 ∧ w 2 = 2 ∧ w 3 = 3 F_{\mathbb{Z}}:1\le x\wedge x\le 3\wedge w_1=1\wedge w_2=2\wedge w_3=3 FZ:1≤x∧x≤3∧w1=1∧w2=2∧w3=3
- V = s h a r e d ( F E , F Z ) = { w 1 , w 2 , w 3 , x } V=shared(F_E,F_{\mathbb{Z}})=\{w_1,w_2,w_3,x\} V=shared(FE,FZ)={w1,w2,w3,x}
注意, T E T_E TE是凸的, T Z T_{\mathbb{Z}} TZ不是
于是
这篇关于程序验证(六):纳尔逊-欧朋算法(Nelson-Oppen Procedure)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!