离散数学数理逻辑导论(大佬大佬快走开,萌新萌新快进来)

Walker终于想起自己的副业了,一定要养成写博客的好习惯。

话说这是一个导论,不是教材什么的东西,当科普读物看吧。当然所谓的导论当然就是不要长篇大套,仔细掰扯掰扯离散数学当中的数理逻辑到底想讲一个什么问题,具体想解决什么问题,什么东西是需要重点掌握的。当然了,这一篇不仅仅是讲离散数学,还有这一章(至少在我的认知范围内)的具体应用领域。

数理逻辑,顾名思义,这一章讲的是逻辑。数学的基础就是严谨的逻辑。当然作为一名工科生要有工程素养(不需要你会的你不要去思考,思考当下的工程问题就完了) ,就是处理问题的能力。所以我们一定要思考我们想解决什么问题。这一章我们想讨论,逻辑的运算问题,也就是从复杂的逻辑关系中挑出我需要的信息。比如老式的计算器吧:
在这里插入图片描述

就这种的计算器

在这里插入图片描述
当我键入一个8的时候就会有一个8出现,那我不输入8,我换成输入一个0,8中间那一杠就不会亮,其实这就涉及到一个逻辑问题,就是我怎么通过我敲的哪个按键就决定中间那个灯亮不亮呢?其实很简单,我只需要告诉计算器,如果我输入2345689的时候,中间的灯就亮,如果我输入170的时候,中间的灯就不亮。具体怎么告诉它呢?

这就使用到了逻辑的运算。

下面假设我每次摁下一个键都会生成一个信号。假设键入0就会有一个I0信号。

那么我就会生成十种信号:I0 I1 I2 I3 I4 I5 I6 I7 I8 I 9

每一种信号都只能传递两种信息:是和否。也就是我们常说的1和0。

接下来我要让它知道我输入了一个按钮,然后构造一个电路让计算器去判断中间的灯是不是应该亮。

逻辑关系是这样的,如果计算器得到的信号是I2 I3 I4 I5 I6 I8 I9其中一个,那么中间的灯就应该亮起来呢?

这就是或运算的逻辑。

Y = I 2 ∨ I 3 ∨ I 4 ∨ I 5 ∨ I 6 ∨ I 8 ∨ I 9 Y = I_2 \vee I_3 \vee I_4 \vee I_5 \vee I_6 \vee I_8 \vee I_9 Y=I2I3I4I5I6I8I9

当然,我们还有另一个想法,那就是假设我们只有这十个按键,那么我只要按下的不是排除以上7个按键的其他键,那灯是不是就应该亮呢?也就是说,不是0,而且不是1,而且不是7。

这就是与逻辑和非逻辑。

Y = I 0 ˉ ∧ I 1 ˉ ∧ I 7 ˉ Y = \bar{I_0} \wedge \bar{I_1} \wedge \bar{I_7} Y=I0ˉI1ˉI7ˉ

当然我们还可以通过De Morgan律得到它的另一个形式。

Y = I 0 ∨ I 1 ∨ I 7 ‾ Y = \overline{{I_0} \vee {I_1} \vee {I_7}} Y=I0I1I7
读起来也符合逻辑。

电路也可以按照这样的逻辑去实现,我们对每一种逻辑(与或非)都有对应的门电路。

看似问题已经解决了,实际上还有一定的距离。

实际上,我们还有其他6个灯没有部署。而且更重要的问题是,计算器是用来计算的,这十种信号之间没有办法直接进行计算(比如我想通过两个 I 1 I_1 I1信号直接获得加和 I 2 I_2 I2的信号)。所以我需要能进行计算的信号,或者说,能够叫计算机理解并处理的信号。

这就是编码。

如果有过一些常识你应该知道实际上数字并不是都是逢十进一的,就像我的老师这么和我讲:“不会吧不会吧,不会有人都大二了还觉得逢十进一是一件理所当然的事情吧。”计算机只能处理零一代码,它的世界是二进制的,他只能对二进制数进行计算(甚至这种运算逻辑也需要人来实现)。所以,我们有必要将上面十种机器不认识的信号转换成二进制数交给计算机去理解。

所以就诞生了编码器。

我很显然直接使用十个数字的二进制表示就能表示这十个数。
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
当然聪明的你应该能想到这实际可以表示16个数,但是我们只用其中十个。
接下来我们就对这每种状态进行编码。如果我输入一个信号 I 0 I_0 I0那我编码器就应该输出0000如果输入一个信号 I 5 I_5 I5那就应该输出0101,我们将这四位数的每一位都起一个名字,就比如
D3 D2 D1 D0
那么,中间的灯的逻辑就从刚开始的七个信号相或变成了

Y = ( D ˉ 3 ∧ D ˉ 2 ∧ D 1 ∧ D ˉ 0 ) ∨ ( D ˉ 3 ∧ D ˉ 2 ∧ D 1 ∧ D 0 ) ∨ ( D ˉ 3 ∧ D 2 ∧ D ˉ 1 ∧ D ˉ 0 ) ∨ ( D ˉ 3 ∧ D 2 ∧ D ˉ 1 ∧ D 0 ) ∨ ( D ˉ 3 ∧ D 2 ∧ D 1 ∧ D ˉ 0 ) ∨ ( D 3 ∧ D ˉ 2 ∧ D ˉ 1 ∧ D ˉ 0 ) ∨ ( D 3 ∧ D ˉ 2 ∧ D ˉ 1 ∧ D 0 ) Y = ( \bar D_3 \wedge \bar D_2 \wedge D_1 \wedge \bar D_0 ) \vee ( \bar D_3 \wedge \bar D_2 \wedge D_1 \wedge D_0 ) \vee ( \bar D_3 \wedge D_2 \wedge \bar D_1 \wedge \bar D_0 )\vee ( \bar D_3 \wedge D_2 \wedge \bar D_1 \wedge D_0 ) \vee ( \bar D_3 \wedge D_2 \wedge D_1 \wedge \bar D_0 )\vee ( D_3 \wedge \bar D_2 \wedge \bar D_1 \wedge \bar D_0 ) \vee ( D_3 \wedge \bar D_2 \wedge \bar D_1 \wedge D_0 ) Y=(Dˉ3Dˉ2D1Dˉ0)(Dˉ3Dˉ2D1D0)(Dˉ3D2Dˉ1Dˉ0)(Dˉ3D2Dˉ1D0)(Dˉ3D2D1Dˉ0)(D3Dˉ2Dˉ1Dˉ0)(D3Dˉ2Dˉ1D0)

好长鸭,我们不妨将与逻辑的运算符省略,因为我们知道,与逻辑的逻辑好像乘法,任何式和零乘都会是零。
省略之后就是这样。

Y = ( D ˉ 3 D ˉ 2 D 1 D ˉ 0 ) ∨ ( D ˉ 3 D ˉ 2 D 1 D 0 ) ∨ ( D ˉ 3 D 2 D ˉ 1 D ˉ 0 ) ∨ ( D ˉ 3 D 2 D ˉ 1 D 0 ) ∨ ( D ˉ 3 D 2 D 1 D ˉ 0 ) ∨ ( D 3 D ˉ 2 D ˉ 1 D ˉ 0 ) ∨ ( D 3 D ˉ 2 D ˉ 1 D 0 ) Y = ( \bar D_3 \bar D_2 D_1 \bar D_0 ) \vee ( \bar D_3 \bar D_2 D_1 D_0 ) \vee ( \bar D_3 D_2 \bar D_1 \bar D_0 )\vee ( \bar D_3 D_2 \bar D_1 D_0 ) \vee ( \bar D_3 D_2 D_1 \bar D_0 )\vee ( D_3 \bar D_2 \bar D_1 \bar D_0 ) \vee ( D_3 \bar D_2 \bar D_1 D_0 ) Y=(Dˉ3Dˉ2D1Dˉ0)(Dˉ3Dˉ2D1D0)(Dˉ3D2Dˉ1Dˉ0)(Dˉ3D2Dˉ1D0)(Dˉ3D2D1Dˉ0)(D3Dˉ2Dˉ1Dˉ0)(D3Dˉ2Dˉ1D0)

这就好看多了,接下来就是所谓的逻辑运算了,我可以通过这个式子进行化简得到一个足够简洁的式子,如果能化简成一个逻辑符号那我一定爽翻了,当然这只是特殊情况,不过化简总是有收获的。
这个式子化简结果如下,具体方法后面说:
D 3 ∨ D ˉ 2 D 1 ∨ D ˉ 1 D 2 ∨ D ˉ 0 D 2 D_3 \vee \bar D_2D_1 \vee \bar D_1D_2 \vee \bar D_0D_2 D3Dˉ2D1Dˉ1D2Dˉ0D2
怎么样,这个式子是不是巨简洁了。通过这个式子构建的电路是不是应该比之前的电路要小一些呢?

我们化简基于两种方法,第一种就是直接通过毕生绝学,通过公式进行化简,当然可以,我们知道1或0等于1,1且0等于0,或和且都对彼此满足分配律。。等等一系列的理论,我们就能把公式化的足够简单。但是我们有更出色的工具:卡诺图。化简这一部分我就不详细讲了,我们的重点并不在此。感兴趣可以学完了数理逻辑的知识之后再去深入理解卡诺图的知识。但是在此之前,我们应该把注意力放回逻辑代数上。

不过离散数学中,我们更多的是探讨对一个逻辑代数式,如何确定它的每个输入的输出值,就比如我已经得到了一个逻辑关系,对于前面的我们大可以通过将 D i D_i Di所有可能的取值进行代入计算,但是实际是不可取的,因为这样的工作量会呈指数递增,5个变量要算32次,10个变量就要算1024次!这很显然不是上策。
比如我们现在得到了这样一个逻辑关系,如果我们得到了一个四位二进制码,并且知道了二进制码如果最高位为1,或者中间两位不一样,又或者次高位是1而且最低位为0,最终的逻辑表达式的值就是1。最后总结下来其实就是刚才我们得到的那个式子
D 3 ∨ D ˉ 2 D 1 ∨ D ˉ 1 D 2 ∨ D ˉ 0 D 2 D_3 \vee \bar D_2D_1 \vee \bar D_1D_2 \vee \bar D_0D_2 D3Dˉ2D1Dˉ1D2Dˉ0D2
问这个式子四位二进制取遍所有能取的组合输出分别都是什么?
其实前边都已经有答案了,我就是按照它的输入输出规则构造的这么一个式子,但是我想讲的也正在于此。我们是怎么通过之前那个长式子得到的这个短式子,我们就用什么样的思想解决这个短式子换算成长式子进一步得到真值表的问题。而且短式子换算成长式子往往更机械更容易操作。

我们首先要清楚这个式子有四个变量,如果我想让短式子变回那个长式子,我首先就需要将每一个类似 D ˉ 2 D 1 \bar D_2D_1 Dˉ2D1的项3210四位数都要补全。所以,我们想到了这样的办法,就是在这一项后边补一个 ( D 3 ∨ D ˉ 3 ) (D_3\vee \bar D_3) (D3Dˉ3)。加一个它不会影响整个项的逻辑取值,却能让 D ˉ 2 D 1 \bar D_2D_1 Dˉ2D1又多一个变量 D 3 D_3 D3。其他的项也都这样操作,我们就将式子补回去了,当然实际操作过程中还有其他步骤,但是宗旨都是一样的,化成尽量标准的形式。

这就是逻辑表达式求最小项。
我们最终求出的表达式应该包含上文中提到的
Y = ( D ˉ 3 D ˉ 2 D 1 D ˉ 0 ) ∨ ( D ˉ 3 D ˉ 2 D 1 D 0 ) ∨ ( D ˉ 3 D 2 D ˉ 1 D ˉ 0 ) ∨ ( D ˉ 3 D 2 D ˉ 1 D 0 ) ∨ ( D ˉ 3 D 2 D 1 D ˉ 0 ) ∨ ( D 3 D ˉ 2 D ˉ 1 D ˉ 0 ) ∨ ( D 3 D ˉ 2 D ˉ 1 D 0 ) Y = ( \bar D_3 \bar D_2 D_1 \bar D_0 ) \vee ( \bar D_3 \bar D_2 D_1 D_0 ) \vee ( \bar D_3 D_2 \bar D_1 \bar D_0 )\vee ( \bar D_3 D_2 \bar D_1 D_0 ) \vee ( \bar D_3 D_2 D_1 \bar D_0 )\vee ( D_3 \bar D_2 \bar D_1 \bar D_0 ) \vee ( D_3 \bar D_2 \bar D_1 D_0 ) Y=(Dˉ3Dˉ2D1Dˉ0)(Dˉ3Dˉ2D1D0)(Dˉ3D2Dˉ1Dˉ0)(Dˉ3D2Dˉ1D0)(Dˉ3D2D1Dˉ0)(D3Dˉ2Dˉ1Dˉ0)(D3Dˉ2Dˉ1D0)
但是实际比这个要长,因为我刚才也提到,四位二进制码一共能表示十六个数,而我们实际只用了10个,其余六个我没有考虑,所以在长表达式化简成短表达式时我也没有考虑其余六个数的取值问题(卡诺图解决的过程中可以当1或者0处理,我都当1处理了)所以短表达式化成长表达式时,将其余六位的输出也包含进去了,而且是六个1,最后的结果应该多出六位。

每一个类似 ( D ˉ 3 D ˉ 2 D 1 D ˉ 0 ) ( \bar D_3 \bar D_2 D_1 \bar D_0 ) (Dˉ3Dˉ2D1Dˉ0)的东西都叫一个最小项。他们按照下标取值确定位数的话,上边的式子就可以表示为
Y = m 2 ∨ m 3 ∨ m 4 ∨ m 5 ∨ m 6 ∨ m 8 ∨ m 9 Y = m_2 \vee m_3 \vee m_4 \vee m_5 \vee m_6 \vee m_8 \vee m_9 Y=m2m3m4m5m6m8m9
也就是说,当 D i D_i Di按照5(0101)这么取值,就可以让原式值为1。
其实这不就和我们最开始的逻辑非常像了么?

当然了这只是个导论,我们没有那么大的篇幅去解释具体细节的做法。

我们已经可以像这样讨论逻辑代数式的真值,实际上,我们能做的远不止于此。
我们通过数理逻辑创建了严谨的证明体系,为今后的集合论等论证打下了坚实的基础。当然数学中的逻辑和平时的逻辑有一定的出入,不过问题不大,我们正是有了统一的逻辑体系,才能有严谨的数学架构。今天我只是主要讲一讲数理逻辑在数字电路方面的应用,离散数学的才踏上了第一步。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值