Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Salwa Al Atassi Gonzlez Jos Francisco Poveda Garca Jos Sosa Garca
INDICE
1. 2. 3. 4. Parmetros acumuladores. Transformacin de programas. El modelo Desplegar/Plegar. Reduccin de la complejidad por transformacin. 5. Correccin parcial de los programas transformados. 6. Ejercicios.
2
Parmetros Acumuladores
1.1 Definicin. 1.2 Nmeros de Fibonacci. 1.2.1 Solucin. 1.2.2 Solucin con parmetros acumuladores. 1.3 Plegados estrictos. 1.3.1 Ejemplos.
3
Parmetros Acumuladores
Definicin:
Son parmetros de una funcin donde se van almacenado soluciones parciales que se van utilizando en llamadas recursivas hasta llegar a la solucin final.
Parmetros Acumuladores
Nmeros de Fibonacci: Solucin trivial
fib fib fib fib :: Integer -> Integer 0=1 1=1 (n + 2) = fib (n + 1) + fib n
Parmetros Acumuladores
Nmeros de Fibonacci Inconvenientes:
Repeticin de Clculos. Las sumas quedan suspendidas.
Parmetros Acumuladores
fib 6 => fib(4+1) + fib4 => fib5 + fib4 => fib(3+1) + fib3 + fib4 => fib4 + fib3 + fib4 => fib(2+1) + fib2 + fib3 +fib4 =>
7
Parmetros Acumuladores
Solucin con parmetros acumuladores:
fibAux y z 0 = y fibAux y z (n + 1) = fibAux z (y+z) n fib n = fibAux 1 1 n
Parmetros Acumuladores
Ventaja:
No se producen clculos repetidos.
Inconveniente:
Con evaluacin perezosa, quedan suspendidas. las sumas
Parmetros Acumuladores
Plegados estrictos:
Consiste en aprovechar parte del argumento de una funcin para representar el acumulador. Esto es posible si el valor a devolver tiene el mismo tipo que cierta subexpresin del acumulador.
10
Parmetros Acumuladores
Ejemplos:
Funcin Suma:
suma [] = 0 suma [x] = x suma (x:y:xs)=
suma (x + y : xs)
Funcin Mayor
mayor [x] = x mayor (x : x : xs) = mayor (max x x : xs)
11
Transformacin de Programas
2.1 Definicin. 2.2 Transformaciones. 2.3 Ejemplo.
12
Transformacin de Programas
Definicin:
Se pretende la derivacin de programas a partir de otros de forma que se conserve la correccin y se mejore la eficiencia.
13
Transformacin de Programas
Transformaciones:
Una transformacin consiste en sustituir una o varias ecuaciones por otras, sin alterar el significado global del programa.
14
Transformacin de Programas
Ejemplo: Sea g una funcin que calcula la suma de los dobles de los nmeros de una lista.
doble :: [Int]->[Int] suma, g :: [Int]->Int g xs = suma (doble xs) suma [] = 0 suma (x:xs) = x + suma xs doble [] = [] doble (x:xs) = 2*x : doble xs
15
Transformacin de Programas
Aplicando transformaciones:
g[] {sustitucin en la def. de g (instanciacin)} suma(doble []) {desplegar la ecuacin doble[]=[]} suma [] {desplegar la ecuacin suma [] =0} 0
16
Transformacin de Programas
Aplicando transformaciones II:
g (x:xs) {instanciacin} suma (doble (x:xs)) {desplegar} suma(2*x : doble xs) {desplegar} 2*x + suma (doble xs) {plegar g xs = suma (doble xs)} 2*x + g xs
17
Transformacin de Programas
La nueva versin de g es:
g [] = 0 g (x:xs) = 2*x + g xs
18
El modelo Desplegar/Plegar
3.1 Introduccin. 3.2 Las reglas Desplegar/Plegar. 3.3 Ejemplo de la Media.
19
El modelo Desplegar/Plegar
Introduccin.
La metodologa desplegar/plegar fue introducida por Burstall y Darlingtong en 1977. Se basa en la transformacin de programas para mejorar su eficiencia.
20
El modelo Desplegar/Plegar
Las reglas Desplegar/Plegar.
Definicin: Introduce una ecuacin para definir una nueva funcin o extenderla. Instanciacin: Obtiene una nueva ecuacin sustituyendo expresiones particulares en las variables de la cabeza de una ecuacin.
21
El modelo Desplegar/Plegar
Las reglas Desplegar/Plegar.
Desplegar la ecuacin F = F a travs de la ecuacin E = E significa sustituir la aparicin de E en F por E, resultando la nueva ecuacin: F = [E := E] F En definitiva, desplegar es reemplazar miembros izquierdos por miembros derechos.
22
El modelo Desplegar/Plegar
Las reglas Desplegar/Plegar.
Plegar la ecuacin F = F con la ecuacin E = E significa sustituir la aparicin de E en F por E, resultando la nueva ecuacin: F = [E:= E ] F En definitiva, plegar es reemplazar miembros derechos por miembros izquierdos.
23
El modelo Desplegar/Plegar
Las reglas Desplegar/Plegar.
Abstraccin: Introduce una expresin cualificada partiendo de una ecuacin E = E transformndola en la nueva ecuacin: E = [ u1, , un := F1, , Fn] E where (u1, , un) = (F1, , Fn)
24
El modelo Desplegar/Plegar
Ejemplo de la media de una lista:
media :: [Int]->Int media xs = suma xs `div` nDatos xs suma :: [Int]->Int suma [] = 0 suma (x:xs) = x + suma xs nDatos :: [Int]->Int nDatos [] = 0 nDatos (x:xs) = 1 + nDatos xs
25
El modelo Desplegar/Plegar
Introducimos una funcin: sYn :: [Int]->(Int, Int) esta funcin calcula la suma y el nmero de elementos de la lista. Aplicando las reglas D/P: sYn xs {definicin} (suma xs, nDatos xs)
26
El modelo Desplegar/Plegar
Entonces: sYn [] {Instanciacin} (suma [], nDatos []) {Desplegar} (0,0) sYn (x:xs) {Instanciacin} (suma (x:xs), nDatos (x:xs)) {desplegar} (x + suma xs, 1 + nDatos xs) {abstraccin} (x + u, 1 + v) where (u,v) = (suma xs, nDatos xs) {plegar} (x + u, 1 + v) where (u,v) = sYn xs
27
El modelo Desplegar/Plegar
Hemos obtenido 2 ecuaciones para la funcin sYn: sYn [] = (0,0) sYn (x:xs) = (x+u, 1+v) Where (u,v)= sYn xs
Ahora es trivial el clculo de la media: media xs {desplegar} suma xs `div` nDatos xs {abstraccin} u `div` v Where (u, v)= (suma xs, nDatos xs) {plegar} u `div` v Where (u,v)= sYn xs
28
El modelo Desplegar/Plegar
y finalmente, el programa equivalente es: media :: [Int]-> Int media xs = u `div` v Where (u,v)= sYn xs sYn :: [Int]-> (Int, Int) sYn[] = (0,0) sYn (x: xs) = (x+u, 1+v) Where (u,v) = sYn xs
29
30
31
g (n +1) {instanciacin} (fib (n+2), fib (n+1)) {desplegar} (fib (n+1)+ fib n, fib (n+1)) {abstraccin} (u+v, u) where (u,v) = (fib (n+1), fib n) {plegar} (u+v, u) where (u,v) = g n
33
34
Reduccin de la complejidad por transformacin Estudio mnimo de una lista: Dada una lista, sustituir todos sus elementos por el mnimo de la lista.
35
36
minl (x:x:xs) {desplegar} min x (minl (x:xs)) {desplegar} min x (min x (minl xs)) {asociatividad de min} min (min x x) (minl xs) {plegar} minl ((min x x) : xs)
37
38
39
40
Caso Base (xs = [x]):trivial. Paso Inductivo: Supongamos que Para todo x, xs . x::a, xs::[a] (hi) cabeza(lmin(x:xs)) =minl(x:xs) ^ ti(lmin(x:xs)) Entonces: cabeza (lmin (x:x:xs)) cabeza (m:m:u) where m:u = lmin((min x x):xs)
42
minl ((min x x) : xs) {minl dos veces y asociatividad de min} minl (x: x:xs)
ti (lmin (x:x:xs)) {lmin} ti (m:m:u) where m:u = lmin ((min x x):xs) {ti} m==m && ti (m:u) where m:u = lmin ((min x x):xs)
43
44
45
48
50
Ejercicios
Ejemplo que sustituye en una lista todos los elementos por el ltimo y demostracin de su correccin, utilizando el mtodo de PettorosiSkowron.
ultl : Ord a => [a] -> a ultl [x]=x ultl [x:xs] = seg x (ultl xs) reemplaza ::a -> [a] -> [a]
51
Ejercicios
reemplaza _ []= [] reemplaza m (_:xs) = m :reemplaza m xs lult xs =reemplaza (ultl xs) xs ultl (x:x:xs) = ultl ((seg x x):xs) {desplegar} seg x (ultl (x: xs)) {desplegar} seg x (seg x(ultl xs)) {asociatividad de seg} seg (seg x x) (ultl xs) {plegar} ultl ((seg x x):xs)
52
Ejercicios
lult (x:x:xs) {desplegar} reemplaza (ultl(x:x:xs)) (x:x:xs) {instanciacin de reemplaza dos veces} ultl(x:x:xs):ultl(x:x:xs):reemplaza(ultl (x:x:xs))xs {abstraccin} m:m:u where m:u =ultl(x:x:xs):reemplaza (ultl(x:x:xs))xs ultl(x:x:xs):reemplaza (ultl(x:x:xs))xs {propiedad de ultl}
53
Ejercicios
ultl((seg x x):xs):reemplaza(ultl((seg x x):xs)) xs {instanciacin de reemplaza} reemplaza (ultl((seg x x):xs))((seg x x):xs) {instanciacin de lult} lult((seg x x):xs) lult[x]=[x] lultl (x:x:xs)= m:m:u where m:u =lult ((seg x x):xs)
54
Ejercicios
Sea la funcin:
long ::[a] -> Int long[] = 0 long (_:xs)=1 + long xs Vamos a utilizar la tcnica de D/P para transformar el programa anterior en uno ms eficiente utilizando una funcin con un acumulador: long::[Int]->Int->Int tal que no deje sumas suspendidas.
55
Ejercicios
Demostrar su correccin , probando que: long xs n = long xs +n
Considerando la definicin long xs n = long xs + n que podemos transformar segn: long [] n {desplegar} long [] + n {desplegar long} n
56
Ejercicios
long (x:xs) n {desplegar} long (x:xs) +n {desplegar long} 1+ long xs +n {asociatividad y conmutacin} long xs + (n+1) {plegar} long xs (n+1) de donde hemos eliminado la funcin long:
Ejercicios
que introducimos en la forma: long xs =long xs 0 La correccin es trivial.
58
Ejercicios
Sustituir en un rbol binario todas sus apariciones por la mayor en una sola pasada.
Solucin al ejercicio en el fichero adjunto Ejercicio1620.hs La solucin a este ejercicio est basada en el mtodo de Pettorossi-Skowron donde nos basamos en una funcin auxiliar fmax, que dado un rbol devuelve un par formado por un elemento y una funcin. Dicha funcin va reconstruyendo una estructura de rbol idntica a la original y en cuyos nodos aparecen el elemento que se le pasa, en este caso el mximo de los nodos.
59
Anexo I
Dada una funcin
f(0)=15, f(1)=3, f(2)=8, f(3)=1 f(n+4) = f(n+3) + f(n+2) + f(n+1) + f(n) La solucin utilizando parmetros acumuladores en Haskell es la siguiente: fxyzk0=x f x y z k (n+1) = f y z k (x+y+z+k) n La llamada a esta funcin con n=5 sera: f 15 3 8 1 5
60
Anexo I
Al igual que en la funcin fibonacci con parmetros acumuladores, la funcin anterior no hace repeticin de clculos pero si que siguen quedando las sumas suspendidas.
61
Anexo II
Correccin de la solucin de la funcin lult.
La correccin de la solucin para la funcin lult se hace demostrando el siguiente predicado: Para todo xs . xs::[a], xs []
(cabeza (lult xs) = ultl xs) ^ (ti (lult xs)) Donde: ultl :: [a]->a ultl [x] = x ultl (x:xs) = ultl xs
62
Anexo II
Correccin de la solucin de la funcin lult.
Una vez definido el predicado y las funciones que se usan en el mismo, la demostracin se hace de forma similar a la vista en el ejercicio de la correccin de lmin.
63
Anexo III
Comportamiento en memoria de la doble llamada recursiva realizada por la funcin lmin:
minl (x:xs) = min x (minl xs) reemplaza m (_:xs)= m:reemplaza m xs lmin xs = reemplaza (minl xs) xs
*
La lista tan solo es recorrida una vez, al contrario de lo que se podra pensar, debido al comportamiento de m:reemplaza.
* Ejemplo de sustitucin de todos los elementos de una lista por su mnimo, pg 35
64
Bibliografa
Razonando con Haskell un curso sobre programacin funcional; Blas C. Ruiz, Francisco Gutirrez, Pablo Guerrero, Jos E. Gallardo
65