module Main where data BF = Zero | One | Add BF BF | Mul BF BF | Not BF deriving (Show, Eq) evaluate :: BF -> BF evaluate Zero = Zero evaluate One = One evaluate (Add x y) | (evaluate x == Zero) && (evaluate y == Zero) = Zero | otherwise = One evaluate (Mul x y) | (evaluate x == One) && (evaluate y == One) = One | otherwise = Zero evaluate (Not x) | evaluate x == Zero = One | otherwise = Zero a, b, c :: BF a = (Not ( ((Zero `Add` ((One `Mul` Zero) `Mul` Not (One))) `Mul` Zero) `Add` (((One `Add` Zero) `Mul` (Not One)) `Add` Zero) ) ) `Mul` ((Not One) `Add` One) b = Not ( (Not (Not ((Not Zero) `Add` One)) `Mul` (Zero `Mul` (Not One))) `Add` ((Not ((Not Zero) `Add` One)) `Mul` (Not (Zero `Mul` (Not One)))) ) c = ((One `Add` (Not One)) `Mul` (Zero `Add` (Not ((Not Zero) `Mul` One)))) `Add` ( (Not ((Zero `Mul` (Not One)) `Add` ((Not Zero) `Mul` One))) `Mul` (Not (Zero `Mul` One)) ) main :: IO () main = mapM_ (\(s, f) -> putStrLn $ s ++ " = " ++ (show f) ++ "\nEvaluate " ++ s ++ ":\n" ++ (show $ evaluate f) ++ "\n\n" ) [("a", a), ("b", b), ("c", c)]