{- Dieses Modul stellt den Datentyp Formula und das Typsynonym Assignment bereit. Außerdem werden Funktionen printFormula :: Formula -> IO () zur Ausgabe von Formeln auf der Konsole und printTable :: [(Assignment,Bool)] -> IO() zur Ausgabe einer Wahrheitstabelle definiert. -} module Formula where data Formula = Var String | Not Formula | And Formula Formula | Or Formula Formula deriving (Eq, Show) type Assignment = [(String, Bool)] -- pretty print Ausgabe einer Formel in Infix-Notation mit Klammern printFormula :: Formula -> IO () printFormula = putStr . f2s where f2s :: Formula -> String f2s (Var s) = s f2s (Not f) = "not " ++ f2s f f2s (And f g) = bf2s f ++ " && " ++ bf2s g f2s (Or f g) = bf2s f ++ " || " ++ bf2s g bf2s (Var s) = s bf2s f = brackets (f2s f) brackets :: String -> String brackets cs = '(':(cs ++ ")") -- pretty print Ausgabe einer Wahrheitstabelle -- Es wird angenommen, dass die Variablen immer in der -- gleichen Reihenfolge angegeben werden. printTable :: [(Assignment,Bool)] -> IO() printTable table = do printTableHead table putStr $ unlines $ map t2s table printTableHead :: [(Assignment,Bool)] -> IO() printTableHead [] = putStr "Empty Table" printTableHead ((ass,b):rest) = let fstline = concat [ v++" " | (v,b) <- ass] ++ " | Formelwert " in putStrLn $ fstline ++ '\n' : (replicate (length fstline) '-' ) t2s :: (Assignment,Bool) -> String t2s (ass,b) = concatMap printSnd ass ++ " | " ++ show b where printSnd :: (String,Bool) -> String printSnd (cs,b) = show b ++ replicate n ' ' where n = abs (length (show b) - (length cs+5)) -- Beispieleingaben bspFormel = And (Var "A") (Not (Var "B")) bspTabelle = [([("A",True),("B",True)],False),([("A",True),("B",False)],True), ([("A",False),("B",True)],False),([("A",False),("B",False)],False)]