module FOLSyntax where data Term = Var String | Fun String [Term] deriving (Eq, Ord) data Formula = Pred String [Term] | Neg Formula | Conj Formula Formula | Disj Formula Formula | Impl Formula Formula | All String Formula | Exists String Formula | T | F deriving (Eq, Ord) instance Show Term where show (Var x) = x show (Fun f []) = f show (Fun f (x : xs)) = f ++ "(" ++ show x ++ foldr ((++) . (", "++) . show) ")" xs instance Show Formula where show (Pred p []) = p show (Pred p (x : xs)) = p ++ "(" ++ show x ++ foldr ((++) . (", "++) . show) ")" xs show (Neg f) = "!(" ++ show f ++ ")" show (Conj f1 f2) = "(" ++ show f1 ++ " /\\ " ++ show f2 ++ ")" show (Disj f1 f2) = "(" ++ show f1 ++ " \\/ " ++ show f2 ++ ")" show (Impl f1 f2) = "(" ++ show f1 ++ " -> " ++ show f2 ++ ")" show (All x f) = "(forall " ++ x ++ ". " ++ show f ++ ")" show (Exists x f) = "(exists " ++ x ++ ". " ++ show f ++ ")" show T = "true" show F = "false"