Zjednanie.hs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. module Zjednanie (dawaj, zjednaj) where
  2. import Drzewo
  3. type Podstawienie = [(Nazwa, Typ)]
  4. występuje :: Nazwa -> Typ -> Bool
  5. występuje x (TZmiennej y) = x == y
  6. występuje x (Strzałka u v) = występuje x u || występuje x v
  7. -- (podmień s x t) => Podmień s za wszystkie wystąpienia zmiennej x w t
  8. podmień :: Typ -> Nazwa -> Typ -> Typ
  9. podmień s x t@(TZmiennej y) = if x == y then s else t
  10. podmień s x (Strzałka u v) = Strzałka (podmień s x u) (podmień s x v)
  11. -- podmienia
  12. dawaj :: Podstawienie -> Typ -> Typ
  13. dawaj s t = foldr (\ (x,e) -> podmień e x) t s
  14. -- DOZRO: jakiś ładniejszy typ niż `Może`
  15. zjednajJedno :: Typ -> Typ -> Maybe Podstawienie
  16. zjednajJedno (TZmiennej x) t@(TZmiennej y) = Just (if x == y then [] else [(x, t)])
  17. zjednajJedno (Strzałka x y) (Strzałka u v) = zjednaj [(x, u), (y, v)]
  18. zjednajJedno (TZmiennej x) z@(Strzałka _ _) = _zj x z
  19. zjednajJedno z@(Strzałka _ _) (TZmiennej x) = _zj x z
  20. _zj x z = if występuje x z then Nothing {-- not unifiable: circularity --} else Just [(x,z)]
  21. zjednaj :: [(Typ, Typ)] -> Maybe Podstawienie
  22. zjednaj [] = Just []
  23. zjednaj ((x, y) : t) = zjednaj t >>= (\ t2 -> (\t1 -> t1 ++ t2) <$> zjednajJedno (dawaj t2 x) (dawaj t2 y))
  24. {--
  25. λ> zjednaj [(Strzałka (TZmiennej "XD") (TZmiennej "ELO"), Strzałka (TZmiennej "DD") (TZmiennej "QQ"))]
  26. Just [("XD",TZmiennej "DD"),("ELO",TZmiennej "QQ")]
  27. --}