数理逻辑(Mathematical Logic)用数学方法研究 推理:什么样的论证是「站得住脚」的,跟内容无关,只看形式。它是计算机科学的基础——电路设计、程序验证、数据库查询、人工智能里的知识表示,本质上都是在跟逻辑打交道。
可以这样理解:逻辑把日常语言里的「因为……所以……」抽象成符号运算,于是「论证是否正确」就变成了「公式是否恒为真」这种可以机械检验的问题。这正是计算机擅长的事。
本章先讲 命题逻辑(只关心整句的真假),再讲 谓词逻辑(深入到句子内部的「对象」和「性质」)。
能 判断真假 的陈述句称为 命题(Proposition)。真值用 1(真)或 0(假)表示。
「明天会下雨」「1+1=2」是命题;「请关门!」「x+1=3」不是命题——前者是祈使句无所谓真假,后者的真假取决于 x,本身不确定。
不能再拆分的命题叫 原子命题,用 p,q,r 等 命题变元 表示;由联结词组合而成的叫 复合命题。
联结词(Connective)是把命题粘起来的「运算符」,就像算术里的 +−×÷。
| 符号 | 名称 | 读法 |
|---|
| ¬p | 否定 | 非 p |
| p∧q | 合取 | p 且 q |
| p∨q | 析取 | p 或 q |
| p→q | 蕴含 | 若 p 则 q |
| p↔q | 等价 | p 当且仅当 q |
直觉上:
- 合取 p∧q 是「两个都要成立」,像电路里的 串联开关——全通才通。
- 析取 p∨q 是「至少一个成立」(注意是 可兼或,不是「二选一」),像 并联开关——有一个通就通。
- 蕴含 p→q 表达「承诺」:只要 p 成立,就保证 q 成立。它最容易让人困惑,下面单独说。
- 等价 p↔q 是「两者真值一样」,即 p,q 同真同假。
把所有变元的取值组合穷举一遍,列出复合命题的真值,就是 真值表(Truth Table)。n 个变元有 2n 行。
| p | q | ¬p | p∧q | p∨q | p→q | p↔q |
|---|
| 0 | 0 | 1 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| 1 | 1 | 0 | 1 | 1 | 1 | 1 |
蕴含 p→q 只有「前真后假」时为假,其余情形都真。
最反直觉的是 0→ 任何 = 真,对应「错误前提可以推出任何结论」。想象承诺「如果考一百分,就请你吃饭」——只要没考到一百分,无论我请不请,这句承诺都没被违背,所以算真。逻辑里的蕴含是这种「空泛成立」(vacuously true)的承诺,跟日常语言里隐含的因果关系并不一样。
一个有意思的事实:所有联结词都能用 ¬ 和 ∧(或 ¬ 和 ∨)表示出来,比如 p→q⇔¬p∨q。更进一步,单独一个 与非 ↑(NAND)或 或非 ↓(NOR)就能表示一切——这就是为什么数字电路里用 NAND 门可以搭出任何逻辑电路。
p↑q⇔¬(p∧q),p↓q⇔¬(p∨q)
由命题变元、联结词、括号按规则组成的式子称为 命题公式(合式公式,well-formed formula)。按真值情况分类:
- 永真式(重言式,Tautology):在所有赋值下恒为真。
- 永假式(矛盾式,Contradiction):恒为假。
- 可满足式(Satisfiable):至少存在一种赋值使其为真。
判断一个公式属于哪类,最朴素的办法就是列真值表。「公式是否可满足」这个问题(SAT)是计算机科学里第一个被证明 NP-完全的问题,地位很特殊。
例:判断 (p→q)→(¬q→¬p) 是哪类公式。逐行列真值表(记 A=p→q、B=¬q→¬p):
| p | q | p→q | ¬q→¬p | A→B |
|---|
| 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
最后一列恒为 1,故它是 重言式——这正是逆否等价 p→q⇔¬q→¬p 的另一种说法。
例:用真值表判断 p→(q→r) 与 (p∧q)→r 是否等值。两式各有 23=8 行,只需比较输出列。对照后会发现两列逐行相同(如 p=q=1,r=0 时,左边 1→(1→0)=1→0=0,右边 (1∧1)→0=1→0=0;其余各行同理),故二者 等值。这条规律叫 输出律(exportation),编程里「嵌套 if 等价于条件用 && 连起来」就是它。
若 A↔B 是重言式,称 A,B 等值,记 A⇔B。等值式是公式化简的「运算法则」,相当于代数里的恒等式。
| |
|---|
| 双重否定 | ¬¬p⇔p |
| 幂等律 | p∧p⇔p,p∨p⇔p |
| 交换律 | p∧q⇔q∧p,p∨q⇔q∨p |
| 结合律 | (p∧q)∧r⇔p∧(q∧r) |
| 分配律 | p∧(q∨r)⇔(p∧q)∨(p∧r) |
| 德摩根律 | ¬(p∧q)⇔¬p∨¬q |
| 吸收律 | p∨(p∧q)⇔p |
| 零一律 | p∨1⇔1,p∧0⇔0 |
| 同一律 | p∨0⇔p,p∧1⇔p |
| 排中律 | p∨¬p⇔1 |
| 矛盾律 | p∧¬p⇔0 |
| 蕴含等价 | p→q⇔¬p∨q |
| 逆否等价 | p→q⇔¬q→¬p |
| 等价展开 | p↔q⇔(p→q)∧(q→p) |
蕴含等价 p→q⇔¬p∨q 是化简里最常用的一步:它把不好处理的 → 消成 ¬ 和 ∨,剩下的就能套德摩根律和分配律了。
不列真值表、纯靠等值式一步步替换来证明等值或化简,称 等值演算。每一步都把局部子式换成等值的形式,整体真值不变。
例:化简 (p∨q)∧(p∨¬q)。
(p∨q)∧(p∨¬q)⇔p∨(q∧¬q)⇔p∨0⇔p分配律(提取 p)矛盾律同一律
例:证明 ¬(p→q)⇔p∧¬q,这是「否定一个蕴含」的标准结果。
¬(p→q)⇔¬(¬p∨q)⇔¬¬p∧¬q⇔p∧¬q蕴含等价德摩根律双重否定
直觉上「并非『若 p 则 q』」就是「p 成立却 q 不成立」——承诺被违背的唯一情形。
例:证明 (p→q)∧(p→r)⇔p→(q∧r)。
(p→q)∧(p→r)⇔(¬p∨q)∧(¬p∨r)⇔¬p∨(q∧r)⇔p→(q∧r)蕴含等价分配律蕴含等价
化简到最后若得到 1 就是重言式、得到 0 就是矛盾式,所以等值演算也能用来判别公式类型。
直接比较两个公式是否等值很麻烦,于是约定一种 标准写法,让等值的公式长得一样,这就是 范式(Normal Form)。
先约定两个词:
- 文字(Literal):命题变元 p 或其否定 ¬p。
- 简单合取式 / 简单析取式:若干文字的合取(如 p∧¬q)/ 析取(如 ¬p∨q)。
两种基本范式:
- 析取范式(Disjunctive Normal Form,DNF):若干 简单合取式之析取,形如 (p∧q)∨(¬p∧r)。
- 合取范式(Conjunctive Normal Form,CNF):若干 简单析取式之合取,形如 (p∨q)∧(¬p∨r)。
任何公式都能化成 DNF 和 CNF,步骤是:
- 用 蕴含等价 消去 →、↔。
- 用 德摩根律 把 ¬ 一直内推到变元前。
- 用 分配律 展开成需要的形状。
普通范式不唯一(p∨(p∧q) 和 p 都是 DNF),不便于比较。主范式 通过「每个变元在每个子式里恰好出现一次」消除了这种自由度,于是 每个公式的主范式唯一。
- 极小项(minterm):每个变元恰出现一次的简单合取式,如 p∧¬q∧r。它在真值表里 恰有一行为真。
- 极大项(maxterm):每个变元恰出现一次的简单析取式,如 ¬p∨q∨¬r。它 恰有一行为假。
- 主析取范式(principal DNF):把真值表里所有取值为 真 的行对应的极小项析取起来。
- 主合取范式(principal CNF):把所有取值为 假 的行对应的极大项合取起来。
直觉很简单:每个极小项「点亮」真值表里的一行,主析取范式就是把所有该真的行点亮、其余保持假。这也说明了为什么它唯一——真值表唯一,对应的极小项集合就唯一。
记口诀:主析取看真行、用极小项;主合取看假行、用极大项。两者互补,知道一个就能写出另一个。
约定一个变元顺序(如 p,q,r),把每个极小项里的变元 正则号为 1、否定号为 0,读成二进制就是它的编号 mi。极大项相反:变元正则号为 0、否定号为 1。
例:三变元下 m5=m101=p∧¬q∧r(它只在 p=1,q=0,r=1 这行为真);M5=M101=¬p∨q∨¬r(它只在 p=1,q=0,r=1 这行为假)。同一编号的极小项与极大项互为否定:¬mi⇔Mi。
由此有一条对偶关系:若真值表里真的行编号集合是 S,则
主析取范式=i∈S⋁mi,主合取范式=i∈/S⋀Mi
例:求 p→(q∧r) 的主析取范式与主合取范式。先列真值表(变元序 p,q,r,编号 0∼7):
| 编号 | p | q | r | q∧r | p→(q∧r) |
|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 |
| 2 | 0 | 1 | 0 | 0 | 1 |
| 3 | 0 | 1 | 1 | 1 | 1 |
| 4 | 1 | 0 | 0 | 0 | 0 |
| 5 | 1 | 0 | 1 | 0 | 0 |
| 6 | 1 | 1 | 0 | 0 | 0 |
| 7 | 1 | 1 | 1 | 1 | 1 |
真的行是 {0,1,2,3,7},假的行是 {4,5,6}。于是主析取范式取这五行的极小项:
m0∨m1∨m2∨m3∨m7=¬p∧¬q∧¬r ∨ … ∨ p∧q∧r
主合取范式取另外三行的极大项(编号 4=100、5=101、6=110):
M4∧M5∧M6=(¬p∨q∨r)∧(¬p∨q∨¬r)∧(¬p∨¬q∨r)
两者所用的编号正好互补({0,1,2,3,7} 与 {4,5,6} 并起来是全部 8 个),这是检验有没有写漏的好办法。也可不画真值表、直接由等值演算化成主析取范式:把公式化成析取范式后,对每个缺变元的简单合取式补上 (x∨¬x) 再展开即可。
从一组 前提 A1,…,An 推出 结论 B,记为:
A1∧A2∧⋯∧An⇒B
推理 有效(Valid)当且仅当 (A1∧⋯∧An)→B 是 重言式——也就是说,只要前提全真,结论就不可能假。注意「有效」只管形式对不对,前提本身是真是假它不负责。
| 名称 | 规则 |
|---|
| 假言推理 | (p→q)∧p⇒q |
| 拒取式 | (p→q)∧¬q⇒¬p |
| 析取三段论 | (p∨q)∧¬p⇒q |
| 假言三段论 | (p→q)∧(q→r)⇒p→r |
| 化简律 | p∧q⇒p |
| 附加律 | p⇒p∨q |
| 构造性二难 | (p→q)∧(r→s)∧(p∨r)⇒q∨s |
实际证明一个推理有效,除了列真值表,更常用的是 构造证明:从前提出发,每一步引用一条推理规则或等值式,逐行推到结论。常见策略有三种:
- 直接证法:从前提出发,正向逐步推出结论。
- 附加前提法(CP 规则):当结论形如 A→B 时,把 A 当作额外前提加进去,只要能推出 B,原结论即成立。依据是 (Γ∧A)→B 与 Γ→(A→B) 等值。
- 归谬法(反证法):把结论的 否定 ¬B 加入前提,若能推出 矛盾(如 r∧¬r,即 0),则说明 ¬B 与前提不相容,故 B 成立。
结论是 蕴含式 时优先用附加前提法,能把目标拆小;结论是 否定式 或难以正面下手时用归谬法。两者本质都是把「难证的目标」换成「好证的等价命题」。
例:前提 p→q、q→r、p,证结论 r。从前提正向推:
(1) p(2) p→q(3) q(4) q→r(5) r前提前提(1)(2) 假言推理前提(3)(4) 假言推理
例:前提 p→(q→r)、p,证结论 q→r。结论是蕴含式,把前件 q 当附加前提加入:
(1) q(2) p(3) p→(q→r)(4) q→r(5) r附加前提前提前提(2)(3) 假言推理(1)(4) 假言推理
推出 r,故附加前提下结论成立,由 CP 规则原结论 q→r 得证。
例:前提 p∨q、p→r、q→r,证结论 r(这正是「构造性二难」的一个特例)。把结论的否定 ¬r 加入前提找矛盾:
(1) ¬r(2) p→r(3) ¬p(4) q→r(5) ¬q(6) ¬p∧¬q(7) p∨q(8) ¬(p∨q)(9) (p∨q)∧¬(p∨q)否定结论前提(1)(2) 拒取式前提(1)(4) 拒取式(3)(5) 合取前提(6) 德摩根律(7)(8) 矛盾
得到矛盾 0,故 ¬r 与前提不相容,结论 r 成立。
命题逻辑把整句话当成一个不可分的真值,于是无法刻画「所有人都会死」与「苏格拉底是人」推出「苏格拉底会死」这种推理——因为这里的关键是句子内部的「所有」和「是人」。谓词逻辑(Predicate Logic,又称一阶逻辑)深入句子内部,引入 谓词 和 量词。
- 个体词:被研究的对象,用 a,b,c 表示 常元,x,y,z 表示 变元;它们的取值范围叫 个体域(论域)。
- 谓词:刻画对象的性质或对象间的关系,记 P(x)(「x 是人」)、R(x,y)(「x 大于 y」)。代入具体个体后才有真假。
- 全称量词 ∀x:「对所有 x」,是一种「无限的合取」。
- 存在量词 ∃x:「存在 x」,是一种「无限的析取」。
于是开头那个推理可写成 ∀x(P(x)→D(x))、P(a),推出 D(a)。
量词与个体域 紧密绑定,翻译时容易出错:
- 全称量词通常配 蕴含:「所有学生都努力」是 ∀x(S(x)→H(x)),而不是 ∀x(S(x)∧H(x))(后者意思是「万物都既是学生又努力」)。
- 存在量词通常配 合取:「有学生努力」是 ∃x(S(x)∧H(x)),而不是 ∃x(S(x)→H(x))。
设个体域为全体人,S(x):「x 是学生」,P(x):「x 用功」,M(x,y):「x 认识 y」。
例:「所有学生都用功」译为 ∀x(S(x)→P(x))。若误写成 ∀x(S(x)∧P(x)),意思变成「每个人既是学生又用功」——把非学生也卷进来了,错。
例:「有的学生用功」译为 ∃x(S(x)∧P(x))。若误写成 ∃x(S(x)→P(x)),因为蕴含「前件假即真」,只要存在 任何一个非学生(让 S(x) 假)整句就为真,跟「有学生用功」毫无关系,错得离谱。
例:「没有学生不用功」。先直译为 ¬∃x(S(x)∧¬P(x)),再用量词否定律推进否定:
¬∃x(S(x)∧¬P(x))⇔∀x¬(S(x)∧¬P(x))⇔∀x(S(x)→P(x))
化回了「所有学生都用功」——两种说法等值,这也验证了翻译没错。
例:「每个学生都认识某个用功的人」译为 ∀x(S(x)→∃y(P(y)∧M(x,y)))。注意 ∃y 在 ∀x 的辖域内,所以「某个用功的人」可以因学生而异——这正是 ∀∃ 次序的含义。
落在某个量词辖域内、被该量词「管住」的变元称 约束变元(Bound Variable),其余称 自由变元(Free Variable)。含自由变元的公式真假未定,像命题里的 x+1=3;闭式(无自由变元)才有确定真假。
换名规则:约束变元可以改名(∀xP(x)⇔∀yP(y)),但新名字不能与辖域内已有的其他变元冲突,否则会改变含义。这跟编程里函数局部变量改名同理——只要不撞名,叫什么都行。
命题逻辑的所有等值式在谓词逻辑里依然成立,此外还有专门处理量词的规则:
量词否定(量词的德摩根律):
¬∀xP(x)⇔∃x¬P(x),¬∃xP(x)⇔∀x¬P(x)
含义直白:「不是所有都满足」等于「存在一个不满足」;「不存在满足的」等于「所有都不满足」。否定一个量词,就是把它换成另一个量词、并把否定推进去。
量词辖域收缩与扩张(设 Q 中不含 x,故 x 在 Q 中自由出现与否不影响):
∀x(P(x)∧Q)⇔∀xP(x)∧Q,∃x(P(x)∨Q)⇔∃xP(x)∨Q
量词分配:
∀x(P(x)∧Q(x))⇔∀xP(x)∧∀xQ(x)
∃x(P(x)∨Q(x))⇔∃xP(x)∨∃xQ(x)
分配只在「∀ 对 ∧」「∃ 对 ∨」时是等值;交叉情形 只能单向蕴含,不能划等号。例如:
∀xP(x)∨∀xQ(x) ⇒ ∀x(P(x)∨Q(x))反过来不成立——「每个数要么正要么负」是真的,但「所有数都正」和「所有数都负」都假。
同类量词可以交换次序,异类量词 不能随便交换:
∀x∀yP(x,y)⇔∀y∀xP(x,y),∃x∃yP(x,y)⇔∃y∃xP(x,y)
但 ∀ 与 ∃ 的次序事关重大:
∃y∀xP(x,y) ⇒ ∀x∃yP(x,y)
只能这样单向推,反向不成立。设 P(x,y) 为「y 是 x 的母亲」:
- ∀x∃yP(x,y):每个人都有母亲(母亲可以因人而异)——真。
- ∃y∀xP(x,y):存在一个人是 所有人 共同的母亲——假。
关键在于:后置量词依赖前置量词时,∃y 选的 y 是否允许随 x 变。∀x∃y 允许 y 随 x 变,∃y∀x 要求一个 y 通吃——后者强得多。极限定义里 ∀ε∃N 的次序之所以不能调换,正是这个道理。
把所有量词 提到公式最前面、辖域覆盖其后整个式子的形式,称 前束范式(Prenex Normal Form):
(Q1x1)(Q2x2)⋯(Qkxk)M
其中每个 Qi 是 ∀ 或 ∃,M 是 不含量词 的公式(母式)。任何谓词公式都能化成前束范式,步骤:
- 消去 →、↔。
- 用量词否定律把 ¬ 推到谓词前。
- 必要时 换名,避免不同量词用了同一变元而提取时冲突。
- 用辖域扩张律把量词逐个提到最前。
前束范式把「量词结构」和「命题结构」彻底分开,是判定、模型论里进一步处理(如 Skolem 化)的标准起点。
例:求 ∀xP(x)→∃xQ(x) 的前束范式。两个量词都用了 x,直接提取会冲突,所以先换名再提取:
∀xP(x)→∃xQ(x)⇔¬∀xP(x)∨∃xQ(x)⇔∃x¬P(x)∨∃xQ(x)⇔∃x¬P(x)∨∃yQ(y)⇔∃x∃y(¬P(x)∨Q(y))蕴含等价量词否定换名辖域扩张
母式 ¬P(x)∨Q(y) 已不含量词,前缀 ∃x∃y 即为所求。若中途不换名、把两个 ∃x 直接合并,会错误地强迫「不用功」和「用功」指同一个 x,含义就变了——这是求前束范式最常见的错。