Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.94 KB | None | 0 0
  1. import Data.List hiding (find)
  2.  
  3. data Prop =
  4. Const Bool -- 恒真命題(T),恒偽命題(⊥)
  5. | Var Char -- 論理変数( p, q, r, ...)
  6. | Not Prop -- ¬ x
  7. | And Prop Prop -- x ∧ y
  8. | Or Prop Prop -- x ∨ y
  9. | Xor Prop Prop -- x ⊕ y
  10. | NotBut Prop Prop -- x < y
  11. | ButNot Prop Prop -- x > y
  12. | Imply Prop Prop -- x ⇒ y
  13. | Equiv Prop Prop -- x ⇔ y
  14. deriving (Show)
  15.  
  16. xor :: Bool -> Bool -> Bool
  17. True `xor` True = False
  18. False `xor` False = False
  19. _ `xor` _ = True
  20.  
  21. notbut :: Bool -> Bool -> Bool
  22. x `notbut` y = not x && y
  23.  
  24. butnot :: Bool -> Bool -> Bool
  25. x `butnot` y = x && not y
  26.  
  27. type Assoc k v = [(k,v)]
  28. find :: Eq k => k -> Assoc k v -> v
  29. find k t = head [ v | (k', v) <- t, k == k' ]
  30.  
  31. type Subst = Assoc Char Bool -- Assign(付値)
  32.  
  33. eval :: Subst -> Prop -> Bool
  34. eval _ (Const b) = b
  35. eval s (Var x) = find x s
  36. eval s (Not p) = not (eval s p)
  37. eval s (And p q) = eval s p && eval s q
  38. eval s (Or p q) = eval s p || eval s q
  39. eval s (Xor p q) = (eval s p) `xor` (eval s q)
  40. eval s (NotBut p q) = (eval s p) `notbut` (eval s q)
  41. eval s (ButNot p q) = (eval s p) `butnot` (eval s q)
  42. eval s (Imply p q) = not (eval s p) || (eval s p)
  43. eval s (Equiv p q) = (eval s p <= eval s q) && (eval s q <= eval s p)
  44.  
  45. vars :: Prop -> [Char]
  46. vars (Const _) = []
  47. vars (Var x) = [x]
  48. vars (Not p) = vars p
  49. vars (And p q) = vars p ++ vars q
  50. vars (Or p q) = vars p ++ vars q
  51. vars (Xor p q) = vars p ++ vars q
  52. vars (NotBut p q) = vars p ++ vars q
  53. vars (ButNot p q) = vars p ++ vars q
  54. vars (Imply p q) = vars p ++ vars q
  55. vars (Equiv p q) = vars p ++ vars q
  56.  
  57. bools :: Int -> [[Bool]]
  58. bools 0 = [[]]
  59. bools n = map (False:) bss ++ map (True:) bss
  60. where bss = bools (n-1)
  61.  
  62. rmdups :: Eq a => [a] -> [a]
  63. rmdups [] = []
  64. rmdups (x:xs) = x : rmdups (filter (/= x) xs)
  65.  
  66. substs :: Prop -> [Subst]
  67. substs p = map (zip vs) (bools (length vs))
  68. where vs = rmdups (vars p)
  69.  
  70. -- isTautology :: Prop -> Bool
  71. -- isTautology p = and [eval s p | s <- substs p]
  72.  
  73. -- isSatisfiable :: Prop -> Bool
  74. -- isSatisfiable p = or [eval s p | s <- substs p]
  75.  
  76. mkTruethTable :: Prop -> String
  77. mkTruethTable p = group4 $ map (\x -> if x then '1' else '0') [eval s p | s <- substs p]
  78.  
  79. group4 :: String -> String
  80. group4 s
  81. | length s <= 4 = s
  82. | otherwise = take 4 s ++ " " ++ group4 (drop 4 s)
  83.  
  84. s4 = And
  85. (And (Var '1') (Var '2'))
  86. (And (Var '3') (Var '4'))
  87.  
  88. s3 = Xor
  89. (And
  90. (And (Var '1') (Var '2'))
  91. (Or (Var '3') (Var '4')))
  92. (And
  93. (Or (Var '1') (Var '2'))
  94. (And (Var '3') (Var '4')))
  95.  
  96. s34 = And
  97. (Or
  98. (And (Var '1') (Var '2'))
  99. (And (Var '3') (Var '4')))
  100. (And
  101. (Or (Var '1') (Var '2'))
  102. (Or (Var '3') (Var '4')))
  103.  
  104. s2 = ButNot
  105. (Or
  106. (Xor (Var '1') (Var '3'))
  107. (Xor (Var '1') (Var '2')))
  108. (Xor
  109. (Xor (Var '1') (Var '2'))
  110. (Xor (Var '3') (Var '4')))
  111.  
  112. s24 = ButNot
  113. (Or
  114. (Or (Var '1') (Var '2'))
  115. (Var '3'))
  116. (Xor
  117. (Xor (Var '1') (Var '2'))
  118. (Xor (Var '3') (Var '4')))
  119.  
  120. s23 = Xor
  121. (ButNot
  122. (Xor
  123. (Xor (Var '1') (Var '2'))
  124. (Var '3'))
  125. (Xor (Var '3') (Var '4')))
  126. (Or (Var '1') (Var '2'))
  127.  
  128. s14 = Xor
  129. (And
  130. (Or (Var '1') (Var '2'))
  131. (Or (Var '3') (Var '4')))
  132. (Or
  133. (Xor (Var '1') (Var '2'))
  134. (Xor (Var '3') (Var '4')))
  135.  
  136. -- "0001011001101000" is the truth table for S2
  137. printTables p = mapM_ print $ map mkTruethTable (props p)
  138.  
  139. data State' = N | Y deriving (Eq, Show)
  140.  
  141. data Prop' =
  142. Const' Bool State'
  143. | Var' Char State'
  144. | Not' Prop'
  145. | And' Prop' Prop'
  146. | Or' Prop' Prop'
  147. | Xor' Prop' Prop'
  148. | NotBut' Prop' Prop'
  149. | ButNot' Prop' Prop'
  150. | Imply' Prop' Prop'
  151. | Equiv' Prop' Prop'
  152. deriving (Show)
  153.  
  154. addState :: Prop -> Prop'
  155. addState (Const b) = Const' b N
  156. addState (Var x) = Var' x N
  157. addState (Not p) = Not' (addState p)
  158. addState (And p q) = And' (addState p) (addState q)
  159. addState (Or p q) = Or' (addState p) (addState q)
  160. addState (Xor p q) = Xor' (addState p) (addState q)
  161. addState (NotBut p q) = NotBut' (addState p) (addState q)
  162. addState (ButNot p q) = ButNot' (addState p) (addState q)
  163. addState (Imply p q) = Imply' (addState p) (addState q)
  164. addState (Equiv p q) = Equiv' (addState p) (addState q)
  165.  
  166. eraseState :: Prop' -> Prop
  167. eraseState (Const' b s) = Const b
  168. eraseState (Var' x s) = Var x
  169. eraseState (Not' p) = Not (eraseState p)
  170. eraseState (And' p q) = And (eraseState p) (eraseState q)
  171. eraseState (Or' p q) = Or (eraseState p) (eraseState q)
  172. eraseState (Xor' p q) = Xor (eraseState p) (eraseState q)
  173. eraseState (NotBut' p q) = NotBut (eraseState p) (eraseState q)
  174. eraseState (ButNot' p q) = ButNot (eraseState p) (eraseState q)
  175. eraseState (Imply' p q) = Imply (eraseState p) (eraseState q)
  176. eraseState (Equiv' p q) = Equiv (eraseState p) (eraseState q)
  177.  
  178. change :: Prop' -> Char -> Char -> Prop'
  179. change (Const' b s) _ _ = Const' b s
  180. change (Var' x s) y z
  181. | s == N = if y == x then Var' z Y else Var' x s
  182. | otherwise = (Var' x s)
  183. change (Not' p) y z = Not' (change p y z)
  184. change (And' p q) y z = And' (change p y z) (change q y z)
  185. change (Or' p q) y z = Or' (change p y z) (change q y z)
  186. change (Xor' p q) y z = Xor' (change p y z) (change q y z)
  187. change (NotBut' p q) y z = NotBut' (change p y z) (change q y z)
  188. change (ButNot' p q) y z = ButNot' (change p y z) (change q y z)
  189. change (Imply' p q) y z = Imply' (change p y z) (change q y z)
  190. change (Equiv' p q) y z = Equiv' (change p y z) (change q y z)
  191.  
  192. changes :: Prop' -> String -> Prop'
  193. changes x qs = changes' x ps qs
  194. where ps = take (length qs) ['1'..'9']
  195.  
  196. changes' :: Prop' -> String -> String -> Prop'
  197. changes' x [] _ = x
  198. changes' x (p:ps) (q:qs) = changes' (change x p q) ps qs
  199.  
  200. perm :: Prop -> String -> Prop
  201. perm x ps = eraseState x''
  202. where x' = addState x
  203. x'' = changes x' ps
  204.  
  205. props :: Prop -> [Prop]
  206. props p = [perm p s | s <- ps]
  207. where vs = (rmdups . vars) p
  208. ps = permutations vs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement