命题逻辑与证明方法

命题逻辑与证明方法

本章主线:命题与逻辑联结词 → 量词与逻辑等价 → 基本证明方法 → 算法正确性与不变量。

1 命题

能够明确判断真假的陈述句称为命题。

例如:

  • 2+3=52+3=5 是真命题;
  • 77 是偶数是假命题;
  • “请关闭窗口”不是命题;
  • “这个算法很优秀”通常不是严格命题,因为“优秀”的标准不明确。

命题通常用字母 P,Q,RP,Q,R 表示。

命题只有两种真值:

  • 真,记作 TT;
  • 假,记作 FF。

2 否定

命题 PP 的否定记作 ¬P\neg P,表示“PP 不成立”。

若 PP 为真,则 ¬P\neg P 为假;若 PP 为假,则 ¬P\neg P 为真。

例如,若 PP 表示“xx 是偶数”,则 ¬P\neg P 表示“xx 不是偶数”。

注意,否定一个命题时,需要否定整个陈述,而不是只替换其中某个词。

例如,“所有顶点都被访问”的否定是“至少存在一个顶点未被访问”。


3 合取

命题 PP 与 QQ 的合取记作 P∧QP\land Q,表示“PP 且 QQ”。

只有当 P,QP,Q 都为真时,P∧QP\land Q 才为真。

例如,“x>0x>0 且 x<10x<10”可以写成 x>0∧x<10x>0\land x<10。

在集合语言中:

x∈A∩B⟺x∈A∧x∈B.x\in A\cap B\Longleftrightarrow x\in A\land x\in B.


4 析取

命题 PP 与 QQ 的析取记作 P∨QP\lor Q,表示“PP 或 QQ”。

数学中的“或”通常是包含性的:只要至少一个命题为真,P∨QP\lor Q 就为真。

例如,“x∈Ax\in A 或 x∈Bx\in B”包括 xx 同时属于 A,BA,B 的情况。

在集合语言中:

x∈A∪B⟺x∈A∨x∈B.x\in A\cup B\Longleftrightarrow x\in A\lor x\in B.


5 蕴含

命题“若 PP,则 QQ”记作 P⟹QP\Longrightarrow Q。

其中:

  • PP 称为前件;
  • QQ 称为后件。

P⟹QP\Longrightarrow Q 只在 PP 为真而 QQ 为假时为假。

例如:

若一个整数能被 44 整除,则它是偶数。

记作

4∣n⟹2∣n.4\mid n\Longrightarrow2\mid n.

这里“能被 44 整除”是充分条件,“是偶数”是必要条件。


6 充分条件与必要条件

若 P⟹QP\Longrightarrow Q,则:

  • PP 是 QQ 的充分条件;
  • QQ 是 PP 的必要条件。

“充分”表示只要满足 PP,就足以推出 QQ。

“必要”表示若想让 PP 成立,QQ 必须成立。

例如,若一个图是树,则它一定连通。

因此,“是树”是“连通”的充分条件,“连通”是“是树”的必要条件。

但连通图不一定是树,所以“连通”不是“是树”的充分条件。


7 逆命题、否命题与逆否命题

原命题为

P⟹Q.P\Longrightarrow Q.

对应的三个命题为:

  • 逆命题:Q⟹PQ\Longrightarrow P;
  • 否命题:¬P⟹¬Q\neg P\Longrightarrow\neg Q;
  • 逆否命题:¬Q⟹¬P\neg Q\Longrightarrow\neg P。

原命题与逆否命题等价。

逆命题与否命题等价。

但原命题通常不与逆命题等价。

例如原命题:

若 nn 能被 44 整除,则 nn 是偶数。

逆命题:

若 nn 是偶数,则 nn 能被 44 整除。

逆命题为假,因为 n=2n=2 是反例。

逆否命题:

若 nn 不是偶数,则 nn 不能被 44 整除。

该命题与原命题等价。


8 充要条件

若 P⟹QP\Longrightarrow Q 且 Q⟹PQ\Longrightarrow P,则称 PP 与 QQ 互为充要条件,记作

P⟺Q.P\Longleftrightarrow Q.

证明充要条件时,需要分别证明两个方向:

  1. P⟹QP\Longrightarrow Q;
  2. Q⟹PQ\Longrightarrow P。

例如,整数 nn 是偶数,当且仅当存在整数 kk,使得 n=2kn=2k。


9 量词

9.1 全称量词

“对所有”记作 ∀\forall。

例如

∀x∈R,x2≥0.\forall x\in\mathbb R,\quad x^2\ge0.

表示对任意实数 xx,都有 x2≥0x^2\ge0。

9.2 存在量词

“存在”记作 ∃\exists。

例如

∃x∈Z,x2=4.\exists x\in\mathbb Z,\quad x^2=4.

表示存在整数 xx,满足 x2=4x^2=4。


10 含量词命题的否定

全称命题的否定是存在命题:

¬(∀x, P(x))⟺∃x, ¬P(x).\neg(\forall x,\ P(x)) \Longleftrightarrow \exists x,\ \neg P(x).

存在命题的否定是全称命题:

¬(∃x, P(x))⟺∀x, ¬P(x).\neg(\exists x,\ P(x)) \Longleftrightarrow \forall x,\ \neg P(x).

例如,“所有数组元素都为正数”的否定是“至少存在一个数组元素不是正数”。

“存在一个顶点未访问”的否定是“所有顶点都已访问”。


11 德摩根律

命题逻辑中的德摩根律为

¬(P∧Q)⟺¬P∨¬Q,\neg(P\land Q)\Longleftrightarrow\neg P\lor\neg Q,

¬(P∨Q)⟺¬P∧¬Q.\neg(P\lor Q)\Longleftrightarrow\neg P\land\neg Q.

例如,“不同时满足 P,QP,Q”表示“至少一个不成立”。

集合中的德摩根律正是这一逻辑规律的集合形式。


12 直接证明

直接证明从已知条件出发,通过定义和已知结论推出目标结论。

例如证明:若 a,ba,b 都是偶数,则 a+ba+b 是偶数。

由偶数定义,存在整数 m,nm,n,使得 a=2ma=2m,b=2nb=2n。

于是 a+b=2(m+n)a+b=2(m+n)。因为 m+n∈Zm+n\in\mathbb Z,所以 a+ba+b 是偶数。

直接证明适合推导链条清晰的问题。


13 逆否证明

要证明 P⟹QP\Longrightarrow Q,可以改为证明等价的逆否命题 ¬Q⟹¬P\neg Q\Longrightarrow\neg P。

例如证明:若 n2n^2 是偶数,则 nn 是偶数。

直接从 n2n^2 是偶数出发不够方便,可以证明逆否命题:

若 nn 是奇数,则 n2n^2 是奇数。

设 n=2k+1n=2k+1,则

n2=(2k+1)2=2(2k2+2k)+1,n^2=(2k+1)^2=2(2k^2+2k)+1,

所以 n2n^2 是奇数。

因此原命题成立。


14 反证法

反证法用于证明命题 PP。

先假设 ¬P\neg P 成立,再从这个假设推出矛盾,从而说明 ¬P\neg P 不可能成立,因此 PP 成立。

例如证明 2\sqrt2 不是有理数。

假设 2=p/q\sqrt2=p/q,其中 p,qp,q 互质。

平方后得 p2=2q2p^2=2q^2,所以 p2p^2 是偶数,从而 pp 是偶数。

设 p=2kp=2k,代入得 q2=2k2q^2=2k^2,所以 qq 也是偶数。

这与 p,qp,q 互质矛盾,因此 2\sqrt2 不是有理数。


15 分类讨论

当问题可以按互斥情况完整划分时,可以分别证明每种情况。

例如证明任意整数 nn 的 n(n+1)n(n+1) 都是偶数。

整数 nn 只有两种情况:

  • 若 nn 是偶数,则 n(n+1)n(n+1) 是偶数;
  • 若 nn 是奇数,则 n+1n+1 是偶数,所以 n(n+1)n(n+1) 是偶数。

两种情况覆盖所有整数,因此结论成立。

分类讨论需要满足:

  • 各情况覆盖全部可能;
  • 不遗漏情况;
  • 各分支结论都成立。

16 数学归纳法

数学归纳法用于证明关于自然数 nn 的命题 P(n)P(n)。

基本步骤为:

  1. 证明基础情形 P(n0)P(n_0) 成立;
  2. 假设 P(k)P(k) 成立;
  3. 在该假设下证明 P(k+1)P(k+1) 成立。

若两步都完成,则 P(n)P(n) 对所有 n≥n0n\ge n_0 成立。

例如证明

1+2+⋯+n=n(n+1)2.1+2+\cdots+n=\frac{n(n+1)}2.

基础情形 n=1n=1 时成立。

假设 n=kn=k 时成立,即

1+2+⋯+k=k(k+1)2.1+2+\cdots+k=\frac{k(k+1)}2.

则

1+2+⋯+k+(k+1)=k(k+1)2+(k+1)=(k+1)(k+2)2.\begin{aligned} 1+2+\cdots+k+(k+1) &=\frac{k(k+1)}2+(k+1)\\ &=\frac{(k+1)(k+2)}2. \end{aligned}

所以 n=k+1n=k+1 时也成立。


17 强归纳法

强归纳法在证明 P(k+1)P(k+1) 时,可以假设 P(n0),P(n0+1),…,P(k)P(n_0),P(n_0+1),\dots,P(k) 全部成立。

例如证明每个大于 11 的整数都可以分解为质数乘积。

若 nn 是质数,则结论成立。

若 nn 不是质数,则 n=abn=ab,其中 1<a,b<n1<a,b<n。

根据归纳假设,a,ba,b 都可以分解为质数乘积,因此 nn 也可以。

强归纳法适合当前状态依赖多个更小状态的问题。


18 构造证明

构造证明通过直接给出满足条件的对象证明其存在。

例如证明任意偶数 nn 都可以写成两个整数之和。

可以直接构造

n=0+n.n=0+n.

在算法中,给出一个可行解、构造一条路径或构造一种排列,都属于构造思想。


19 反例

要否定全称命题 ∀x, P(x)\forall x,\ P(x),只需找到一个反例 x0x_0,使得 P(x0)P(x_0) 不成立。

例如命题“所有质数都是奇数”是假的,因为 22 是质数但不是奇数。

反例只能否定命题,不能证明命题。

检查猜想时,应优先寻找:

  • 最小规模;
  • 边界情况;
  • 空集或单元素情况;
  • 极端值;
  • 对称情况。

20 不变量

不变量是在算法执行过程中始终保持成立的性质。

证明算法正确性时,通常分为三步:

  1. 初始化后不变量成立;
  2. 每次操作都保持不变量;
  3. 算法结束时,不变量能够推出目标结论。

例如,二分查找可以维护不变量:

答案始终位于当前搜索区间内。

每次根据中点结果缩小区间,但不丢失答案。

并查集可以维护不变量:

两个元素属于同一个集合,当且仅当它们最终拥有相同根节点。


21 循环不变量

循环不变量是在每次循环开始或结束时都成立的命题。

例如插入排序处理到位置 ii 时,可以维护:

前 ii 个元素已经有序,并且它们仍然是原数组前 ii 个元素的一个排列。

证明循环正确性通常包括:

  • 初始化:第一次循环前成立;
  • 保持:一次循环后仍成立;
  • 终止:循环结束时推出最终目标。

22 极小反例法

要证明某命题对所有对象成立,可以假设存在反例,并选择其中规模最小的反例。

然后利用其最小性,将它缩小、拆分或变换,构造出更小反例,从而产生矛盾。

极小反例法常用于:

  • 图论证明;
  • 贪心正确性;
  • 递归结构;
  • 整数分解问题。

其核心是利用“最小反例的所有更小结构都不是反例”。


23 交换论证

交换论证常用于证明贪心算法。

基本思路为:

  1. 取一个最优解;
  2. 若它不包含贪心选择,就交换其中部分结构;
  3. 证明交换后仍然可行,且答案不变差;
  4. 得到一个包含贪心选择的最优解。

这说明贪心选择至少存在于某个最优解中。

例如活动选择问题中,可以将最优解的第一个活动替换为结束最早的活动,而不会减少可选活动数量。


24 算法证明的基本结构

证明一个算法正确,通常需要分别说明:

24.1 可行性

算法产生的结果满足题目全部约束。

24.2 完备性

算法不会遗漏所有可能的正确答案。

24.3 最优性

若题目要求最优解,需要证明算法所得答案不劣于任何其他可行解。

24.4 终止性

算法能够在有限步内结束。

不同算法的证明重点不同:

  • 搜索:完备性与不重复;
  • 贪心:最优性;
  • 动态规划:状态定义与转移完备性;
  • 数据结构:操作前后的不变量;
  • 图算法:路径、割、连通性等结构性质。

25 常见逻辑错误

25.1 证明了逆命题

已知需要证明 P⟹QP\Longrightarrow Q,却只证明了 Q⟹PQ\Longrightarrow P。

25.2 把必要条件当充分条件

由“树一定连通”,错误推出“连通图一定是树”。

25.3 用若干例子代替证明

有限个例子只能支持猜想,不能证明全称命题。

25.4 漏掉边界情况

例如空图、单点图、长度为 00 的路径、数组为空等。

25.5 循环论证

证明 PP 时使用了尚未证明的 PP 本身。

25.6 量词顺序混淆

下面两个命题不同:

∀x, ∃y, P(x,y),\forall x,\ \exists y,\ P(x,y),

∃y, ∀x, P(x,y).\exists y,\ \forall x,\ P(x,y).

前者允许不同的 xx 选择不同的 yy;后者要求存在同一个 yy 对所有 xx 都有效。


26 与算法的联系

并查集

不变量是:父指针形成森林,每棵树对应一个等价类。

二分答案

需要证明判定函数具有单调性,并维护答案仍在搜索区间中的不变量。

Kruskal

常用交换论证或割性质证明贪心选边不会破坏最优性。

Dijkstra

在边权非负的前提下,维护已经确定的顶点,其最短距离不会再被后续路径改进。

动态规划

常用归纳法证明状态值等于对应子问题的最优答案。

拓扑排序

通过每次删除入度为 00 的顶点,保持剩余图仍是 DAG。


28 与后续内容的联系

  • 集合恒等式可以转化为命题逻辑等价;
  • 等价关系、偏序关系、树与群等结构都需要通过定义和证明建立;
  • 数学归纳法、循环不变量与交换论证分别支撑递归、迭代与贪心算法;
  • 后续各数学分支中的证明,均默认使用本章的逻辑语言与证明规范。

29 本章思考题

  1. 判断下列句子是否为命题:

    • 3+5=83+5=8;
    • 请输出答案;
    • 存在最大的质数;
    • 这个算法运行得很快。
  2. 写出命题“所有顶点都已访问”的否定。

  3. 写出命题“存在一个整数 xx,使得 x2=2x^2=2”的否定。

  4. 设原命题为“若图是树,则图连通”,写出其逆命题、否命题和逆否命题。

  5. 说明原命题与逆否命题为什么等价。

  6. 证明:若 nn 是奇数,则 n2n^2 是奇数。

  7. 使用逆否证明:若 n2n^2 是偶数,则 nn 是偶数。

  8. 使用数学归纳法证明:

    1+3+5+⋯+(2n−1)=n2.1+3+5+\cdots+(2n-1)=n^2.

  9. 找出命题“若 abab 是偶数,则 a,ba,b 都是偶数”的反例。

  10. 说明二分查找中可以维护什么循环不变量。

  11. 说明为什么用若干测试样例不能证明算法一定正确。

  12. 尝试用交换论证说明:区间调度中优先选择结束时间最早的区间是合理的。


命题逻辑与证明方法
http://miqiu.space/posts/5efd66d4/
作者
Miqiu
发布于
2026年7月1日
许可协议