2011-01-21 174 views
10

我遇到了一些OBJ-C代碼,我不知道是否有一種方法來簡化它:邏輯:是(A &&!(B || C))|| (B || C)與(A || B || C)相同?

#if (A && !(B || C)) || (B || C) 

這是一樣的?

#if (A || B || C) 

如果沒有,是否有另一種方法來制定它會更容易閱讀?

在問這個問題之前,我嘗試了真值表,但是以爲我不得不錯過一些東西,因爲我懷疑Foundation.framework/Foundation.h會使用這個更復雜的表格。它有一個很好的理由嗎?

這裏的原代碼(從Foundation.h):

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE) 
+0

爲什麼不直接實現與結果有點道理表和測試它自己?只有8個不同的輸入| A = true,B = true,C = true | A =真,B =真。 C = false |等等等等。比較真值表。如果輸出是相同的,那麼你的邏輯是相同的。 – AndyPerfect 2011-01-21 20:58:18

+3

問題標題中的圓括號與問題本身略有不同。如果標題是正確的,那麼部分「!(B || C)||(B || C)」,可以用「真實」所取代,讓你有「A &&真」,這僅相當於A.另一方面,問題版本似乎缺少一對括號,否則你有一個語法錯誤。除此之外,我同意其他海報,創建真相表。 – cobaltduck 2011-01-21 21:03:06

+0

@PeterPerháč - 感謝編輯! – jpwco 2011-01-21 22:09:27

回答

12

是。像其他人說的那樣,你可以真相表。德摩根規則也可以提供幫助。

不過,我認爲最好的辦法是使用Karnaugh Map。學習需要幾分鐘的時間,但卡諾圖允許您始終找到布爾邏輯的最小表達式。真理表可以驗證最小化,但他們不能給你。

這裏就是我得到了它:

一,表佈局:

  AB 
    00 01 11 10 
    0| | | | | 
C 1| | | | | 

現在,考慮你的公式,B || C總是會導致一個真相:

  AB 
    00 01 11 10 
    0| | T | T | | 
C 1| T | T | T | T | 

這隻剩下兩種情況。無論哪種情況,右側的評估結果都是錯誤的。對於000,左側還計算結果爲假(0 & &!(什麼)是假的)。對於100,1 & &!(0 ||| 0)的計算結果爲真。因此,聲明是真實的。填寫:

  AB 
    00 01 11 10 
    0| F | T | T | T | 
C 1| T | T | T | T | 

現在,我們只需要「掩蓋」所有的事實。 「C」將覆蓋最後一行。 「B」將覆蓋中間方塊(四個值)。因此,「B || C」涵蓋除右上方以外的所有區域。現在,「A」將覆蓋正確的四格廣場。這是多餘的。因此,「A || B || C」涵蓋了所有的真正方格,並且省略了唯一的方格。

7

獲取筆+紙+試試吧,只有8種可能的輸入

+0

當然,我先試過。我聲稱代碼的源代碼超出了這個看似不起眼的表述:OSX的Foundation.h。所以我懷疑我的塗鴉。但是,是的,+1爲你的出色的第一本能。 – jpwco 2011-01-21 21:51:25

+0

我是一名實驗物理學家 - 考慮做數學或做測量的選擇我去做啞巴解決方案 – 2011-01-22 01:07:44

+2

我也是,但哪一個是愚蠢的,哪一個不依賴於實驗。 ;) – John 2011-01-24 23:43:32

2

是的,它是一樣的。使用德摩根規則:

(!一個& &(B || C))|| (B || C)=(A & &!乙& &!C)|| (B || C)。 因此,當A = 1和B,C = 0。如果不是的第二部分(B || C)爲真時,B中的情況下,第二將爲真|| C.所以它等於第一個。

0

是,兩人的表情是等價的。 (我剛剛寫了幾個函數來測試所有八種可能性。)

7
A | B | C | (B || C) | (!(B || C)) | (A && !(B || C)) | (A && (!(B || C)) || (B || C) | (A || B || C) 
------------------------------------------------------------------------------------------------------ 
T | T | T |  T |  F  |   F  |     T    |   T  
T | T | F |  T |  F  |   F  |     T    |   T 
T | F | T |  T |  F  |   F  |     T    |   T 
T | F | F |  F |  T  |   T  |     T    |   T 
F | T | T |  T |  F  |   F  |     T    |   T 
F | T | F |  T |  F  |   F  |     T    |   T 
F | F | T |  T |  F  |   F  |     T    |   T 
F | F | F |  F |  T  |   F  |     F    |   F 

根據最後兩列,我會說是。

7

他們是相同的。您可以使用Truth Table Generator進行測試。這兩種表述只有在一種情況下,當ABCfalsefalse

1

你也可以說:

(!一個& &(B || C))|| (B || C)重寫爲(A & &!W)|| W(1)

(1)重寫爲(A & &!W)|| (A ||!甲|| W)(2)

(2)重寫(A & &!W)|| (A || W)|| (3)

(3)重寫!(A & &!W)|| (A || W)(4)

(4)導致|| W然後A || B || ç

相關問題