上一章一直在强调:举很多例子,只能让一个猜想显得可信;真正的证明要说明它为什么不可能失败。可一旦开始写证明,我们马上会碰到一个更基础的问题——“如果”“且”“或”“只有”“当且仅当”到底各自承诺了什么?
日常聊天允许含糊。朋友说“有空就来”,我们通常不会追问“有空”的判定标准,也不会列出他来与不来的四种情况。数学不能这样省略,因为证明中的一个箭头写反,整条推理就会跟着转向。
命题逻辑先做一件看似朴素、其实很有用的事:暂时不看句子内部谈的是整数、图还是程序,只记录它是真还是假,再研究这些真假怎样被连接词组合。你可以把这一章看成证明语言的语法课。我们会把思考过程摊开:先判断什么能进入逻辑式,再解释每个连接词的规则,最后用真值表把所有可能情况逐行核对。
命题是一个已经表达完整、并且在语境固定后具有确定真值的陈述。真值只有两个:真与假。
“”是命题,而且是真命题。“ 是偶数”也是命题,只不过它是假命题。请留意这里最容易混淆的一点:命题不等于正确的话。一句话只要能够明确地判为真或假,就已经取得了“命题”的资格。
判断时可以按下面的顺序问:
看几组对比会更清楚。
有些命题很难判断,甚至还没有人知道答案。它们仍然是命题。命题的要求是“真值确定”,不是“我们现在就会算”。
例如,“每个大于 的偶数都能写成两个质数之和”是一句完整陈述。我们可以暂时不知道它究竟真还是假,但它没有因为我们的无知变成问句或模糊句。
反过来,“今天有点冷”可能人人都听得懂,却不适合直接放进数学论证。它缺少地点、时刻和温度标准。把它改成“2026 年 1 月 15 日上午 8 点,北京某气象站记录的气温低于 ”,真假边界才清楚。
“能否很快算出真值”和“有没有确定真值”是两件事。前者讨论我们的知识或计算能力,后者才决定一个句子能不能成为命题。
“”通常叫开放句,或看成一个关于 的谓词。它像一张还没填完的表格:填入 ,得到真命题“”;填入 ,得到假命题“”。
让开放句变成命题,常见方法有两种:
量词会在后面的章节专门展开。现在先守住边界:命题逻辑把完整命题当成整体处理,不负责打开量词内部。
下面的交互练习可以帮你校准这条边界。做题时不要先猜真假,先问“这句话有没有资格取真值”。
假设我们讨论一个课程系统:
叫命题变量,也叫布尔变量。每个变量在某个情形中只能取真或假。把长句换成字母,不是为了故作抽象,而是为了先看清句子之间的骨架。
如果系统规则是“作业已经提交且格式正确时,系统显示通过”,它的骨架就是:
这里 是构成公式的基本单元,可以称为原子命题;整个公式是复合命题。所谓“原子”是相对于当前分析层次说的。只要我们决定不再拆开“作业已经提交”,它在本次建模中就是一个原子。
命名时最好把每个字母定义成一句肯定、完整、尽量简单的话。例如,用 表示“作业已提交”,以后写“作业未提交”就是 。如果把 定义成“作业没有提交”,再写 ,就会出现双重否定,读者很容易绕晕。
不要把多个逻辑层次悄悄塞进一个字母。若 已经表示“作业提交且格式正确”,再写 时,公式表面看起来只有一层,实际却藏着另一层“且”。除非确实要把那段话当成不可拆的整体,否则应把基本陈述分别命名。
命题逻辑里最常用的连接词是:否定、合取、析取、蕴含和双条件。先看全貌,再逐个拆开。

只做一件事:把 的真值翻转。
真正写证明时,难点往往不在符号,而在自然语言的否定范围。例如,
表示“ 与 不会同时成立”,它允许两边都假,也允许恰好一边真;它不等于“ 都不成立”,后者是 。先把括号看清,能避开很多错误。
只有在 都为真时才为真。“报名成功且缴费完成”要求两项都过关,少一项都不算完成。
中文里的“但”“虽然……可是……”在情感色彩上和“且”不同,在最基础的命题逻辑里通常仍按合取处理。例如,“程序运行成功,但输出不正确”可以写成 。逻辑式保留真假条件,不保留说话人的惊讶或转折语气。
表示至少一个成立,也允许 同时成立。这叫相容析取。
日常语言有时把“或”说成二选一。例如“套餐选米饭或面条”可能暗含只能选一种。数学不会让这个暗示停留在语气里。若要表达“恰好一个为真”,可以写成:
它先要求至少一个成立,再排除两个同时成立。这种“恰好一个”的连接也常叫异或。
表示 同真或同假。它等价于同时提出两个条件:
所以“ 当且仅当 ”不是把箭头写得更漂亮,而是承诺两个方向都能推出。定义和充要条件常用这种形式。
复合公式一长,括号就不能省。例如:
和
一般不等价。第一式要求 必须为真;第二式只要 为真,整式就已经为真。
通常可把优先级记成 最高,接着是 、、、。但长公式不要拿读者来测试优先级,主动加括号更可靠。
条件命题 是最需要慢下来想的连接词。 叫前件或假设, 叫后件或结论。它说的不是“ 已经发生”,也不是“ 在现实中造成了 ”,而是一条约束:只要 成立, 就不能失败。
拿一句承诺来想:
如果明天下雨,我就带伞。
什么时候能明确说这个承诺被破坏了?只有明天真的下雨,而我没有带伞。其余情况都不能判我违约:下雨并带伞,承诺兑现;没下雨但带了伞,承诺没有禁止我带;没下雨也没带,承诺根本没有对这种情况提出要求。
设 表示“明天下雨”, 表示“我带伞”,四种情况就是:

前件为假时, 被规定为真,这常叫空真。第一次见会觉得别扭,是因为日常聊天习惯追问一句话“有没有实际信息”;命题逻辑问的却是“有没有出现违反规则的情形”。当前件为假时,违反规则所需的那种情形没有出现。
系统规范能进一步说明为什么这个约定有用。假设系统有十二条规则,每条都写成“若条件 出现,则执行动作 ”。某次运行只有 和 出现,系统正确执行了 。我们希望说这次运行遵守了全部规范,而不是说其他十条规则都真假不明。把未触发规则视为没有被违反,正好对应假前件下的空真。
蕴含还有一个非常实用的改写:
右边说“要么 不成立,要么 成立”。它和左边排除的是同一种情况: 真而 假。稍后我们会用真值表亲自核对这件事。
只规定真值关系,不自动表达因果、时间顺序或解释机制。“若 则 ”在逻辑上成立,不代表 是 的现实原因。讨论因果时还需要额外背景。
真值表的力量不在计算复杂,而在没有漏掉情况。若公式里有 个不同命题变量,每个变量有真、假两种取值,就一共有:
种真值分配。两个变量有 行,三个变量有 行。
以 为例,可以让 每四行变一次, 每两行变一次, 每行变一次:
这种排列像二进制计数,能确保每种组合恰好出现一次。行的顺序不是数学结论的一部分,只要完整、不重复即可。
考虑公式:
不要一眼跳到最后一列。先算 ,再算 ,最后做合取。
读最后一列前,可以先用中文猜一下:公式要求“ 至少一个为真,并且 为假”。既然 必须假,就只能靠 让析取成立。因此唯一的真行应该是 假、 真。表格正好验证了这段思考。
先圈出公式中不同的命题变量。这里有 两个,所以表格必须有 行。
按固定顺序列出真真、真假、假真、假假,避免漏行或重行。
下面的实验台会把每一行的中间计算展开。你可以先选预设公式,再自己输入只含 的公式,观察括号怎样改变最后一列。
真值表完成后,先别急着收笔。最后一列会告诉我们这个公式在所有情形下的整体性质。
若最后一列全是真,公式叫重言式,也常说它是有效式。例如:
无论 真还是假,“ 或非 ”都为真。
若最后一列全是假,公式叫矛盾式。例如:
它要求 同时为真又为假,没有任何真值分配能做到。
若至少有一行使公式为真,公式就是可满足的。例如 只有一行真,但一行已经足够,所以它可满足。
这里有个细小却重要的包含关系:重言式当然也可满足,因为它每一行都真。因此,“可满足”不等于“有的行真、有的行假”。若公式既不是重言式,也不是矛盾式,也就是最后一列既有真又有假,可以称它为偶然式。
否定能把这些性质连起来: 是重言式,当且仅当 是矛盾式; 可满足,当且仅当 不是重言式。
两个公式 在每一种真值分配下都给出相同结果,就称它们逻辑等价,记作:
例如核对 与 :
两列逐行相同,所以两个公式等价。注意,等价比较的不是“某一次碰巧同真”,而是所有行都相同。事实上, 也可以理解成 是重言式。
翻译不是看到“如果”就画箭头,看到“且”就放符号。更稳的方法是先把句子拆成能独立取真值的短句,再确定谁约束谁。
以“如果作业已经提交并且格式正确,那么系统显示通过”为例,按四步处理。
先找原子命题。设 表示“作业已经提交”, 表示“格式正确”, 表示“系统显示通过”。
找最里面的连接。“已经提交并且格式正确”要求两者都真,所以得到 。
最终得到:
“只有登录,才能提交”最容易写反。设:
“只有登录”在说:一旦用户能够提交,我们就能确定他已经登录。箭头应写成:
一个实用检查法是故意让必要条件失败。若 为假,规则应该禁止 为真; 恰好在 真、 假时为假。
“登录就能提交”则是 ,它比原句强得多,因为登录可能只是提交的必要条件之一,还可能需要权限、材料完整等条件。
“,除非 ”通常先读成“如果不 ,那么 ”:
它也等价于 。例如,“系统继续运行,除非温度过高”可以先改写为“如果温度没有过高,那么系统继续运行”。
自然语言中的“除非”有时混入时间、默认行为或因果意味。若原句属于正式规范,应把这些背景条件也写清,不要只凭一个关键词套模板。
下面的练习会让你专门处理“只有”“除非”“当且仅当”等方向词。做每题前,先用完整中文说出字母定义,再看箭头。
程序中的条件判断几乎就是命题逻辑的日常工作区。假设某段代码的条件是:
x > 0 || (x <= 0 && y > 100)设 表示“”, 表示“”。在普通实数比较中,“”正是 ,因此条件骨架是:
它其实与 等价。我们可以不用立刻列完整表,先按 分情况想:
所以在纯布尔意义下,可以把条件化简成:
x > 0 || y > 100化简能让条件更易读,也可能减少逻辑门或重复判断。但把数学等价搬进真实程序时还要多检查一步:表达式是否有副作用、异常或短路求值差异。若计算 会修改状态,两个真假等价的条件不一定有相同的运行行为。
假设一个功能配置有三条要求:
把要求合在一起:
这个公式不是矛盾式,因为令 都为假时,三条要求可以同时成立;所以整个规范可满足。但它也告诉我们:在当前安全策略下不能开启离线模式。若再加一条“必须开启离线模式”即 ,新规范就不可满足。
这正是可满足性问题的实际含义:不是问某一句要求听起来合不合理,而是问能否找到一组真假配置,让所有要求同时成立。
前面一直是“给公式,算真值表”。其实也可以反过来:给定一张真值表,把每个真行描述出来,再用“或”连接,就能得到一个与原表完全一致的公式。
以 为例,它在三行中为真:
每个合取项只在对应那一行成立。把三个真行用析取连接:
这叫从真行得到的析取范式。它看起来比 长,但意义很直接:列出所有能让公式为真的输入模式。进一步化简,就会得到熟悉的 。
同样,也可以针对每个假行写一个只在该行失败的析取项,再把这些项用“且”连接,得到合取范式。任何命题公式都能写成这样的析取范式或合取范式。
这件事很有分量:真值表不只用来检验已有公式,它本身已经完整描述了一个布尔函数,我们总能把表格重新翻译成公式。代价也很明显——变量一多,行数按 增长,公式可能迅速变长。
真值表适合变量较少时逐行核对。公式更长时,我们也会用已经验证过的等价律做变形。
这些规则不是凭符号长相猜出来的,每一条都可以用真值表验证。下一章会继续追问:哪些等价变形能帮助我们改写条件命题,哪些推理形式能保证从真前提得到真结论。
判断下列语句是否为命题,并说明缺少的条件或真值。
设 表示“用户已登录”, 表示“用户有管理员权限”, 表示“用户可以删除记录”。写出下列句子的逻辑式。
为下面的公式写真值表,并判断它是重言式、矛盾式还是偶然式:
要使下面的公式为假, 分别应取什么真值?先根据蕴含的失败条件推理,再用真值表核对。
判断下列规范能否同时满足,并给出一组真值分配或说明矛盾在哪里:
现在我们已经有了一套不会含糊的基本语言:完整陈述先变成命题变量,连接词规定组合规则,真值表负责穷尽所有输入。读到 时,我们会主动寻找“前件真、后件假”的反例;读到“当且仅当”时,我们知道必须照顾两个方向;看到一组系统要求时,我们也会问它们能否同时满足。
下一章会把注意力集中到条件命题本身:逆命题为什么不能随便使用,逆否命题为什么与原命题等价,“充分”“必要”怎样对应箭头方向,以及哪些推理规则能安全地把前提推进到结论。那时证明不再只是“感觉顺”,而会有一条可以逐步核对的逻辑骨架。
| 至少一边为真时就真 |
| 若 ,则 | 只在 真、 假时为假 |
| 当且仅当 | 两边真值相同时为真 |
把括号内或优先级更高的部分各设一列。这里先计算 与 。
最后合并中间列,得到目标公式。算完后再用一句自然语言检查结果是否符合直觉。
| 假 |
| 真 |
| 真 |
| 真 |
| 真 |
| 假 | 假 | 真 | 真 | 真 |
判断条件方向。“如果”后面是触发条件,“那么”后面是受约束的结果,所以箭头从 指向 。
加括号并回译。 读回中文仍是原句,说明结构没有在符号化时走样。
| 至少一项,默认允许两项都满足 |
| 要么 要么 ,但不能都选 | 至少一个,再排除同时成立 |
| 若 则 | 是前件, 是后件 |
| 仅当 | 是 的必要条件 |
| 只有 才 | “才”后面的事发生,会迫使“只有”后面的条件成立 |
| 当且仅当 | 两个方向都成立 |
| 不会同时成立 | 允许两者都不成立 |
| 都不成立 | 两项分别取反 |
| ,除非 | 先改写为“若不 ,则 ” |
| 分配律 |
| 对偶分配律 |
| 德摩根律 |
| 德摩根律 |
| 排中律 |
| 矛盾律 |