上一章里,我们已经会把复合命题拆成命题变元和连接词,也会用真值表逐行计算真假。现在要把其中最容易“听错方向”的连接词单独拿出来:条件命题。
它难的地方不在符号 ,而在日常语言给我们留下的习惯。平时说“如果下雨,我就带伞”,我们会联想到天气导致行为、事情发生的先后,甚至一个人的承诺是否可靠。数学暂时把这些背景全部拿掉,只问一件很窄的事:有没有出现前件已经成立、后件却失败的情况?
这一步看起来像是在抠字眼,其实后面的证明都靠它。直接证明是在假设前件以后寻找后件;逆否证明是在后件失败时排除前件;推理规则是在检查一条结论是否真的被前提锁定。把这条箭头读准,证明就不再是一串突然出现的句子,而会变成一条能逐步核对的路线。
条件命题写作 ,读作“如果 ,那么 ”。 叫前件或假设, 叫后件或结论。
先用一句话抓住它的意思:只要 成立, 就必须成立。于是,要证明这句话不守信用,必须同时看到两件事: 确实发生了, 却没有发生。
真值表正是在记录这四种可能:

考虑命题:“如果整数 是 的倍数,那么 是偶数。”令
原命题就是 。若要推翻它,我们得找出一个既满足 、又满足 的整数。可一旦 ,就有 ,因此这样的整数不存在。
这里要分清“证明”和“试了几个数”。检查 都是偶数,只能增加信心,不能覆盖所有整数;写出 ,才说明任何 的倍数都不会成为违背条件的例子。
再取 。这时前件“ 是 的倍数”为假,后件“ 是偶数”为真,所以整句仍为真。 没有满足前件,当然不能拿它来反驳“满足前件以后会怎样”。
没有说 是 的原因,也没有说 是让 成立的唯一办法。它只排除 这一种组合。
初学时最别扭的是后两行:前件为假,无论后件真假, 都为真。这叫空真。
还是看一句承诺:“如果我今天提交作业,那么文件名里会写学号。”如果今天确实提交了,却没写学号,承诺失败;如果今天根本没提交,单凭文件名是否出现学号,无法说这句条件承诺被违背。数学把“没有出现违背情形”统一记为真。
这样规定还有一个很实用的结果。假设一个系统有十二条规则:在条件 出现时执行动作 。某次运行只有 和 出现,系统正确执行了 和 。我们希望说十二条规则都被遵守了,而不是说其余十条规则都失败了。把假前件的蕴含判为真,正好表达“未触发的规则没有被违反”。
空真不表示后件被前件“证明”了。它只是在判断整个条件命题的真值:这一次赋值没有落入唯一的失败行。
下面可以逐个切换 与 。先故意切到“ 真、 假”,再比较另外三种状态,条件命题的规则会比背表格直观得多。
否定一句话,是要准确描述它什么时候失败。 唯一的失败情形是 真而 假,所以
例如,“如果下雨,那么地面湿”的否定是“下雨了,并且地面不湿”。它不是“如果不下雨,那么地面不湿”;后一句仍是一个条件命题,而且谈的是另一种方向。
这条等价式也是反例为什么有用的根源。一个全称条件命题声称所有研究对象都不会出现 。只要找到一个对象同时满足 与 ,整句就被推翻。
否定箭头时,不要把两边分别加上否定号。 是 ,不是 。
从 出发,交换两端、否定两端,会得到三个相关命题。名字容易混,最稳妥的办法是先做符号操作,再贴名称。
真正的等价关系只有两组:

不要只记“原命题等价于逆否命题”,我们顺着失败情形看一次。
原命题 失败,需要 真、 假。逆否命题 失败,需要 真、 假,翻回去仍然是 假、 真。两者在同一个情形失败,其余情形同时为真,所以真值始终一致。
也可以用等价变形写成:
而
最后只用了双重否定和析取交换律。两个式子都化到了同一个形状。
继续使用“如果 是 的倍数,那么 是偶数”。四种形式分别是:
原命题为真,逆否命题也为真。取 ,逆命题的前件为真而后件为假,所以逆命题为假;同一个 也使否命题的前件为真、后件为假,因此否命题为假。
这不是巧合。逆命题与否命题本来就等价,因此能推翻其中一个的对象,也会推翻另一个。
设原命题是:“如果整数 能被 整除,那么 能被 整除。”
先只提取两个完整命题。令 表示“”,令 表示“”。暂时不要在中文句子里直接换词。
证明 时改证 ,证明目标没有变弱。逆否命题是同一个逻辑内容的另一种写法。
如果 为真,我们可以从两个方向描述同一支箭头:
“充分”和“必要”不是两条箭头。它们是对 的两种读法。

例如,在整数范围内,“是 的倍数”对应的集合包含在“是偶数”的集合中。因此,“是 的倍数”是“是偶数”的充分条件;“是偶数”是“是 的倍数”的必要条件。
但“是偶数”不充分,因为 是偶数而不是 的倍数。一个条件可以必要却不充分,也可以充分却不必要。
方向最容易藏在“只要”“只有”“仅当”这些词里。不要靠语感抢答,先问:谁成立以后,谁必须跟着成立?
例如,“只有完成身份验证,才能提交申请”。令 表示“可以提交申请”, 表示“完成身份验证”。真正的箭头是
它并没有说完成验证以后一定提交申请,所以不能反过来写成 。
判断充分、必要的机械方法很可靠:先写出 ,再读成“ 对 充分, 对 必要”。
双条件 为真,表示 与 真值相同:要么都真,要么都假。它等价于两个条件命题同时成立:
也等价于“两者同时真,或者两者同时假”:
因此,证明“ 当且仅当 ”不能只证一个方向。只证明 ,最多说明 充分、 必要;还差 ,才能得到充要关系。
下面的分类练习不会让你凭词语猜答案。每题都显示 和 是否成立,可以用它训练“先看箭头,再叫名称”的习惯。
两个命题逻辑等价,意思是:无论其中的命题变元怎样取真值,它们都同真同假。写作 。
这里的“等价”比“碰巧都为真”强得多。某次取值下 与 都真,只说明这一行相同;逻辑等价要求真值表的每一行都相同。所以,等价变形可以在任何论证中把一边替换成另一边,而不会改变命题内容。
最常用的第一条是消去箭头:
右边说“前件不成立,或者后件成立”,正好排除了 。再结合逆否等价,我们得到:

消去箭头以后,否定条件命题也能一步一步推出来:
第二步是德摩根律,第三步是双重否定。这比单独背一个结论更牢靠:忘记时,可以重新推一遍。
真值表能检验等价,但变元一多,行数会按 增长。三个变元有 行,十个变元已有 行。实际变形时,我们通常像做代数那样,一次使用一条已经确认的等价律。
逻辑代数与普通数的代数长得相似,却不能完全照搬。尤其是“或”也能对“且”分配:
普通加法对乘法没有对应规律,所以不要只凭外形猜等价式。拿不准时,用真值表检查。
命题代数还有一个很实用的目标:把复杂公式整理成只含“且、或、非”的标准形状。命题变元或它的否定叫文字,例如 、 都是文字。
析取范式是“若干合取项用或连接”。每个合取项内部只有文字,例如:
合取范式则把结构反过来,是“若干析取项用且连接”:
真值表解释了为什么任何命题公式都能写成这两类范式。构造析取范式时,逐个查看公式为真的行:为每一行写一个只在该行成立的合取项,再把这些合取项用“或”连起来。构造合取范式时,逐个查看公式为假的行:为每一行写一个只在该行失败的析取项,再把这些析取项用“且”连起来。
例如, 只在 真且 至少一个为真时成立。从三条真值行直接读出的完整析取形式是:
再使用分配律和吸收律,可以把它缩短为:
原式 本身已经是合取范式。范式不一定是最短写法,它的价值是提供统一结构:比较两个公式、设计逻辑电路或把约束交给求解程序时,统一形状往往比表面简短更重要。
真值表给出一种保证能完成的范式构造法,等价律则可能更快地得到简洁结果。前者稳定,后者依赖你是否看得出合适的变形路线。
证明下面的等价式:
我们先想它为什么合理。左边说:只要 发生, 和 都要发生。那自然等于同时提出两个要求:“ 发生就有 ”以及“ 发生就有 ”。正式变形如下:
第一、三步消去或恢复箭头,第二步使用析取对合取的分配律。每一行都与上一行等价,所以整条变形链可以双向使用。
设有两条规则 与 。要说“这两条规则没有同时被遵守”,我们否定它们的合取:
结果说得很具体:至少有一条规则出现了“前件成立、后件失败”。等价变形的价值就在这里——它能把一句抽象的“不满足规则”,改写成可以实际检查的失败状态。
一个公式在所有真值赋值下都为真,叫永真式,也叫有效公式。例如:
一个公式只要在至少一种赋值下为真,就叫可满足。例如 不是永真式,但在 都真时成立,因此可满足。
等价与永真之间有一条很方便的桥: 与 等价,当且仅当 是永真式。
这也告诉我们怎样否定“两个公式等价”:不必说明它们处处不同,只要找一组赋值,使一个真、另一个假,就足够了。
逻辑等价是在比较两个公式是否同真同假;推理有效性是在问另一件事:当前提全部为真时,结论有没有可能为假?
设前提是 ,结论是 。推理有效,恰好表示下面这个条件命题是永真式:
换句话说,我们允许前提在某些赋值下为假,也允许结论在某些赋值下单独为假;唯一不允许的是“这一组前提全真,而结论假”。
“推理有效”不等于“每条前提都符合事实”。有效性只保证:如果前提全真,结论就不能假。要得到可靠结论,还要另外确认前提确实为真。

前提一:“如果 能被 整除,那么 能被 整除。”
前提二:“ 能被 整除。”
结论:“ 能被 整除。”
令 表示“”, 表示“”。形式就是:
这条规则常被称为肯定前件。我们已经知道 成立,而 禁止 真、 假,所以 只能为真。
前提一:“如果输入通过校验,程序就进入计算步骤。”
前提二:“程序没有进入计算步骤。”
结论:“输入没有通过校验。”
形式是:
这条规则其实没有增加新魔法。把第一条前提换成等价的逆否命题 ,再和 一起使用肯定前件,就得到 。
如果“服务器过载会触发限流”,而“触发限流会延迟部分请求”,那么“服务器过载会延迟部分请求”。
注意结论仍是条件命题。我们没有断言服务器已经过载,也没有断言请求已经延迟;我们只是把两段可靠的箭头接成了一段更长的箭头。
如果已经确认“文件在目录 或目录 ”,又确认“不在目录 ”,就可以推出“文件在目录 ”。
这条规则依赖第一条前提真的是逻辑上的“至少一个成立”。如果原句只是“我猜在 或 ”,那只是前提不可靠,不是规则本身失效。
证明中还会频繁用到一些不带箭头的规则:
这些规则看起来很朴素,但正式证明里常常缺的就是其中一步。例如,要证明 ,分别推出 和 后,还应明确用合取引入得到 。
如果不确定一条推理是否有效,可以按下面的顺序检查:
先把自然语言中的完整命题分别记成 ,不要把关键词相似当成逻辑结构相同。
强制让结论为假。有效性的唯一危险情形就是“前提全真、结论假”,所以从结论假开始找最快。
在结论为假的条件下,尝试让所有前提同时为真。如果做得到,就找到一个反赋值,推理无效。
例如,要检查肯定前件,先让结论 为假。为了让前提 为真,只能取 真;但这会使另一个前提 为假。因此无法让两个前提全真而结论假,规则有效。
下面的检查器把有效规则和常见谬误混在一起。做题时不要先看结论听起来是否正确,先把前提和结论压成符号骨架。
无效推理并不一定得出假结论。它真正的问题是:前提没有把结论锁住。某个例子里结论碰巧为真,也救不了一个无效的推理形式。
肯定后件的形式是:
它和肯定前件只差一个字,却是无效的。 允许 通过别的条件成立。
例如:
如果一个整数是 的倍数,那么它是偶数。 是偶数。所以 是 的倍数。
第一条前提真,第二条前提也真,结论却假。 直接给出了“前提全真、结论假”的反例。
哪怕把 换成 ,结论碰巧变真,这段推理的形式仍然无效。我们需要的是“一切满足前提的情况都保住结论”,不能靠刚好猜对一次。
否定前件的形式是:
它和否定后件也很像,但方向错了。 不成立,只能说明这条通往 的路没有启用,不能说明 没有别的成立方式。
例如:
如果一个整数是 的倍数,那么它是偶数。 不是 的倍数。所以 不是偶数。
前两句都真,结论假。问题恰好在于把原命题误当成了否命题。

日常表达经常省略背景。有人说“如果刷卡成功,门会开”,听者可能自动补成“门只会因为刷卡成功而开”。一旦补上“只有这一种原因”,逆命题也成立,整句话就变成双条件。但原来的 并没有包含这层信息。
所以,遇到肯定后件或否定前件时,不要争论故事是否合理,直接问:我们是否另有前提 ?如果有,便能合法反向;如果没有,就只能停在原箭头上。
看到 后,不能自动得到 ,也不能自动得到 。能保证等价的是逆否命题 。
要说明一个推理形式无效,最有力的办法不是说“感觉不严谨”,而是给出一组真值:
同一组取值同时拆穿了两种谬误。它表达的核心就是:前件可以不成立,而后件仍然成立。
证明不是把所有脑内尝试原样写下来,也不是直接端出一个看似漂亮的结论。比较可靠的工作方式分两层:草稿阶段寻找路线,成稿阶段把路线写成可核查的推理链。
草稿可以问得很直白:“假设给我的条件后,我能写出什么定义?”“结论要我得到一个存在式,那个对象该怎么构造?”“直接走不顺,是不是否定结论以后结构更清楚?”这些问题不一定出现在最终证明里,但它们解释了下一步从哪里来。

证明 的标准骨架很短:
真正费脑筋的是第二步。看下面这个命题:若实数 满足 ,则 。
直接看三次式,很难从“”立刻看出它为正。草稿阶段可以先观察:负项是 ,正项是 ,也许能把它们合并并因式分解:
现在假设中的两个端点条件都派上了用场:,,而 。于是三个非负数的乘积非负,再加 就严格为正。
把草稿整理成证明:
假设 。于是 、,并且 。
这段证明没有隐藏关键灵感:因式分解的目的,是把题目给的区间条件变成三个因子的符号信息。
有些命题直接从 推 很别扭,但 有清楚的结构。这时证明等价的逆否命题 。
证明:如果整数 是偶数,那么 是偶数。
直接假设 是偶数,只能写出 ,很难从平方中“开出”一个整数因子。反过来, 不是偶数意味着 是奇数,而奇数有明确形式 。这就是选择逆否路线的理由。
我们证明逆否命题:如果 不是偶数,那么 不是偶数。
假设整数 不是偶数。整数非奇即偶,所以 是奇数,存在整数 使 。
逆否证明不是“先假设结论错误,再导出矛盾”。它直接证明 。反证法会假设整个目标命题的否定,两者在写法和使用时机上并不相同。
证明 最稳妥的模板是先证 ,再证 。两个方向可以使用不同方法。
证明:整数 是偶数,当且仅当 是偶数。
先证正向。假设 是偶数,则存在整数 使 。于是 ,所以 是偶数。
另一种写法是构造等价链:
这种写法很短,但每一步都必须可逆。如果某一步只证明了左边推出右边,就只能写 ,不能写 。初学阶段如果拿不准可逆性,分成两个方向写通常更安全。
先写清目标的逻辑形状。它是 、,还是某个复合命题?形状决定证明的外层结构。
若目标是条件命题,比较直接路线和逆否路线。看哪一边的假设能更快落到定义或已知事实上。
到这里,我们一直把 当成已经能判断真假的完整命题。实际定理往往还带着变量,例如:
它背后真正完整的结构是:
箭头负责描述“对一个固定的 ,前件和后件怎样关联”;全称量词负责说明“这种关联要覆盖哪些 ”。这两个层次不能混在一起。
因此,后面处理量词时,今天的规则仍然保留:否定箭头会得到“前件真且后件假”。新的问题是,否定“对所有 ”还会把全称量词变成存在量词。直观上,就是从“每个对象都守规则”变成“至少有一个对象违背规则”。
我们将在下一章把这件事写成严格的符号变形。现在先记住连接点:反例之所以能推翻全称条件命题,是因为它找到了一个具体对象,让 成立。
练习一:写出命题“如果四边形是正方形,那么它是矩形”的逆命题、否命题和逆否命题,并判断真假。
练习二:把 改写成只含 的形式,再写出它的否定。
练习三:判断推理是否有效:“如果 是大于 的质数,那么 是奇数。 不是大于 的质数。所以 不是奇数。”
练习四:证明:如果整数 是奇数,那么 是奇数。写证明前,先说明你准备如何使用“奇数”的定义。
练习五:证明:对整数 , 能被 整除,当且仅当 同时能被 和 整除。
练习六:有人写道:“若程序通过全部测试,则程序没有缺陷。这个程序没有通过全部测试,所以它有缺陷。”指出逻辑形式,并说明还缺少什么信息才能得到结论。
| 交换并同时否定 |
逆命题先交换位置,写成 :若 ,则 。取 可知它为假。
否命题只否定两边,写成 :若 ,则 。 同样是反例。
逆否命题既交换又否定,写成 :若 ,则 。它与原命题等价,因此为真。
| “只要”后面是充分条件 |
| 仅当 | 成立必须有 |
| 只有 ,才有 | 是 的必要条件 |
| 当且仅当 | 两个方向都成立 |
| 结合律 | ,析取同理 |
| 幂等律 | , |
| 同一律 | , |
| 支配律 | , |
| 互补律 | , |
| 德摩根律 | , |
| 分配律 |
| 对偶分配律 |
| 吸收律 | , |
| 先换成逆否命题,再肯定前件 |
| 假言三段论 | 从 出发先到 ,再到 |
| 析取三段论 | 至少一个为真,排除 后只剩 |
| 已知 真,则“至少 之一真” |
| 双条件消去 | 双条件可以拆出任一方向 |
如果无论怎样都不能让前提全真,就说明坏的一行不存在,推理有效。
| 真, 真 |
| 假 |
三个因子都非负,所以 。
由此得到 。
展开左边即 ,因此 。
平方并整理:
是整数,因此 是奇数,也就不是偶数。
逆否命题成立,所以原命题“若 是偶数,则 是偶数”成立。
再证反向。假设 是偶数。这个方向采用逆否证明:若 不是偶数,则 ,从而 是奇数。
因此 为偶数能推出 为偶数。两个方向都成立,故 为偶数当且仅当 为偶数。
若目标是双条件,明确标出两个方向。不要让“反之显然”替代真正缺失的推理。
检查每一步使用了什么:假设、定义、代数变形、已知结论,还是某条推理规则。不能把待证结论提前当作前提。
最后反查箭头方向。尤其确认没有肯定后件、否定前件,也没有把几个例子误当成全称证明。
它表示 已经发生,但允许的两个后件 都没有发生。
因为 是整数,所以 是奇数。
再证反向。若 且 ,则 。因为 是偶数, 也是偶数。若 是奇数,可写成 ,那么 会是奇数,产生矛盾。因此 必为偶数,设 。于是 ,所以 。两个方向都成立,故为充要条件。