2013-12-12 30 views
1

問題是: 假設p,qr是布爾變量。請看下面的表達式:關於布爾表達式的De Morgan定律

!(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

參見[德·摩根定律]回答(http://en.wikipedia.org/wiki/De_Morgan's_laws)。關聯性全部向左,優先級爲:'(),!,&&/||' – user2864740

+0

您可以編寫一個小程序,測試所有備選項的所有8個輸入。 – usr

回答

3

布爾代數使用此運算符優先級:NOT,AND,OR

所以原始表達式可以改寫爲:

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

不改變的意思。要否定後保持操作的順序:

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

這是你C)答案

1

De Morgan's law並注意它只是直接通過(P && Q)(P || Q)定義。

二元運算符是left-associativeprecedence 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 &&或調整括號使得優先級被改變。

+0

感謝您的回答。我從最左邊的操作數開始就把左向左混淆了。所以左結合意味着從最右邊的操作數開始並向左走? – user3096748

+0

@ user3096748 [向左](http://en.wikipedia.org/wiki/Operator_associativity)表示對於相同的優先級,「a ||」 b || c || d'相當於'((a || b)|| c)|| d' - 或「操作從左邊分組」。但是,優先規則首先適用('&&'優先於'||')。我修正了我最初的內聯評論,它錯誤地指出,通過關聯性添加括號是等價的 - 事實上它由於優先級而等價。 – user2864740

+0

謝謝!有一個很好的網站,我可以參考布爾和關係運算符的關聯規則等嗎? – user3096748

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