【问题标题】:Boolean expression in SOPSOP 中的布尔表达式
【发布时间】:2016-05-15 16:16:48
【问题描述】:

我是布尔表达式的新手。

我的任务是简化 F(w,x,y,z) = xy’ + x’z’ + wxz + wx’y使用K图。

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

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

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

【问题讨论】:

  • 不知道为什么,但也许是为了让你把这 10 个术语写成长格式??

标签: algorithm boolean boolean-expression digital-logic boolean-algebra


【解决方案1】:

是的,您已经拥有 SOP 格式的文件。但第二个问题是关于标准(又名规范)SOP 形式的。这比必须使用 K-maps 更容易找到(但它通常很长),它只是 minterms 的总和。

【讨论】:

  • 您能简单解释一下如何获得这个规范的 SOP 表格吗?
  • @DominikBanialis 你知道最小术语是什么,对吧?随心所欲地获得它们。由于您在这里已经有一个简短的 SOP,您可以为每个术语的“不关心”的每个组合复制每个术语,例如 xyz -> wxyz + w'xyz
  • 当输出为 T 时,最小项在 Ttable 中为 0 对吗?和 maxterms ar 1s。我应该从第一个表达式 xy' + x'z' + wxz + wx'y 开始。我的结果会和K图的结果一样吗?
  • @DominikBanialis 它与 K 映射结果不同(在某些情况下可能是,但现在不是)因为 xy' 不是有效的最小术语(它没有提到所有变量)等等
【解决方案2】:

我认为您的解决方案并未涵盖所有。这些卡诺图显示了原始表达式、简化版本(最小 SOP)和规范 SOP,其中每个产品都包含所有文字(所有给定变量或其否定)。

原来的表达是

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

– 在对应的(第一个)K-map 中有两个四和两对。

使用K-map简化的原始表达式(见第二个):

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

与您的不同,但您可以使用 wolframalpha 在线工具检查,例如,它是简化的原始表达式。

它也是最小 DNF,但不是 minterms 的总和(输出等于 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

我检查了您的简化表达式,但没有涵盖所有 ones(即使有一些有用的 不关心 状态(标记为 X))。也许你打错了。还是原来的表达有错别字?

【讨论】:

    【解决方案3】:

    我们可以在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),由下表可知:

    从下一段代码sn-p的输出可以看出,程序输出简化形式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)。由于算法是贪心的,它可能会卡在某个局部最小值,我们需要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2023-03-23
      • 2016-04-06
      • 2010-10-04
      • 2012-08-26
      • 2012-04-18
      相关资源
      最近更新 更多