首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOP中的布尔表达式

SOP中的布尔表达式
EN

Stack Overflow用户
提问于 2016-02-05 15:57:41
回答 3查看 663关注 0票数 1

我对布尔表达式很陌生。

我被赋予了使用K映射简化F(w,x,y,z) = xy’ + x’z’ + wxz + wx’y的任务。

我做过了,结果是wx’+w’y’+xyz

现在我必须“用标准SOP表单来编写它,您需要提供获得标准SOP的步骤”。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-05 16:02:35

是的,你已经有SOP格式了。但第二个问题是关于标准(又称规范) SOP形式。这比使用K-映射要简单得多(但它通常很长),它只是腹地之和。

票数 0
EN

Stack Overflow用户

发布于 2016-07-11 10:02:46

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

最初的表达式是

代码语言:javascript
复制
F(w,x,y,z) = x·¬y + ¬x·¬z + w·x·z + w·¬x·y

-在相应的(第一幅)K-图中有两对四圈和两对。

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

代码语言:javascript
复制
F(w,x,y,z) = x·¬y + ¬x·¬z + w·y·z

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

它也是最小DNF,但不是一个中间值之和(其中输出等于1),因为和的每个乘积中并不都有所有变量。

第三张K-图显示10个腹地被圈了起来。它们形成规范的DNF:

代码语言:javascript
复制
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))。也许你做了个错字。或者在原来的表达中可能有一个错误?

票数 0
EN

Stack Overflow用户

发布于 2021-12-02 22:58:57

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

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

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

代码语言:javascript
复制
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形式的布尔函数(基本目标是覆盖所有的1s和最少的功耗-2块)。由于算法是贪婪的,它可能会被困在一些局部极小,这是我们需要小心的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35228353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档