Wnioskowanie.hs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. module Wnioskowanie (wywnioskuj) where
  2. import Drzewo
  3. import qualified Zjednanie
  4. import Data.Char
  5. weźTyp :: OpisaneWyrażenie -> Typ
  6. weźTyp (OZmienna _ a) = a
  7. weźTyp (OFunkcja _ _ a) = a
  8. weźTyp (OWywołanie _ _ a) = a
  9. -- opisz/oznacz
  10. opisz :: Wyrażenie -> OpisaneWyrażenie
  11. opisz w = let (a,_,_) = (_opisz [] [] 'a' w) in a
  12. _opisz :: [(Nazwa, Typ)] -> [(Nazwa, Typ)] -> Char -> Wyrażenie -> (OpisaneWyrażenie, Char, [(Nazwa, Typ)])
  13. _opisz tabela związane c (Zmienna x) =
  14. case lookup x związane of
  15. Just a -> (OZmienna x a, c, tabela)
  16. Nothing -> case lookup x tabela of
  17. Just a -> (OZmienna x a, c, tabela)
  18. Nothing -> let n = następny c in (OZmienna x (TZmiennej [c]), n, (x, (TZmiennej [c])):tabela)
  19. _opisz tabela związane c (Funkcja x e) =
  20. let n = następny c -- nowy typ dla x
  21. (ow, nn, tt) = _opisz tabela ((x,(TZmiennej [c])):związane) n e in
  22. (OFunkcja x ow (Strzałka (TZmiennej [c]) (weźTyp ow)), nn, tt)
  23. _opisz tabela związane c (Wywołanie w1 w2) =
  24. let n = następny c
  25. (xd1, nn, tt) = _opisz tabela związane n w1
  26. (xd2, nnn, ttt) = _opisz tt związane nn w2
  27. in
  28. (OWywołanie xd1 xd2 (TZmiennej [c]), nnn, ttt)
  29. następny :: Char -> Char
  30. --następny 'z' = 'Q' -- :(
  31. następny x = chr (ord x + 1)
  32. -- zbiera ograniczenia dla zjednywania
  33. zbierz :: [OpisaneWyrażenie] -> [(Typ, Typ)] -> [(Typ, Typ)]
  34. zbierz [] u = u
  35. zbierz ((OZmienna _ _) : r) u = zbierz r u
  36. zbierz ((OFunkcja _ ow _) : r) u = zbierz (ow : r) u
  37. zbierz ((OWywołanie ow1 ow2 a) : r) u =
  38. let (f, b) = (weźTyp ow1, weźTyp ow2) in
  39. zbierz (ow1 : ow2 : r) ((f, Strzałka b a) : u)
  40. wywnioskuj :: Wyrażenie -> Maybe Typ
  41. wywnioskuj wyrażenie =
  42. let ow = opisz wyrażenie
  43. zb = zbierz [ow] [] in
  44. (\z -> Zjednanie.dawaj z (weźTyp ow)) <$> Zjednanie.zjednaj zb