德·摩根定律

📚 德·摩根定律(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


🔣 两条核心定律

PQ 是任意两个布尔表达式。

1. 否定一个“与”条件(AND)

!(P && Q) 等价于 !P || !Q

解释
并非(P 且 Q)” 为真,当且仅当 P 为假Q 为假(至少有一个不成立)。

例子

  • 条件:!(下雨 && 带伞)
  • 等价于:!下雨 || !带伞
  • 意思是:不是(下雨并且带了伞),等同于 没下雨 或者 没带伞

2. 否定一个“或”条件(OR)

!(P || Q) 等价于 !P && !Q

解释
并非(P 或 Q)” 为真,当且仅当 P 为假 并且 Q 为假(两者都不成立)。

例子

  • 条件:!(晴天 || 多云)
  • 等价于:!晴天 && !多云
  • 意思是:不是(晴天或多云),等同于 不是晴天 并且 不是多云(即阴天或下雨)。

🧩 核心思想

德·摩根定律的核心是:

  1. “与”变“或”:当取反一个 AND 条件时,内部的 && 变成 ||,并且每个子条件都要取反。
  2. “或”变“与”:当取反一个 OR 条件时,内部的 || 变成 &&,并且每个子条件都要取反。
  3. 括号很重要:复合条件必须用括号括起来,再整体取反,否则逻辑会出错。

✅ 为什么在编程中非常重要?

  1. 简化复杂条件
    将嵌套的取反条件转换成更易读、更易理解的形式。

    // ❌ 复杂难懂
    if (!(user.isAuthenticated && (user.role === 'admin' || user.role === 'moderator'))) {
      // 拒绝访问
    }
    
    // ✅ 应用德·摩根定律后
    if (!user.isAuthenticated || (user.role !== 'admin' && user.role !== 'moderator')) {
      // 拒绝访问
    }
    
  2. 避免逻辑错误
    手动写取反条件时容易出错。使用德·摩根定律可以系统性地转换,保证逻辑正确。

  3. 优化代码可读性
    有时取反后的形式更符合人类的直觉。

  4. 编译器优化基础
    编译器和解释器内部会使用这些定律来优化布尔表达式的执行效率。


📝 使用口诀(记忆方法)

  • “与”的反面是“或”!(P && Q)!P || !Q
  • “或”的反面是“与”!(P || Q)!P && !Q
  • 拆括号,变符号,各自取反

🌰 实际应用示例

判断一个用户不能登录的条件:

  • 原条件(能登录):已同意协议 && (邮箱已验证 || 手机已验证)
  • 取反(不能登录):应用德·摩根定律
    !(已同意协议 && (邮箱已验证 || 手机已验证))
    // →
    !已同意协议 || !(邮箱已验证 || 手机已验证)
    // →
    !已同意协议 || (!邮箱已验证 && !手机已验证)
    

📣 总结

德·摩根定律是逻辑推理和编程中的基石工具。掌握它,你就能:

  • 准确地对复杂的布尔条件进行取反。
  • 写出更清晰、更可靠的条件判断语句。
  • 更好地理解程序中的逻辑分支。

记住这两条公式,它们会在你处理 ifwhilefilter 等任何涉及布尔逻辑的场景中大放异彩!

一个示例

我们来一步步对逻辑表达式 !A || (A && B === 2) 进行取反。


第一步:写出原表达式的否定

原表达式:

!A || (A && B === 2)

对其整体取反:

!( !A || (A && B === 2) )


第二步:应用德·摩根定律(De Morgan's Law)

德·摩根定律之一:

!(P || Q) ≡ !P && !Q

令:

  • P = !A
  • Q = (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

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容