程序验证(二):SAT问题
概念:Satisfiability Problem
SAT问题:给定一个命题公式 F F F,决定是否存在一个解释 I I I使得 I ⊨ F I\models F I⊨F.
3SAT问题是首个被确定的NP完全问题。
大多数重要逻辑问题可以归约为SAT:
- 永真性
- 蕴含
- 等价性
SAT求解能力的发展:
关键:将搜索与推理结合以提高效率
CNF详解
SAT求解器的输入一般是CNF,这里为便于讨论,引入关于CNF的集合表示。
集合表示
一个公式(formula)可以视为子句(clause)的集合:
C 1 ∧ . . . ∧ C n C_1\wedge ... \wedge C_n C1∧...∧Cn
可以表示为:
{ C 1 , . . . , C n } \{C_1 , ... , C_n \} {
C1,...,Cn}
同样,子句可以视为文字(literal)的集合:
( P ∨ Q ) ∧ ( Q → ¬ P ) (P\vee Q)\wedge (Q\to \neg P) (P∨Q)∧(Q→¬P)
可以表示为:
{ { P , Q } , { ¬ Q , ¬ P } } \{\{P,Q\},\{\neg Q,\neg P\}\} {
{
P,Q},{
¬Q,¬P}}
一些通用的表示方法:
- 公式 formula: F F F
- 子句 clause: C C C
- 变量 variable: P , Q , R , . . . P, Q, R, ... P,Q,R,...
一些方便的表达方式:
- C i { P ↦ F } C_i\{P\mapsto F\} Ci{ P↦F}: 在子句 C i C_i Ci中使用 F F F替代 P P P
- C i [ P ] C_i[P] Ci[P]: 变量 P P P在子句 C i C_i Ci中是不取非的,也就是 C i = { . . . , P , . . . } C_i = \{... , P , ...\} Ci={ ...,P,...}
- C i [ ¬ P ] C_i[\neg P] Ci[¬P]: 变量 P P P在 C i C_i Ci中是取非的,也就是 C i = { . . . , ¬ P , . . . } C_i = \{... , \neg P , ...\} Ci={ ...,¬P,...}
在这种符号体系下,会有以下命题成立(有点绕,需要多看几遍):
以 F F F表示公式, C C C表示子句,基于CNF公式的集合表示,有:
- C i ∨ C j C_i\vee C_j Ci∨Cj: union of C i C_i Ci and C j C_j Cj, C i ∪ C j C_i\cup C_j Ci∪Cj
- F i ∧ F j F_i\wedge F_j Fi∧Fj: union of F i F_i Fi and F j F_j Fj, F i ∪ F j F_i\cup F_j Fi∪Fj
归结(resolution)
只有一条规则:
C 1 [ P ] C 2 [ ¬ P ] C 1 { P ↦ ⊥ } ∨ C 2 { ¬ P ↦ ⊥ } \frac{C_1[P]~C_2[\neg P]}{C_1\{P\mapsto \bot\}\vee C_2\{\neg P\mapsto \bot\}} C1{
P↦