程序验证(六):纳尔逊-欧朋算法(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.0ina[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 T1T2有:

  • 符号集: Σ 1 ∪ Σ 2 \Sigma_1 \cup \Sigma_2 Σ1Σ2
  • 公理集: A 1 ∪ A 2 A_1 \cup A_2 A1A2
    纳尔逊-欧朋(Nelson-Oppen)复合方法: T 1 ∪ T 2 T_1\cup T_2 T1T2是可判定的,如果 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=ax=b
    这个理论不是稳定无限的,因为每个解释 ( D , I ) (D,I) (D,I)都有这样的性质: D D D包含至多两个元素,即 ∣ D ∣ ≤ 2 |D|\le 2 D2
    但是大多数我们关心的理论,即 T E , T A , T Z T_E,T_A,T_Z TE,TA,TZ等等,都是稳定无限的

纳尔逊-欧朋算法

概况

输入:由复合理论 T 1 ∪ T 2 T_1\cup T_2 T1T2得到的公式 F F F
输出:等价的公式 F 1 ∧ F 2 F_1\wedge F_2 F1F2,这里:

  • 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 TETZ公式 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:1xx2f(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 1xx2f(x)=f(w1)f(x)=f(w2)w1=1w2=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:1xx2w1=1w2=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,vV.uEvu=vu,vV.¬(uEv)u¬v
公式 F = F 1 ∧ F 2 F=F_1 \wedge F_2 F=F1F2 ( T 1 ∪ T 2 ) (T_1\cup T_2) (T1T2)-可满足的当且仅当存在这样的 α ( 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 Fi=1nui=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\} Fui=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:1zz2u=1v=2
那么
F ⇒ z = u ∨ z = v F\Rightarrow z=u\vee z=v Fz=uz=v
但是无法推出
F ⇒ z = u F\Rightarrow z=u Fz=u

F ⇒ z = v F\Rightarrow z=v Fz=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)xyy+zx0z
在第一步后, 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:xyy+zx0zw=uv
  • 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}} TETZ-公式 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:1xx2f(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:1xx2w1=1w2=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}} TETZ-公式 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:1xx3f(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:1xx3w1=1w2=2w3=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不是
于是
在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值