写在前面:

逻辑之于程序员,好比半导体芯片之于现代工业。本节内容是我们都学过的“集合论”和“数字电路”中工具串联:文氏图、真值表、德摩根律和卡诺图。

作者给出逻辑要求:不漏不重。(不漏即完整, 不重即排他),逻辑根本上来说就是对“不漏不重”的组合表达。

本篇笔记针对如何利用上述逻辑和集合论工具解决复杂逻辑命题。复杂逻辑命题就是一个程序里要写几十个或者上百个if语句组合的情况。

1. 复杂命题表示工具: 文氏图和真值表

  • A∩BA \cap BA∩B: A && B, 逻辑与
  • A∪BA\cup BA∪B: A || B, 逻辑或
  • Aˉ\bar AAˉ: !A, 逻辑非
  • A⊕BA\oplus BA⊕B: A^B, 异或(这里的^是按位异或)
  • A⊙BA\odot BA⊙B:同或
  • A⇒BA\Rightarrow BA⇒B: A蕴含B(若A则B),这是两个命题的复合。

1.1 简单的与或非的文氏图

表示如图1:

图1 与或非文氏图

1.2 异或、同或

直接画出异或、同或的文氏图会有点难度。一般可先写出真值表如图2, 再由真值表推出相应的文氏图,如图3。

图2 异或和同或的真值表

图3 异或 和同或的文氏图

可见(A⊙B)‾==A⊕B\overline{(A\odot B)} == A\oplus B(A⊙B)​==A⊕B

1.3 蕴含A⇒BA\Rightarrow BA⇒B

这个理解起来不像与或非那样可以有直观感受。事实上,蕴含就是逻辑学家发明出来的,而且蕴含不是逻辑运算。而且这个可以帮助我们理解高中时学过的“原命题和逆否命题是等价的”

我个人认为,蕴含是用来搭积木的,把一个命题和另一个命题拼起来,组成一个新命题。不过搭积木的描述稍有不准确,因为搭积木只描述出新命题的真假取决于两个命题A,B的组合,实质上,蕴含希望人们关注的是新命题什么时候为假。 如A⇒BA\Rightarrow BA⇒B中,只有当A为真,B为假的时候,新命题A⇒BA\Rightarrow BA⇒B才为假。

换个生活场景来理解,如果把命题暂且等价理解为承诺的话(事实上命题意义不仅于此)的话,会发现,带有蕴含关系的承诺,能降低许诺的人食言的概率:
如果你考上清华大学,那么我就送你一辆车。
命题A:你考上清华大学; 命题B:我送你一辆车。
只要当 A真,B假的时候,许诺的人属于食言。
对于成绩一般的学生来说,这样的承诺,基本不会食言。

另一个,不含蕴含关系的承诺:
高考结束之后,我送你一辆车。
这两个承诺相比,不带蕴含关系的承诺听起来更令人开心。

重新回到命题A⇒BA\Rightarrow BA⇒B上,其对应真值表和文氏图如图4所示:

图4 蕴含的真值表和文氏图

其中,由A⇒BA\Rightarrow BA⇒B可推出,A⇒B=Aˉ∪BA\Rightarrow B =\bar A \cup BA⇒B=Aˉ∪B, 由这个关系看承诺如果你考上清华大学,那么我就送你一辆车。, 由于Aˉ\bar AAˉ足够的大,使得许诺的人食言的概率大大降低。

下面是“原命题和逆否命题的等价论证”:
即,(A⇒B)⇔(Bˉ⇒Aˉ)(A \Rightarrow B) \Leftrightarrow (\bar B \Rightarrow \bar A)(A⇒B)⇔(Bˉ⇒Aˉ)

其中,Bˉ⇒Aˉ\bar B \Rightarrow \bar ABˉ⇒Aˉ真值表和文氏图如图5所示:

图5 逆否命题的真值表

对比图4和图5发现,A⇒BA \Rightarrow BA⇒B 和 Bˉ⇒Aˉ\bar B \Rightarrow \bar ABˉ⇒Aˉ文氏图完全相同,所以两者等价,命题得证。

蕴含关系的用处:

  • 我觉得这个东西是用来训练对业务逻辑的理解的
  • 其核心是重点关注蕴含关系的逻辑命题何时为假

2. 复杂命题对偶转换:德摩根律

有些情况下,将原命题转换为对偶命题,可以实现一个难解问题转换成容易解决的问题。一个不恰当的例子就是“核方法的非线性支持向量机”(转换为对偶问题过程中,将难解的高维映射函数退化成容易计算核函数)。

Aˉ∩Bˉ=A∪B‾\bar A \cap \bar B = \overline{A\cup B}Aˉ∩Bˉ=A∪B
如图6所示:

图6 德摩根律1

Aˉ∪Bˉ=A∩B‾\bar A \cup \bar B = \overline{A\cap B}Aˉ∪Bˉ=A∩B

如图7所示:

图7 德摩根律2

3. 复杂命题简化工具:卡诺图

【三灯游戏的规则】
请在下述情况时按下按钮:
a:绿灯、黄灯、红灯都灭
b:黄灯灭,红灯亮
c:绿灯灭,黄灯亮
d:绿灯、黄灯、红灯都亮

使用卡诺图化简上述规则:
设命题A:绿灯亮;命题B:黄灯亮;命题C:红灯亮。

设计卡诺图框,只有一个原则:保证由ABC(A是高位)表示二进制数不重不漏。由于是三个命题,所以卡诺图中每个位置要一一对应232^323个数:0~7。

如图8所示,三种卡诺图设计,每个框都唯一对应一个数,且没有重复和遗漏。

图8

图8三种卡诺图框对应的卡诺图结果如图9所示,化简后的结果都是一样的,即Aˉ∪C\bar A \cup CAˉ∪C

图9

4. 逻辑不漏的最后一步:三值逻辑

程序设计中,有的变量会出现未定义的逻辑状态,于是引入了”未定义状态“:undefined。于是有了:true,false,undefined三值逻辑。

考察三值逻辑下C++中的:&&,|| 和 !和德摩根律运算(同样适用于java)。

C++中的 && 和 || 是带条件的运算:
if (A && B) :

  • 如果 A == true,整个表达式等于B 的值;
  • 如果 A == false ,整个表达式就为 false,不再计算 B 的值;
  • 如果 A == undefined,计算机不进行任何处理,B的值不再查看。 整个表达式就为 undefined;

if (A || B) :

  • 如果 A == true,整个表达式等于true,不再查看B;
  • 如果 A == false ,整个表达式等于B 的值;
  • 如果 A == undefined,计算机不进行任何处理,B的值不再查看。 整个表达式就为 undefined;

if (!A) :

  • A==true,整个表达式为false;
  • A==false,整个表达式为true;
  • A为undefined,整个表达式就为 undefined;

至于德摩根律:根据三值逻辑的真值表可以得出,三值逻辑下的德摩根律也是成立的(C++表示,java也一样)。

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

小节

  • 利用上述工具:逻辑表达式、真值表、文氏图、卡诺图等可以将现实世界中的复杂逻辑关系转变为简单的逻辑关系。
  • 本章只是做到了逻辑上的不漏不重,更进一步的,如何有效且简练地将问题划分成不同的子问题,还需要余数和数学归纳法的知识。

编程数学读书笔记 -- 第二章逻辑相关推荐

  1. Linux编程手册读书笔记第二章(20140330)

    内核:管理和分配计算机资源(即CPU.RAM和设备)的核心软件层 Linux内核可执行文件采用/boot/vmlinuz或类似的路径名,"z"表明内核是经过压缩的可执行文件. 内核 ...

  2. 《计算传播学导论》读书笔记——第二章文本分析简介

    <计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...

  3. 【编程珠玑】读书笔记 第二章 算法

    2013-07-11 22:00:28 第二章 算法 本章围绕三个问题进行算法讨论,包括元素的查找.字符串的旋转.以及变位词的查找. 下面给出了实现代码.以及测试结果. 问题一 查找不存在的元素 思路 ...

  4. C++ Primer Plus读书笔记第二章

    自学了一段时间的C++打算还是要系统的整理一下一些知识点,让学习思路更清晰,不然老是学一点忘一点,这个读书笔记用来记录这段时间对C++ Primer Plus一书中知识点的记录,尽量会写的详细一点.直 ...

  5. 《软件测试经验与教训》读书笔记---第二章

    <软件测试经验与教训>读书笔记--目录 第一章 测试员的角色 第二章 按测试员的方式思考 第三章 测试手段 第四章 程序错误分析 第五章 测试自动化 第六章 测试文档 第七章 与程序员交互 ...

  6. In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview

    本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HAN ...

  7. 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第二章的学习

    计算机网络第二章--物理层读书笔记 1.物理层是网络的技术设置,物理层的材质和带宽决定了最大的传输速率. 2.传输介质的分类:引导性(有线介质)和非引导性(无线介质). (1)有线介质:磁介质.双绞线 ...

  8. 《Process Analytics 过程分析》读书笔记 第二章 业务过程范例

    第二章 业务过程范例 毫无疑问,在过程管理中的研究和开发为技术革命铺平了道路. 更重要的是,过程管理技术在今天也同样重要,就像它在两三年前成立时一样. 然而,主要转移的是主要重点. 例如,在1990年 ...

  9. PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...

  10. Android权威编程指南读书笔记(1-2章)

    第一章 Android应用初体验 1.4用户界面设计 <?xml version="1.0" encoding="utf-8"?> ADT21开发版 ...

最新文章

  1. Django 图片上传upload_to路径指定失效的问题记录
  2. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp
  3. 关于nginx rewrtie的四种flag
  4. 学python买什么书好-python官方推荐30本面向初学者的书籍!你看过几本?
  5. 利用原生js 如何实现div移动?
  6. 《HTML、CSS、JavaScript 网页制作从入门到精通》——第6章 使用表格
  7. Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)
  8. linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题
  9. 根据sessionId获取Session对象
  10. Python使用for循环打印九九乘法表
  11. 景驰无人车总部落户广州:明年最低量产500辆,回应百度官司
  12. 软件公司为什么要加密源代码,而且是前前后后,反反复复
  13. Vivado 2015.4安装教程(带有效时间至2037年的license)
  14. 国外量化投资经典案例介绍
  15. JAVA项目答辩题之参考_Java项目答辩
  16. Python英语单词拼写训练考试系统,单词默写系统,统计易错词,基于Django
  17. cc2530 按键中断实验——按键控制LED灯的亮灭
  18. 开关电源变换器稳态原理分析(电感伏秒平衡及电容电荷平衡)
  19. github of gist完全使用指南
  20. Win10家庭版远程桌面工具RDP Wrapper出现Not listening解决方案

热门文章

  1. php阴阳万年历转换的接口,PHP编程实现阳历转换为阴历的方法实例
  2. Revealing the predictability of intrinsic structure in complex networks
  3. 高拍仪拍照SDK开发(良田影像S300L|S500L)
  4. 【开明关系系列之1】人脉关系大检阅
  5. 生命不停应当大步的向前
  6. A STRIP OF LAND POJ - 1156 (单调队列)
  7. css特效:流光背景+动态边框+滑动效果+聚集效果+小耳朵+阴影流光效果
  8. OutLook添加网易邮箱,QQ邮箱
  9. android 4.4 沉浸模式,大杀器:安卓4.4沉浸模式强制开启!
  10. 什么是爬虫?--关于爬虫的简介