Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. data Prop = Const Bool | Var Char | Not Prop | And Prop Prop | Or Prop Prop | Imp Prop Prop
  2.  
  3. type Assoc k v = [(k, v)]
  4.  
  5. find :: (Eq k) => Assoc k v -> k -> v
  6. find a k = head [v | (k',v) <- a, k == k']
  7.  
  8. type Subst = Assoc Char Bool
  9.  
  10. vars :: Prop -> [Char]
  11. vars (Const b) = []
  12. vars (Var x) = [x]
  13. vars (Not p) = vars p
  14. vars (And p q) = vars p ++ vars q
  15. vars (Or p q) = vars p ++ vars q
  16. vars (Imp p q) = vars p ++ vars q
  17.  
  18. uniq :: (Eq a) => [a] -> [a]
  19. uniq [] = []
  20. uniq (x:xs) = [x] ++ uniq (filter ( /= x) xs) -- (filter (\e -> e /= x) xs)
  21.  
  22. table :: Int -> [[Bool]]
  23. table 0 = [[]]
  24. table n = map (False:) t ++ map (True:) t -- map (0:) t ++ map (1:) t
  25. where t = table (n - 1)
  26.  
  27. subst :: Prop -> [Subst]
  28. subst p =map (zip vs) (table (length vs))
  29. where vs = uniq $ vars p
  30.  
  31. eval :: Subst -> Prop -> Bool
  32. eval _ (Const b) = b
  33. eval s (Var x) = find s x
  34. eval s (Not p) = not (eval s p)
  35. eval s (And p q) = eval s p && eval s q
  36. eval s (Or p q) = eval s p || eval s q
  37. eval s (Imp p q) = eval s p <= eval s q
  38.  
  39. isTaut :: Prop -> Bool
  40. isTaut p = and [eval s p | s <- substs p] -- foldr (&&) True []
  41.  
  42. isAntiTaut :: Prop -> Bool
  43. isAntiTaut p = isTaut (not p)
  44.  
  45.  
  46. isAntiTaut' :: Prop -> Bool
  47. isAntiTaut' p = and [not eval s p | s <- substs p]
  48.  
  49. p1 :: Prop
  50. p1 = Imp (And (Var 'A') (Var 'B')) (Var 'A')
  51.  
  52. p2 :: Prop
  53. p2 = Imp (Var 'A') (Var 'B')
  54.  
  55. main :: IO()
  56. main = do print $ isTaut p2
  57. print $ isTaut p1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement