import Prelude hiding ((&&), (||), not) import qualified Prelude infixr 3 && infixr 2 || infixr 3 `xor` class Boolean a where (&&) :: a -> a -> a (||) :: a -> a -> a not :: a -> a data Trivalent = TriFalse | TriUnknown | TriTrue deriving (Show, Eq, Ord) instance Boolean Trivalent where TriFalse && _ = TriFalse _ && TriFalse = TriFalse TriTrue && TriTrue = TriTrue _ && _ = TriUnknown TriTrue || _ = TriTrue _ || TriTrue = TriTrue TriFalse || TriFalse = TriFalse _ || _ = TriUnknown not TriTrue = TriFalse not TriFalse = TriTrue not TriUnknown = TriUnknown instance Boolean Bool where (&&) = (Prelude.&&) (||) = (Prelude.||) not = Prelude.not xor :: Boolean a => a -> a -> a a `xor` b = not a && b || not b && a main = do print $ TriTrue && TriFalse print $ not (TriFalse || TriUnknown) print $ not (TriUnknown || TriFalse && TriTrue) print $ 2 < 3 `xor` False print $ map (&& TriTrue) [TriTrue, TriFalse, TriUnknown] print $ map (&& True) [True, False]