乐读窝

程序员的数学思维修炼

乐读窝 > 科普学习 > 程序员的数学思维修炼

8.5用卡诺图简化逻辑函数

书籍名:《程序员的数学思维修炼》    作者:周颖



在8.4节的例子中,我们演示了通过逻辑运算简化逻辑函数的方法。其实,还可以通过图形方式,以直观、简洁的方式简化逻辑函数。本节我们就来学习这种通过卡诺图简化逻辑函数的方法。



8.5.1 什么是卡诺图


卡诺图是逻辑函数的一种图形表示。一个逻辑函数的卡诺图就是将此函数所有命题的真假组合以二维表的形式表示的图形。

根据以上定义我们可以知道,卡诺图是一种平面方格图。另外,在卡诺图中要表示每个命题的真假情况。也就是说,每一个命题都要表现两种情况,分别用两个方格来表示,每个小方格代表一个最小项(即一个命题的真或假)。因此,卡诺图也称为最小方格图。

只看概念比较抽象,来看一个实际例子。仍以前面的外地生招生考试为例,将该例子用卡诺图来表示。该例可分解出两个简单命题:

下面就根据设置的规则,将这两个简单命题所有真假组合绘制成一个卡诺图,具体步骤如下。

(1)绘制如图8-12所示的二维表格,在这个表格中,命题A的两个值(真、假)放置在第1行右侧的两列中(其中0表示假、1表示真);类似地,命题B的两个值(真、假)放置在第1列下面的两行中。

图8-12

(2)根据命题描述的情况,在图8-12对应方格中标记1。针对报名规则1(“非本市中心城区户籍,且未在本市中心城区参加高中阶段教育学校统一招生考试报名的初三毕业生”)可知道,这句话的两个命题为“非A,非B”),则在A为0、B为0对应的方格中标记1,得到如图8-13所示的卡诺图。

图8-13

(3)继续在卡诺图对应方格中进行标记。针对报名规则2(“本市中心城区户籍,且未在本市中心城区参加高中阶段教育学校统一招生考试报名的初三毕业生”)可知道,这句话的两个命题为“A,非B”,则标记后的卡诺图如图8-14所示。

图8-14

图8-14所示的卡诺图是根据以下逻辑函数绘制的:

可以看到,这个逻辑函数中只有两个逻辑变量,如果有多个逻辑变量,又该怎么绘制卡诺图呢?



8.5.2 三变量卡诺图


卡诺图是一个二维图表,如果有多个变量,则需要在行/列中同时显示多个变量,这样,行/列中的方格将不再是两行两列,而是根据变量数量的两倍来绘制。

例如,要绘制以下逻辑函数的卡诺图:

可以看出,这个逻辑函数有3个逻辑变量,该怎么绘制3个变量的卡诺图呢?

(1)绘制如图8-15所示的二维表格,在这个表格中,用4列来表示逻辑变量B、C的真假情况(这应该很好理解,逻辑变量B、C共有4种组合形式)。而逻辑变量A位于行中,仍然用两行来表示真假两种情况。

图8-15

注意,在图8-15所示表格中,列中数据的变化,“01”右侧是“11”,很多人根据二进制变化规则会觉得“01”右侧应该是“10”,然后“10”的右侧才是“11”。这是卡诺图相邻项的要求,学习了后面卡诺图化简后就能明白为什么要这样做了。

(2)接下来就是根据逻辑函数进行填值了。这时,不再像二变量(8.5.1节例子)的卡诺图可以按行、列对应来查找了,在三变量即本节例中时,情况变得有点复杂了。不过,我们可以用另一种方式来标记方格,即将逻辑函数中各变量转变为0、1两个数,然后在卡诺图中找到对应位置。转变时,原变量取值为1,反变量取值为0。

(3)根据转变后的二进制数据,找到对应的方格,如图8-16所示。

图8-16

(4)在找到的对应方格中标记1即可,如图8-17所示。

图8-17

对于三变量卡诺图,在前面例子中采用的是在行方向上排列1个变量,列方向上排列2个变量。其实也可以反过来,在行方向上排列2个变量,列方向上排列1个变量,如图8-18所示。

图8-18

由此可见,卡诺图的表示方法并不是唯一的,可以有很多种,例如,还可将A放在列,而将BC放在行中等。



8.5.3 四变量卡诺图


继续增加难度,我们看看四变量的卡诺图该怎么绘制。

有如下逻辑函数,要求将其绘制在卡诺图中。

对于这个逻辑函数,我们发现有4个逻辑变量A、B、C、D,并且在每一个逻辑式中都只有2个或3个逻辑变量组成,这在卡诺图中该怎么表示呢?

(1)绘制如图8-19所示的四变量卡诺图。

图8-19

(2)第一项只包含了2个逻辑变量,变量B、C都没有出现,对于这种情况,应将A=0,D=1的方格都填上1,如图8-20所示。

图8-20

(3)用类似的方法,可将逻辑函数中其他两项也对应标记到卡诺图中,如图8-21所示。其中AB对应同时满足A=1,B=1的方格;而对应同时满足B=1,C=0,D=1的方格。

图8-21

从理论上来说,卡诺图可以表示任意多个逻辑变量的情况,不过实际应用中,一般用于四变量及以下逻辑变量的表示和化简操作,因此,更多变量的卡诺图就不介绍了。



8.5.4 卡诺图化简


使用卡诺图的目的就是化简逻辑函数,学习绘制卡诺图也是为化简打下基础。首先,我们来看一下卡诺图的化简规则。

化简规律:两个相邻最小项有一个变量相异,相加可以消去这一个变量,化简结果为相同变量的与。

这句话是什么意思呢?来看一个如图8-22所示的卡诺图。

图8-22

在该图中圈起来的两个相邻方格可用以下逻辑函数来表示:

可以看出,在卡诺图中两个相邻方格中,只有一个变量取值不同(在图8-22中是变量A的取值不同),而其余的取值都相同(图8-22中变量B的取值相同)。所以,合并相邻方格可利用公式:

从而使

这样,就可消去一个变量,从而使逻辑函数得到简化。

使用类似的方式可进行4、8个相邻项的合并,可发现卡诺图中相邻项合并的规律:

合并相邻最小项,可消去变量。

合并2个最小项,可消去1个变量。

合并4个最小项,可消去2个变量。

合并8个最小项,可消去3个变量。

合并2n个最小项,可消去n个变量。

来看一个例子。用卡诺图化简以下逻辑函数:

首先,根据逻辑函数绘制出如图8-23所示的卡诺图。

图8-23

可以看出,在图8-23所示的卡诺图中,有4个相邻方格标记为1,可对其进行简化,4个相邻方格可简化2个逻辑变量。

那么,从图8-23所示卡诺图中简化后的逻辑函数是什么?该怎么从图中得出简化后的逻辑函数呢?

对图8-23所示卡诺图,未标记1的位置不用关心。对于标记为1方格对应的各变量进行查看,在本例中将4个相邻方格圈出来;然后将相邻方格中变量值相异部分圈出来,得到图8-24所示内容。

图8-24

从图8-24中可以看出,AB部分中变量A一直为1,而变量B是相异的,因此可消去变量B;再看CD部分,变量C是相异的,而变量D一直为1。因此,最后得到的应该是变量A为1,变量D为1,即:

从以上简化过程可以看出,在用卡诺图化简逻辑函数时通常按以下步骤进行。

(1)按2、4、8、2n个数量的规则来圈取值为1的方格。

(2)将上一步圈选各方格中互补的因子消去(即逻辑变量值相异的),保留相同的因子,相同因子取值为1表示用原变量表示,相同因子取值为0表示用反变量表示,将保留的因子按“与”的关系连接(即连续写在一起)。

(3)重复第(1)、(2)步,继续按2n个方格数量的方式圈选其他相邻方格,消去互补因子,保留相同的因,写出“与”项表达式。再将该“与”项表达式与前面1~2步写出的“与”项表达式进行“或”连接(即用加号连起来)。

(4)重复第(3)步,最后即可得到化简后的逻辑函数。



8.5.5 卡诺图中的相邻


可以看出,在卡诺图中“相邻”是一个很重要的概念。在卡诺图中,应将表格看作为一个循环的状态,这样才能理解相邻的概念。例如,如图8-25所示,其中标识①的框内圈选了8个方格,可以很容易看出这8个方格是相邻的;可是,标识②的框(注意左、右都只有半边)也是相邻的,这种情况可能不好理解。

图8-25

我们可以换一种方式来理解,将第1列复制一份到表格右侧,如图8-26所示,怎么样?这样看标识②的框中4个方格,可以很容易看出是相邻的了吧。也就是说,第1列与最后1列之间是相邻的关系。类似地,第1行与最后1行之间也是相邻的关系。

图8-26

最后,我们再来看一下前面提到过的一个问题,为什么“01”列的右侧是“11”而不是“10”?其实,这也是从相邻方格合并简化方面来考虑的。仔细观察图8-26所示的卡诺图,无论是列还是行,相邻行或相邻列中的两个逻辑变量之间始终都只有一个发生变化。如“01”列右侧变“11”,只有第1个(左侧)逻辑变量从0变为1,而第2个(右侧)逻辑变量未变化。这样,在化简时才能方便地确定一个相异逻辑变量,一个相同逻辑变量。

反之,如果在“01”右侧为“10”,可以看到第1个(左侧)逻辑变量从0变为1,第2个(右侧)逻辑变量从1变为0,两个逻辑变量都在变化,就没办法进行化简了。