and',or',nand',nor',xor',impl',equ' :: Bool -> Bool -> Bool
not' :: Bool -> Bool

not' True = False
not' _ = True

and' True True = True
and' _ _ = False

or' False False = False
or' _ _ = True

nand' = curry $ not' . (uncurry and')

nor' = curry $ not' . (uncurry or')

xor' True True = False
xor' False False = False
xor' _ _ = True

impl' a b = or' (not' a) b

equ' = curry $ not' . (uncurry xor')

table :: (Bool -> Bool -> Bool) -> IO ()
table f = mapM_ putStrLn [show a ++ " " ++ show b ++ " " ++ show (f a b)
            | a <- [True, False], b <- [True, False]]