簡體   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