Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1.  
  2. -- cartesian product of lists
  3. cartprod :: [[a]] -> [[a]]
  4. cartprod [] = [[]]
  5. cartprod (xs : xss) = [ x : ys | x <- xs, ys <- yss]
  6. where yss = cartprod xss
  7.  
  8. -- all possible truth values on n vars
  9. build n = cartprod xs
  10. where xs = take n $ repeat [0,1]
  11.  
  12. -- datatype for boolean logic
  13. data Expr =
  14. Var String
  15. | And Expr Expr
  16. | Or Expr Expr
  17. | Imp Expr Expr
  18. | Not Expr
  19. | Equiv Expr Expr
  20. | T | F
  21.  
  22. -- state of variable named String
  23. type State = [(String, Bool)]
  24.  
  25. -- evaluate a boolean expression
  26. eval :: Expr -> State -> Bool
  27. eval exp state = case exp of
  28. Var str -> case lookup str state of
  29. Nothing -> error "variable not found"
  30. Just b -> b
  31. And a b ->eval a state && eval b state
  32. Or a b -> eval a state || eval b state
  33. Imp a b -> not (eval a state && (not $ eval b state))
  34. Not a -> not $ eval a state
  35. Equiv a b -> eval a state== eval b state
  36. T -> True
  37. F -> False
  38.  
  39. -- possible names
  40. alph = ['a' .. 'z'] ++ ['A' .. 'Z']
  41.  
  42. -- make state from a list of ints (uses as default left to right entries in alph)
  43. makestate :: [Int] -> State
  44. makestate = zipWith (\x y -> ([x], not $ y == 0)) alph
  45.  
  46. -- remove duplicate strings from a list (used in getvars)
  47. rmdup :: [String] -> [String]
  48. rmdup [] = []
  49. rmdup (x:xs) | elem x xs = rmdup xs
  50. | otherwise = x : rmdup xs
  51.  
  52. -- return the Strings held by variables in an expression
  53. getvars :: Expr -> [String]
  54. getvars exp = case exp of
  55. Var str -> [str]
  56. And a b -> getvars a ++ getvars b
  57. Or a b -> getvars a ++ getvars b
  58. Imp a b -> getvars a ++ getvars b
  59. Equiv a b -> getvars a ++ getvars b
  60. Not a -> getvars a
  61. T -> []
  62. F -> []
  63.  
  64. -- count the number of distinct vars in an expression
  65. countvar :: Expr -> Int
  66. countvar = length . rmdup . getvars
  67.  
  68. -- create state of all possible vars in an expression
  69. totalstate :: Expr -> [State]
  70. totalstate exp = map makestate (build $ countvar exp)
  71.  
  72. -- eval expression under all possible states
  73. totaleval :: Expr -> [Bool]
  74. totaleval exp = map (eval exp) (totalstate exp)
  75.  
  76. a = Var "a"
  77. b = Var "b"
  78. c = Var "c"
  79.  
  80. ex_a = (Imp (Imp (Imp a b) b) b)
  81. ex_b = (Imp (Imp (Imp a b) b) a)
  82. ex_c = (Imp (Imp (Imp a b) a) a)
  83. ex_d = (Imp (Imp (Imp b c) (Imp a b)) (Imp a b))
  84. ex_e = (Imp (Or a (Not (And b c))) (Or (Equiv a c) b))
  85. ex_f = (Imp a (Imp b (Imp b a)))
  86. ex_g = (Imp (And a b) (Or a c))
  87.  
  88. -- example : totaleval ex_a = [True, True, True, True]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement