だから論理論理 切なくて 壊れそうな夜にさえ

Haskell演算子の定義には色々な記号が使える。ので試してみた。
Unicodeに携帯の絵文字が追加されたらとても楽しいことになりそうですね!


さて、知ってる人にとっては結構当たり前(?)だけど、案外気付いていない人が多い気がする、XORとnot equalの関係。バイト先でも以前首を傾げられたこともあるし、勉強会やWeb上でも「なんでXOR演算子がないの」などと見聞したことがある。ということでこれをネタにしよう。何個か定義してみた。

(∧) :: Bool -> Bool -> Bool
a ∧ b = a && b

(∨) :: Bool -> Bool -> Bool
a ∨ b = a || b

(⇒) :: Bool -> Bool -> Bool
a ⇒ b = not a ∨ b

(⇔) :: Bool -> Bool -> Bool
a ⇔ b = (a ⇒ b) ∧ (b ⇒ a)

-- XOR !
(◎) :: Bool -> Bool -> Bool
a ◎ b = (not a ∧ b) ∨ (a ∧ not b)

getTruthTable ope = [ (x, y, ope x y) | x <- [True, False], y <-[True, False] ]

printTable = putStrLn . unlines . map out
    where out (x, y, z) = show x ++ " : " ++ show y ++ " = " ++ show z
    
main = do
    printTable $ getTruthTable (==)
    printTable $ getTruthTable (⇔)
    putStrLn "----------\n"
    printTable $ getTruthTable (◎)
    printTable $ getTruthTable (/=)
    putStrLn "----------\n"
    
    let deMorgan a b = (not (a ∨ b)) ⇔ (not a ∧ not b)
        in printTable $ getTruthTable deMorgan

True : True = True
True : False = False
False : True = False
False : False = True

True : True = True
True : False = False
False : True = False
False : False = True

                  • -

True : True = False
True : False = True
False : True = True
False : False = False

True : True = False
True : False = True
False : True = True
False : False = False

                  • -

True : True = True
True : False = True
False : True = True
False : False = True

排他的論理和に使われる(主な)記号は○の中に+を書いたものなんだけど、
はてダ上で上手く表示できなかったので◎に変更しました。
最後はおなじみド・モルガンの法則。