程序验证(六):纳尔逊-欧朋算法(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不是
于是