编程数学读书笔记 -- 第二章逻辑
写在前面:
逻辑之于程序员,好比半导体芯片之于现代工业。本节内容是我们都学过的“集合论”和“数字电路”中工具串联:文氏图、真值表、德摩根律和卡诺图。
作者给出逻辑要求:不漏不重。(不漏即完整, 不重即排他),逻辑根本上来说就是对“不漏不重”的组合表达。
本篇笔记针对如何利用上述逻辑和集合论工具解决复杂逻辑命题。复杂逻辑命题就是一个程序里要写几十个或者上百个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.2 异或、同或
直接画出异或、同或的文氏图会有点难度。一般可先写出真值表如图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所示:
其中,由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所示:
对比图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所示:
Aˉ∪Bˉ=A∩B‾\bar A \cup \bar B = \overline{A\cap B}Aˉ∪Bˉ=A∩B
如图7所示:
3. 复杂命题简化工具:卡诺图
【三灯游戏的规则】
请在下述情况时按下按钮:
a:绿灯、黄灯、红灯都灭
b:黄灯灭,红灯亮
c:绿灯灭,黄灯亮
d:绿灯、黄灯、红灯都亮
使用卡诺图化简上述规则:
设命题A:绿灯亮;命题B:黄灯亮;命题C:红灯亮。
设计卡诺图框,只有一个原则:保证由ABC(A是高位)表示二进制数不重不漏。由于是三个命题,所以卡诺图中每个位置要一一对应232^323个数:0~7。
如图8所示,三种卡诺图设计,每个框都唯一对应一个数,且没有重复和遗漏。
图8三种卡诺图框对应的卡诺图结果如图9所示,化简后的结果都是一样的,即Aˉ∪C\bar A \cup CAˉ∪C
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);
小节
- 利用上述工具:逻辑表达式、真值表、文氏图、卡诺图等可以将现实世界中的复杂逻辑关系转变为简单的逻辑关系。
- 本章只是做到了逻辑上的不漏不重,更进一步的,如何有效且简练地将问题划分成不同的子问题,还需要余数和数学归纳法的知识。
编程数学读书笔记 -- 第二章逻辑相关推荐
- Linux编程手册读书笔记第二章(20140330)
内核:管理和分配计算机资源(即CPU.RAM和设备)的核心软件层 Linux内核可执行文件采用/boot/vmlinuz或类似的路径名,"z"表明内核是经过压缩的可执行文件. 内核 ...
- 《计算传播学导论》读书笔记——第二章文本分析简介
<计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...
- 【编程珠玑】读书笔记 第二章 算法
2013-07-11 22:00:28 第二章 算法 本章围绕三个问题进行算法讨论,包括元素的查找.字符串的旋转.以及变位词的查找. 下面给出了实现代码.以及测试结果. 问题一 查找不存在的元素 思路 ...
- C++ Primer Plus读书笔记第二章
自学了一段时间的C++打算还是要系统的整理一下一些知识点,让学习思路更清晰,不然老是学一点忘一点,这个读书笔记用来记录这段时间对C++ Primer Plus一书中知识点的记录,尽量会写的详细一点.直 ...
- 《软件测试经验与教训》读书笔记---第二章
<软件测试经验与教训>读书笔记--目录 第一章 测试员的角色 第二章 按测试员的方式思考 第三章 测试手段 第四章 程序错误分析 第五章 测试自动化 第六章 测试文档 第七章 与程序员交互 ...
- In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview
本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HAN ...
- 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第二章的学习
计算机网络第二章--物理层读书笔记 1.物理层是网络的技术设置,物理层的材质和带宽决定了最大的传输速率. 2.传输介质的分类:引导性(有线介质)和非引导性(无线介质). (1)有线介质:磁介质.双绞线 ...
- 《Process Analytics 过程分析》读书笔记 第二章 业务过程范例
第二章 业务过程范例 毫无疑问,在过程管理中的研究和开发为技术革命铺平了道路. 更重要的是,过程管理技术在今天也同样重要,就像它在两三年前成立时一样. 然而,主要转移的是主要重点. 例如,在1990年 ...
- PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则
2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...
- Android权威编程指南读书笔记(1-2章)
第一章 Android应用初体验 1.4用户界面设计 <?xml version="1.0" encoding="utf-8"?> ADT21开发版 ...
最新文章
- Django 图片上传upload_to路径指定失效的问题记录
- linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp
- 关于nginx rewrtie的四种flag
- 学python买什么书好-python官方推荐30本面向初学者的书籍!你看过几本?
- 利用原生js 如何实现div移动?
- 《HTML、CSS、JavaScript 网页制作从入门到精通》——第6章 使用表格
- Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)
- linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题
- 根据sessionId获取Session对象
- Python使用for循环打印九九乘法表
- 景驰无人车总部落户广州:明年最低量产500辆,回应百度官司
- 软件公司为什么要加密源代码,而且是前前后后,反反复复
- Vivado 2015.4安装教程(带有效时间至2037年的license)
- 国外量化投资经典案例介绍
- JAVA项目答辩题之参考_Java项目答辩
- Python英语单词拼写训练考试系统,单词默写系统,统计易错词,基于Django
- cc2530 按键中断实验——按键控制LED灯的亮灭
- 开关电源变换器稳态原理分析(电感伏秒平衡及电容电荷平衡)
- github of gist完全使用指南
- Win10家庭版远程桌面工具RDP Wrapper出现Not listening解决方案
热门文章
- php阴阳万年历转换的接口,PHP编程实现阳历转换为阴历的方法实例
- Revealing the predictability of intrinsic structure in complex networks
- 高拍仪拍照SDK开发(良田影像S300L|S500L)
- 【开明关系系列之1】人脉关系大检阅
- 生命不停应当大步的向前
- A STRIP OF LAND POJ - 1156 (单调队列)
- css特效:流光背景+动态边框+滑动效果+聚集效果+小耳朵+阴影流光效果
- OutLook添加网易邮箱,QQ邮箱
- android 4.4 沉浸模式,大杀器:安卓4.4沉浸模式强制开启!
- 什么是爬虫?--关于爬虫的简介