module Logic.Statement where import Data.Set (singleton, union, toAscList) data Statement = Atom String | Not Statement | And Statement Statement | Or Statement Statement | Implies Statement Statement | Iff Statement Statement deriving (Show, Eq) atoms :: Statement -> [String] atoms = toAscList . mkSet where mkSet (Atom key) = singleton key mkSet (Not s) = mkSet s mkSet (And s1 s2) = union (mkSet s1) (mkSet s2) mkSet (Or s1 s2) = union (mkSet s1) (mkSet s2) mkSet (Implies s1 s2) = union (mkSet s1) (mkSet s2) mkSet (Iff s1 s2) = union (mkSet s1) (mkSet s2) substatements :: Statement -> [Statement] substatements s@(Atom _) = [s] substatements s@(Not s1) = s:(substatements s1) substatements s@(And s1 s2) = (s:) $ substatements s1 ++ substatements s2 substatements s@(Or s1 s2) = (s:) $ substatements s1 ++ substatements s2 substatements s@(Implies s1 s2) = (s:) $ substatements s1 ++ substatements s2 substatements s@(Iff s1 s2) = (s:) $ substatements s1 ++ substatements s2