📚 德·摩根定律(De Morgan's Laws)在布尔判定中的介绍
德·摩根定律是布尔代数和逻辑学中的两条基本定律,由19世纪英国数学家奥古斯都·德·摩根(Augustus De Morgan)提出。它描述了逻辑与(AND)、逻辑或(OR) 和 逻辑非(NOT) 这三个基本运算之间的关系,特别是在处理取反(否定) 复合条件时非常有用。
在命题逻辑中,德摩根定律表达了否定运算(¬)与合取(∧,即“与”)以及析取(∨,即“或”)之间的等价关系。设 P 和 Q 为两个命题,则德摩根定律可表述为:
¬(P∧Q)≡(¬P)∨(¬Q)(第一定律)
含义:对 P 和 Q 的合取取否定,等价于分别对 P 和 Q 取否定后进行析取。即“并非两者都真”等价于“至少有一个不真”。
¬(P∨Q)≡(¬P)∧(¬Q)(第二定律)
含义:对 P 和 Q的析取取否定,等价于分别对 P和 Q 取否定后进行合取。即“并非至少一个真”等价于“两者都不真”。
运用到程序中就是
!(P && Q) 等价于 !P || !Q
!(P || Q) 等价于 !P && !Q
🔣 两条核心定律
设 P 和 Q 是任意两个布尔表达式。
1. 否定一个“与”条件(AND)
!(P && Q)等价于!P || !Q
解释:
“并非(P 且 Q)” 为真,当且仅当 P 为假 或 Q 为假(至少有一个不成立)。
例子:
- 条件:
!(下雨 && 带伞) - 等价于:
!下雨 || !带伞 - 意思是:不是(下雨并且带了伞),等同于 没下雨 或者 没带伞。
2. 否定一个“或”条件(OR)
!(P || Q)等价于!P && !Q
解释:
“并非(P 或 Q)” 为真,当且仅当 P 为假 并且 Q 为假(两者都不成立)。
例子:
- 条件:
!(晴天 || 多云) - 等价于:
!晴天 && !多云 - 意思是:不是(晴天或多云),等同于 不是晴天 并且 不是多云(即阴天或下雨)。
🧩 核心思想
德·摩根定律的核心是:
-
“与”变“或”:当取反一个
AND条件时,内部的&&变成||,并且每个子条件都要取反。 -
“或”变“与”:当取反一个
OR条件时,内部的||变成&&,并且每个子条件都要取反。 - 括号很重要:复合条件必须用括号括起来,再整体取反,否则逻辑会出错。
✅ 为什么在编程中非常重要?
-
简化复杂条件:
将嵌套的取反条件转换成更易读、更易理解的形式。// ❌ 复杂难懂 if (!(user.isAuthenticated && (user.role === 'admin' || user.role === 'moderator'))) { // 拒绝访问 } // ✅ 应用德·摩根定律后 if (!user.isAuthenticated || (user.role !== 'admin' && user.role !== 'moderator')) { // 拒绝访问 } 避免逻辑错误:
手动写取反条件时容易出错。使用德·摩根定律可以系统性地转换,保证逻辑正确。优化代码可读性:
有时取反后的形式更符合人类的直觉。编译器优化基础:
编译器和解释器内部会使用这些定律来优化布尔表达式的执行效率。
📝 使用口诀(记忆方法)
-
“与”的反面是“或”:
!(P && Q)→!P || !Q -
“或”的反面是“与”:
!(P || Q)→!P && !Q - 拆括号,变符号,各自取反
🌰 实际应用示例
判断一个用户不能登录的条件:
- 原条件(能登录):
已同意协议 && (邮箱已验证 || 手机已验证) - 取反(不能登录):应用德·摩根定律
!(已同意协议 && (邮箱已验证 || 手机已验证)) // → !已同意协议 || !(邮箱已验证 || 手机已验证) // → !已同意协议 || (!邮箱已验证 && !手机已验证)
📣 总结
德·摩根定律是逻辑推理和编程中的基石工具。掌握它,你就能:
- 准确地对复杂的布尔条件进行取反。
- 写出更清晰、更可靠的条件判断语句。
- 更好地理解程序中的逻辑分支。
记住这两条公式,它们会在你处理 if、while、filter 等任何涉及布尔逻辑的场景中大放异彩!
一个示例
我们来一步步对逻辑表达式 !A || (A && B === 2) 进行取反。
第一步:写出原表达式的否定
原表达式:
!A || (A && B === 2)
对其整体取反:
!( !A || (A && B === 2) )
第二步:应用德·摩根定律(De Morgan's Law)
德·摩根定律之一:
!(P || Q) ≡ !P && !Q
令:
P = !AQ = (A && B === 2)
应用定律:
!( !A || (A && B === 2) ) ≡ !!A && !(A && B === 2)
简化 !!A 就是 A:
A && !(A && B === 2)
第三步:再次应用德·摩根定律
对 !(A && B === 2) 使用德·摩根定律:
!(A && B === 2) ≡ !A || !(B === 2)
即:
!A || B !== 2
代入前面的表达式:
A && (!A || B !== 2)
第四步:化简逻辑表达式
现在我们有:
A && (!A || B !== 2)
使用分配律展开:
(A && !A) || (A && B !== 2)
注意:A && !A 是 恒假(false)
所以:
false || (A && B !== 2)
等价于:
A && B !== 2
✅ 最终结果
!A || (A && B === 2) 的取反是:
A && B !== 2
验证(可选参考)
我们可以用真值表验证关键情况:
| A | B | !A | B===2 | A&&B===2 | !A || (A&&B===2) | 取反 | A && B!==2 |
|-------|-----|----|-------|----------|------------------|------|-----------|
| true | 2 | F | T | T | T | F | F |
| true | 3 | F | F | F | F | T | T |
| false | 2 | T | T | F | T | F | F |
| false | 3 | T | F | F | T | F | F |
可以看到,只有当 A 为真且 B !== 2 时,原表达式为假,其取反为真。完全匹配 A && B !== 2。
答案:
A && B !== 2
