条件推理的四种经典形式
并列比较肯定前件、否定后件、肯定后件和否定前件,理解为什么前两者有效、后两者无效,以及必要条件与充分条件在其中如何作用。
[!info] related notes
- 所属 MOC: logic-moc
- 相关概念:
- 易混淆概念:
- 相关资源:
条件推理的四种经典形式
为什么必须把四种形式放在一起
看到条件句:
P → Q
最容易犯的错误就是把“P 足以推出 Q”误读成“P 和 Q 可以双向推出”。
四种经典形式正好把这个问题拆开。
| 形式 | 结构 | 有效? |
|---|---|---|
| 肯定前件 Modus Ponens | P→Q, P ⊢ Q | ✅ |
| 否定后件 Modus Tollens | P→Q, ¬Q ⊢ ¬P | ✅ |
| 肯定后件 Affirming the Consequent | P→Q, Q ⊢ P | ❌ |
| 否定前件 Denying the Antecedent | P→Q, ¬P ⊢ ¬Q | ❌ |
1. 肯定前件 Modus Ponens
P → Q
P
─────
Q
例子:
如果 token 已过期,那么请求会被拒绝。
token 已过期。
∴ 请求会被拒绝。
为什么有效?因为在经典命题逻辑中,P → Q 只禁止一种状态:P=true, Q=false。既然前提告诉你 P 已经为真,而整个条件式也为真,那么 Q 不可能为假。
2. 否定后件 Modus Tollens
P → Q
¬Q
─────
¬P
例子:
如果这次请求是被权限校验拒绝的,那么日志中应出现 authorization denied。
日志中没有 authorization denied。
∴ 在这些前提成立的情况下,它不是被这条权限校验拒绝的。
它其实利用了逆否等价:
P → Q ≡ ¬Q → ¬P
工程边界
现实 Debug 时要小心第一条前提是否真的强到 P → Q。
如果日志系统会丢日志,那么:
如果权限拒绝,通常会出现日志。
只是概率性关系,不再是严格 Modus Tollens。此时“没看到日志”只降低该假设概率,不能演绎推出它绝对不成立。
3. 肯定后件:无效
P → Q
Q
─────
P
例子:
如果数据库挂了,API 会返回 500。
API 返回了 500。
∴ 数据库挂了。
问题:500 还可能来自代码异常、上游失败、超时、配置错误等。
也就是:
P → Q
R → Q
S → Q
...
观察到 Q 不能告诉你究竟是哪一个充分条件发生了。
如何构造反例
要证明这个形式无效,只需要找到一个赋值:
P=false
Q=true
此时:
P → Q = true
Q = true
P = false
所有前提都真,结论却假,所以论证无效。
4. 否定前件:无效
P → Q
¬P
─────
¬Q
例子:
如果管理员登录,就能访问控制台。
小王不是管理员。
∴ 小王不能访问控制台。
可能还有其他角色也有权限,例如 owner、auditor。
P 是 Q 的充分条件,不意味着它是 Q 的必要条件。
和必要条件 / 充分条件连接起来
对于:
P → Q
- P 是 Q 的充分条件;
- Q 是 P 的必要条件。
因此:
有 P → 一定有 Q
没有 Q → 一定没有 P
但不能反过来:
有 Q → 不一定有 P
没有 P → 不一定没有 Q
这就是四种推理形式背后的统一模型。
一个极实用的语言检查
听到:
“如果 A,那么 B。”
立刻问:
A 只是 B 的一种充分路径,还是 A 同时也是 B 的必要条件?
如果只是充分路径,那么从 B 倒推 A 或从 ¬A 推 ¬B 都有风险。
Debug 中为什么肯定后件特别诱人
故障排查天然是“观察结果 Q,寻找原因 P”:
看见 500
↓
猜数据库故障
形式逻辑提醒我们:仅靠 DBDown → 500 和 500 不能证明 DBDown。
但这不意味着诊断不能进行。现实中的正确做法是:
Q 作为证据
→ 生成多个候选原因
→ 比较 P(Q|H1), P(Q|H2)...
→ 搜集能区分假设的新证据
也就是说,肯定后件作为演绎证明是无效的,但“由结果反推最可能原因”可以在概率推理中合理进行。
AI 回答中的常见版本
模型可能说:
“使用 TypeScript 的大型项目通常更容易维护。这个项目很容易维护,所以 TypeScript 是关键原因。”
这里至少混入了:
- 肯定后件式倒推;
- 可能的错误因果;
- 没有比较其他解释。
快速自测
A
如果测试全部通过,那么 CI 显示 green。
测试全部通过。
∴ CI green。
在前提严格成立时:肯定前件,有效。
B
如果测试全部通过,那么 CI green。
CI green。
∴ 测试全部通过。
如果 CI 还有 skip、配置错误等可能:肯定后件,无效。
C
如果构建失败,部署不会开始。
部署开始了。
∴ 构建没有失败。
否定后件,有效,前提严格成立时。
D
如果使用 Redis,响应会更快。
没有使用 Redis。
∴ 响应不会更快。
否定前件,无效,还有其他优化方法。
一句记忆
条件句只给你一条单向保证:顺着箭头走可以,逆着箭头走必须另有理由。