<div dir="ltr"><div dir="ltr"><div><font face="monospace, monospace">data Prop = Const Bool</font></div><div><font face="monospace, monospace">          | Var Char</font></div><div><font face="monospace, monospace">          | Not Prop</font></div><div><font face="monospace, monospace">          | And Prop Prop</font></div><div><font face="monospace, monospace">          | If Prop Prop</font></div><div><font face="monospace, monospace">          | Or Prop Prop</font></div><div><font face="monospace, monospace">          | Yff Prop Prop -- Why do I get errors if "Yff" is replaced with "Iff"?</font></div><div><font face="monospace, monospace">          | Xor Prop Prop</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">type Assoc k v = [(k, v)]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- Hutton, Graham. Programming in Haskell (p. 93). Cambridge University Press. Kindle Edition.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">find :: Eq k => k -> Assoc k v -> v</font></div><div><font face="monospace, monospace">find k t = head [v | (k', v) <- t, k == k']</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- Hutton, Graham. Programming in Haskell (p. 93). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">type Subst = Assoc Char Bool</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- Hutton, 2016, Ch 8.6</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">eval :: Subst -> Prop -> Bool</font></div><div><font face="monospace, monospace">eval _ (Const b) = b</font></div><div><font face="monospace, monospace">eval s (Var x)   = find x s</font></div><div><font face="monospace, monospace">eval s (Not p)   = not (eval s p)</font></div><div><font face="monospace, monospace">eval s (And p q) = eval s p && eval s q</font></div><div><font face="monospace, monospace">eval s (If p q)  = eval s p <= eval s q</font></div><div><font face="monospace, monospace">eval s (Or p q)  = eval s p || eval s q</font></div><div><font face="monospace, monospace">eval s (Yff p q) = eval s p == eval s q  -- Iff produces error here</font></div><div><font face="monospace, monospace">eval s (Xor p q) = eval s p /= eval s q</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- Hutton 2016 Ch 8.6</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">vars :: Prop -> [Char]</font></div><div><font face="monospace, monospace">vars (Const _)  = []</font></div><div><font face="monospace, monospace">vars (Var x)    = [x]</font></div><div><font face="monospace, monospace">vars (Not p)    = vars p</font></div><div><font face="monospace, monospace">vars (And p q)  = vars p ++ vars q</font></div><div><font face="monospace, monospace">vars (If p q)   = vars p ++ vars q</font></div><div><font face="monospace, monospace">vars (Or p q)   = vars p ++ vars q</font></div><div><font face="monospace, monospace">vars (Yff p q)  = vars p ++ vars q -- Iff produces error here</font></div><div><font face="monospace, monospace">vars (Xor p q)  = vars p ++ vars q</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- Hutton 2016 Ch 8.6</font></div><div><br></div></div></div>