Advertisement
JoaquinPaste

Untitled

Oct 22nd, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. module AlgoritmosDF (cierreDF,
  2. cierreAtrib,
  3. clavesCandidatas) where
  4.  
  5. import TiposDF
  6. import Data.Set
  7. import Utils
  8.  
  9.  
  10.  
  11. -- cierreDF r f calcula el cierre del conjunto f de dependencias funcionales bajo el esquema de relación r (f+)
  12. cierreDF :: Set Atrib -> Set DF -> Set DF
  13. cierreDF r f = recursivo r (Data.Set.foldr union f (Data.Set.map (\x -> reflexivo x) (powerSet' r)))
  14.  
  15. iter :: Set Atrib -> Set DF -> Set DF
  16. iter r f = transitividad $ aumentatividad r f
  17.  
  18. recursivo :: Set Atrib -> Set DF -> Set DF
  19. recursivo r f = let res = iter r f in
  20. if (Data.Set.size res /= (Data.Set.size f)) then recursivo r res
  21. else res
  22.  
  23. r = fromList ["a","b","c"]
  24. f = fromList[(fromList["a"],fromList["c"]),(fromList["c"],fromList["b"])]
  25.  
  26. reflexivo :: Set Atrib -> Set DF
  27. reflexivo r = Data.Set.foldr union empty (Data.Set.map (\x -> insert (r , x) empty) (powerSet' r))
  28.  
  29. aumentatividad :: Set Atrib -> Set DF -> Set DF
  30. aumentatividad r f = Data.Set.foldr union f (Data.Set.map (\f1 -> aum' r f1) f)
  31.  
  32. aum' :: Set Atrib -> DF -> Set DF
  33. aum' r (a,b) = Data.Set.map (\x -> ((insert x a),(insert x b))) r
  34.  
  35. transitividad :: Set DF -> Set DF
  36. transitividad f = Data.Set.foldr union f (Data.Set.map (\f1 -> trans' f1 f) f)
  37.  
  38.  
  39.  
  40. trans' :: DF -> Set DF -> Set DF
  41. trans' f1 f = Data.Set.map (\f2 -> trans'' f1 f2) f
  42.  
  43. trans'' :: DF -> DF -> DF
  44. trans'' (a,b) (c,d) = if (b==c) then (a,d) else if (a==d) then (c,b) else (a,b)
  45.  
  46. -- cierreAtrib a f calcula el cierre del conjunto de atributos a bajo el conjunto f de dependencias funcionales
  47. cierreAtrib :: Set Atrib -> Set DF -> Set Atrib
  48. cierreAtrib r f = recursivo' r f
  49.  
  50. recursivo' :: Set Atrib -> Set DF -> Set Atrib
  51. recursivo' r f = let res = iter' r f in
  52. if (Data.Set.size res /= (Data.Set.size r)) then recursivo' res f
  53. else res
  54.  
  55. iter' :: Set Atrib -> Set DF -> Set Atrib
  56. iter' r f = Data.Set.foldr union r (Data.Set.map (\(b,c) -> if (Data.Set.isSubsetOf b r) then c else empty) f)
  57.  
  58. -- clavesCandidatas r f calcula el conjunto de todas las claves candidatas para el esquema de relación r con dependencias funcionales f
  59. clavesCandidatas :: Set Atrib -> Set DF -> Set (Set Atrib)
  60. clavesCandidatas = undefined
  61.  
  62. result r f = let m = Data.Set.findMin (longs r f) in Data.Set.filter (\(s,x) -> if s==m then True else False) (longsx r f)
  63.  
  64. longsx r f = Data.Set.map (\x -> let cA = Data.Set.size (cierreAtrib x f) in if cA == Data.Set.size r then
  65. (Data.Set.size x, x) else (Data.Set.size r,r)) (powerSet' r)
  66.  
  67. longs r f = Data.Set.map (\x -> let cA = Data.Set.size (cierreAtrib x f) in if cA == Data.Set.size r then
  68. Data.Set.size x else Data.Set.size r) (powerSet' r)
  69. p a b = putStrLn $ showTreeWith True False $ cierreDF a b
  70.  
  71. a = fromList ["a", "b", "c", "d", "e","f","g","h","i","j"]
  72. b = fromList [(fromList["a","b"], fromList["c"]), (fromList["b","d"], fromList["e","f"]), (fromList["a","d"], fromList["g","h"]), (fromList["a"], fromList["i"]), (fromList["h"], fromList["j"])]
  73.  
  74.  
  75. --I ->
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement