关于布尔表达式的德摩根定律

问题描述 投票:0回答:3

我收到了一道测试题:

假设

p
q
r
是布尔变量。考虑以下表达式:

!(p && !q || r)

下列哪个表达式与给定的表达式等价?

A. (p && r) || (!q && r)
B. (!p && !q) || (!p && r)
C. (!p || q ) && !r
D. (!p || q && !r)
E. (!p || q) || r

我的答案是D,但正确答案是C。为什么?这些运算符的关联性如何发挥作用?

boolean-expression demorgans-law
3个回答
3
投票

布尔代数使用以下运算符优先级:NOT、AND、OR

所以原来的表达式可以改写为:

!((p && !q) || r)
  ^--     ^-- new

不改变含义。要在求反后保留该运算顺序:

!(p && !q) && !r
(!p || q) && !r

这是你的 C) 答案


1
投票

请参阅德摩根定律,并注意它仅在

(P && Q)
(P || Q)
上直接定义。

二元运算符为 左结合优先级为:

(), !, &&, ||

因此:

!(p && !q || r)      // start
!((p && !q) || r)    // explicitly grouping by precedence
(!(p && !q) && !r)   // by DM
(!p || q) && !r      // by DM

这到达了

C
,但我们无法做到
D
,因为这需要分配
&&
或调整括号以更改优先级。


0
投票

我将使用 PyEDA

来回答
>>> from pyeda.inter import *
>>> f = Not(Or(And('p', '-q'), 'r'))
>>> ga = Or(And('p', 'r'), And('-q', 'r'))
>>> gb = Or(And('-p', '-q'), And('-p', 'r'))
>>> gc = And(Or('-p', 'q'), '-r')
>>> gd = Or('-p', And('q', '-r'))
>>> ge = Or(Or('-p', 'q'), 'r')

>>> for g in [ga, gb, gc, gd, ge]:
...     print(f.equivalent(g))

False
False
True
False
False

>>> expr2truthtable(f)
inputs: r q p
000 1
001 0
010 1
011 1
100 0
101 0
110 0
111 0

>>> expr2truthtable(gc)
inputs: r q p
000 1
001 0
010 1
011 1
100 0
101 0
110 0
111 0
© www.soinside.com 2019 - 2024. All rights reserved.