邏輯運算回憶筆記

 最近在寫程式時,因為作出了類似以下的語法

If flag Then
    If props.Contains(prop.Name) Then
      ....
    End If
Else
    If Not props.Contains(prop.Name) Then
      ....
    End If
End If

其中 .... 的語法其實是一樣的。

然後想起來皆為真或皆為假才執行,應該是可以縮減運算式才對,開始翻遍我的大腦(因為我常用 Not/And/AndAlso/Or/OrElse/Xor )

然後想起來高中 VB6 的 EQV ,結果發現原來 EQV 及 IMP 都被取消支援了,所以產生這個筆記

Not/And/Or 是基本款,應該不難,不過還是列舉一下

1. Not

A NOT
True False
False True

2. And

A B AND
True True True
True False False
False True False
False False False
3. Or
A B OR
True True True
True False True
False True True
False False False

以上 3 種是基本款,極大多數狀況下也只用得到上面三種
而 OrElse 或 AndAlso 則不太算是邏輯運算,而是邏輯判斷
OrElse 的真值表與 Or 一致,但是當前者為 True 時,他就不會作後面的判斷了
AndAlso 的真值表與 And 一致,但是當前者為 False 時,他就不會作後面的判斷了
這兩個的主要用處是用在某些條件下你不希望去執行後面判斷式的函式運算等狀況
像是如果某個 Instance 是 Null ,那你也不需要特別從裡面取值來判斷內容了,否則會引發 Null reference exception,或者當某些條件下,你不希望執行條件式後面的可能比較耗時的運算函式來算出結果時使用。
接下來介紹 XOR/EQV/IMP ,其中要說明的是後兩個在現行的 Vb.Net 已移除支援

4. Xor
A B XOR
True True False
True False True
False True True
False False False
Xor 的口訣是一真一假即為真
使用上述三種基本款來實現的邏輯運算為:(A AND NOT B) OR (NOT A AND B)
這個運算子大量的被使用在密碼學相關的演算法及雜湊相關的演算法中。

5. EQV
A B EQV
True True True
True False False
False True False
False False True
EQV 為兩者相等即為真,剛好是與 XOR 反過來
所以他也只要 NOT (A XOR B) 即可以實現
現在的 VB.Net 已移除此運算子的支援,但可以輕易使用 XOR + NOT 重新得到相同的結果。


5. IMP
A B IMP
True True True
True False False
False True True
False False True
IMP 其實就是大名鼎鼎的若P則Q(因果論),可以視 A 為因,B為果,那是否A→B是成立的,這個用舉例來描述比較好懂,晚點我舉例,我先說明在被移除支援的現在,如何用現有邏輯運算子達成相同算式
使用上述已有的邏輯運算式展開為: NOT A OR (A AND B)
這個函式極少會使用到,並且現在的 VB.Net 已不支援此邏輯運算子

IMP 的舉例:若我去摘蘋果,則蘋果會掉下來
A:我是否去摘蘋果
B:蘋果是否掉下來

由上述的 A 及 B 兩個 條件,可以展開下面四種結果:
  • 我去摘蘋果且蘋果會掉下來,所以 "若我去摘蘋果,則蘋果會掉下來" 成立。
  • 我去摘蘋果,但蘋果卻不會掉;
    這違反了因果論,所以 "若我去摘蘋果,則蘋果會掉下來" 明顯的不成立。
  • 我不去摘蘋果,蘋果卻掉下來;
    因為我不去摘他時,他也有可能因為熟透了自己掉下來,所以這個因果論是成立的。
  • 我不去摘蘋果,蘋果也不會掉下來;
    因為我不去摘他時,他本來就有可能好好的長在樹上,所以這個因果論也是成立的。
而引伸常常看到的經典邏輯謬論就是看到蘋果掉下來了,就認定是我去摘的,這個是不成立的,因為若P則Q,是無法推導成若Q則P的,當然,非P則非Q(我沒去摘就不會掉)也是經典謬論
(蘋果還是有可能因熟透掉下來,所以還是有可能會掉)
(正確的邏輯是要倒過來,非Q則非P,他沒掉下來那就我沒去摘)。
但是雖然邏輯推論很常使用到若P則Q,在程式領域卻極少使用若P則Q的,所以被移除這麼多年我也是今天才發現到他被移除了www
(或許人工智慧那邊有可能會用到吧?但我沒寫過那邊的程式,所以也不確定,至少常見的程式設計極少使用到。)

最後我精簡後的語法變成了

If Not (flag Xor props.Contains(prop.Name)) Then
    ....
End If

不過這主要也是弄個隨筆,順便回憶青澀的高中生涯www

留言

這個網誌中的熱門文章

DB 資料庫呈現復原中

Outlook 刪除大量重覆信件

[VB.Net] If vs IIf ,兩者的差異