Advertisement
tomasfdel

Estructuras II Práctica 4

May 8th, 2018
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Consultas:
  2. Ej 5 :  (PREGUNTAR SI HACE FALTA HACER LAS CLAUSULAS CONDICIONALES DE TODO EL ARMADO DEL ARBOL)
  3. Ej 9:   (DEBERÍAMOS PROBAR DE ANTEMANO QUE alturaAGT DEVUELVE LA ALTURA)
  4.         (PROBAR QUE map (f (map g xs)) = map (f o g) xs)
  5. Ej 10:  PROBAR QUE map f (x ++ y) = map f x ++ map f y
  6. Ej 11:  DEMOSTRAR QUE (x:xs) ++ join xss = x:(xs ++ join xss)
  7.         DEMOSTRAR TODOS LOS PASOS TURBIOS QUE USAMOS
  8. Ej 12:  Segùn Rabasedas y las autoridades de la cátedra, el 12 y 13 no son ejercicios para demostrar formalmente. Demostrar "con palabras".
  9. Ej 13:  Ìdem anterior.
  10.  
  11.  
  12. -- Ejercicio 1
  13.  
  14. tad lista (A:Set) where
  15.     import Bool
  16.     nil : lista A
  17.     cons : A -> lista A -> lista A
  18.     null : lista A -> Bool
  19.     head : lista A -> A
  20.     tail : lista A -> lista A
  21.    
  22. Especificación algebraica:
  23. null nil = True
  24. null (cons x xs) = False
  25. head (cons x xs) = x
  26. tail (cons x xs) = xs
  27.  
  28. Especificación con modelo de secuencias:
  29. nil = <>
  30. cons x <x1, ..., xn> = <x, x1, ..., xn>
  31. null <x1, ..., xn> = True si n = 0
  32. null <x1, ..., xn> = False en otro caso
  33. head <x1, ..., xn> = x1
  34. tail <x1, x2, ..., xn> = <x2, ..., xn>
  35.  
  36. inL : lista A -> A -> Bool
  37. inL nil x = False
  38. inL (cons y ys) x = or (y == x) (inL ys x)
  39.  
  40. del : lista A -> A -> lista A
  41. del nil x = nil
  42. del (cons y ys) x = if (y == x) then (del ys x) else (cons y (del ys x))
  43.  
  44.  
  45.  
  46.  
  47. -- Ejercicio 2
  48.  
  49. tad Pila (A:Set) where
  50.     import Bool
  51.     empty : Pila A
  52.     push : A -> Pila A -> Pila A
  53.     isEmpty : Pila A -> Bool
  54.     top : Pila A -> A
  55.     pop : Pila A -> Pila A
  56.    
  57. Especificación algebraica:
  58. isEmpty empty = True
  59. isEmpty (push x xs) = False
  60. top (push x xs) = x
  61. pop (push x xs) = xs
  62.  
  63. Especificación con modelo de secuencias:
  64. empty = <>
  65. push x <x1, ..., xn> = <x, x1, ..., xn>
  66. isEmpty <x1, ..., xn> = True si x = 0
  67. isEmpty <x1, ..., xn> = False en otro caso
  68. top <x1, ..., xn> = x1
  69. pop <x1, x2, ..., xn> = <x2, ..., xn>
  70.  
  71.  
  72.  
  73.  
  74. -- Ejercicio 3
  75.  
  76. tad Conjunto (A:Set) where
  77.     import Bool
  78.     vacio : Conjunto A
  79.     insertar : A -> Conjunto A -> Conjunto A
  80.     borrar : A -> Conjunto A -> Conjunto A
  81.     esVacio : Conjunto A -> Bool
  82.     union : Conjunto A -> Conjunto A -> Conjunto A
  83.     interseccion : Conjunto A -> Conjunto A -> Conjunto A
  84.     resta : Conjunto A -> Conjunto A -> Conjunto A
  85.    
  86. Especificación algebraica:
  87. insertar x (insertar y c) = insertar y (insertar x c)
  88. insertar x (insertar x' c) = insertar x c si x = x'
  89. borrar x vacio = vacio
  90. borrar x (insertar x' c) = c si x = x'
  91. borrar x (insertar y c) = (insertar y (borrar x c))
  92. esVacio vacio = True
  93. esVacio (insertar x c) = False
  94. union vacio y = y
  95. union (insertar x c) y = insertar x (union c y)
  96. inC vacio x = False
  97. inC (insertar y c) x = if y == x then True else inC c x
  98. interseccion vacio y = vacio
  99. interseccion (insertar x c) y = if (inC y x) then insertar x (interseccion c y) else interseccion c y
  100. resta y vacio = y
  101. resta y (insertar x c) = borrar x (resta y c)
  102.  
  103. Si agregáramos la función choose mencionada, habría una inconsistencia que haría que no se supiera qué tendría que devolver.
  104.  
  105.  
  106.  
  107.  
  108. -- Ejercicio 4
  109. Especificación algebraica:
  110. tad PQ (A: Set, B: Ordered Set) where
  111.     import Bool
  112. poner (e, p) (poner (e', p') q) = poner (e', max (p, p')) si e = e'
  113. poner (e, p) (poner (e', p') q) = poner (e', p') (poner (e, p) q) si e != e'
  114. poner (e, p) (poner (e', p') q) = (poner (e', p') q) si p = p'
  115.  
  116. maxPQ (e, p) vacia = (e, p)
  117. maxPQ (e, p) (poner (e', p') q) = if p > p' then (maxPQ (e, p) q) else (maxPQ (e', p') q)
  118.  
  119. primero (poner (e, p) q) = maxPQ (e, p) q
  120.  
  121. eliminar (e, p) (poner (e', p') q) = if e == e' then q else (poner (e', p') (eliminar (e, p) q))
  122.  
  123. sacar (poner (e, p) q) = eliminar primero(poner (e, p) q) (poner (e, p) q)
  124.  
  125. esVacia vacia = True
  126. esVacia (poner (e, p) q) = False
  127.  
  128. union vacia q' = q'
  129. union (poner (e, p) q) q' = union q (poner (e, p) q')
  130.  
  131.  
  132. Especificación con modelo de conjuntos:
  133. vacia = {}
  134. poner (e, p) {(e1, p1), ..., (en, pn)} = {(e, p)} U {(e1, p1), ..., (en, pn)} si e != ei y p != pi para todo i en [1,n]
  135. poner (e, p) {(e1, p1), ..., (en, pn)} = {(e, max(p, pi)} U {(e1, p1), ...,  (e(i-1), p(i-1)), (e(i+1), p(i+1)), ..., (en, pn)} si e = ei para algún i en [1,n]
  136. poner (e, p) {(e1, p1), ..., (en, pn)} = {(e1, p1), ..., (en, pn)} si p = pi para algún i en [1,n]
  137. primero {(e1, p1), ..., (en, pn)} = (e, p) si p >= pi para todo i en [1,n]
  138. sacar Q = Q - {primero Q}
  139. esVacia Q = if #Q = 0 then True else False
  140. union {} Q' = Q'
  141. union {(e1, p1), (e2, p2), ..., (en, pn)} Q' = poner (e1, p1) (union {(e2, p2), ..., (en, pn)} Q')
  142.  
  143.  
  144.  
  145.  
  146. -- Ejercicio 5
  147.  
  148. size empty = 0
  149. size (join L Nothing R) = size L + size R
  150. size (join L (Just x) R) = 1 + size L + size R
  151.  
  152. case expose t where
  153.  Nothing -> t = empty
  154.  Just (l,x,r) -> t = join l (Just x) r
  155.  
  156.  
  157.  
  158. -- Ejercicio 6
  159.  
  160. (uncurry zip) o zip = id
  161.  
  162. Para ello hacemos inducción en el largo de la lista.
  163.  
  164. Para n = 0:
  165. (uncurry zip) o zip L = uncurry zip (unzip L) = uncurry zip ([], []) = []
  166.  
  167. Para n > 0:
  168. (uncurry zip) o zip L = uncurry zip (unzip ((x,y):ps)) = uncurry zip (x:xs, y:ys) where ... = (x,y):(uncurry zip (unzip ps)) = (x,y):ps
  169.  
  170. -- Ejercicio 7
  171.  
  172. sum xs <= length xs * maxl xs
  173.  
  174. Para ello hacemos inducción en el largo de la lista.
  175.  
  176. Para n = 0:
  177. sum xs = 0 <= 0 * 0 = length xs * maxl xs
  178.  
  179. Para n > 0:
  180. sum (x:xs) = x + sum xs <= x + length xs * maxl xs
  181. length (x:xs) * maxl (x:xs) = (1 + length xs) * (max x (maxl xs)) (Exp 1)
  182.  
  183. Si x <= maxl xs:
  184.     (Exp 1) = (1 + length xs) * (maxl xs) = (maxl xs) + (length xs) * (maxl xs) >= x + (length xs) * (maxl xs)
  185.     >= x + sum xs = sum (x:xs)
  186. Si x > maxl xs:
  187.     (Exp 1) = (1 + length xs) * x = x + (length xs) * x >= x + (length xs) * (maxl xs) >= x + (sum xs) = sum (x:xs)
  188.    
  189.    
  190. -- Ejercicio 8
  191.  
  192. size :: Arbol a -> Int
  193. size Hoja n = 1
  194. size (Nodo d l r) = 1 + size l + size r
  195.  
  196. Hacemos una sexy inducción estructural:
  197.  
  198. Caso t = Hoja n :
  199. size t = 1 = 2 * 0 + 1
  200.  
  201. Caso t = (Nodo d l r):
  202. size t = 1 + size l + size r = 1 + 2 k' + 1 + 2 k'' + 1 = 2k' + 2k'' + 2 + 1 = 2(k' + k'' + 1) + 1
  203.  
  204. mirror :: Arbol a -> Arbol a
  205. mirror Hoja n = Hoja n
  206. mirror (Nodo d l r) = Nodo d (mirror r) (mirror l)
  207.  
  208. Hacemos una sexy inducción estructural (Again):
  209. Caso t = Hoja n :
  210. mirror (mirror t) = mirror t = t
  211.  
  212. Caso t = (Nodo d l r):
  213. mirror (mirror t) = mirror (Nodo d (mirror r) (mirror l)) = Nodo d (mirror (mirror l)) (mirror (mirror r)) =
  214. Nodo d l r
  215.  
  216. Hacemos una sexy inducción estructural (Yet again):
  217. Caso t = Hoja n :
  218. hojas t = 1 < 2 = 2 ^ 1 = 2 ^ (altura t)
  219.  
  220. Caso t = (Nodo d l r):
  221. hojas t = (hojas l) + (hojas r) < 2 ^ (altura l) + 2 ^ (altura r) <= 2 ^ (max (altura l) (altura r)) + 2 ^ (max (altura l) (altura r)) =
  222. = 2 * 2 ^ (max (altura l) (altura r)) = 2 ^ (1 + (max (altura l) (altura r))) = 2 ^ (altura t)
  223.  
  224.  
  225. -- Ejercicio 9
  226.  
  227. alturaAGT :: AGTree a -> Int
  228. alturaAGT (Node d []) = 1
  229. alturaAGT (Node d (x:xs)) = 1 + (maxl (map alturaAGT (x:xs)))
  230.  
  231. maxAGT :: Ord a => AGTree a -> a
  232. maxAGT (Node d []) = d
  233. maxAGT (Node d (x:xs)) = max (d (maxl (map maxAGT (x:xs)))
  234.  
  235.  
  236. SUPONEMOS podría ser una idea conveniente hacer inducción en la altura:
  237. Probaremos un resultado más fuerte que tiene como corolario el ejercicio. Veremos que:
  238. alturaAGT + (p - 1) = maxAGT o ponerProfs p
  239.  
  240. Caso altura = 1:
  241. En esta situación, vemos que t no debe tener hijos pues su altura sería mayor a 1. Es decir, t = Node d [].
  242. alturaAGT t + (p - 1) = 1 + (p - 1) = p
  243. maxAGT o ponerProfs p t = maxAGT (ponerProfs p t) = maxAGT (Node p (map (ponerProfs (p + 1)) [])) = maxAGT (Node p []) = p
  244.  
  245. Caso altura = n > 1:
  246. En este caso, vemos que t = Node d xs, donde algún elemento de xs tiene altura n-1 y es la altura máxima entre él y sus hermanos.
  247.  
  248. alturaAGT t = n
  249. maxAGT o ponerProfs p t = maxAGT (ponerProfs p (Node d xs)) = maxAGT (Node p (map (ponerProfs (p + 1)) xs)) =
  250. max (p (maxl (map maxAGT (map (ponerProfs (p + 1)) xs))) = max (p (maxl (map (maxAGT (ponerProfs (p + 1))) xs))) =
  251. max (p (maxl (map (maxAGT o ponerProfs (p + 1)) xs))) = max (p (maxl (map (alturaAGT + p) xs))) =
  252. max (p (n - 1 + p)) = n - 1 + p = n + (p - 1) = alturaAGT t + (p - 1)
  253.  
  254.  
  255. -- Ejercicio 10
  256. Lo probaremos por inducción estructural en Tree:
  257.  
  258. Caso t = Leaf n:
  259. map f (flatten t) = map f (flatten (Leaf n)) = map f [n] = [f n]
  260. flatten (mapTree f n) = flatten (mapTree f (Leaf n)) = flatten (Leaf f n) = [f n]
  261.  
  262. Caso t = Node n l r:
  263. map f (flatten t) =
  264. map f (flatten (Node n l r)) =
  265. map f (flatten l ++ [n] ++ flatten r) =
  266. map f (flatten l) ++ map f [n] ++ map f (flatten r) =
  267. flatten (mapTree f l) ++ map f [n] ++ flatten (mapTree f r) =
  268. flatten (mapTree f l) ++ [f n] ++ flatten (mapTree f r) =
  269. flatten (Node (f n) (mapTree f l) (mapTree f r)) =
  270. flatten (mapTree f (Node n l r) =
  271. flatten (mapTree f t)
  272.  
  273.  
  274.  
  275.  
  276. -- Ejercicio 11
  277. Probaremos por inducción estructural en listas:
  278.  
  279. Caso t = []:
  280. join t = join [] = [] = concat [] = concat (map id [])
  281.  
  282. Caso t = (x:xs):
  283. join t = join (x:xs) = x ++ join xs = x ++ concat (map id xs) =
  284. map id x ++ concat (map id xs) = concat (map id (x:xs))
  285.  
  286.  
  287. Probaremos (de nuevo) por inducción estructural en listas:
  288. t:[[a]] (join.join) t = (join.map join) t
  289.  
  290. Caso t = []:
  291. join (join []) = join [] = join (map join [])
  292.  
  293. Caso t = ((x:xs):xss):
  294. join (join t) = join (join ((x:xs):xss)) = join ((x:xs) ++ join xss) =
  295. join (x:(xs ++ join xss)) = x ++ join (xs ++ join xss) =
  296. x ++ y ++ ... ++ z ++ join ([] ++ join xss) =
  297. x ++ y ++ ... ++ z ++ join (join xss) =
  298. x ++ y ++ ... ++ z ++ join (map join xss) =
  299. join (x:xs) ++ join (map join xss)) =
  300. join (join (x:xs) : (map join xss)) =
  301. join (map join ((x:xs):xss))
  302.  
  303.  
  304.  
  305. -- Ejercicio 12
  306. -- Ejercicio 13
  307. -- Ejercicio 14
  308. Dada una propiedad P sobre elementos de F, P(f) valdrá para todo f::F si:
  309.     - Vale P (Zero).
  310.     - Si vale P(n), entonces vale P(One n), con n::F.
  311.     - Si valen P (f True) y P (f False), entonces vale P(Two f), con f::(Bool -> F).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement