Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Monad
  2. import qualified Data.Map as Map
  3.  
  4. -- funkcja umozliwajaca wpisanie znaku pomiedzy dwa inne
  5. wpiszPomiedzy :: String -> String -> String
  6. wpiszPomiedzy "" str = ""
  7. wpiszPomiedzy [s] str = [s]
  8. wpiszPomiedzy (p:r) str = [p] ++ str ++ wpiszPomiedzy r str
  9.  
  10.  
  11. -- definicje uzywanych symboli logicznych
  12. data Zdanie = Z Char
  13.                 | N Zdanie
  14.                 | K Zdanie Zdanie
  15.                 | A Zdanie Zdanie
  16.                 | C Zdanie Zdanie
  17.    
  18.  
  19. znajdz :: (Eq z) => z -> [z] -> Bool
  20. znajdz _ [] = False
  21. znajdz z (p:r) = if p == z then True else znajdz z r  
  22.    
  23. -- funkcja usuwajaca duplikaty danych
  24. usun_duplikat :: (Eq z) => [z] -> [z]
  25. usun_duplikat [] = []
  26. usun_duplikat (p:r) = if znajdz p r then usun_duplikat r else  p : usun_duplikat r
  27.        
  28. -- przeladowanie show dla wypisania
  29. instance Show Zdanie where
  30.     show (Z c) = [c]
  31.     show (N x) = show x
  32.     show (K x y) = usun_duplikat (show x ++ show y)
  33.     show (A x y) = usun_duplikat (show x ++ show y)
  34.     show (C x y) = usun_duplikat (show x ++ show y)
  35.  
  36. -- Zadanie 1
  37. -- funkcja pobiera zdanie i tworzy ciag znakow gotowy do wyswietlenia w postaci cztelnej dla uzytkownika
  38. -- Z oznacza zmienna/znak N negacje K koniunkcja A alternatywa C implikacja
  39. drukuj :: Zdanie -> String
  40. drukuj (Z x) = [x]
  41. drukuj (N x) = "~" ++ drukuj x
  42. drukuj (K x y) = "(" ++ drukuj x ++ " & " ++ drukuj y ++ ")"
  43. drukuj (A x y) = "(" ++ drukuj x ++ " | " ++ drukuj y ++ ")"
  44. drukuj (C x y) = "(" ++ drukuj x ++ " => " ++ drukuj y ++ ")"
  45.  
  46. -- Zadanie 2
  47. -- funkcja wypisuje zmienne
  48. wypisz_zmienne :: Zdanie -> IO ()
  49. wypisz_zmienne a = putStrLn ("[" ++ (wpiszPomiedzy (show a) ", " ) ++ "]")
  50.  
  51. -- Zadanie 3
  52. -- funkcja podstawia zadane wartosci parametrow i sprawdza zgodnosc zdania
  53. sprawdz :: Zdanie -> Map.Map Char Bool -> Bool
  54. sprawdz (Z x) map = Map.findWithDefault False x map
  55. sprawdz (N x) map = not(sprawdz x map)
  56. sprawdz (K x y) map = (sprawdz x map) && (sprawdz y map)
  57. sprawdz (A x y) map = (sprawdz x map) || (sprawdz y map)
  58. sprawdz (C x y) map = not(sprawdz x map) || (sprawdz y map)
  59.  
  60. -- Zadanie 4.b
  61. -- funkcja sprawdza czy zdanie jest tautologia poprzez
  62. -- wygenerowanie kazdej mozliwej mapy z parametrami
  63. -- a nastepnie podstawienie tej mapy i sprawdzenie czy zdanie zachodzi
  64. jest_tautologia :: Zdanie -> Bool
  65. jest_tautologia z = usun_duplikat (map (sprawdz z) (wygeneruj_kombinacje z)) == [True]
  66.  
  67. -- generowanie mozliwych przypadkow parametrow dla zdania
  68. wygeneruj_kombinacje :: Zdanie -> [Map.Map Char Bool]
  69. wygeneruj_kombinacje z = map (polacz_w_mape (show z)) (replicateM (length (show z)) [True, False]);
  70.  
  71. -- laczenie wartosci w mape wartosci bool
  72. polacz_w_mape :: [Char] -> [Bool]  -> Map.Map Char Bool
  73. polacz_w_mape chars bools = Map.fromList (zip chars bools)
  74.  
  75. -- Przykładowe dane
  76. taut = A (Z 'p') (N (Z 'p'))
  77. predykat = (C (N (Z 'p')) (A (K (Z 'p') (Z 'q')) (Z 'r')))
  78. testMap = Map.fromList [('p', True), ('q', True), ('r', True)]
  79. testMap2 = Map.fromList [('p', False), ('q', True), ('r', False)]
  80. testMap3 = Map.fromList [('p', True), ('q', False), ('r', False)]
  81.  
  82. main = do
  83.   print $ drukuj predykat
  84.   wypisz_zmienne predykat
  85.   print $ sprawdz predykat testMap
  86.   print $ sprawdz predykat testMap2
  87.   print $ sprawdz predykat testMap3
  88.   print $ jest_tautologia taut
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement