繁体   English   中英

SOP 中的布尔表达式

[英]Boolean expression in SOP

我是布尔表达式的新手。

我的任务是使用 K 映射简化F(w,x,y,z) = xy' + x'z' + wxz + wx'y

我已经完成了,结果是wx'+w'y'+xyz

现在我必须“以标准 SOP 形式编写它。您需要提供获得标准 SOP 的步骤”。

我不知道该怎么做。 我认为 k 地图后的结果是 sop。

是的,您已经以SOP形式获得它。 但是第二个问题是关于标准(又称规范)SOP形式的。 这比必须使用K-maps要容易得多(但通常很长),这只是最小项的总和。

我认为您的解决方案不能解决所有问题 这些卡诺图显示原始表达式,简化版本(最小SOP)和规范SOP,其中每个乘积都包含所有文字(所有给定变量或它们的取反)。

原始,简化和完整SOP的K图

原始表达是

F(w,x,y,z) = x·¬y + ¬x·¬z + w·x·z + w·¬x·y

–在相应的(第一个)K映射中圈出两个四和两对。

原始表达式使用K-map简化(如第二个所示):

F(w,x,y,z) = x·¬y + ¬x·¬z + w·y·z

与您的工具有所不同,但是您可以使用Wolframalpha在线工具检查其是否为简化的原始表示形式。

它也是最小DNF,但不是最小项的总和(输出等于1),因为总和的每个乘积中都没有变量。

第三张K-map显示了十个最小项。 它们形成规范的DNF:

F(w,x,y,z) = m0 + m2 + m4 + m5 + m8 + m10 + m11 + m12 + m13 + m15 =
           = ¬w·¬x·¬y·¬z + ¬w·¬x·y·¬z + ¬w·x·¬y·¬z + ¬w·x·¬y·z + w·¬x·¬y·¬z 
             + w·¬x·y·¬z + w·¬x·y·z + w·x·¬y·¬z + w·x·¬y·z + w·x·y·z

我检查你的简化表达,但也有不是所有的人覆盖(即使有一些有用的无关状态(标记X))。 也许你打错字了。 或原始表达形式中可能有错字?

我们可以在python实现4个变量的K-Map算法,如下图。 该函数接受 SOP(乘积总和)形式的布尔函数和变量名称,并返回简化的简化表示。 基本上,您需要创建包含 8、4、2 等 2 次幂的总项的矩形组,并尝试在一组中包含尽可能多的元素。

例如,该函数可以表示为 F(w,x,y,z) = xy' + x'z' + wxz + wx'y 以 SOP 形式表示为 f(w,x,y,z)=∑(0 ,2,4,5,8,10,11,12,13,15),如下表所示:

在此处输入图片说明

从下一段代码的输出可以看出,程序输出了简化形式x¬y + ¬x¬z + wyz ,其中布尔变量x否定在代码中表示为¬x

from collections import defaultdict
from itertools import permutations, product
    
def kv_map(sop, vars):
    
    sop = set(sop)
    not_covered = sop.copy()
    sop_covered = set([])
    
    mts = [] # minterms
    
    # check for minterms with 1 variable
    all_3 = [''.join(x) for x in product('01', repeat=3)]
    for i in range(4):
        for v_i in [0,1]:
                if len(not_covered) == 0: continue
                mt = ('' if v_i else '¬') + vars[i]
                s = [x[:i]+str(v_i)+x[i:] for x in all_3]
                sop1 = set(map(lambda x: int(x,2), s))
                if len(sop1 & sop) == 8 and len(sop_covered & sop1) < 8: # if not already covered
                    mts.append(mt)
                    sop_covered |= sop1
                    not_covered = not_covered - sop1
        if len(not_covered) == 0:
           return mts
    
    # check for minterms with 2 variables
    all_2 = [''.join(x) for x in product('01', repeat=2)]
    for i in range(4):
        for j in range(i+1, 4):
            for v_i in [0,1]:
                for v_j in [0,1]:
                    if len(not_covered) == 0: continue
                    mt = ('' if v_i else '¬') + vars[i] + ('' if v_j else '¬') + vars[j]
                    s = [x[:i]+str(v_i)+x[i:] for x in all_2]
                    s = [x[:j]+str(v_j)+x[j:] for x in s]
                    sop1 = set(map(lambda x: int(x,2), s))
                    if len(sop1 & sop) == 4 and len(sop_covered & sop1) < 4: # if not already covered
                        mts.append(mt)
                        sop_covered |= sop1
                        not_covered = not_covered - sop1
    if len(not_covered) == 0:
        return mts

    # check for minterms with 3 variables similarly (code omitted)
    # ... ... ...
    
    return mts
    
mts = kv_map([0,2,4,5,8,10,11,12,13,15], ['w', 'x', 'y', 'z'])
mts
# ['x¬y', '¬x¬z', 'wyz']

下面的动画展示了上面的代码如何(贪婪地)简化以 SOP 形式给出的布尔函数(基本目标是用最少的 2 次幂块覆盖所有 1)。 由于算法是贪婪的,它可能会卡在某个局部最小值,我们需要小心。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM