import Prelude hiding ((&&), (||), not) infixr 3 && infixr 2 || data Trivalent = TriFalse | TriUnknown | TriTrue deriving (Show, Eq, Ord) (&&) :: Trivalent -> Trivalent -> Trivalent TriFalse && _ = TriFalse _ && TriFalse = TriFalse TriTrue && TriTrue = TriTrue _ && _ = TriUnknown (||) :: Trivalent -> Trivalent -> Trivalent TriTrue || _ = TriTrue _ || TriTrue = TriTrue TriFalse || TriFalse = TriFalse _ || _ = TriUnknown not :: Trivalent -> Trivalent not TriTrue = TriFalse not TriFalse = TriTrue not TriUnknown = TriUnknown main = do print $ TriTrue && TriFalse print $ not (TriFalse || TriUnknown) print $ not (TriUnknown || TriFalse && TriTrue)