SOP 中的布尔表达式
Boolean expression in SOP
我是布尔表达式的新手。
我的任务是简化
F(w,x,y,z) = xy’ + x’z’ + wxz + wx’y
使用K图
我已经做到了,结果是wx’+w’y’+xyz
。
现在我必须"Write it in a standard SOP form. You need to provide the steps through which you get the standard SOP"。
而且我不知道该怎么做。我以为k图后的结果是sop。
是的,您已经有了 SOP 表格。但第二个问题是关于标准(又名规范)SOP 形式。这比必须使用 K-maps 更容易找到(但它通常很长),它只是最小项的总和。
我认为您的解决方案并未涵盖所有 。这些卡诺图显示了原始表达式、简化版本(最小 SOP)和规范 SOP,其中每个产品都包含所有文字(所有给定变量或其否定)。
原表达式为
F(w,x,y,z) = x·¬y + ¬x·¬z + w·x·z + w·¬x·y
– 相应的(第一个)K-map中圈出了两个fours和两个pair
使用K-map简化的原始表达式(如第二张所示):
F(w,x,y,z) = x·¬y + ¬x·¬z + w·y·z
和你的不一样,不过你可以用wolframalpha在线工具查一下,是简化后的原始表达式。
也是最小DNF,但不是最小项之和(输出等于1),因为不是每一个和的乘积都有变量。
第三张K图圈出十个最小项。它们构成了规范的 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(乘积总和)形式的布尔函数和变量名称以及 returns 简化的简化表示。基本上,您需要创建矩形组,其中包含总项的 2 次幂,例如 8、4、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),从下面可以看出table:
从下一个代码片段的输出可以看出,程序输出了简化形式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)。由于该算法是贪婪的,它可能会卡在某个局部最小值,我们需要小心。
我是布尔表达式的新手。
我的任务是简化
F(w,x,y,z) = xy’ + x’z’ + wxz + wx’y
使用K图
我已经做到了,结果是wx’+w’y’+xyz
。
现在我必须"Write it in a standard SOP form. You need to provide the steps through which you get the standard SOP"。
而且我不知道该怎么做。我以为k图后的结果是sop。
是的,您已经有了 SOP 表格。但第二个问题是关于标准(又名规范)SOP 形式。这比必须使用 K-maps 更容易找到(但它通常很长),它只是最小项的总和。
我认为您的解决方案并未涵盖所有 。这些卡诺图显示了原始表达式、简化版本(最小 SOP)和规范 SOP,其中每个产品都包含所有文字(所有给定变量或其否定)。
原表达式为
F(w,x,y,z) = x·¬y + ¬x·¬z + w·x·z + w·¬x·y
– 相应的(第一个)K-map中圈出了两个fours和两个pair
使用K-map简化的原始表达式(如第二张所示):
F(w,x,y,z) = x·¬y + ¬x·¬z + w·y·z
和你的不一样,不过你可以用wolframalpha在线工具查一下,是简化后的原始表达式。
也是最小DNF,但不是最小项之和(输出等于1),因为不是每一个和的乘积都有变量。
第三张K图圈出十个最小项。它们构成了规范的 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(乘积总和)形式的布尔函数和变量名称以及 returns 简化的简化表示。基本上,您需要创建矩形组,其中包含总项的 2 次幂,例如 8、4、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),从下面可以看出table:
从下一个代码片段的输出可以看出,程序输出了简化形式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)。由于该算法是贪婪的,它可能会卡在某个局部最小值,我们需要小心。