Guest User

Tautology prover.

a guest
Jul 6th, 2013
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2.  
  3. type ID = String
  4. type Env = [(ID,Bool)]
  5. data Exp = T | F | Var ID | Not Exp | Exp :+: Exp | Exp :*: Exp
  6.     deriving (Eq)
  7.  
  8.  
  9. eval :: Env -> Exp -> Bool
  10. eval env T = True
  11. eval env F = False
  12. eval env (Var x) | Just b <- lookup x env = b
  13. eval env (Not e) = not (eval env e)
  14. eval env (e1 :+: e2) = (eval env e1) || (eval env e2)
  15. eval env (e1 :*: e2) = (eval env e1) && (eval env e2)
  16.  
  17.  
  18. vars :: Exp -> [ID]
  19. vars e = nub (go e [])
  20.   where
  21.     go (Var x) acc = x : acc
  22.     go (Not e) acc = go e acc
  23.     go (e1 :+: e2) acc = go e2 (go e1 acc)
  24.     go (e1 :*: e2) acc = go e2 (go e1 acc)
  25.     go _ acc = acc
  26.  
  27.  
  28. envs :: [ID] -> [Env]
  29. envs []  = []
  30. envs [x] = [ [(x,False)], [(x,True)] ]
  31. envs (x:xs) = [ (x,False) : env | env <- es ] ++ [ (x,True) : env | env <- es ]
  32.   where es = envs xs
  33.  
  34.  
  35. exhaust :: Exp -> [(Bool,Env)]
  36. exhaust e = [ (eval env e, env) | env <- envs . vars $ e ]
  37.  
  38. showEnvs :: [Env] -> String
  39. showEnvs = glue "\n" . map (glue ", " . map showVar)
  40.   where showVar (x,b) = x ++ "=" ++ show (fromEnum b)
  41.         glue s = concat . intersperse s
  42.  
  43. isTautology :: Exp -> String
  44. isTautology e =
  45.   case exhaust e of
  46.     [] -> if eval [] e then "OK" else "FAIL"
  47.     xs -> case filter (not . fst) xs of
  48.             [] -> "OK"
  49.             xs -> "FAIL for these environments:\n" ++ showEnvs (map snd xs)
  50.  
  51.  
  52. (==>) :: Exp -> Exp -> Exp
  53. e1 ==> e2 = Not (e1 :*: (Not e2))
  54.  
  55. (<=>) :: Exp -> Exp -> Exp
  56. e1 <=> e2 = (e1 :*: e2) :+: (Not e1 :*: Not e2)
  57.  
  58. test = ((Var "p" :*: Var "r") :+: (Var "q" :*: Var "s"))
  59.    ==> ((Var "p" :+: Var "q") :*: (Var "r" :+: Var "s"))
  60.  
  61. main = putStrLn $ isTautology test
Advertisement
Add Comment
Please, Sign In to add comment