Chapter 1 命题逻辑
逻辑符号
negation:
¬
p
\neg p
¬p
disjunction:
p
∨
q
p \lor q
p∨q
conjunction:
p
∧
q
p \land q
p∧q
implication:
p
→
q
p \to q
p→q
证明规则
通过将证明规则(proof rules)应用于前提(premises)公式,推断(infer)出结论(conclusion)。
ϕ
1
,
ϕ
2
,
…
,
ϕ
n
⊢
ψ
\phi_1,\phi_2,\dots,\phi_n \vdash \psi
ϕ1,ϕ2,…,ϕn⊢ψ 称为矢列(sequent)。如果可以找到矢列的证明,矢列称为有效的。若逻辑公式
ϕ
\phi
ϕ具有有效的矢列,称为定理。
一共15个演绎规则,其中11个基本规则,4个派生规则,横线上是前提,横线下是结论,横线右边是记号:
合取规则 引入规则
∧
i
\land i
∧i,消去规则
∧
e
1
,
∧
e
2
\land e_1, \land e_2
∧e1,∧e2
ϕ
ψ
ϕ
∧
ψ
∧
i
,
ϕ
∧
ψ
ϕ
∧
e
1
,
ϕ
∧
ψ
ψ
∧
e
2
\frac{\phi\quad\psi}{\phi\land\psi}\land i,\quad\frac{\phi\land\psi}{\phi}\land e_1,\quad\frac{\phi\land\psi}{\psi}\land e_2
ϕ∧ψϕψ∧i,ϕϕ∧ψ∧e1,ψϕ∧ψ∧e2
双重否定规则 引入规则(派生)
¬
¬
i
\neg\neg i
¬¬i,消去规则
¬
¬
e
\neg\neg e
¬¬e
ϕ
¬
¬
ϕ
¬
¬
i
,
¬
¬
ϕ
ϕ
¬
¬
e
\frac{\phi}{\neg\neg\phi}\neg\neg i, \quad\frac{\neg\neg\phi}{\phi}\neg\neg e
¬¬ϕϕ¬¬i,ϕ¬¬ϕ¬¬e
蕴含消去规则(分离规则)
→
e
\to e
→e
ϕ
ϕ
→
ψ
ψ
→
e
\frac{\phi \quad \phi \to \psi}{\psi}\to e
ψϕϕ→ψ→e
反证规则(派生) MT
ϕ
→
ψ
¬
ψ
¬
ϕ
MT
\frac{\phi \to \psi \quad \neg\psi}{\neg\phi}\text{MT}
¬ϕϕ→ψ¬ψMT
蕴含引入规则
→
i
\to i
→i
[
ϕ
⋮
ψ
]
ψ
→
i
\frac{\left[\begin{matrix}\phi \\ \vdots \\ \psi\end{matrix}\right]}{\psi}\to i
ψ⎣⎢⎡ϕ⋮ψ⎦⎥⎤→i
为证明 ϕ → ψ \phi \to \psi ϕ→ψ ,做临时的假定 ϕ \phi ϕ,然后证明 ψ \psi ψ 。在证明 ψ \psi ψ的过程中,可以使用 ϕ \phi ϕ,以及任何其他公式。一般来讲,只有在公式 ϕ \phi ϕ先于该位置出现,而且出现 ϕ \phi ϕ的矩形框都没有关闭的情况下,才可以使用公式 ϕ \phi ϕ。紧跟在关闭的矩形框后面的行必须与使用该矩形框的规则所得到的结论模式相匹配,即如果一个矩形框的第一个公式是 ϕ \phi ϕ,最后一个公式是 ψ \psi ψ,那么紧跟在该矩形框后面的行必须是 ϕ → ψ \phi \to \psi ϕ→ψ。
如果我们将 p → q p\to q p→q视为程序的类型,(例如p代表整型输入,q代表布尔型输出)。 p → q p\to q p→q的有效性相当于一个假设-保证断言:如果输入是整数,输出是布尔值。使用规则 → i \to i →i证明 p → q p\to q p→q称为类型检测(type checking),用于构造带类型编程语言。
例
析取规则 引入规则
∨
i
1
,
∨
i
2
\lor i_1, \lor i_2
∨i1,∨i2,消去规则
∨
e
\lor e
∨e
ϕ
ϕ
∨
ψ
∨
i
1
,
ψ
ϕ
∨
ψ
∨
i
2
,
ϕ
∨
ψ
[
ϕ
⋮
χ
]
[
ψ
⋮
χ
]
χ
∨
e
\frac{\phi}{\phi \lor \psi}\lor i_1,\quad \frac{\psi}{\phi \lor \psi}\lor i_2, \quad \frac{\phi \lor \psi\quad\left[\begin{matrix}\phi \\ \vdots \\ \chi\end{matrix}\right]\quad\left[\begin{matrix}\psi \\ \vdots \\ \chi\end{matrix}\right]}{\chi}\lor e
ϕ∨ψϕ∨i1,ϕ∨ψψ∨i2,χϕ∨ψ⎣⎢⎡ϕ⋮χ⎦⎥⎤⎣⎢⎡ψ⋮χ⎦⎥⎤∨e
矛盾规则
→
e
\to e
→e
矛盾
⊥
\bot
⊥是形如
ϕ
∧
¬
ϕ
\phi \land \neg \phi
ϕ∧¬ϕ或
¬
ϕ
∧
ϕ
\neg \phi \land \phi
¬ϕ∧ϕ的表达式;矛盾可以推导出任何公式:
⊥
ϕ
⊥
e
ϕ
¬
ϕ
⊥
¬
e
[
ϕ
⋮
⊥
]
¬
ϕ
¬
i
\frac{\bot}{\phi} \bot e \quad \frac{\phi \quad \neg \phi}{\bot} \neg e \quad \frac{\left[\begin{matrix}\phi \\ \vdots \\ \bot\end{matrix}\right]}{\neg \phi} \neg i
ϕ⊥⊥e⊥ϕ¬ϕ¬e¬ϕ⎣⎢⎡ϕ⋮⊥⎦⎥⎤¬i
反证法(派生) PBC
[
¬
ϕ
⋮
⊥
]
ϕ
PBC
\frac{\left[\begin{matrix}\neg\phi \\ \vdots \\ \bot\end{matrix}\right]}{\phi}\text{PBC}
ϕ⎣⎢⎡¬ϕ⋮⊥⎦⎥⎤PBC
排中律(派生)
ϕ
∨
¬
ϕ
LEM
\frac{}{\phi\lor\neg\phi} \text{LEM}
ϕ∨¬ϕLEM
以下六个式子逻辑等价:
¬
(
p
∧
q
)
⊣
⊢
¬
q
∨
¬
p
¬
(
p
∨
q
)
⊣
⊢
¬
q
∧
¬
p
p
→
q
⊣
⊢
¬
q
→
¬
p
p
→
q
⊣
⊢
¬
p
∨
q
p
∧
q
→
p
⊣
⊢
r
∨
¬
r
p
∧
q
→
r
⊣
⊢
p
→
(
q
→
r
)
\neg (p \land q) \ \dashv \vdash \ \neg q \lor \neg p \qquad \neg (p \lor q) \ \dashv \vdash \ \neg q \land \neg p \\ p \to q \ \dashv \vdash \ \neg q \to \neg p \qquad p \to q \ \dashv \vdash \ \neg p \lor q \\ p \land q \to p \ \dashv \vdash \ r \lor \neg r \qquad p \land q \to r \ \dashv \vdash \ p \to (q \to r)
¬(p∧q) ⊣⊢ ¬q∨¬p¬(p∨q) ⊣⊢ ¬q∧¬pp→q ⊣⊢ ¬q→¬pp→q ⊣⊢ ¬p∨qp∧q→p ⊣⊢ r∨¬rp∧q→r ⊣⊢ p→(q→r)
作为形式语言的命题逻辑
合式公式(Backus Naur范式,BNF)其中
p
p
p代表任意原子命题:
ϕ
:
:
=
p
∣
(
¬
ϕ
)
∣
(
ϕ
∧
ϕ
)
∣
(
ϕ
∨
ϕ
)
∣
(
ϕ
→
ϕ
)
\phi ::= p \ | \ (\neg \phi) \ | \ (\phi \land \phi) \ | \ (\phi \lor \phi) \ | \ (\phi \rightarrow \phi)
ϕ::=p ∣ (¬ϕ) ∣ (ϕ∧ϕ) ∣ (ϕ∨ϕ) ∣ (ϕ→ϕ)
可以用语法分析树表示和判定合式公式。最终叶子节点都是原子命题的树。
命题逻辑的语义
定义:公式 ϕ \phi ϕ的一个赋值(valuation)或模型(model)是对 ϕ \phi ϕ中的每个命题原子指派一个真值。两个公式的真值表相同,称为语义等价(semantically equivalent)。
数学归纳法:
基本情况:自然数 1 有性质 M,即有 M(1) 的证明;
归纳步骤:如果 n 是我们假设有性质 M(n) 的自然数(归纳假设),那么,可以证明 n+1 有性质 M(n+1) ;即有一个 M(n)
→
\to
→ M(n+1) 的证明。
串值归纳法:证明 M(n+1) 不仅需要 M(n) ,而且需要合取 M ( 1 ) ∧ M ( 2 ) ∧ ⋯ ∧ M ( n ) M(1) \land M(2) \land \cdots \land M(n) M(1)∧M(2)∧⋯∧M(n)。
定义:合式公式的高度为1加上它的语法分析树中最长路径的长度。
结构归纳法:串值归纳法的一个特例。对合式公式的高度运用数学归纳法,证明关于合式公式的定理。
定义:若对使所有命题的
ϕ
1
,
ϕ
2
,
…
,
ϕ
n
\phi_1, \phi_2, \dots, \phi_n
ϕ1,ϕ2,…,ϕn都赋值为T的一切赋值,
ψ
\psi
ψ也赋值为T,则说
ϕ
1
,
ϕ
2
,
…
,
ϕ
n
⊨
ψ
\phi_1, \phi_2, \dots, \phi_n\models \psi
ϕ1,ϕ2,…,ϕn⊨ψ成立,称
⊨
\models
⊨为语义推导关系(semantic entailment relation)。
合理性和完备性定理:矢列有效性与语义推导关系等价。
重言式:各种赋值情况下结果都是T,即当且仅当 ⊨ ψ \models \psi ⊨ψ。记为 ⊤ \top ⊤
若 ⊨ η \models \eta ⊨η成立,则 ⊢ η \vdash \eta ⊢η是有效的。换言之,若 η \eta η是重言式,则 η \eta η是定理。
范式
语义等价:对与命题逻辑公式 ϕ , ψ \phi,\psi ϕ,ψ,说他们语义等价,当且仅当 ϕ ⊨ ψ \phi \vDash \psi ϕ⊨ψ与 ψ ⊨ ϕ \psi \vDash \phi ψ⊨ϕ成立。记为: ϕ ≡ ψ \phi \equiv \psi ϕ≡ψ。进一步,如果 ⊨ ϕ \vDash \phi ⊨ϕ成立,称 ϕ \phi ϕ是有效的。也可以定义 ϕ ≡ ψ \phi \equiv \psi ϕ≡ψ为 ⊨ ( ϕ → ψ ) ∧ ( ψ → ϕ ) \vDash (\phi \to \psi) \land (\psi \to \phi) ⊨(ϕ→ψ)∧(ψ→ϕ)。
由于合理性和完备性,语义等价和逻辑等价是一致的。
由于语义等价,我们希望把公式化成一种特定的形式,称作范式,在这种形式下有效性检查很容易。
合取范式:利用等价
ϕ
→
ψ
≡
¬
ϕ
∨
ψ
\phi \to \psi \equiv \neg \phi \lor \psi
ϕ→ψ≡¬ϕ∨ψ替换所有
→
\to
→。文字
L
L
L或者是原子
p
p
p,或者是原子的否定
¬
p
\neg p
¬p。公式
C
C
C如果是若干子句的合取,则是一个合取范式(conjuncitve normal form, CNF),而每个子句
D
D
D是文字的析取:
L
:
:
=
p
∣
¬
p
D
:
:
=
L
∣
L
∨
D
C
:
:
=
D
∣
D
∧
C
L::=p \ | \ \neg p \\ D::= L\ | \ L \lor D \\ C::=D\ | \ D \land C
L::=p ∣ ¬pD::=L ∣ L∨DC::=D ∣ D∧C
例:
(
¬
q
∨
p
∨
r
)
∧
(
¬
p
∨
r
)
∧
q
(\neg q \lor p \lor r)\land(\neg p \lor r)\land q
(¬q∨p∨r)∧(¬p∨r)∧q,它成立当且仅当三个字句都有效。
如果
ϕ
\phi
ϕ是 CNF,有一个非常容易快速判断
⊨
ϕ
\vDash\phi
⊨ϕ有效性的方法:检查
ϕ
\phi
ϕ的所有合取
ψ
k
\psi_k
ψk,寻找
ψ
k
\psi_k
ψk中是否有这样的原子,即它们的否定也在
ψ
k
\psi_k
ψk中。如果所有的析取都能找到这样的匹配,那么有
⊨
ψ
\vDash \psi
⊨ψ。
可满足性:已知一个命题逻辑公式
ϕ
\phi
ϕ,如果有一个赋值使它的赋值为T,那么称
ϕ
\phi
ϕ是可满足的。
命题逻辑
ϕ
\phi
ϕ是可满足的,当且仅当
¬
ϕ
\neg \phi
¬ϕ不是有效的。因此判定有效性和可满足性是在程序上相同的。
除了写出
ϕ
\phi
ϕ的真值表,没有简单的计算
ϕ
\phi
ϕ的CNF形式等价公式的方法。通过真值表可以构造CNF公式。
否定范式(negation normal form, NNF):只否定原子的公式。
CNF算法:通过把任意一个公式转化为CNF形式,我们可以快速原始公式检验有效性。
流程:
- 先进行蕴含释放:将 ψ → η \psi \to \eta ψ→η的蕴含用 ¬ ψ ∨ η \neg \psi \lor \eta ¬ψ∨η代替;
- 转换为否定范式;
- 分析情况:
- 如果 ψ \psi ψ是一个文字,由 CNF 的定义,CNF 输出 ψ \psi ψ;
- 如果 ϕ = ϕ 1 ∧ ϕ 2 \phi = \phi_1 \land \phi_2 ϕ=ϕ1∧ϕ2,对每个 ϕ i \phi_i ϕi,循环地调用 CNF ,分别得到输出 η i \eta_i ηi,最后得到输入 ϕ \phi ϕ作为 CNF 地输出 η i ∧ η 2 \eta_i \land \eta_2 ηi∧η2;
- 如果 ϕ = ϕ 1 ∨ ϕ 2 \phi = \phi_1 \lor \phi_2 ϕ=ϕ1∨ϕ2,对每个 ϕ i \phi_i ϕi,循环地调用 CNF ,分别得到输出 η i \eta_i ηi,使用分配率,将合取的析取转换为析取的合取;
伪代码:
function CNF(φ):
/* 前置条件: φ是蕴含释放,并且是NNF模式 */
/* 后置条件: CNF(φ) 计算 ψ 的等价 */
begin function
case
φ 是文字: return φ
φ 是 φ1 ∧ φ2: return CNF(φ1) ∧ CNF(φ2)
φ 是 φ1 ∨ φ2: return DISTR(CNF(φ1), CNF(φ2))
end case
end function
function NNF
/* 前置条件: φ 是无蕴含的 */
/* 后置条件: NNF(φ) 计算 φ 的 NNF */
begin function
case
φ 是 一个文字 : φ
φ 是 ¬¬φ1 : return NNF(φ1)
φ 是 φ1 ∧ φ2 : return NNF(φ1) ∧ NNF(φ2)
φ 是 φ1 ∨ φ2 : return NNF(φ1) ∨ NNF(φ2)
φ 是 ¬(φ1 ∧ φ2) : return NNF(¬φ1) ∨ NNF(¬φ2)
φ 是 ¬(φ1 ∨ φ2) : return NNF(¬φ1) ∧ NNF(¬φ2)
end case
end function
function DISTR
/* 前置条件: ŋ1 和 ŋ2 是 CNF 形式 */
/* 后置条件: DIST(ŋ1, ŋ2),计算 ŋ1 ∨ ŋ2 的 CNF */
begin function
case
ŋ1 是 ŋ11 ∧ ŋ12 : return DISTR(ŋ11, ŋ2) ∧ DISTR(ŋ12, ŋ2)
ŋ2 是 ŋ21 ∧ ŋ22 : return DISTR(ŋ1 ∨ ŋ21) ∧ DISTR(ŋ1 ∨ ŋ22)
否则(=没有合取) : return ŋ1 ∨ ŋ2
end case
end function
霍恩公式:易于判断可满足性。指逻辑公式
ϕ
\phi
ϕ,如果它可以用下列语法作为霍恩公式
H
H
H的实例产生,C的每一个实例称为霍恩子句:
P
:
:
=
⊥
∣
⊤
∣
p
A
:
:
=
P
∣
P
∧
A
C
:
:
=
A
→
P
H
:
:
=
C
∣
C
∧
H
P ::= \bot \ | \ \top \ | \ p \\ A ::= P \ | \ P \land A \\ C ::= A \to P \\ H ::= C \ | \ C \land H
P::=⊥ ∣ ⊤ ∣ pA::=P ∣ P∧AC::=A→PH::=C ∣ C∧H
判断一个霍恩公式 ϕ \phi ϕ可满足性算法:
- 如果它出现在 ϕ \phi ϕ中,标记为 ⊤ \top ⊤;
- 如果 ϕ \phi ϕ的合取 P 1 ∧ P 2 ∧ ⋯ ∧ P k i → P ′ P_1 \land P_2 \land \cdots \land P_{k_i} \to P' P1∧P2∧⋯∧Pki→P′中所有 P j ( 1 ≤ j ≤ k i ) P_j(1 \le j \le k_i) Pj(1≤j≤ki)都被标记,那么标记 P ′ P' P′,重复2。否则(=没有合取 P 1 ∧ P 2 ∧ ⋯ ∧ P k i → P ′ P_1 \land P_2 \land \cdots \land P_{k_i} \to P' P1∧P2∧⋯∧Pki→P′中所有 P j ( 1 ≤ j ≤ k i ) P_j(1 \le j \le k_i) Pj(1≤j≤ki)都被标记),继续3;
- 如果 ⊥ \bot ⊥被标记,输出”霍恩公式 ϕ \phi ϕ不是可满足的“,停止。否则,继续4;
- 输出"霍恩公式 ϕ \phi ϕ是可满足的",停止。
伪代码:
function HORN(φ)
/* 前置条件: φ 是霍恩公式 */
/* 后置条件: HORN(φ)判断φ的可满足性 */
begin function
标记所有在φ中出现的⊤
while φ 中合取P_1∧P_2∧⋯∧P_{k_i}→P′的所有P_j都被标记而P′没有标记时,do 标记 P′
end while
if ⊥ 被标记 then return "不是可满足的" ,else return "可满足的"
end function
HORN算法在while语句中,如果 ϕ \phi ϕ中的原子数是n,那么循环不超过n+1次。
SAT求解机
设计想法:扩展HORN算法的标记思想到一般的公式:“对于 ϕ \phi ϕ赋值为T的所有赋值,所有的标记子式赋值为它们的标记值。”(使用真,假标记)
线性求解机:对公式的语法分析树执行这个算法。把公式由BNF范式翻译为合适的片段:
ϕ
:
:
=
p
∣
(
¬
ϕ
)
∣
(
ϕ
∧
ϕ
)
\phi ::= p \ |\ (\neg \phi)\ | \ (\phi \land \phi)
ϕ::=p ∣ (¬ϕ) ∣ (ϕ∧ϕ)
然后共享语法分析树的共同子式,使树成为一个有向无环图(DAG)。递归地定义这种转化:
T
(
p
)
=
p
T
(
¬
ϕ
)
=
¬
T
(
ϕ
)
T
(
ϕ
1
∧
ϕ
2
)
=
T
(
ϕ
1
)
∧
T
(
ϕ
2
)
T
(
ϕ
1
∨
ϕ
2
)
=
¬
(
¬
T
(
ϕ
1
)
∧
¬
T
(
ϕ
2
)
)
T
(
ϕ
1
→
ϕ
2
)
=
¬
(
T
(
ϕ
1
)
∧
¬
T
(
ϕ
2
)
)
\begin{array}{ll} T(p)=p & T(\neg \phi)=\neg T(\phi)\\ T(\phi_1\land\phi_2)=T(\phi_1)\land T(\phi_2) & T(\phi_1\lor\phi_2)=\neg (\neg T(\phi_1)\land \neg T(\phi_2))\\ T(\phi_1\to\phi_2)=\neg (T(\phi_1)\land \neg T(\phi_2)) \end{array}
T(p)=pT(ϕ1∧ϕ2)=T(ϕ1)∧T(ϕ2)T(ϕ1→ϕ2)=¬(T(ϕ1)∧¬T(ϕ2))T(¬ϕ)=¬T(ϕ)T(ϕ1∨ϕ2)=¬(¬T(ϕ1)∧¬T(ϕ2))
翻译完的公式应满足: ϕ \phi ϕ和 T ( ϕ ) T(\phi) T(ϕ)是语义等价的,并且有同样的命题原子。因此, ϕ \phi ϕ是可满足的,当且仅当 T ( ϕ ) T(\phi) T(ϕ)是可满足的;使 ϕ \phi ϕ为真的赋值集合等于使 T ( ϕ ) T(\phi) T(ϕ)为真的赋值集合。后者保证引用到 T ( ϕ ) T(\phi) T(ϕ)的SAT求解判断对原来公式 ϕ \phi ϕ是有意义的。
例子:
任何使
p
∧
¬
¬
(
¬
q
∧
¬
¬
p
)
p\land \neg\neg(\neg q\land \neg\neg p)
p∧¬¬(¬q∧¬¬p)为真的赋值一定把T指派给图1-12中的DAG的最上面的
∧
\land
∧结点。添加标记T到p结点和最上面的
¬
\neg
¬结点。用同样的方法,得到图1-13的完全约束集合,其中时间戳"1:"等表示应用关于这些约束的直觉推理的次序,这个次序一般不是唯一的。
规则:
SAT求解机运行时间关于
T
(
ϕ
)
T(\phi)
T(ϕ)的DAG大小是线性的,即对公式长度是线性的。代价是线性求解机对形如
¬
(
ϕ
1
∧
ϕ
2
)
\neg(\phi_1\land\phi_2)
¬(ϕ1∧ϕ2)的所有公式失效,这是由于求解结果中所有强加约束彼此都是相容的,但不是所有的结点都被约束。因此说明CNF公式的有效性检验很容易(见范式一节),但可满足性检验很难。
三次求解机
对于没有标记的节点n,分别做两个独立的计算来检验节点n:
- 通过只对n增加 T 标记来确定哪些临时标记是被强制的;
- 通过只对n再一次增加 F 标记来确定哪些临时标记是被强制的。
对于公式
(
(
p
∨
(
q
∨
r
)
∧
(
(
p
∨
¬
q
)
∧
(
(
q
∨
¬
r
)
∧
(
(
r
∨
¬
p
)
∧
(
¬
p
∨
(
¬
q
∨
¬
r
)
)
)
)
)
)
((p\lor (q\lor r)\land((p\lor \neg q)\land((q\lor\neg r)\land((r\lor \neg p)\land(\neg p \lor(\neg q \lor \neg r))))))
((p∨(q∨r)∧((p∨¬q)∧((q∨¬r)∧((r∨¬p)∧(¬p∨(¬q∨¬r))))))
如果两种运算都得到矛盾约束,那么算法停止,报告
T
(
ϕ
)
T(\phi)
T(ϕ)是不可满足的;否则对两种运算都得到同样标记的所有节点接受相同的标记作为永久标记。
用同样的方法进一步检验未标记的节点,直到发现矛盾的永久标记节点;或检测了所有目前尚未标记的节点而没有发现任何共享的标记,报告这些标记作为可满足性的一个证据,终止算法。
三次求解机的运行时间是关于 ϕ \phi ϕ的 DAG 大小的立方。