module Logic where import Prelude hiding ((^), (&&), (||)) import Data.List (intercalate) data Logic = T | F | Atom String | Neg Logic | Or [Logic] | And [Logic] instance Show Logic where show x = case x of Atom a -> a Neg p -> "¬" ++ show p Or ps -> intercalate " ∨ " (map show ps) And ps -> intercalate " ∧ " (map show ps) T -> "T" F -> "F" p = Atom "p" :: Logic q = Atom "q" :: Logic r = Atom "r" :: Logic (^) :: Logic -> Logic (^) p = Neg p (||) :: Logic -> Logic -> Logic (||) p q = Or [p, q] (&&) :: Logic -> Logic -> Logic (&&) p q = And [p, q] (==>) :: Logic -> Logic -> Logic (==>) p q = (Neg p) || q (<=>) :: Logic -> Logic -> Logic (<=>) p q = ((Neg p) || q) && (p || (Neg q))