fork(1) download
  1. data Prop = Var String
  2. | Not Prop
  3. | And [Prop]
  4. | Or [Prop]
  5. | Nil
  6. deriving (Show, Eq)
  7.  
  8. cutAnd :: Prop -> [Prop]
  9. cutAnd (And ps) = ps
  10. cutAnd p = [p]
  11.  
  12. cutOr :: Prop -> [Prop]
  13. cutOr (Or ps) = ps
  14. cutOr p = [p]
  15.  
  16. smartOne :: (Prop -> Prop) -> Prop -> Prop
  17. smartOne cons Nil = Nil
  18. smartOne cons p = cons p
  19.  
  20. smartMany :: ([Prop] -> Prop) -> [Prop] -> Prop
  21. smartMany cons xs = case filter (/= Nil) xs of
  22. [] -> Nil
  23. [x] -> x
  24. xs' -> cons xs'
  25.  
  26. flatten :: Prop -> Prop
  27. flatten (Not p) = smartOne Not $ flatten p
  28. flatten (And ps) = smartMany And $ ps >>= cutAnd . flatten
  29. flatten (Or ps) = smartMany Or $ ps >>= cutOr . flatten
  30. flatten p = p
  31.  
  32. vx = Var "x"; vy = Var "y"; vz = Var "z"
  33.  
  34. main = mapM_ (print . flatten)
  35. [ And [Or [Nil], Nil, And [Nil]]
  36. -- Nil
  37.  
  38. , And [Or [vx, vy], Or [vx, Or [vz, Nil]]]
  39. -- And [Or [Var "x",Var "y"],Or [Var "x",Var "z"]]
  40.  
  41. , Or [Or [vx, vy], Or [vx, Or [vz, Nil]]]
  42. -- Or [Var "x",Var "y",Var "x",Var "z"]
  43.  
  44. , Not (And [And [Or [Or [Nil], Or [Not vx]], Nil, And [vy]]])
  45. -- Not (And [Not (Var "x"),Var "y"])
  46.  
  47. , And []
  48. -- Nil
  49.  
  50. , Or [And [vx]]
  51. -- Var "x"
  52.  
  53. , And [vx, Or []]
  54. -- Var "x'
  55.  
  56. , And [Or [And [vx, Or [], vy, Nil]], And [vz, Or [vx]]]
  57. -- And [Var "x",Var "y",Var "z",Var "x"]
  58. ]
Success #stdin #stdout 0s 6232KB
stdin
Standard input is empty
stdout
Nil
And [Or [Var "x",Var "y"],Or [Var "x",Var "z"]]
Or [Var "x",Var "y",Var "x",Var "z"]
Not (And [Not (Var "x"),Var "y"])
Nil
Var "x"
Var "x"
And [Var "x",Var "y",Var "z",Var "x"]