1. 命题:看似最基础,但“蕴含”就够先栽一跟头
1.1 什么样的句子才算命题
我第一次在讨论班上被问到“如果明天下雨,我就待在家里”这句话是真是假时,第一反应是“那得看明天到底下不下雨”。但出题人紧接着补了一句:不许看明天,就按今天的形式逻辑规则判断。全班安静了三秒,然后有人小声说“那是假的吧”,有人坚持“不知道真假所以不算命题”。这正是命题逻辑里第一个反直觉的点:命题不是日常对话里的“句子有没有道理”,而是客观上能不能判定真假的陈述句。
在经典二值逻辑里,一个命题必须满足两个条件:它是一个陈述句,并且它在任一解释下有且只有一个真值(真或假)。疑问句“今天下雨了吗?”不是命题,因为没有在陈述一个事实;祈使句“请把门关上”也不是命题,因为它不承担真假判断。但“明天下雨”这个断言本身是命题,哪怕我现在不知道它事实上是真是假,这不妨碍它作为命题存在。真实值是客观的,认识状态是主观的,这两件事从逻辑入门时就要分开。
我在实际带人刷证明题时发现,大部分人栽的第一个跟头不是看不懂符号,而是分不清“语言中的句子”和“逻辑中的命题”。举个非常典型的例子:
- “x > 3” 是命题吗?
- “对任意实数x,x > 3” 是命题吗?
前者不是命题,因为x未赋值时真假不确定;后者是命题,因为量词已经把x限定住了。很多教材在第一章就混用这两种表达,导致读者形成一种错误的默认:只要写出来一个不等式,就天然是命题。这种错觉到了谓词逻辑部分会被放大,所以最好在进入下一阶段前就把句式判断练稳。
命题的基本运算也值得先建立直觉,再背真值表。否定、合取、析取相对自然:否定就是真假翻转,合取是“两个都成立”,析取是“至少一个成立”,这里容易出错是逻辑析取是相容的。日常说“你或者我留下”时往往隐含“只能留一个”,但在逻辑里 P∨Q 在两个都为真时依然为真。程序员写代码接触过 || 可能会快一点,没接触过的人需要刻意重置一下对“或”的理解。
1.2 蕴含的真值表反直觉:为什么“假”能推出任何东西
如果上面那些只是热身,那么蕴含联结词才是命题逻辑中真正劝退新人的地方。P→Q 的真值表如下:
| P | Q | P→Q |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 真 |
| 假 | 假 | 真 |
问题来了:为什么 P 为假时,无论 Q 是真还是假,整个蕴含式都是真的?很多人第一次看到这行会认为这是逻辑学家为了省事硬定的规则。我在学习阶段也这么想过。后来才明白,这个规定不是拍脑袋,而是为了保证蕴含能作为一个严格的真值函数工作。
想想我们什么时候会说“如果P则Q”这句话是假的。只有一种情况:P 确实发生了,但 Q 没有跟着发生。比如我说“如果今天下雨,那么地面是湿的”,你发现今天下了雨但地面全干,那我的承诺就被证伪了。但今天没有下雨,地面是湿的还是干的,都和我这句“如果”无关。所以逻辑里干脆约定:前提不成立时,整句蕴含式为真。这叫“空真”(vacuously true),它不是哲学上的“实质蕴含有没有意义”这种争论,而是从真值表定义里必然长出来的东西。
换个角度也好理解:把 P→Q 看成一种约束或承诺,而不是因果关系。“承诺”只有在“你满足了前提,却没得到结论”时才算违约。前提都没发生,承诺从未被触发,自然不能算违约。实际做证明时这个性质非常有用,比如要证“若 n > 10,则 n² > 100”,你只需要在假设 n > 10 成立的情况下推出结果;如果 n ≤ 10,你根本不需要管它,蕴含式自动成立。
还有一个高频混淆点:P→Q 不等于 Q→P,更不等于 ¬P→¬Q。前者是原命题,后面两个是逆命题和否命题,它们在逻辑上与原命题不等值。真正与原命题等值的是逆否命题 ¬Q→¬P。我在教证明策略时发现,很多人做反证法的第一步总想“先否定前提”,这就是因为没有意识到“若P则Q”真正在说的是“没有Q就没有P”。一套滴水不漏的证明,往往是在心里默默把这种关系翻转了好几次的。
1.3 从自然语言到逻辑语言的翻译陷阱
把日常语言翻译成命题公式,是整个证明学习中持续出现的问题。重点不在语法,而在语义精确定位。中文里有大量模糊词汇:“除非”“只有”“当且仅当”“否则”……每类词都有固定套路,但套路背后是同一件事:先判断逻辑上谁推出谁。
对我来说最有效的判断方法是画条件方向。“只有注册了会员,才能进入论坛”,这里的“注册”是“进入”的必要条件。所以逻辑式应该是 进入→注册,而不是 注册→进入。如果用前者,等于说“能进论坛的人一定注册过”;如果误用后者,就变成“注册过的人一定能进”,这显然比原意强了很多。翻译这一步容易错,是因为自然语言天然带有说话人默认的语境,而命题逻辑只认形式上的单向箭头。
另一个典型问题是“除非”。比如“除非你道歉,否则我不原谅你”。这句话可以等价为“如果不道歉,那么不原谅”,也就是 ¬A→¬F,再取逆否得到 F→A,即“原谅推出道歉过”。翻译完后可以自检:什么时候这句话是假的?是你没道歉但对方原谅了的时候。所以用 ¬A→¬F 来表示恰好能抓住这种证伪条件。做符号化训练时,我建议每翻译一句,就自己追问一句“我要找一个什么情形来推翻这句话”,如果能找到明确的反例条件,翻译基本就不会歪。
命题逻辑本身是平的:它只能把完整的陈述句按真值运算拼起来,无法描述“所有的”“存在一个”这类结构。真实世界的数学命题,比如“对任意正整数n,如果n是偶数,则n²是偶数”,只用命题变量根本表达不
