问题是:
假设p
,q
和r
是布尔变量。请考虑以下表达式:
!(p && !q || r)
Which of the following expressions is equivalent to the given expression?
A. (p && r) || (!q && r)
B. (!p && !q) || (!p && r)
C. (!p || q ) && !r
D. (!p || q && !r)
E. (!p || q) || r
我把它解决为D.但答案是C.布尔运算符的结合律是什么? 谁能解释为什么它应该是C?
谢谢, 美达
答案 0 :(得分:3)
布尔代数使用此运算符优先级:NOT,AND,OR
因此原始表达式可以重写为:
!((p && !q) || r)
^-- ^-- new
没有改变意义。在否定之后保持这种操作顺序:
!(p && !q) && !r
(!p || q) && !r
这是你的答案
答案 1 :(得分:1)
请参阅De Morgan's law并注意,它仅在(P && Q)
和(P || Q)
上直接定义。
二元运算符为left-associative和precedence is: (), !, &&, ||
。
因此:
!(p && !q || r) // start
!((p && !q) || r) // explicitly grouping by precedence
(!(p && !q) && !r) // by DM
(!p || q) && !r // by DM
这是C
,但我们无法做D
,因为这需要distributing over &&
或调整括号,以便更改优先级。
答案 2 :(得分: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