latex truth table: hard part
This commit is contained in:
parent
5e0827b17d
commit
1e66888807
1 changed files with 46 additions and 10 deletions
54
Main.hs
54
Main.hs
|
@ -184,27 +184,52 @@ data SerializeFormat
|
||||||
| Latex
|
| Latex
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
serialize :: SerializeFormat -> Statement -> String
|
serializeParts :: SerializeFormat -> Statement -> [String]
|
||||||
serialize = aux
|
serializeParts = aux
|
||||||
where
|
where
|
||||||
aux Ascii = ascii
|
aux Ascii = ascii
|
||||||
aux Latex = latex
|
aux Latex = latex
|
||||||
|
|
||||||
ascii (Atom string) = string
|
ascii (Atom key) = [key]
|
||||||
ascii (Not s) = "!" <> ascii s
|
ascii (Not s) = ["!"] ++ ascii s
|
||||||
ascii (And s1 s2) = connective "&" (ascii s1) (ascii s2)
|
ascii (And s1 s2) = connective "&" (ascii s1) (ascii s2)
|
||||||
ascii (Or s1 s2) = connective "|" (ascii s1) (ascii s2)
|
ascii (Or s1 s2) = connective "|" (ascii s1) (ascii s2)
|
||||||
ascii (Implies s1 s2) = connective "->" (ascii s1) (ascii s2)
|
ascii (Implies s1 s2) = connective "->" (ascii s1) (ascii s2)
|
||||||
ascii (Iff s1 s2) = connective "<->" (ascii s1) (ascii s2)
|
ascii (Iff s1 s2) = connective "<->" (ascii s1) (ascii s2)
|
||||||
|
|
||||||
latex (Atom string) = string
|
latex (Atom key) = [key]
|
||||||
latex (Not s) = "\\neg " <> latex s
|
latex (Not s) = ["\\neg "] ++ latex s
|
||||||
latex (And s1 s2) = connective "\\cap " (latex s1) (latex s2)
|
latex (And s1 s2) = connective "\\cap " (latex s1) (latex s2)
|
||||||
latex (Or s1 s2) = connective "\\cup " (latex s1) (latex s2)
|
latex (Or s1 s2) = connective "\\cup " (latex s1) (latex s2)
|
||||||
latex (Implies s1 s2) = connective "\\to " (latex s1) (latex s2)
|
latex (Implies s1 s2) = connective "\\to " (latex s1) (latex s2)
|
||||||
latex (Iff s1 s2) = connective "\\leftrightarrow " (latex s1) (latex s2)
|
latex (Iff s1 s2) = connective "\\leftrightarrow " (latex s1) (latex s2)
|
||||||
|
|
||||||
connective token s1 s2 = "(" <> s1 <> token <> s2 <> ")"
|
connective token s1 s2 = ["("] ++ s1 ++ [token] ++ s2 ++ [")"]
|
||||||
|
|
||||||
|
serialize :: SerializeFormat -> Statement -> String
|
||||||
|
serialize fmt s = concat $ serializeParts fmt s
|
||||||
|
|
||||||
|
serializeLatexTruthTableRow :: [(String, Bool)] -> Statement -> Maybe String
|
||||||
|
serializeLatexTruthTableRow = latexRow
|
||||||
|
where
|
||||||
|
latexRow ass (Atom key) = toInt <$> eval ass (Atom key)
|
||||||
|
latexRow ass (Not s) = (toInt <$> not <$> eval ass s) <> latexRow ass s
|
||||||
|
latexRow ass (And s1 s2) = latexRowBinaryConnective (&&) ass s1 s2
|
||||||
|
latexRow ass (Or s1 s2) = latexRowBinaryConnective (||) ass s1 s2
|
||||||
|
latexRow ass (Implies s1 s2) = latexRowBinaryConnective implies ass s1 s2
|
||||||
|
latexRow ass (Iff s1 s2) = latexRowBinaryConnective (==) ass s1 s2
|
||||||
|
|
||||||
|
latexRowBinaryConnective op ass s1 s2 =
|
||||||
|
(\subrow1 subrow2 subeval1 subeval2 -> " " <> subrow1 <> (toInt $ op subeval1 subeval2) <> subrow2 <> " ") <$>
|
||||||
|
latexRow ass s1 <*> latexRow ass s2 <*>
|
||||||
|
eval ass s1 <*> eval ass s2
|
||||||
|
|
||||||
|
toInt :: Bool -> String
|
||||||
|
toInt False = "0"
|
||||||
|
toInt True = "1"
|
||||||
|
|
||||||
|
implies :: Bool -> Bool -> Bool
|
||||||
|
implies b1 b2 = not b1 || b2
|
||||||
|
|
||||||
truthtable :: Statement -> String
|
truthtable :: Statement -> String
|
||||||
truthtable s = open <> header <> "\\hline\n" <> body <> close
|
truthtable s = open <> header <> "\\hline\n" <> body <> close
|
||||||
|
@ -224,15 +249,26 @@ truthtable s = open <> header <> "\\hline\n" <> body <> close
|
||||||
atomsList = S.toAscList $ atoms s
|
atomsList = S.toAscList $ atoms s
|
||||||
|
|
||||||
header :: String
|
header :: String
|
||||||
header = intercalate "&" atomsList <> " \\\\\n"
|
header =
|
||||||
|
intercalate " & " (map dollars atomsList) <>
|
||||||
|
" & " <>
|
||||||
|
intercalate " & " (map dollars $ serializeParts Latex s) <>
|
||||||
|
" \\\\\n"
|
||||||
|
|
||||||
|
dollars :: String -> String
|
||||||
|
dollars string = "$" <> string <> "$"
|
||||||
|
|
||||||
|
body :: String
|
||||||
body = concat $ map line $ enumerate atomsList
|
body = concat $ map line $ enumerate atomsList
|
||||||
|
|
||||||
line assignments =
|
line assignments =
|
||||||
intercalate " & " (bools assignments) <>
|
intercalate " & " (bools assignments) <>
|
||||||
|
" & " <>
|
||||||
intercalate " & " (parts assignments) <>
|
intercalate " & " (parts assignments) <>
|
||||||
" \\\\\n"
|
" \\\\\n"
|
||||||
|
|
||||||
bools assignments = [if bool then "1" else "0" | (key, bool) <- assignments]
|
bools assignments = [if bool then "1" else "0" | (key, bool) <- assignments]
|
||||||
|
|
||||||
parts assignments = [""]
|
parts assignments =
|
||||||
|
(\xs -> [" " <> [x] <> " " | x <- xs]) $
|
||||||
|
fromJust $ serializeLatexTruthTableRow assignments s
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue