Advertisement
Guest User

3zadanka

a guest
Dec 9th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import qualified Data.Map as Map
  2.  
  3. put "" str = ""
  4. put [s] str = [s]
  5. put (p:r) str = [p] ++ str ++ put r str
  6.  
  7. data Expression = Z Char | N Expression | K Expression Expression | A Expression Expression | C Expression Expression
  8.  
  9. find _ [] = False
  10. find z (p:r) = if p == z then True else find z r
  11.  
  12. deleteIfRepeat [] = []
  13. deleteIfRepeat (p:r) = if find p r then deleteIfRepeat r else  p : deleteIfRepeat r
  14.  
  15. instance Show Expression where
  16.   show (Z a) = [a]
  17.   show (N a) = show a
  18.   show (K a b) = deleteIfRepeat (show a ++ show b)
  19.   show (A a b) = deleteIfRepeat (show a ++ show b)
  20.   show (C a b) = deleteIfRepeat (show a ++ show b)
  21.  
  22. -- zależnie od typu wyrażenia jakie podamy jako input zwracany jest inny string wyjściowy
  23. drukuj (Z a) = [a]  -- zwracane jest to samo co zostało podane na wejście pod postacią Chara
  24. drukuj (N a) = "~" ++ drukuj a  -- zwracana jest wratość podana na wejście poprzedzona znakiem tylda "~"
  25. drukuj (K a b) = "(" ++ drukuj a ++ " & " ++ drukuj b ++ ")"  -- jako input podawane są dwie wartości i są one zamykane w nawias i rozdzielone znakiem "&"
  26. drukuj (A a b) = "(" ++ drukuj a ++ " | " ++ drukuj b ++ ")"  -- tak samo jak powyżej tylko, że są rozdzielane znakiem "|"
  27. drukuj (C a b) = "(" ++ drukuj a ++ " => " ++ drukuj a ++ ")" -- tak samo jak powyżej tylko są rozdzielane znakiem "=>"
  28.  
  29.  
  30. wypisz_zmienne a = putStrLn ("[" ++ (put (show a) ", " ) ++ "]") --miedzy znaki wstawia ", "
  31.  
  32. -- map sprawdza w 'mapie' wartosc logiczna danej zmiennej i ja zwraca
  33. sprawdz :: Expression -> Map.Map Char Bool -> Bool -- sprawdza wartosc logiczna zdania
  34. sprawdz (Z x) map = Map.findWithDefault False x map
  35. sprawdz (N x) map = not(sprawdz x map)
  36. sprawdz (K x y) map = (sprawdz x map) && (sprawdz y map)
  37. sprawdz (A x y) map = (sprawdz x map) || (sprawdz y map)
  38. sprawdz (C x y) map = not(sprawdz x map) || (sprawdz y map)
  39.  
  40. -- przykładowe zapytania
  41. przyklad1 = (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r')))
  42. mapawartosci = Map.fromList [('p', False), ('q', True), ('r', False)]
  43. main = do
  44.   print(drukuj przyklad1)
  45.   wypisz_zmienne przyklad1
  46.   print(sprawdz przyklad1 mapawartosci )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement