Sunteți pe pagina 1din 339

Temas de Programacin funcional (curso 201112)

Jos A. Alonso Jimnez

Grupo de Lgica Computacional Dpto. de Ciencias de la Computacin e Inteligencia Articial Universidad de Sevilla Sevilla, 24 de Septiembre de 2011 (versin de 24 de septiembre de 2011)

Esta obra est bajo una licencia ReconocimientoNoComercialCompartirIgual 2.5 Spain de Creative Commons.

Se permite: copiar, distribuir y comunicar pblicamente la obra hacer obras derivadas Bajo las condiciones siguientes: Reconocimiento. Debe reconocer los crditos de la obra de la manera especicada por el autor. No comercial. No puede utilizar esta obra para nes comerciales. Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una obra derivada, slo puede distribuir la obra generada bajo una licencia idntica a sta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor.

Esto es un resumen del texto legal (la licencia completa). Para ver una copia de esta licencia, visite httpXGGretiveommonsForgGliensesGyEnEsGPFSGesG o envie una carta a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

ndice general
1. Introduccin a la programacin funcional 1.1. Funciones . . . . . . . . . . . . . . . . 1.2. Programacin funcional . . . . . . . . 1.3. Rasgos caractersticos de Haskell . . . 1.4. Antecedentes histricos . . . . . . . . 1.5. Presentacin de Haskell . . . . . . . . 5 5 7 8 9 9 13 13 13 13 14 14 15 16 17 17 18 18 19 21 21 22 23 23 24 24 25 27 27

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

2. Introduccin a la programacin con Haskell 2.1. El sistema GHC . . . . . . . . . . . . . . 2.2. Iniciacin a GHC . . . . . . . . . . . . . 2.2.1. Inicio de sesin con GHCi . . . . 2.2.2. Clculo aritmtico . . . . . . . . 2.2.3. Clculo con listas . . . . . . . . . 2.2.4. Clculos con errores . . . . . . . 2.3. Aplicacin de funciones . . . . . . . . . 2.4. Guiones Haskell . . . . . . . . . . . . . . 2.4.1. El primer guin Haskell . . . . . 2.4.2. Nombres de funciones . . . . . . 2.4.3. La regla del sangrado . . . . . . 2.4.4. Comentarios en Haskell . . . . . 3. Tipos y clases 3.1. Conceptos bsicos sobre tipos 3.2. Tipos bsicos . . . . . . . . . . 3.3. Tipos compuestos . . . . . . . 3.3.1. Tipos listas . . . . . . . 3.3.2. Tipos tuplas . . . . . . 3.3.3. Tipos funciones . . . . 3.4. Parcializacin . . . . . . . . . 3.5. Polimorsmo y sobrecarga . . 3.5.1. Tipos polimrcos . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . . 3

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

Temas de programacin funcional (201011)

3.5.2. Tipos sobrecargados . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.6. Clases bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4. Denicin de funciones 4.1. Deniciones por composicin . . . . . . . . 4.2. Deniciones con condicionales . . . . . . . 4.3. Deniciones con ecuaciones con guardas . 4.4. Deniciones con equiparacin de patrones 4.4.1. Constantes como patrones . . . . . . 4.4.2. Variables como patrones . . . . . . . 4.4.3. Tuplas como patrones . . . . . . . . 4.4.4. Listas como patrones . . . . . . . . . 4.4.5. Patrones enteros . . . . . . . . . . . 4.5. Expresiones lambda . . . . . . . . . . . . . . 4.6. Secciones . . . . . . . . . . . . . . . . . . . . 5. Deniciones de listas por comprensin 5.1. Generadores . . . . . . . . . . . . . . . 5.2. Guardas . . . . . . . . . . . . . . . . . 5.3. La funcin zip . . . . . . . . . . . . . . 5.4. Comprensin de cadenas . . . . . . . . 5.5. Cifrado Csar . . . . . . . . . . . . . . 5.5.1. Codicacin y descodicacin 5.5.2. Anlisis de frecuencias . . . . . 5.5.3. Descifrado . . . . . . . . . . . . 35 35 35 36 36 36 37 37 37 38 38 40 43 43 44 45 46 47 48 50 51 53 53 54 57 57 58 59 63 63 64 64 65 66 69

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

6. Funciones recursivas 6.1. Recursin numrica . . . . . . . . . . . . . . 6.2. Recusin sobre lista . . . . . . . . . . . . . . 6.3. Recursin sobre varios argumentos . . . . . 6.4. Recursin mltiple . . . . . . . . . . . . . . 6.5. Recursin mutua . . . . . . . . . . . . . . . 6.6. Heursticas para las deniciones recursivas 7. Funciones de orden superior 7.1. Funciones de orden superior . . . . . . . . . 7.2. Procesamiento de listas . . . . . . . . . . . . 7.2.1. La funcin mp . . . . . . . . . . . . 7.2.2. La funcin filter . . . . . . . . . . 7.3. Funcin de plegado por la derecha: foldr . 7.4. Funcin de plegado por la izquierda: foldl

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

ndice general

7.5. Composicin de funciones . . . . . . . . . . . . . . . . . . . . . . 7.6. Caso de estudio: Codicacin binaria y transmisin de cadenas 7.6.1. Cambio de bases . . . . . . . . . . . . . . . . . . . . . . . 7.6.2. Codicacin y descodicacin . . . . . . . . . . . . . . . 8. Razonamiento sobre programas 8.1. Razonamiento ecuacional . . . . . . . . . . . . . . . . 8.1.1. Clculo con longitud . . . . . . . . . . . . . . 8.1.2. Propiedad de intermi . . . . . . . . . . . 8.1.3. Inversa de listas unitarias . . . . . . . . . . . . 8.1.4. Razonamiento ecuacional con anlisis de casos 8.2. Razonamiento por induccin sobre los naturales . . . 8.2.1. Esquema de induccin sobre los naturales . . 8.2.2. Ejemplo de induccin sobre los naturales . . . 8.3. Razonamiento por induccin sobre listas . . . . . . . 8.3.1. Esquema de induccin sobre listas . . . . . . . 8.3.2. Asociatividad de CC . . . . . . . . . . . . . . . 8.3.3. es la identidad para CC por la derecha . . . 8.3.4. Relacin entre length y CC . . . . . . . . . . . . 8.3.5. Relacin entre tke y drop . . . . . . . . . . . . 8.3.6. La concatenacin de listas vacas es vaca . . . 8.4. Equivalencia de funciones . . . . . . . . . . . . . . . . 8.5. Propiedades de funciones de orden superior . . . . . 9. Declaraciones de tipos y clases 9.1. Declaraciones de tipos . . . . . . . . . . 9.2. Deniciones de tipos de datos . . . . . . 9.3. Denicin de tipos recursivos . . . . . . 9.4. Sistema de decisin de tautologas . . . 9.5. Mquina abstracta de clculo aritmtico 9.6. Declaraciones de clases y de instancias . 10. Evaluacin perezosa 10.1. Estrategias de evaluacin 10.2. Terminacin . . . . . . . . 10.3. Nmero de reducciones . 10.4. Estructuras innitas . . . . 10.5. Programacin modular . . 10.6. Aplicacin estricta . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

70 71 72 73 77 77 77 77 78 79 79 79 80 81 81 81 82 83 84 85 86 87 91 91 93 95 99 102 104 109 109 110 111 112 113 114

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Temas de programacin funcional (201011)

11. Aplicaciones de programacin funcional 11.1. El juego de cifras y letras . . . . . . . . . . . . . . . . . . . . . . 11.1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2. Bsqueda de la solucin por fuerza bruta . . . . . . . . 11.1.3. Bsqueda combinando generacin y evaluacin . . . . 11.1.4. Bsqueda mejorada mediante propiedades algebraicas 11.2. El problema de las reinas . . . . . . . . . . . . . . . . . . . . . . 11.3. Nmeros de Hamming . . . . . . . . . . . . . . . . . . . . . . . 12. Analizadores sintcticos funcionales 12.1. Analizadores sintcticos . . . . . . . . . . . . . . 12.2. El tipo de los analizadores sintcticos . . . . . . 12.3. Analizadores sintcticos bsicos . . . . . . . . . . 12.4. Composicin de analizadores sintcticos . . . . . 12.4.1. Secuenciacin de analizadores sintcticos 12.4.2. Eleccin de analizadores sintcticos . . . 12.5. Primitivas derivadas . . . . . . . . . . . . . . . . 12.6. Tratamiento de los espacios . . . . . . . . . . . . 12.7. Analizador de expresiones aritmticas . . . . . . 13. Programas interactivos 13.1. Programas interactivos . . . . . . . . . . 13.2. El tipo de las acciones de entrada/salida 13.3. Acciones bsicas . . . . . . . . . . . . . . 13.4. Secuenciacin . . . . . . . . . . . . . . . 13.5. Primitivas derivadas . . . . . . . . . . . 13.6. Ejemplos de programas interactivos . . 13.6.1. Juego de adivinacin interactivo 13.6.2. Calculadora aritmtica . . . . . . 13.6.3. El juego de la vida . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

119 119 119 123 125 127 130 131 133 133 133 134 135 135 136 136 139 140 147 147 148 148 148 149 150 150 151 154 159 159 159 159 159 160 161 161 163 164

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

14. El TAD de las pilas 14.1. Tipos abstractos de datos . . . . . . . . . . . . . . . . . . . 14.1.1. Abstraccin y tipos abstractos de datos . . . . . . 14.2. Especicacin del TAD de las pilas . . . . . . . . . . . . . 14.2.1. Signatura del TAD pilas . . . . . . . . . . . . . . . 14.2.2. Propiedades del TAD de las pilas . . . . . . . . . . 14.3. Implementaciones del TAD de las pilas . . . . . . . . . . 14.3.1. Las pilas como tipos de datos algebraicos . . . . . 14.3.2. Las pilas como listas . . . . . . . . . . . . . . . . . 14.4. Comprobacin de las implementaciones con QuickCheck

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

ndice general

14.4.1. 14.4.2. 14.4.3. 14.4.4.

Libreras auxiliares . . . . . . . . . . . . . . . . Generador de pilas . . . . . . . . . . . . . . . . Especicacin de las propiedades de las pilas . Comprobacin de las propiedades . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

164 165 165 166 167 167 167 168 168 168 170 173 173 174 174 176 179 179 179 180 180 180 182 182 182 183 184 185 187 187 187 187 188 188 191 193 195 199

15. El TAD de las colas 15.1. Especicacin del TAD de las colas . . . . . . . . . . . . . . . 15.1.1. Signatura del TAD de las colas . . . . . . . . . . . . . 15.1.2. Propiedades del TAD de las colas . . . . . . . . . . . 15.2. Implementaciones del TAD de las colas . . . . . . . . . . . . 15.2.1. Implementacin de las colas mediante listas . . . . . 15.2.2. Implementacin de las colas mediante pares de listas 15.3. Comprobacin de las implementaciones con QuickCheck . . 15.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . 15.3.2. Generador de colas . . . . . . . . . . . . . . . . . . . . 15.3.3. Especicacin de las propiedades de las colas . . . . 15.3.4. Comprobacin de las propiedades . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

16. El TAD de las colas de prioridad 16.1. Especicacin del TAD de las colas de prioridad . . . . . . . . . . 16.1.1. Signatura del TAD colas de prioridad . . . . . . . . . . . . 16.1.2. Propiedades del TAD de las colas de prioridad . . . . . . . 16.2. Implementaciones del TAD de las colas de prioridad . . . . . . . . 16.2.1. Las colas de prioridad como listas . . . . . . . . . . . . . . 16.2.2. Las colas de prioridad como montculos . . . . . . . . . . . 16.3. Comprobacin de las implementaciones con QuickCheck . . . . . 16.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . 16.3.2. Generador de colas de prioridad . . . . . . . . . . . . . . . 16.3.3. Especicacin de las propiedades de las colas de prioridad 16.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

17. El TAD de los conjuntos 17.1. Especicacin del TAD de los conjuntos . . . . . . . . . . . . . . . . . 17.1.1. Signatura del TAD de los conjuntos . . . . . . . . . . . . . . . 17.1.2. Propiedades del TAD de los conjuntos . . . . . . . . . . . . . . 17.2. Implementaciones del TAD de los conjuntos . . . . . . . . . . . . . . 17.2.1. Los conjuntos como listas no ordenadas con duplicados . . . 17.2.2. Los conjuntos como listas no ordenadas sin duplicados . . . . 17.2.3. Los conjuntos como listas ordenadas sin duplicados . . . . . . 17.2.4. Los conjuntos de nmeros enteros mediante nmeros binarios 17.3. Comprobacin de las implementaciones con QuickCheck . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

Temas de programacin funcional (201011)

17.3.1. 17.3.2. 17.3.3. 17.3.4.

Libreras auxiliares . . . . . . . . . . . . . . . . . . . Generador de conjuntos . . . . . . . . . . . . . . . . Especicacin de las propiedades de los conjuntos . Comprobacin de las propiedades . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

199 199 199 201 203 203 203 204 208 208 208 209 209 210 212 214 214 214 215 216 217 217 217 218 219 219 223 223 223 224 227 229 229 229 230 230 230 235

18. El TAD de las tablas 18.1. El tipo predenido de las tablas (arrays) . . . . . . . . . 18.1.1. La clase de los ndices de las tablas . . . . . . . . . 18.1.2. El tipo predenido de las tablas (arrays) . . . . 18.2. Especicacin del TAD de las tablas . . . . . . . . . . . . 18.2.1. Signatura del TAD de las tablas . . . . . . . . . . . 18.2.2. Propiedades del TAD de las tablas . . . . . . . . . 18.3. Implementaciones del TAD de las tablas . . . . . . . . . . 18.3.1. Las tablas como funciones . . . . . . . . . . . . . . 18.3.2. Las tablas como listas de asociacin . . . . . . . . 18.3.3. Las tablas como matrices . . . . . . . . . . . . . . 18.4. Comprobacin de las implementaciones con QuickCheck 18.4.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . 18.4.2. Generador de tablas . . . . . . . . . . . . . . . . . 18.4.3. Especicacin de las propiedades de las tablas . . 18.4.4. Comprobacin de las propiedades . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

19. El TAD de los rboles binarios de bsqueda 19.1. Especicacin del TAD de los rboles binarios de bsqueda . . . . . 19.1.1. Signatura del TAD de los rboles binarios de bsqueda . . . . 19.1.2. Propiedades del TAD de los rboles binarios de bsqueda . . 19.2. Implementacin del TAD de los rboles binarios de bsqueda . . . . 19.2.1. Los ABB como tipo de dato algebraico . . . . . . . . . . . . . . 19.3. Comprobacin de la implementacin con QuickCheck . . . . . . . . . 19.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . 19.3.2. Generador de rboles binarios de bsqueda . . . . . . . . . . 19.3.3. Especicacin de las propiedades de los rboles de bsqueda 19.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . 20. El TAD de los montculos 20.1. Especicacin del TAD de los montculos . . . . . . . . 20.1.1. Signatura del TAD de los montculos . . . . . . 20.1.2. Propiedades del TAD de los montculos . . . . . 20.2. Implementacin del TAD de los montculos . . . . . . . 20.2.1. Los montculos como tipo de dato algebraico . . 20.3. Comprobacin de la implementacin con QuickCheck .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

ndice general

20.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . 20.3.2. Generador de montculos . . . . . . . . . . . . . . . . . . 20.3.3. Especicacin de las propiedades de los montculos . . . 20.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . 20.4. Implementacin de las colas de prioridad mediante montculos 20.4.1. Las colas de prioridad como montculos . . . . . . . . . . 21. El TAD de los polinomios 21.1. Especicacin del TAD de los polinomios . . . . . . . . . . 21.1.1. Signatura del TAD de los polinomios . . . . . . . . 21.1.2. Propiedades del TAD de los polinomios . . . . . . . 21.2. Implementacin del TAD de los polinomios . . . . . . . . . 21.2.1. Los polinomios como tipo de dato algebraico . . . . 21.2.2. Los polinomios como listas dispersas . . . . . . . . 21.2.3. Los polinomios como listas densas . . . . . . . . . . 21.3. Comprobacin de las implementaciones con QuickCheck . 21.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . 21.3.2. Generador de polinomios . . . . . . . . . . . . . . . 21.3.3. Especicacin de las propiedades de los polinomios 21.3.4. Comprobacin de las propiedades . . . . . . . . . . 21.4. Operaciones con polinomios . . . . . . . . . . . . . . . . . . 21.4.1. Operaciones con polinomios . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

235 235 237 238 239 239 243 243 243 244 244 244 247 250 253 253 253 254 255 256 256 261 261 261 262 263 266 269 269 272 272 272 274 274 275 278

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

22. Algoritmos sobre grafos 22.1. El TAD de los grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.1.1. Deniciones y terminologa sobre grafos . . . . . . . . . . . 22.1.2. Signatura del TAD de los grafos . . . . . . . . . . . . . . . . 22.1.3. Implementacin de los grafos como vectores de adyacencia 22.1.4. Implementacin de los grafos como matrices de adyacencia 22.2. Recorridos en profundidad y en anchura . . . . . . . . . . . . . . . 22.2.1. Recorrido en profundidad . . . . . . . . . . . . . . . . . . . . 22.2.2. Recorrido en anchura . . . . . . . . . . . . . . . . . . . . . . 22.3. Ordenacin topolgica . . . . . . . . . . . . . . . . . . . . . . . . . . 22.3.1. Ordenacin topolgica . . . . . . . . . . . . . . . . . . . . . . 22.4. rboles de expansin mnimos . . . . . . . . . . . . . . . . . . . . . 22.4.1. rboles de expansin mnimos . . . . . . . . . . . . . . . . . 22.4.2. El algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . 22.4.3. El algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

10

Temas de programacin funcional (201011)

23. Tcnicas de diseo descendente de algoritmos 23.1. La tcnica de divide y vencers . . . . . . . . . . . . . . . . . . . . . . . . . 23.1.1. La tcnica de divide y vencers . . . . . . . . . . . . . . . . . . . . . 23.1.2. La ordenacin por mezcla como ejemplo de DyV . . . . . . . . . . 23.1.3. La ordenacin rpida como ejemplo de DyV . . . . . . . . . . . . . 23.2. Bsqueda en espacios de estados . . . . . . . . . . . . . . . . . . . . . . . . 23.2.1. El patrn de bsqueda en espacios de estados . . . . . . . . . . . . 23.2.2. El problema del 8 puzzle . . . . . . . . . . . . . . . . . . . . . . . . . 23.2.3. El problema de las n reinas . . . . . . . . . . . . . . . . . . . . . . . 23.2.4. El problema de la mochila . . . . . . . . . . . . . . . . . . . . . . . . 23.3. Bsqueda por primero el mejor . . . . . . . . . . . . . . . . . . . . . . . . . 23.3.1. El patrn de bsqueda por primero el mejor . . . . . . . . . . . . . 23.3.2. El problema del 8 puzzle por BPM . . . . . . . . . . . . . . . . . . . 23.4. Bsqueda en escalada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.4.1. El patrn de bsqueda en escalada . . . . . . . . . . . . . . . . . . . 23.4.2. El problema del cambio de monedas por escalada . . . . . . . . . . 23.4.3. El algoritmo de Prim del rbol de expansin mnimo por escalada 24. Tcnicas de diseo ascendente de algoritmos 24.1. Programacin dinmica . . . . . . . . . . . . . . . . . . . . . . . . . 24.1.1. Introduccin a la programacin dinmica . . . . . . . . . . . 24.1.2. El patrn de la programacin dinmica . . . . . . . . . . . . 24.2. Fibonacci como ejemplo de programacin dinmica . . . . . . . . . 24.2.1. Denicin de Fibonacci mediante programacin dinmica . 24.3. Producto de cadenas de matrices (PCM) . . . . . . . . . . . . . . . . 24.3.1. Descripcin del problema PCM . . . . . . . . . . . . . . . . . 24.3.2. Solucin del PCM mediante programacin dinmica . . . . 24.3.3. Solucin del PCM mediante divide y vencers . . . . . . . . 24.4. rboles binarios de bsqueda optimales (ABBO) . . . . . . . . . . . 24.4.1. Descripcin del problema de ABBO . . . . . . . . . . . . . . 24.4.2. Solucin del ABBO mediante programacin dinmica . . . . 24.5. Caminos mnimos entre todos los pares de nodos de un grafo(CM) 24.5.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . 24.5.2. Solucin del problema de los caminos mnimos (CM) . . . . 24.6. Problema del viajante (PV) . . . . . . . . . . . . . . . . . . . . . . . . 24.6.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . 24.6.2. Solucin del problema del viajante (PV) . . . . . . . . . . . . A. Resumen de funciones predenidas de Haskell Bibliografa

279 279 279 280 280 281 281 282 285 287 289 289 289 290 290 291 292 295 295 295 296 297 297 299 299 300 302 303 303 304 306 306 306 308 308 309 313 316

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

Tema 1 Introduccin a la programacin funcional


Contenido
1.1. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Programacin funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Rasgos caractersticos de Haskell . . . . . . . . . . . . . . . . . . . . . . 1.4. Antecedentes histricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5. Presentacin de Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7 8 9 9

1.1.

Funciones
En Haskell, una funcin es una aplicacin que toma uno o ms argumentos y devuelve un valor. En Haskell, las funciones se denen mediante ecuaciones formadas por el nombre de la funcin, los nombres de los argumentos y el cuerpo que especica cmo se calcula el valor a partir de los argumentos. Ejemplo de denicin de funcin en Haskell:

Funciones en Haskell

dole x a x C x
Ejemplo de evaluacin: doble 3 = 3+3 [def. de doble] = 6 [def. de +] 11

12

Temas de programacin funcional (201011)

Evaluaciones de funciones en Haskell Ejemplo de evaluacin anidada impaciente: doble (doble 3) = doble (3 + 3) [def. de doble] = doble 6 [def. de +] = 6+6 [def. de doble] = 12 [def. de +] Ejemplo de evaluacin anidada perezosa: doble (doble 3) = (doble 3) + (doble 3) [def. de doble] = (3 +3) + (doble 3) [def. de doble] = 6 + (doble 3) [def. de +] = 6 + (3 + 3) [def. de doble] = 6+6 [def. de +] = 12 [def. de +] Comprobacin de propiedades Propiedad: El doble de x ms y es el doble de x ms el doble de y Expresin de la propiedad:

propdole x y a dole @xCyA aa @dole xA C @dole yA


Comprobacin de la propiedad con QuickCheck:

Bwinb quikghek propdole CCC yuD pssed IHH testsF


Para usar QuickCheck hay que importarlo, escribiendo al principio del chero

import estFuikghek
Refutacin de propiedades Propiedad: El producto de dos nmeros cualequiera es distinto de su suma. Expresin de la propiedad:

propprodsum x y a xBy Ga xCy

Tema 1. Introduccin a la programacin funcional

13

Refutacin de la propiedad con QuickCheck:

Bwinb quikghek propprodsum BBB piled3 plsifile @fter I testAX H H


Renamiento: El producto de dos nmeros no nulos cualequiera es distinto de su suma.

propprodsum9 x y a x Ga H 88 y Ga H aab xBy Ga xCy


Refutacin de la propiedad con QuickCheck:

Bwinb quikghek propprodsum9 CCC yuD pssed IHH testsF Bwinb quikghek propprodsum9 BBB piled3 plsifile @fter S testsAX P P

1.2.

Programacin funcional

Programacin funcional y programacin imperativa La programacin funcional es un estilo de programacin cuyo mtodo bsico de computacin es la aplicacin de funciones a sus argumentos. Un lenguaje de programacin funcional es uno que soporta y potencia el estilo funcional. La programacin imperativa es un estilo de programacin en el que los programas estn formados por instrucciones que especican cmo se ha de calcular el resultado. Ejemplo de problema para diferenciar los estilos de programacin: Sumar los n primeros nmeros.

14

Temas de programacin funcional (201011)

Solucin mediante programacin imperativa Programa suma n: contador := 0 total := 0 repetir contador := contador + 1 total := total + contador hasta que contador = n Evaluacin de suma 4: contador total 0 0 1 1 2 3 3 6 4 10

Solucin mediante programacin funcional Programa:

sum n a sum IFFn


Evaluacin de suma 4: suma 4 = sum [1..4] [def. de suma] = sum [1, 2, 3, 4] [def. de [..]] = 1+2+3+4 [def. de sum] = 10 [def. de +]

1.3.

Rasgos caractersticos de Haskell


Programas concisos. Sistema potente de tipos. Listas por comprensin. Funciones recursivas. Funciones de orden superior.

Tema 1. Introduccin a la programacin funcional

15

Razonamiento sobre programas. Evaluacin perezosa. Efectos mondicos.

1.4.

Antecedentes histricos
1930s: Alonzo Church desarrolla el lambda clculo (teora bsica de los lenguajes funcionales). 1950s: John McCarthy desarrolla el Lisp (lenguaje funcional con asignaciones). 1960s: Peter Landin desarrolla ISWIN (lenguaje funcional puro). 1970s: John Backus desarrolla FP (lenguaje funcional con orden superior). 1970s: Robin Milner desarrolla ML (lenguaje funcional con tipos polimrcos e inferencia de tipos). 1980s: David Turner desarrolla Miranda (lenguaje funcional perezoso). 1987: Un comit comienza el desarrollo de Haskell. 2003: El comit publica el Haskell Report.

1.5.

Presentacin de Haskell
Especicacin: @sum xsA es la suma de los elementos de xs. Ejemplo: sum [2,3,7] ;12 Denicin:

Ejemplo de recursin sobre listas

sum a H sum @xXxsA a x C sum xs


Evaluacin: sum [2,3,7] = 2 + sum [3,7] = 2 + (3 + sum [7]) = 2 + (3 + (7 + sum [])) = 2 + (3 + (7 + 0)) = 12

[def. de sum] [def. de sum] [def. de sum] [def. de sum] [def. de +]

16

Temas de programacin funcional (201011)

Tipo de sum: @xum A ab Eb Ejemplo con listas de comprensin Especicacin: @orden xsA es la lista obtenida ordenando xs mediante el algoritmo de ordenacin rpida. Ejemplo:

orden RDTDPDSDQ ; PDQDRDSDT orden 4de4 ; 4de4


Denicin:

orden a orden @xXxsA a @orden menoresA CC x CC @orden myoresA where menores a | `E xsD `a x myores a | `E xsD b x
Tipo de orden: yrd ab Eb Evaluacin del ejemplo con listas de comprensin ordena [4,6,2,3] = (ordena [2,3]) ++ [4] ++ (ordena [6]) = ((ordena []) ++ [2] ++ (ordena [3])) ++ [4] ++ (ordena [6]) = ([] ++ [2] ++ (ordena [3])) ++ [4] ++ (ordena [6]) = ([2] ++ (ordena [3])) ++ [4] ++ (ordena [6,5]) = ([2] ++ ((ordena []) ++ [3] ++ [])) ++ [4] ++ (ordena [6]) = ([2] ++ ([] ++ [3] ++ [])) ++ [4] ++ (ordena [6]) = ([2] ++ [3]) ++ [4] ++ (ordena [6]) = [2,3] ++ [4] ++ (ordena [6]) = [2,3,4] ++ (ordena [6]) = [2,3,4] ++ ((ordena []) ++ [6] ++ (ordena [])) = [2,3,4] ++ ((ordena []) ++ [6] ++ (ordena [])) = [2,3,4] ++ ([] ++ [6] ++ []) = [2,3,4,6]

[def. ordena] [def. ordena] [def. ordena] [def. ++] [def. ordena] [def. ordena] [def. ++] [def. ++] [def. ++] [def. ordena] [def. ordena] [def. ordena] [def. ++]

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000.

Tema 1. Introduccin a la programacin funcional

17

Cap. 1: Conceptos fundamentales. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 1: Introduction. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 1: Getting Started. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 1: Programacin funcional. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 1: Introducing functional programming.

18

Temas de programacin funcional (201011)

Tema 2 Introduccin a la programacin con Haskell


Contenido
2.1. El sistema GHC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2. Iniciacin a GHC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.1. Inicio de sesin con GHCi . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.2. Clculo aritmtico . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.3. Clculo con listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.4. Clculos con errores . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3. Aplicacin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4. Guiones Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.4.1. El primer guin Haskell . . . . . . . . . . . . . . . . . . . . . . . . 17 2.4.2. Nombres de funciones . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.4.3. La regla del sangrado . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.4.4. Comentarios en Haskell . . . . . . . . . . . . . . . . . . . . . . . . 19

2.1.

El sistema GHC

El sistema GHC Los programa funcionales pueden evaluarse manualmente (como en el tema anterior). Los lenguajes funcionales evalan automticamente los programas funcionales. 19

20

Temas de programacin funcional (201011)

Haskell es un lenguaje funcional. GHC (Glasgow Haskell Compiler) es el intrprete de Haskell que usaremos en el curso.

2.2.
2.2.1.

Iniciacin a GHC
Inicio de sesin con GHCi
I1M> ghci GHCi, version 6.10.3: http://www.haskell.org/ghc/ Prelude>

Inicio mediante ghi


:? for help

La llamada es reludeb Indica que ha cargado las deniciones bsicas que forman el preludio y el sistema est listo para leer una expresin, evaluarla y escribir su resultado.

2.2.2.

Clculo aritmtico

Clculo aritmtico: Operaciones aritmticas Operaciones aritmticas en Haskell:

reludeb S reludeb EI reludeb T reludeb Q reludeb V

PCQ PEQ PBQ U div P PQ

Clculo aritmtico: Precedencia y asociatividad Precedencia:

Tema 2. Introduccin a la programacin con Haskell

21

reludeb PBIHQ PHHH reludeb PCQBR IR


Asociacitividad:

reludeb PQR PRIUVSITQWPPWPSVQRWRIPQSP reludeb P@QRA PRIUVSITQWPPWPSVQRWRIPQSP reludeb PEQER ES reludeb @PEQAER ES

2.2.3.

Clculo con listas

Clculo con listas: Seleccionar y eliminar Seleccionar el primer elemento de una lista no vaca:

hed IDPDQDRDS ;

Eliminar el primer elemento de una lista no vaca:

til IDPDQDRDS ;

PDQDRDS

Seleccionar el nsimo elemento de una lista (empezando en 0):

IDPDQDRDS 33 P ;

Seleccionar los n primeros elementos de una lista:

tke Q IDPDQDRDS ;

IDPDQ

Eliminar los n primeros elementos de una lista:

drop Q IDPDQDRDS ;

RDS

22

Temas de programacin funcional (201011)

Clculo con listas Calcular la longitud de una lista:

length IDPDQDRDS ;

Calcular la suma de una lista de nmeros:

sum IDPDQDRDS ;

IS

Calcular el producto de una lista de nmeros:

produt IDPDQDRDS ;
Concatenar dos listas:

IPH

IDPDQ CC RDS ;
Invertir una lista:

IDPDQDRDS

reverse IDPDQDRDS ;

SDRDQDPDI

2.2.4.

Clculos con errores

Ejemplos de clculos con errores

reludeb I div H BBB ixeptionX divide y zero reludeb hed BBB ixeptionX reludeFhedX empty list reludeb til BBB ixeptionX reludeFtilX empty list reludeb PDQ 33 S BBB ixeptionX reludeF@33AX index too lrge

2.3.

Aplicacin de funciones

Aplicacin de funciones en matemticas y en Haskell Notacin para funciones en matemticas: En matemticas, la aplicacin de funciones se representa usando parntesis y la multiplicacin usando yuxtaposicin o espacios

Tema 2. Introduccin a la programacin con Haskell

23

Ejemplo: f ( a, b) + cd representa la suma del valor de f aplicado a a y b ms el producto de c por d. Notacin para funciones en Haskell: En Haskell, la aplicacin de funciones se representa usando espacios y la multiplicacin usando . Ejemplo: f C Bd representa la suma del valor de f aplicado a y ms el producto de por d. Prioridad de la aplicacin de funciones En Haskell, la aplicacin de funciones tiene mayor prioridad que los restantes operadores. Por ejemplo, la expresin Haskell f C representa la expresin matemtica f ( a) + b. Ejemplos de expresiones Haskell y matemticas: Matemticas f (x) f ( x, y) f ( g( x )) f ( x, g(y)) f ( x ) g(y) Haskell f x f x y f @g xA f x @g yA f x B g y

2.4.

Guiones Haskell
En Haskell los usuarios pueden denir funciones. Las nuevas deniciones se denen en guiones, que son cheros de textos compuestos por una sucesin de deniciones. Se acostumbra a identicar los guiones de Haskell mediante el sujo Fhs

2.4.1.

El primer guin Haskell

Iniciar emacs y abrir dos ventanas: gEx P En la primera ventana ejecutar Haskell: wEx runEhskell Cambiar a la otra ventana: gEx o

24

Temas de programacin funcional (201011)

Iniciar el guin: gEx gEf ejemploFhs Escribir en el guin las siguientes deniciones

dole x a xCx udruple x a dole @dole xA


Grabar el guin: gEx gEs Cargar el guin en Haskell: gE gEl Evaluar ejemplos:

Bwinb udruple IH RH Bwinb tke @dole PA IDPDQDRDSDT IDPDQDR


Volver al guin: gEx o Aadir al guin las siguientes deniciones:

ftoril n a produt IFFn medi ns a sum ns div length ns


Grabar el guin: gEx s Cargar el guin en Haskell: gE gEl Evaluar ejemplos:

Bwinb ftoril @dole PA PR Bwinb dole @medi IDSDQA T

2.4.2.

Nombres de funciones

Los nombres de funciones tienen que empezar por una letra en minscula. Por ejemplo, sumgudrdo, sumudrdo, sum9 Las palabras reservadas de Haskell no pueden usarse en los nombres de funciones. Algunas palabras reservadas son

Tema 2. Introduccin a la programacin con Haskell


case if let class import module data default deriving do else in infix infixl infixr instance newtype of then type where

25

Se acostumbra escribir los argumentos que son listas usando s como sujo de su nombre. Por ejemplo, ns representa una lista de nmeros, xs representa una lista de elementos, ss representa una lista de listas de caracteres.

2.4.3.

La regla del sangrado

En Haskell la disposicin del texto del programa (el sangrado) delimita las deniciones mediante la siguiente regla: Una denicin acaba con el primer trozo de cdigo con un margen izquierdo menor o igual que el del comienzo de la denicin actual. Ejemplo:

a C where a I a P d a B P
Consejos: Comenzar las deniciones de las funciones en la primera columna. Usar el tabulador en emacs para determinar el sangrado en las deniciones.

2.4.4.

Comentarios en Haskell

En los guiones Haskell pueden incluirse comentarios. Un comentario simple comienza con EE y se extiende hasta el nal de la lnea. Ejemplo de comentario simple:

EE @ftoril nA es el ftoril del nmero nF ftoril n a produt IFFn

26

Temas de programacin funcional (201011)

Un comentario anidado comienza con {E y termina en E} Ejemplo de comentario anidado:

{E @ftoril nA es el ftoril del nmero nF or ejemploD ftoril Q aa T E} ftoril n a produt IFFn

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 1: Conceptos fundamentales. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 2: First steps. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 1: Getting Started. 4. B. Pope y A. van IJzendoorn A Tour of the Haskell Prelude (basic functions) 5. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introduccin a Haskell. 6. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 2: Getting started with Haskell and Hugs.

Tema 3 Tipos y clases


Contenido
3.1. Conceptos bsicos sobre tipos . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2. Tipos bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3. Tipos compuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.1. Tipos listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3.2. Tipos tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3.3. Tipos funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.4. Parcializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5. Polimorsmo y sobrecarga . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.5.1. Tipos polimrcos . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.5.2. Tipos sobrecargados . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.6. Clases bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.1.

Conceptos bsicos sobre tipos


Un tipo es una coleccin de valores relacionados. Un ejemplo de tipos es el de los valores booleanos: fool El tipo fool tiene dos valores rue (verdadero) y plse (falso).

Qu es un tipo?

v XX representa que v es un valor del tipo y se dice que v tiene tipo .


Clculo de tipo con Xtype 27

28

Temas de programacin funcional (201011)

reludeb Xtype rue rue XX fool reludeb Xtype plse plse XX fool
El tipo fool Eb fool est formado por todas las funciones cuyo argumento y valor son booleanos. Ejemplo de tipo fool Eb fool

reludeb Xtype not not XX fool Eb fool


Inferencia de tipos Regla de inferencia de tipos f :: A B e :: A f e :: B Tipos de expresiones:

reludeb Xtype not rue not rue XX fool reludeb Xtype not plse not plse XX fool reludeb Xtype not @not plseA not @not plseA XX fool
Error de tipo:

reludeb Xtype not irrorX xo instne reludeb Xtype I C irrorX xo instne


Ventajas de los tipos

Q for @xum foolA plse for @xum foolA

Los lenguajes en los que la inferencia de tipo precede a la evaluacin se denominan de tipos seguros. Haskell es un lenguaje de tipos seguros.

Tema 3. Tipos y clases

29

En los lenguajes de tipos seguros no ocurren errores de tipos durante la evaluacin. La inferencia de tipos no elimina todos los errores durante la evaluacin. Por ejemplo,

reludeb Xtype I div H I div H XX @sntegrl tA ab t reludeb I div H BBB ixeptionX divide y zero

3.2.

Tipos bsicos
fool (Valores lgicos):
Sus valores son rue y plse.

ghr (Caracteres):
Ejemplos: 99, 9f9, 9Q9, 9C9

tring (Cadena de caracteres):


Ejemplos: 44, 4I C P a Q4

snt (Enteros de precisin ja):


Enteros entre 231 y 231 1. Ejemplos: IPQ, EIP

snteger (Enteros de precisin arbitraria):


Ejemplos: IPTUTSHTHHPPVPPWRHIRWTUHQPHSQUT.

plot (Reales de precisin arbitraria):


Ejemplos: IFP, EPQFRS, RSeEU

houle (Reales de precisin doble):


Ejemplos: IFP, EPQFRS, RSeEU

30

Temas de programacin funcional (201011)

3.3.
3.3.1.

Tipos compuestos
Tipos listas
Una lista es una sucesin de elementos del mismo tipo.

es el tipo de las listas de elementos de tipo .


Ejemplos de listas:

plseD rue XX fool 99D99D9d9 XX ghr 4uno4D4tres4 XX tring


Longitudes: La longitud de una lista es el nmero de elementos. La lista de longitud 0, , es la lista vaca. Las listas de longitud 1 se llaman listas unitarias. Comentarios: El tipo de una lista no informa sobre su longitud:

99D99 XX ghr 99D99D99 XX ghr


El tipo de los elementos de una lista puede ser cualquiera:

99D99D99 XX ghr

3.3.2.

Tipos tuplas

Una tupla es una sucesin de elementos.

( T1 , T2 , . . . , Tn ) es el tipo de las ntuplas cuya componente isima es de tipo Ti .


Ejemplos de tuplas:

@plseDrueA XX @foolDfoolA @plseD99DrueA XX @foolDghrDfoolA


Aridades: La aridad de una tupla es el nmero de componentes. La tupla de aridad 0, @A, es la tupla vaca.

Tema 3. Tipos y clases

31

No estn permitidas las tuplas de longitud 1. Comentarios: El tipo de una tupla informa sobre su longitud:

@99D99A XX @ghrDghrA @99D99D99A XX @ghrDghrDghrA


El tipo de los elementos de una tupla puede ser cualquiera:

@@99D99AD99D9d9A XX @@ghrDghrADghrA

3.3.3.

Tipos funciones

Tipos funciones Una funcin es una aplicacin de valores de un tipo en valores de otro tipo. T1 T2 es el tipo de las funciones que aplica valores del tipo T1 en valores del tipo T2 . Ejemplos de funciones:

not XX fool Eb fool ishigit XX ghr Eb fool


Funciones con mltiples argumentos o valores Ejemplo de funcin con mltiples argumentos: sum @xDyA es la suma de x e y. Por ejemplo, sum @PDQA es S.

sum XX @sntDsntA Eb snt sum @xDyA a xCy


Ejemplo de funcin con mltiples valores: degeroe S es la lista de los nmeros desde H hasta n. Por ejemplo, degeroe n es HDIDPDQDRDS.

degeroe XX snt Eb snt degeroe n a HFFn


Notas: 1. En las deniciones se ha escrito la signatura de las funciones. 2. No es obligatorio escribir la signatura de las funciones. 3. Es conveniente escribir las signatura.

32

Temas de programacin funcional (201011)

3.4.

Parcializacin
Mecanismo de parcializacin (currying en ingls): Las funciones de ms de un argumento pueden interpretarse como funciones que toman un argumento y devuelven otra funcin con un argumento menos. Ejemplo de parcializacin:

Parcializacin

sum9 XX snt Eb @snt Eb sntA sum9 x y a xCy sum9 toma un entero x y devuelve la funcin sum9 x que toma un entero y y devuelve la suma de x e y. Por ejemplo, Bwinb Xtype sum9 P sum9 P XX snt Eb snt Bwinb Xtype sum9 P Q sum9 P Q XX snt
Ejemplo de parcializacin con tres argumentos:

mult XX snt Eb @snt Eb @snt Eb sntAA mult x y z a xByBz mult toma un entero x y devuelve la funcin mult x que toma un entero y y devuelve la funcin mult x y que toma un entero z y devuelve xByBz. Por ejemplo, Bwinb mult P Bwinb mult P Bwinb mult P Xtype mult P XX snt Eb @snt Eb sntA Xtype mult P Q Q XX snt Eb snt Xtype mult P Q U Q U XX snt

Aplicacin parcial Las funciones que toman sus argumentos de uno en uno se llaman curricadas (curried en ingls). Las funciones sum9 y mult son curricadas.

Tema 3. Tipos y clases

33

Las funciones curricadas pueden aplicarse parcialmente. Por ejemplo,

Bwinb @sum9 PA Q S
Pueden denirse funciones usando aplicaciones parciales. Por ejemplo,

su XX snt Eb snt su a sum9 I su x es el sucesor de x. Por ejemplo, su P es Q.


Convenios para reducir parntesis Convenio 1: Las echas en los tipos se asocia por la derecha. Por ejemplo, snt Eb snt Eb snt Eb snt representa a snt Eb @snt Eb @snt Eb sntAA Convenio 2: Las aplicaciones de funciones se asocia por la izquierda. Por ejemplo, mult x y z representa a @@mult xA yA z Nota: Todas las funciones con mltiples argumentos se denen en forma curricada, salvo que explcitamente se diga que los argumentos tienen que ser tuplas.

3.5.
3.5.1.

Polimorsmo y sobrecarga
Tipos polimrcos
Un tipo es polimrco (tiene muchas formas) si contiene una variable de tipo. Una funcin es polimrca si su tipo es polimrco. La funcin length es polimca: Comprobacin:

reludeb Xtype length length XX Eb snt


Signica que que para cualquier tipo , length toma una lista de elementos de tipo y devuelve un entero.

34

Temas de programacin funcional (201011)

es una variable de tipos. Las variables de tipos tienen que empezar por minscula. Ejemplos:

length ID RD UD I ; length 4vunes4D 4wrtes4D 4tueves4 ; length reverseD til ;


Ejemplos de funciones polimrcas

R Q P

fst XX @D A Eb fst @ID9x9A ; fst @rueD4roy4A ; hed XX Eb hed PDIDR ; hed 99D99 ; P 99 I rue

tke XX snt Eb Eb tke Q QDSDUDWDR tke P 9l9D9o9D9l9D99 tke P 4lol4


; ; ;

QDSDU 4lo4 4lo4

zip XX Eb Eb @D A zip QDS 4lo4 ; id XX Eb id Q id 9x9


; ;

@QD9l9AD@SD9o9A

Q 9x9

3.5.2.

Tipos sobrecargados

Un tipo est sobrecargado si contiene una restriccin de clases. Una funcin est sobregargada si su tipo est sobrecargado. La funcin sum est sobrecargada: Comprobacin:

Tema 3. Tipos y clases

35

reludeb Xtype sum sum XX @xum A ab Eb


Signica que que para cualquier tipo numrico , sum toma una lista de elementos de tipo y devuelve un valor de tipo . xum es una restriccin de clases. Las restricciones de clases son expresiones de la forma g , donde g es el nombre de una clase y es una variable de tipo. Ejemplos:

sum PD QD S sum PFID QFPQD SFQRS


Ejemplos de tipos sobrecargados

; ;

IH IHFTUS

Ejemplos de funciones sobrecargadas: @EA @BA s

XX @xum A ab Eb Eb XX @xum A ab Eb Eb XX @xum A ab Eb

negte XX @xum A ab Eb signum XX @xum A ab Eb Ejemplos de nmeros sobrecargados: S

XX @xum tA ab t

SFP XX @prtionl tA ab t

3.6.

Clases bsicas
Una clase es una coleccin de tipos junto con ciertas operaciones sobrecargadas llamadas mtodos. Clases bsicas: iq yrd how ed xum sntegrl prtionl

tipos comparables por igualdad tipos ordenados tipos mostrables tipos legibles tipos numricos tipos enteros tipos fraccionarios

36

Temas de programacin funcional (201011)

La clase iq (tipos comparables por igualdad)

iq contiene los tipos cuyos valores con comparables por igualdad.


Mtodos:

@aaA XX Eb Eb fool @GaA XX Eb Eb fool


Instancias: fool, ghr, tring, snt, snteger, plot y houle. tipos compuestos: listas y tuplas. Ejemplos:

plse aa rue plse Ga rue 99 aa 99 4ei4 aa 4ei4 PDQ aa PDQDP @99DSA aa @99DSA

; ; ; ; ; ;

plse rue plse rue plse rue

La clase yrd (tipos ordenados)

yrd es la subclase de iq de tipos cuyos valores estn ordenados.


Mtodos:

@`AD @`aAD @bAD @baA XX Eb Eb fool minD mx XX Eb Eb


Instancias: fool, ghr, tring, snt, snteger, plot y houle. tipos compuestos: listas y tuplas. Ejemplos:

plse ` rue min 99 99 4elegnte4 ` 4elefnte4 IDPDQ ` IDP @99DPA ` @99DIA @99DPA ` @99DIA

; ; ; ; ; ;

rue 99 plse plse plse rue

Tema 3. Tipos y clases

37

La clase how (tipos mostrables)

how contiene los tipos cuyos valores se pueden convertir en cadenas de caracteres.
Mtodo:

show XX Eb tring
Instancias: fool, ghr, tring, snt, snteger, plot y houle. tipos compuestos: listas y tuplas. Ejemplos:

show show show show show

plse 99 IPQ IDPDQ @99DrueA

; ; ; ; ;

4plse4 4994 4IPQ4 4IDPDQ4 4@99DrueA4

La clase ed (tipos legibles)

ed contiene los tipos cuyos valores se pueden obtener a partir de cadenas de caracteres.
Mtodo:

red XX tring Eb
Instancias: fool, ghr, tring, snt, snteger, plot y houle. tipos compuestos: listas y tuplas. Ejemplos:

red red red red red

4plse4 XX fool 4994 XX ghr 4IPQ4 XX snt 4IDPDQ4 XX snt 4@99DrueA4 XX @ghrDfoolA

; ; ; ; ;

plse 99 IPQ IDPDQ @99DrueA

38

Temas de programacin funcional (201011)

La clase xum (tipos numricos)

xum es la subclase de iq y yrd de tipos cuyos valores son nmeros


Mtodos:

@CAD @BAD @EA XX Eb Eb negteD sD signum XX Eb


Instancias: snt, snteger, plot y houle. Ejemplos:

PCQ PFQCRFP negte PFU s @ESA signum @ESA

; ; ; ; ;

S TFS EPFU S EI

La clase sntegrl (tipos enteros)

sntegrl es la subclase de xum cuyo tipos tienen valores enteros.


Mtodos:

div XX Eb Eb mod XX Eb Eb
Instancias: snt e snteger. Ejemplos:

II div R ; II mod R ;

P Q

La clase prtionl (tipos fraccionarios)

prtionl es la subclase de xum cuyo tipos tienen valores no son enteros.


Mtodos:

@GA XX Eb Eb reip XX Eb
Instancias: plot y houle.

Tema 3. Tipos y clases

39

Ejemplos:

UFH G PFH ; reip HFP ;

QFS SFH

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 2: Tipos de datos simples. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 3: Types and classes. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 2: Types and Functions. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introduccin a Haskell. Cap. 5: El sistema de clases de Haskell. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 3: Basic types and denitions.

40

Temas de programacin funcional (201011)

Tema 4 Denicin de funciones


Contenido
4.1. Deniciones por composicin . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2. Deniciones con condicionales . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3. Deniciones con ecuaciones con guardas . . . . . . . . . . . . . . . . . . 36 4.4. Deniciones con equiparacin de patrones . . . . . . . . . . . . . . . . . 36 4.4.1. Constantes como patrones . . . . . . . . . . . . . . . . . . . . . . . 36 4.4.2. Variables como patrones . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4.3. Tuplas como patrones . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4.4. Listas como patrones . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.4.5. Patrones enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.5. Expresiones lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.6. Secciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.1.

Deniciones por composicin


Decidir si un carcter es un dgito:

ishigit XX ghr Eb fool ishigit a ba 9H9 88 `a 9W9


Decidir si un entero es par:

relude

relude even XX @sntegrl A ab Eb fool even n a n rem P aa H


41

42

Temas de programacin funcional (201011)

Dividir una lista en su nsimo elemento: relude splitet XX snt Eb Eb @DA splitet n xs a @tke n xsD drop n xsA

4.2.

Deniciones con condicionales


Calcular el valor absoluto (con condicionales): relude s XX snt Eb snt s n a if n ba H then n else En Calcular el signo de un nmero (con condicionales anidados): relude signum XX snt Eb snt signum n a if n ` H then @EIA else if n aa H then H else I

4.3.

Deniciones con ecuaciones con guardas


Calcular el valor absoluto (con ecuaciones guardadas): relude s n | n ba H a n | otherwise a En Calcular el signo de un nmero (con ecuaciones guardadas): relude signum n | n ` H a EI | n aa H a H | otherwise a I

4.4.
4.4.1.

Deniciones con equiparacin de patrones


Constantes como patrones
Calcular la negacin:

Tema 4. Denicin de funciones

43

not XX fool Eb fool not rue a plse not plse a rue


Calcular la conjuncin (con valores):

relude

@88A rue rue plse plse

XX 88 88 88 88

fool Eb rue a plse a rue a plse a

fool Eb fool rue plse plse plse

relude

4.4.2.

Variables como patrones

Calcular la conjuncin (con variables annimas): relude @88A XX fool Eb fool Eb fool rue 88 rue a rue 88 a plse Calcular la conjuncin (con variables): relude @88A XX fool Eb fool Eb fool rue 88 x a x plse 88 a plse

4.4.3.

Tuplas como patrones

Calcular el primer elemento de un par: relude fst XX @DA Eb fst @xDA a x Calcular el segundo elemento de un par: relude snd XX @DA Eb snd @DyA a y

44

Temas de programacin funcional (201011)

4.4.4.

Listas como patrones


testI XX ghr Eb fool testI 99DD a rue testI a plse

@testI xsA se verica si xs es una lista de 3 caracteres que empieza por 99.

Construccin de listas con @XA

IDPDQ a IXPDQ a IX@PXQA a IX@PX@QXAA @testP xsA se verica si xs es una lista de caracteres que empieza por 99. testP XX ghr Eb fool testP @99XA a rue testP a plse
Decidir si una lista es vaca:

null XX Eb fool null a rue null @XA a plse


Primer elemento de una lista:

relude

hed XX Eb hed @xXA a x


Resto de una lista:

relude

til XX Eb til @XxsA a xs

relude

4.4.5.

Patrones enteros
pred XX snt Eb snt pred H a H pred @nCIA a n relude

Predecesor de un nmero entero:

Tema 4. Denicin de funciones

45

Comentarios sobre los patrones nCk: nCk slo se equipara con nmeros mayores o iguales que k Hay que escribirlo entre parntesis.

4.5.

Expresiones lambda
Las funciones pueden construirse sin nombrarlas mediante las expresiones lambda. Ejemplo de evaluacin de expresiones lambda:

reludeb @x Eb xCxA Q T
Uso de las expresiones lambda para resaltar la parcializacin:

@sum x yA es la suma de x e y.
Denicin sin lambda:

sum x y a xCy
Denicin con lambda:

sum9 a x Eb @y Eb xCyA
Uso de las expresiones lambda en funciones como resultados:

@onst x yA es x.
Denicin sin lambda:

onst XX Eb Eb onst x a x
Denicin con lambda:

relude

onst9 XX Eb @ Eb A onst9 x a Eb x
Uso de las expresiones lambda en funciones con slo un uso:

@impres nA es la lista de los n primeros nmeros impares.

46

Temas de programacin funcional (201011)

Denicin sin lambda:

impres n a mp f HFFnEI where f x a PBxCI


Denicin con lambda:

impres9 n a mp @x Eb PBxCIA HFFnEI

4.6.

Secciones
Los operadores son las funciones que se escriben entre sus argumentos. Los operadores pueden convertirse en funciones prejas escribindolos entre parntesis. Ejemplo de conversin:

reludeb P C Q S reludeb @CA P Q S


Ejemplos de secciones:

reludeb @PCA Q S reludeb @CQA P S


Expresin de secciones mediante lambdas Sea B un operador. Entonces

@BA

a x Eb @y Eb xByA

@xBA a y Eb xBy @ByA a x Eb xBy

Tema 4. Denicin de funciones

47

Aplicaciones de secciones Uso en deniciones de funciones mediante secciones

sum9 siguiente inverso dole mitd

a a a a a

@CA @ICA @IGA @PBA @GPA

Uso en signatura de operadores:

@88A XX fool Eb fool Eb fool


Uso como argumento:

relude

reludeb mp @PBA IFFS PDRDTDVDIH

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 1: Conceptos fundamentales. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 4: Dening functions. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 2: Types and Functions. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introduccin a Haskell. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 3: Basic types and denitions.

48

Temas de programacin funcional (201011)

Tema 5 Deniciones de listas por comprensin


Contenido
5.1. Generadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2. Guardas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.3. La funcin zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.4. Comprensin de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.5. Cifrado Csar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.5.1. Codicacin y descodicacin . . . . . . . . . . . . . . . . . . . . 48 5.5.2. Anlisis de frecuencias . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.5.3. Descifrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

5.1.

Generadores

Deniciones por comprensin Deniciones por comprensin en Matemticas: { x2 : x {2, 3, 4, 5}} = {4, 9, 16, 25} Deniciones por comprensin en Haskell:

reludeb xP | x `E PFFS RDWDITDPS


La expresin x `E PFFS se llama un generador. Ejemplos con ms de un generador:

49

50

Temas de programacin funcional (201011)

reludeb @xDyA | x `E IDPDQD y `E RDS @IDRAD@IDSAD@PDRAD@PDSAD@QDRAD@QDSA reludeb @xDyA | y `E RDSD x `E IDPDQ @IDRAD@PDRAD@QDRAD@IDSAD@PDSAD@QDSA
Generadores dependientes Ejemplo con generadores dependientes:

reludeb @xDyA | x `E IFFQD y `E xFFQ @IDIAD@IDPAD@IDQAD@PDPAD@PDQAD@QDQA @ont xssA es la concatenacin de la lista de listas xss. Por ejemplo, ont IDQDPDSDTDRDU ; IDQDPDSDTDRDU relude

ont XX Eb ont xss a x | xs `E xssD x `E xs

Generadores con variables annimas Ejemplo de generador con variable annima: @primeros psA es la lista de los primeros elementos de la lista de pares ps. Por ejemplo,

primeros @IDQAD@PDSAD@TDQA ; primeros XX @D A Eb primeros ps a x | @xDA `E ps

IDPDT

Denicin de la longitud por comprensin relude length XX Eb snt length xs a sum I | `E xs

Tema 5. Deniciones de listas por comprensin

51

5.2.

Guardas
Las listas por comprensin pueden tener guardas para restringir los valores. Ejemplo de guarda:

reludeb x | x `E IFFIHD even x PDRDTDVDIH


La guarda es even x.

@ftores nA es la lista de los factores del nmero n. Por ejemplo, ftores QH


;

IDPDQDSDTDIHDISDQH

ftores XX snt Eb snt ftores n a x | x `E IFFnD n mod x aa H @primo nA se verica si n es primo. Por ejemplo, primo QH primo QI
; plse ; rue

primo XX snt Eb fool primo n a ftores n aa ID n @primos nA es la lista de los primos menores o iguales que n. Por ejemplo, primos QI
; PDQDSDUDIIDIQDIUDIWDPQDPWDQI

primos XX snt Eb snt primos n a x | x `E PFFnD primo x


Guarda con igualdad Una lista de asociacin es una lista de pares formado por una clave y un valor. Por ejemplo,

@4tun4DUAD@4en4DWAD@4iv4DQA @us tA es la lista de los valores de la lista de asociacin t cuyas claves valen . Por ejemplo,

52

Temas de programacin funcional (201011)

reludeb us 99 @99DIAD@99DQAD@99DSAD@99DPA QDP us XX iq ab Eb @D A Eb us t a v | @9D vA `E tD 9 aa

5.3.

La funcin zip
@zip xs ysA es la lista obtenida emparejando los elementos de las listas xs e ys. Por ejemplo, reludeb zip 99D99D99 PDSDRDU @99DPAD@99DSAD@99DRA @dyentes xsA es la lista de los pares de elementos adyacentes de la lista xs. Por ejemplo, dyentes PDSDQDU ; @PDSAD@SDQAD@QDUA

La funcin zip y elementos adyacentes

dyentes XX Eb @D A dyentes xs a zip xs @til xsA


Las funciones zip, nd y listas ordenadas

@nd xsA se verica si todos los elementos de xs son verdaderos. Por ejemplo, nd P ` QD PCQ aa S nd P ` QD PCQ aa SD U ` U
; ;

rue plse

@ordend xsA se verica si la lista xs est ordenada. Por ejemplo, ordend IDQDSDTDU ; ordend IDQDTDSDU ; rue plse

ordend XX yrd ab Eb fool ordend xs a nd x `a y | @xDyA `E dyentes xs

Tema 5. Deniciones de listas por comprensin

53

La funcin zip y lista de posiciones

@posiiones x xsA es la lista de las posiciones ocupadas por el elemento x en la lista xs. Por ejemplo, posiiones S IDSDQDSDSDU
;

IDQDR

posiiones XX iq ab Eb Eb snt posiiones x xs a i | @x9DiA `E zip xs HFFnD x aa x9 where n a length xs E I

5.4.

Comprensin de cadenas

Cadenas y listas Las cadenas son listas de caracteres. Por ejemplo,

Bwinb 44 aa 99D99D99 rue


La expresin

44 XX tring
es equivalente a

99D99D99 XX ghr
Las funciones sobre listas se aplican a las cadenas:

length 4de4 reverse 4de4 4de4 CC 4fg4 posiiones 99 4lmn4

; ; ; ;

S 4ed4 4defg4 IDQDSDV

Deniciones sobre cadenas con comprensin

@minusuls A es la cadena formada por las letras minsculas de la cadena . Por ejemplo, minusuls 4istoisnrue4 ; 4stosnrue4

54

Temas de programacin funcional (201011)

minusuls XX tring Eb tring minusuls xs a x | x `E xsD elem x 99FF9z9 @ourrenis x xsA es el nmero de veces que ocurre el carcter x en la cadena xs. Por ejemplo, ourrenis 99 4lmn4
;

ourrenis XX ghr Eb tring Eb snt ourrenis x xs a length x9 | x9 `E xsD x aa x9

5.5.

Cifrado Csar
En el cifrado Csar cada letra en el texto original es reemplazada por otra letra que se encuentra 3 posiciones ms adelante en el alfabeto. La codicacin de

4en todo l medid4


es

4hq wrgr od phglgd4


Se puede generalizar desplazando cada letra n posiciones. La codicacin con un desplazamiento 5 de

4en todo l medid4


es

4js ytit qf rjinif4


La descodicacin de un texto codicado con un desplazamiento n se obtiene codicndolo con un desplazamiento n.

Tema 5. Deniciones de listas por comprensin

55

5.5.1.

Codicacin y descodicacin

Las funciones ord y hr

@ord A es el cdigo del carcter . Por ejemplo, ord 99 ord 99 ord 9e9
; ; ;

WU WV TS

@hr nA es el carcter de cdigo n. Por ejemplo, hr WU hr WV hr TS


; ; ;

99 99 9e9

Codicacin y descodicacin: Cdigo de letra Simplicacin: Slo se codicarn las letras minsculas dejando los restantes caracteres sin modicar.

@letPint A es el entero correspondiente a la letra minscula . Por ejemplo, letPint 99 letPint 9d9 letPint 9z9
; ; ;

H Q PS

letPint XX ghr Eb snt letPint a ord E ord 99


Codicacin y descodicacin: Letra de cdigo

@intPlet nA es la letra minscula correspondiente al entero n. Por ejemplo, intPlet H intPlet Q intPlet PS
; ; ;

99 9d9 9z9

intPlet XX snt Eb ghr intPlet n a hr @ord 99 C nA

56

Temas de programacin funcional (201011)

Codicacin y descodicacin: Desplazamiento

@desplz n A es el carcter obtenido desplazando n caracteres el carcter . Por ejemplo, desplz Q 99 desplz Q 9y9 desplz @EQA 9d9 desplz @EQA 99
; ; ; ;

9d9 99 99 9y9

desplz XX snt Eb ghr Eb ghr desplz n | elem 99FF9z9 a intPlet @@letPint CnA mod PTA | otherwise a
Codicacin y descodicacin

@odifi n xsA es el resultado de codicar el texto xs con un desplazamiento n. Por ejemplo, reludeb 4iq wrgr reludeb 4in todo odifi Q 4in todo l medid4 od phglgd4 odifi @EQA 4iq wrgr od phglgd4 l medid4

odifi XX snt Eb tring Eb tring odifi n xs a desplz n x | x `E xs


Propiedades de la codicacin con QuickCheck Propiedad: Al desplazar n un carcter desplazado n, se obtiene el carcter inicial.

propdesplz n xs a desplz @EnA @desplz n xsA aa xs Bwinb quikghek propdesplz CCC yuD pssed IHH testsF
Propiedad: Al codicar con n una cadena codicada con n, se obtiene la cadena inicial.

Tema 5. Deniciones de listas por comprensin

57

propodifi n xs a odifi @EnA @odifi n xsA aa xs Bwinb quikghek propodifi CCC yuD pssed IHH testsF

5.5.2.

Anlisis de frecuencias

Tabla de frecuencias Para descifrar mensajes se parte de la frecuencia de aparicin de letras.

tl es la lista de la frecuencias de las letras en castellano, Por ejemplo, la frecuencia de la 99 es del 12.53 %, la de la 99 es 1.42 %. tl XX plot tl a IPFSQD IFRPD HFUHD TFPSD VFTVD PFSID HFWHD HFHPD
Frecuencias

RFTVD HFRRD HFVVD HFPPD

SFVTD HFHID TFVUD HFWHD

IQFTVD HFTWD IFHID RFWUD QFISD TFUID UFWVD RFTQD QFWQD HFSP

@porentje n mA es el porcentaje de n sobre m. Por ejemplo, porentje P S ; RHFH

porentje XX snt Eb snt Eb plot porentje n m a @fromsntegrl n G fromsntegrl mA B IHH @freuenis xsA es la frecuencia de cada una de las minsculas de la cadena xs. Por ejemplo, reludeb freuenis 4en todo l medid4 IRFQDHDHDPIFRDIRFQDHDHDHDUFIDHDHDUFID UFIDUFIDIRFQDHDHDHDHDUFIDHDHDHDHDHDH freuenis XX tring Eb plot freuenis xs a porentje @ourrenis x xsA n | x `E 99FF9z9 where n a length @minusuls xsA

58

Temas de programacin funcional (201011)

5.5.3.

Descifrado

Descifrado: Ajuste chi cuadrado Una medida de la discrepancia entre la distribucin observada osi y la esperada esi es n 1 (osi esi )2 2 = esi i =0 Los menores valores corresponden a menores discrepancias.

@higud os esA es la medida chi cuadrado de las distribuciones os y es. Por ejemplo, higud QDSDT QDSDT higud QDSDT SDTDQ
; ;

HFH QFWTTTTTU

higud XX plot Eb plot Eb plot higud os es a sum @@oEeAPAGe | @oDeA `E zip os es


Descifrado: Rotacin

@rot n xsA es la lista obtenida rotando n posiciones los elementos de la lista xs. Por ejemplo, rot P 4mnolo4 ; 4nolom4

rot XX snt Eb Eb rot n xs a drop n xs CC tke n xs


Descifrado (descifra xs) es la cadena obtenida descodicando la cadena xs por el anti-desplazamiento que produce una distribucin de minsculas con la menor desviacin chi cuadrado respecto de la tabla de distribucin de las letras en castellano. Por ejemplo,

Bwinb odifi S 4odo pr nd4 4tit ufwf sfif4 Bwinb desifr 4tit ufwf sfif4 4odo pr nd4

Tema 5. Deniciones de listas por comprensin

59

desifr desifr where ftor tghi tl9

XX tring Eb tring xs a odifi @EftorA xs a hed @posiiones @minimum tghiA tghiA a higud @rot n tl9A tl | n `E HFFPS a freuenis xs

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 4: Listas. 2. G. Hutton Programming in Haskell. Cambridge University Press. Cap. 5: List comprehensions. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 12: Barcode Recognition. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 6: Programacin con listas. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 5: Data types: tuples and lists.

60

Temas de programacin funcional (201011)

Tema 6 Funciones recursivas


Contenido
6.1. Recursin numrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 6.2. Recusin sobre lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.3. Recursin sobre varios argumentos . . . . . . . . . . . . . . . . . . . . . 57 6.4. Recursin mltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.5. Recursin mutua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 6.6. Heursticas para las deniciones recursivas . . . . . . . . . . . . . . . . 59

6.1.

Recursin numrica
La funcin factorial:

Recursin numrica: El factorial

ftoril XX snteger Eb snteger ftoril H a I ftoril @n C IA a @n C IA B ftoril n


Clculo:

ftoril Q a a a a a a a

Q Q Q Q Q Q T

B B B B B B

@ftoril PA @P B @ftoril IAA @P B @I B @ftoril HAAA @P B @I B IAA @P B IA P

61

62

Temas de programacin funcional (201011)

Recursin numrica: El producto Denicin recursiva del producto:

por XX snt Eb snt Eb snt m por H a H m por @n C IA a m C @m por nA


Clculo:

Q por P a a a a a

Q Q Q Q T

C C C C

@Q por IA @Q C @Q por HAA @Q C HA Q

6.2.

Recusin sobre lista

Recursin sobre listas: La funcin produt Producto de una lista de nmeros:

produt XX xum ab Eb produt a I produt @nXnsA a n B produt ns


Clculo:

relude

produt UDSDP a a a a a a a

U B U B U B U B U B U B UH

@produt SDPA @S B @produt PAA @S B @P B @produt AAA @S B @P B IAA @S B PA IH

Recursin sobre listas: La funcin length Longitud de una lista:

Tema 6. Funciones recursivas

63

length XX Eb snt length a H length @XxsA a I C length xs


Clculo:

relude

length PDQDS a a a a a a a

I I I I I I Q

C C C C C C

@length QDSA @I C @length SAA @I C @I C @length AAA @I C @I C HAA @I C IA P

Recursin sobre listas: La funcin reverse Inversa de una lista:

reverse XX Eb reverse a reverse @xXxsA a reverse xs CC x


Clculo:

relude

reverse PDSDQ a a a a a a a
Recursin sobre listas: CC

@reverse SDQA CC P @@reverse QA CC SA CC P @@@reverse A CC QA CC SA CC P @@ CC QA CC SA CC P @Q CC SA CC P QDS CC P QDSDP

Concatenacin de listas:

@CCA XX Eb Eb CC ys a ys @xXxsA CC ys a x X @xs CC ysA

relude

64

Temas de programacin funcional (201011)

Clculo:

IDQDS CC PDR a a a a a a a

IX@QDS CC PDRA IX@QX@S CC PDRAA IX@QX@SX@ CC PDRAAA IX@QX@SXPDRAA IX@QXSDPDRA IXQDSDPDR IDQDSDPDR

Recursin sobre listas: Insercin ordenada

@insert e xsA inserta el elemento e en la lista xs delante del primer elemento de xs mayor o igual que e. Por ejemplo, insert S PDRDUDQDTDVDIH ; PDRDSDUDQDTDVDIH insert XX yrd ab Eb Eb insert e a e insert e @xXxsA | e `a x a e X @xXxsA | otherwise a x X insert e xs
Clculo:

insert R IDQDSDU a a a a a

IX@insert R QDSDUA IX@QX@insert R SDUAA IX@QX@RX@SXUAAA IX@QX@RXSDUAA IDQDRDSDU

Recursin sobre listas: Ordenacin por insercin

@ordenporinserion xsA es la lista xs ordenada mediante insercin, Por ejemplo, ordenporinserion PDRDQDTDQ ; PDQDQDRDT ordenporinserion XX yrd ab Eb ordenporinserion a ordenporinserion @xXxsA a insert x @ordenporinserion xsA

Tema 6. Funciones recursivas

65

Clculo:

a a a a

ordenporinserion UDWDT a insert U @insert W @insert T AA insert U @insert W TA insert U TDW TDUDW

6.3.

Recursin sobre varios argumentos


Emparejamiento de elementos (la funcin zip): relude zip XX Eb Eb @D A zip a zip a zip @xXxsA @yXysA a @xDyA X zip xs ys Clculo:

Recursin sobre varios argumentos: La funcin zip

a a a a a

zip IDQDS PDRDTDV @IDPA X @zip QDS RDTDVA @IDPA X @@QDRA X @zip S TDVAA @IDPA X @@QDRA X @@SDTA X @zip VAAA @IDPA X @@QDRA X @@SDTA X AA @IDPAD@QDRAD@SDTA

Recursin sobre varios argumentos: La funcin drop Eliminacin de elementos iniciales:

drop drop drop drop

XX snt Eb Eb H xs a xs @nCIA a @nCIA @xXxsA a drop n xs

relude

Clculo:

66

Temas de programacin funcional (201011)

drop P SDUDWDR a drop I UDWDR a drop H WDR a WDR

| | | |

drop S IDR a drop R R a drop I a

6.4.

Recursin mltiple

Recursin mltiple: La funcin de Fibonacci La sucesin de Fibonacci es: 0,1,1,2,3,5,8,13,21,. . . . Sus dos primeros trminos son 0 y 1 y los restantes se obtienen sumando los dos anteriores.

@fioni nA es el nsimo trmino de la sucesin de Fibonacci. Por ejemplo, fioni V fioni fioni fioni fioni
;

PI

XX snt Eb snt H a H I a I @nCPA a fioni n C fioni @nCIA

Recursin mltiple: Ordenacin rpida Algoritmo de ordenacin rpida:

orden XX @yrd A ab Eb orden a orden @xXxsA a @orden menoresA CC x CC @orden myoresA where menores a | `E xsD `a x myores a | `E xsD b x

6.5.

Recursin mutua

Recursin mutua: Par e impar Par e impar por recursin mutua:

Tema 6. Funciones recursivas

67

pr XX snt Eb fool pr H a rue pr @nCIA a impr n impr XX snt Eb fool impr H a plse impr @nCIA a pr n
Clculo:

a a a a

impr Q pr P impr I pr H rue

| | | | |

a a a a

pr Q impr P pr I impr H plse

Recursin mutua: Posiciones pares e impares

@pres xsA son los elementos de xs que ocupan posiciones pares. @impres xsA son los elementos de xs que ocupan posiciones impares. pres XX Eb pres a pres @xXxsA a x X impres xs impres XX Eb impres a impres @XxsA a pres xs
Clculo:

a a a a a

pres IDQDSDU IX@impres QDSDUA IX@pres SDUA IX@SX@impres UAA IX@SXA IDS

68

Temas de programacin funcional (201011)

6.6.

Heursticas para las deniciones recursivas

Aplicacin del mtodo: La funcin produt Paso 1: Denir el tipo:

produt XX snt Eb snt


Paso 2: Enumerar los casos:

produt XX snt Eb snt produt a produt @nXnsA a


Paso 3: Denir los casos simples:

produt XX snt Eb snt produt a I produt @nXnsA a


Paso 4: Denir los otros casos:

produt XX snt Eb snt produt a I produt @nXnsA a n B produt ns


Paso 5: Generalizar y simplicar:

produt XX xum ab Eb produt a foldr @BA I


donde @foldr op e lA pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al nal. Por ejemplo,

foldr @CA T PDQDS ; PC@QC@SCTAA ; IT foldr @EA T PDQDS ; PE@QE@SETAA ; EP

Tema 6. Funciones recursivas

69

Aplicacin del mtodo: La funcin drop Paso 1: Denir el tipo:

drop XX snt Eb Eb
Paso 2: Enumerar los casos:

drop drop drop drop drop

XX snt Eb Eb H a H @xXxsA a @nCIA a @nCIA @xXxsA a

Paso 3: Denir los casos simples:

drop drop drop drop drop

XX snt Eb Eb H a H @xXxsA a xXxs @nCIA a @nCIA @xXxsA a

Paso 4: Denir los otros casos:

drop drop drop drop drop

XX snt Eb Eb H a H @xXxsA a xXxs @nCIA a @nCIA @xXxsA a drop n xs

Paso 5: Generalizar y simplicar:

drop drop drop drop

XX sntegrl ab Eb Eb H xs a xs @nCIA a @nCIA @XxsA a drop n xs

Aplicacin del mtodo: La funcin init

init elimina el ltimo elemento de una lista no vaca.

70

Temas de programacin funcional (201011)

Paso 1: Denir el tipo:

init XX Eb
Paso 2: Enumerar los casos:

init XX Eb init @xXxsA a


Paso 3: Denir los casos simples:

init XX Eb init @xXxsA | null xs a | otherwise a


Paso 4: Denir los otros casos:

init XX Eb init @xXxsA | null xs a | otherwise a x X init xs


Paso 5: Generalizar y simplicar:

init XX Eb init a init @xXxsA a x X init xs

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 3: Nmeros. Cap. 4: Listas. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 6: Recursive functions. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 2: Types and Functions.

Tema 6. Funciones recursivas

71

4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introduccin a Haskell. Cap. 6: Programacin con listas. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 4: Designing and writing programs.

72

Temas de programacin funcional (201011)

Tema 7 Funciones de orden superior


Contenido
7.1. Funciones de orden superior . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.2. Procesamiento de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 7.2.1. La funcin map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 7.2.2. La funcin filter . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 7.3. Funcin de plegado por la derecha: foldr . . . . . . . . . . . . . . . . . 66 7.4. Funcin de plegado por la izquierda: foldl . . . . . . . . . . . . . . . . 69 7.5. Composicin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . 70 7.6. Caso de estudio: Codicacin binaria y transmisin de cadenas . . . . 71 7.6.1. Cambio de bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 7.6.2. Codicacin y descodicacin . . . . . . . . . . . . . . . . . . . . 73

7.1.

Funciones de orden superior

Funciones de orden superior Una funcin es de orden superior si toma una funcin como argumento o devuelve una funcin como resultado.

@dosees f xA es el resultado de aplicar f a f x. Por ejemplo, dosees @BQA P dosees reverse PDSDU
; ;

IV PDSDU

73

74

Temas de programacin funcional (201011)

dosees XX @ Eb A Eb Eb dosees f x a f @f xA
Prop: dosees reverse a id donde id es la funcin identidad.

id XX Eb id x a x

relude

Usos de las funciones de orden superior Denicin de patrones de programacin. Aplicacin de una funcin a todos los elementos de una lista. Filtrado de listas por propiedades. Patrones de recursin sobre listas. Diseo de lenguajes de dominio especco: Lenguajes para procesamiento de mensajes. Analizadores sintcticos. Procedimientos de entrada/salida. Uso de las propiedades algebraicas de las funciones de orden superior para razonar sobre programas.

7.2.
7.2.1.

Procesamiento de listas
La funcin map

La funcin mp: Denicin

@mp f xsA es la lista obtenida aplicando f a cada elemento de xs. Por ejemplo, mp @BPA QDRDU mp sqrt IDPDR mp even IFFS
; TDVDIR ; IFHDIFRIRPIQSTPQUQIDPFH ; plseDrueDplseDrueDplse

Denicin de mp por comprensin:

Tema 7. Funciones de orden superior

75

mp XX @ Eb A Eb Eb mp f xs a f x | x `E xs
Denicin de mp por recursin:

mp XX @ Eb A Eb Eb mp a mp f @xXxsA a f x X mp f xs
Relacin entre sum y mp La funcin sum:

relude

sum XX snt Eb snt sum a H sum @xXxsA a x C sum xs

relude

Propiedad: sum @mp @PBA xsA a P B sum xs Comprobacin con QuickCheck:

propsummp XX snt Eb fool propsummp xs a sum @mp @PBA xsA aa P B sum xs Bwinb quikghek propsummp CCC yuD pssed IHH testsF

7.2.2.

La funcin filter

La funcin filter

filter p xs es la lista de los elementos de xs que cumplen la propiedad p. Por ejemplo, filter even IDQDSDRDPDTDI ; RDPDT filter @bQA IDQDSDRDPDTDI ; SDRDT
Denicin de filter por comprensin:

76

Temas de programacin funcional (201011)

filter XX @ Eb foolA Eb Eb filter p xs a x | x `E xsD p x


Denicin de filter por recursin:

relude filter XX @ Eb foolA Eb Eb filter a filter p @xXxsA | p x a x X filter p xs | otherwise a filter p xs

Uso conjunto de mp y filter

sumgudrdosres xs es la suma de los cuadrados de los nmeros pares de la lista xs. Por ejemplo, sumgudrdosres IFFS ; PH

sumgudrdosres XX snt Eb snt sumgudrdosres xs a sum @mp @PA @filter even xsAA
Denicin por comprensin:

sumgudrdosres9 XX snt Eb snt sumgudrdosres9 xs a sum xP | x `E xsD even x


Predenidas de orden superior para procesar listas

ll p xs se verica si todos los elementos de xs cumplen la propiedad p. Por ejemplo, ll odd IDQDS ; ll odd IDQDT ; rue plse

ny p xs se verica si algn elemento de xs cumple la propiedad p. Por ejemplo, ny odd IDQDS ; ny odd PDRDT ; rue plse

tkehile p xs es la lista de los elementos iniciales de xs que verican el predicado p. Por ejemplo,

Tema 7. Funciones de orden superior

77

tkehile even PDRDTDUDVDW ; PDRDT drophile p xs es la lista xs sin los elementos iniciales que verican el predicado p. Por ejemplo, drophile even PDRDTDUDVDW ; UDVDW

7.3.

Funcin de plegado por la derecha: foldr


Ejemplos de deniciones recursivas:

Esquema bsico de recursin sobre listas

sum sum @xXxsA produt produt @xXxsA or or @xXxsA nd nd @xXxsA

a a a a a a a a

H x C sum xs I x B produt xs plse x || or xs rue x 88 nd xs

relude

Esquema bsico de recursin sobre listas:

f a v f @xXxsA a x op @f xsA
El patrn foldr Redeniciones con el patrn foldr

sum produt or nd

a a a a

foldr foldr foldr foldr

@CA H @BA I @||A plse @88A rue

Denicin del patrn foldr

relude foldr XX @ Eb Eb A Eb Eb Eb foldr f v a v foldr f v @xXxsA a f x @foldr f v xsA

78

Temas de programacin funcional (201011)

Visin no recursiva de foldr Clculo con sum: sum PDQDS = foldr @CA H PDQDS = foldr @CA H PX@QX@SXAA = PC@QC@SCHAA = IH Clculo con sum: produt PDQDS = foldr @BA I PDQDS = foldr @BA I PX@QX@SXAA = PB@QB@SBIAA = QH

[def. de sum] [notacin de lista] [sustituir @XA por @CA y por H] [aritmtica]

[def. de sum] [notacin de lista] [sustituir @XA por @BA y por I] [aritmtica]

Clculo de foldr f v xs Sustituir en xs los @XA por f y por v. Denicin de la longitud mediante foldr Ejemplo de clculo de la longitud:

longitud PDQDS a longitud PX@QX@SXAA a IC@IC@ICHAA a Q


Sustituciones: los @XA por @ n Eb ICnA la por H

ustituiones

Denicin de length usando foldr

longitud XX Eb snt longitud a foldr @ n Eb ICnA H


Denicin de la inversa mediante foldr Ejemplo de clculo de la inversa:

Tema 7. Funciones de orden superior

79

invers PDQDS a invers PX@QX@SXAA a @@ CC SA CC QA CC P a SDQDP


Sustituciones: los @XA por @x xs Eb xs CC xA la por Denicin de invers usando foldr

ustituiones

invers XX Eb invers a foldr @x xs Eb xs CC xA


Denicin de la concatenacin mediante foldr Ejemplo de clculo de la concatenacin:

on PDQDS UDW a on PX@QX@SXAA UDW a PX@QX@SXUDWAA a PDQDSDUDW


Sustituciones: los @XA por @XA la por ys Denicin de on usando foldr

ustituiones

on xs ys a @foldr @XA ysA xs

7.4.

Funcin de plegado por la izquierda: foldl


Denicin de sum con acumuladores:

Denicin de suma de lista con acumuladores

sum XX snteger Eb snteger sum a sumeux H where sumeux v a v sumeux v @xXxsA a sumeux @vCxA xs

80

Temas de programacin funcional (201011)

Clculo con sum:

sum PDQDU a a a a a a a a

sumeux sumeux sumeux sumeux sumeux sumeux sumeux IP

H PDQDU @HCPA QDU P QDU @PCQA U S U @SCUA IP

Patrn de denicin de recursin con acumulador Patrn de denicin (generalizacin de sumeux):

f v a v f v @xXxsA a f @vBxA xs
Denicin con el patrn foldl:

sum produt or nd

a a a a

foldl foldl foldl foldl

@CA H @BA I @||A plse @88A rue

Denicin de foldl Denicin de foldl:

relude foldl XX @ Eb Eb A Eb Eb Eb foldl f v a v foldl f v @xXxsA a foldl f @f v x A xs

7.5.

Composicin de funciones

Composicin de funciones Denicin de la composicin de dos funciones:

Tema 7. Funciones de orden superior

81

relude @FA XX @ Eb A Eb @ Eb A Eb Eb f F g a x Eb f @g xA
Uso de composicin para simplicar deniciones: Deniciones sin composicin:

pr n a not @impr nA doees f x a f @f x A sumgudrdosres ns a sum @mp @PA @filter even nsAA
Deniciones con composicin:

pr a not F impr dosees f a f F f sumgudrdosres a sum F mp @PA F filter even


Composicin de una lista de funciones La funcin identidad:

id XX Eb id a x Eb x

relude

@omposiionvist fsA es la composicin de la lista de funciones fs. Por ejemplo, omposiionvist @BPAD@PA Q omposiionvist @PAD@BPA Q omposiionvist @GWAD@PAD@BPA Q
; ; ;

IV QT RFH

omposiionvist XX Eb Eb @ Eb A omposiionvist a foldr @FA id

7.6.

Caso de estudio: Codicacin binaria y transmisin de cadenas


Objetivos: 1. Denir una funcin que convierta una cadena en una lista de ceros y unos junto con otra funcin que realice la conversin opuesta.

82

Temas de programacin funcional (201011)

2. Simular la transmisin de cadenas mediante ceros y unos. Los nmeros binarios se representan mediante listas de bits en orden inverso. Un bit es cero o uno. Por ejemplo, el nmero 1101 se representa por [1,0,1,1]. El tipo fit es el de los bits.

type fit a snt

7.6.1.

Cambio de bases

Cambio de bases: De binario a decimal

@inPint xA es el nmero decimal correspondiente al nmero binario x. Por ejemplo, inPint IDHDIDI ;
El clculo es

IQ

inPint IDHDIDI a inPint IX@HX@IX@IXAAA a ICPB@HCPB@ICPB@ICPBHAAA a IQ inPint XX fit Eb snt inPint a foldr @x y Eb x C PByA H
Cambio de base: De decimal a binario

@intPin xA es el nmero binario correspondiente al nmero decimal x. Por ejemplo, intPin IQ


;

IDHDIDI

intPin XX snt Eb fit intPin n | n ` P a n | otherwise a n mod P X intPin @n div PA


Por ejemplo,

Tema 7. Funciones de orden superior

83

a a a a a a a a a

intPin IQ IQ mod P X intPin @IQ div PA I X intPin @T div PA I X @T mod P X intPin @T div PAA I X @H X intPin QA I X @H X @Q mod P X intPin @Q div PAAA I X @H X @I X intPin IAA I X @H X @I X @I X intPin HAAA I X @H X @I X @I X AAA IDHDIDI

Cambio de base: Comprobacin de propiedades Propiedad: Al pasar un nmero natural a binario con intPin y el resultado a decimal con inPint se obtiene el nmero inicial.

propintin XX snt Eb fool propintin x a inPint @intPin yA aa y where y a s x


Comprobacin:

Bwinb quikghek propintin CCC yuD pssed IHH testsF

7.6.2.

Codicacin y descodicacin

Creacin de octetos Un octeto es un grupo de ocho bits.

@reyteto sA es el octeto correspondiente a la lista de bits s; es decir, los 8 primeros elementos de s si su longitud es mayor o igual que 8 y la lista de 8 elemento aadiendo ceros al nal de s en caso contrario. Por ejemplo, winBb reyteto IDHDIDIDHDHDIDIDIDHDHDH IDHDIDIDHDHDIDI winBb reyteto IDHDIDI IDHDIDIDHDHDHDH

84

Temas de programacin funcional (201011)

reyteto XX fit Eb fit reyteto s a tke V @s CC repet HA


donde @repet xA es una lista innita cuyo nico elemento es x. Codicacin

@odifi A es la codicacin de la cadena como una lista de bits obtenida convirtiendo cada carcter en un nmero Unicode, convirtiendo cada uno de dichos nmeros en un octeto y concatenando los octetos para obtener una lista de bits. Por ejemplo, Bwinb odifi 44 IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH odifi XX tring Eb fit odifi a ont F mp @reyteto F intPin F ordA
donde @ont xssA es la lista obtenida concatenando la lista de listas xss. Codicacin Ejemplo de codicacin,

a a a a a a

odifi 44 ont F mp @reyteto F intPin F ordA 44 ont F mp @reyteto F intPin F ordA 99D99D99 ont reyteto F intPin F ord 99D reyteto F intPin F ord 99D reyteto F intPin F ord 99 ont reyteto IDHDHDHDHDIDID reyteto HDIDHDHDHDIDID reyteto IDIDHDHDHDIDI ont IDHDHDHDHDIDIDHD HDIDHDHDHDIDIDHD IDIDHDHDHDIDIDH IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH

Tema 7. Funciones de orden superior

85

Separacin de octetos

@seprytetos sA es la lista obtenida separando la lista de bits s en listas de 8 elementos. Por ejemplo, Bwinb seprytetos IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDH IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDH seprytetos seprytetos seprytetos tke V s
Descodicacin

XX fit Eb fit a s a X seprytetos @drop V sA

@desodifi sA es la cadena correspondiente a la lista de bits s. Por ejemplo, Bwinb desodifi IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH 44 desodifi XX fit Eb tring desodifi a mp @hr F inPintA F seprytetos
Por ejemplo,

a a a a a

desodifi IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH @mp @hr F inPintA F seprytetosA IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH mp @hr F inPintA IDHDHDHDHDIDIDHDHDIDHDHDHDIDIDHDIDIDHDHDHDIDIDH @hr F inPintA IDHDHDHDHDIDIDHD @hr F inPintA HDIDHDHDHDIDIDHD @hr F inPintA IDIDHDHDHDIDIDH hr WUD hr WVD hr WW 44

Transmisin Los canales de transmisin pueden representarse mediante funciones que transforman cadenas de bits en cadenas de bits.

@trnsmite tA es la cadena obtenida transmitiendo la cadena t a travs del canal . Por ejemplo,

86

Temas de programacin funcional (201011)

Bwinb trnsmite id 4exto por nl orreto4 4exto por nl orreto4 trnsmite XX @fit Eb fitA Eb tring Eb tring trnsmite nl a desodifi F nl F odifi
Correccin de la transmisin Propiedad: Al trasmitir cualquier cadena por el canal identidad se obtiene la cadena.

proptrnsmite XX tring Eb fool proptrnsmite s a trnsmite id s aa s


Comprobacin de la correccin:

Bwinb quikghek proptrnsmite CCC yuD pssed IHH testsF

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 4: Listas. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 7: Higher-order functions. 3. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 8: Funciones de orden superior y polimorsmo. 4. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 9: Generalization: patterns of computation. Cap. 10: Functions as values.

Tema 8 Razonamiento sobre programas


Contenido
8.1. Razonamiento ecuacional . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 8.1.1. Clculo con longitud . . . . . . . . . . . . . . . . . . . . . . . . . 77 8.1.2. Propiedad de intercambia . . . . . . . . . . . . . . . . . . . . . . 77 8.1.3. Inversa de listas unitarias . . . . . . . . . . . . . . . . . . . . . . . 78 8.1.4. Razonamiento ecuacional con anlisis de casos . . . . . . . . . . . 79 8.2. Razonamiento por induccin sobre los naturales . . . . . . . . . . . . . 79 8.2.1. Esquema de induccin sobre los naturales . . . . . . . . . . . . . 79 8.2.2. Ejemplo de induccin sobre los naturales . . . . . . . . . . . . . . 80 8.3. Razonamiento por induccin sobre listas . . . . . . . . . . . . . . . . . . 81 8.3.1. Esquema de induccin sobre listas . . . . . . . . . . . . . . . . . . 81 8.3.2. Asociatividad de ++ . . . . . . . . . . . . . . . . . . . . . . . . . . 81 8.3.3. [] es la identidad para ++ por la derecha . . . . . . . . . . . . . . 82 8.3.4. Relacin entre length y ++ . . . . . . . . . . . . . . . . . . . . . . . 83 8.3.5. Relacin entre take y drop . . . . . . . . . . . . . . . . . . . . . . . 84 8.3.6. La concatenacin de listas vacas es vaca . . . . . . . . . . . . . . 85 8.4. Equivalencia de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . 86 8.5. Propiedades de funciones de orden superior . . . . . . . . . . . . . . . . 87

87

88

Temas de programacin funcional (201011)

8.1.
8.1.1.

Razonamiento ecuacional
Clculo con longitud
longitud a H longitud @XxsA a I C longitud xs
Propiedad: longitud PDQDI a Q Demostracin: longitud PDQDI = 1 + longitud PDQ = 1 + (1 + longitud Q) = 1 + (1 + (1 + longitud )) = 1 + (1 + (1 + 0) =3 Programa:

EE longitudFI EE longitudFP

[por longitudFP] [por longitudFP] [por longitudFP] [por longitudFI]

8.1.2.

Propiedad de intercambia
intermi XX @DA Eb @DA intermi @xDyA a @yDxA

Programa:

EE intermi

Propiedad: intermi @intermi @xDyAA a @xDyA. Demostracin: intermi @intermi @xDyAA = intermi @yDxA = @xDyA Comprobacin con QuickCheck Propiedad:

[por intermi] [por intermi]

propintermi XX iq ab Eb Eb fool propintermi x y a intermi @intermi @xDyAA aa @xDyA


Comprobacin:

Tema 8. Razonamiento sobre programas

89

Bwinb quikghek propintermi CCC yuD pssed IHH testsF

8.1.3.

Inversa de listas unitarias


invers XX Eb invers a invers @xXxsA a invers xs CC x

Inversa de una lista:

EE inversFI EE inversFP

Prop.: invers x a x invers x = invers @xXA = @invers A CC x = CC x = x

[notacin de lista] [inversa.2] [inversa.1] [def. de CC]

Comprobacin con QuickCheck Propiedad:

propinversunitri XX @iq A ab Eb fool propinversunitri x a invers x aa x


Comprobacin:

Bwinb quikghek propinversunitri CCC yuD pssed IHH testsF

8.1.4.

Razonamiento ecuacional con anlisis de casos


relude

Negacin lgica:

not XX fool Eb fool not plse a rue not rue a plse


Prop.: not @not xA a x Demostracin por casos:

90

Temas de programacin funcional (201011)

Caso 1: x a rue: not @not rueA Caso 2: x a plse: not @not plseA

= not plse [notFP] = rue [notFI] = not rue = plse [notFI] [notFP]

Comprobacin con QuickCheck Propiedad:

propdolenegion XX fool Eb fool propdolenegion x a not @not xA aa x


Comprobacin:

Bwinb quikghek propdolenegion CCC yuD pssed IHH testsF

8.2.
8.2.1.
bar:

Razonamiento por induccin sobre los naturales


Esquema de induccin sobre los naturales

Para demostrar que todos los nmeros naturales tienen una propiedad basta pro1. Caso base naH: @HA. 2. Caso inductivo na@mCIA: Suponiendo @mA demostrar @mCIA. En el caso inductivo, la propiedad @nA se llama la hiptesis de induccin.

8.2.2.

Ejemplo de induccin sobre los naturales

Ejemplo de induccin sobre los naturales: Propiedad

@replite n xA es la lista formda por n elementos iguales a x. Por ejemplo, replite Q S ; SDSDS

Tema 8. Razonamiento sobre programas

91

replite XX snt Eb Eb replite H a replite @nCIA x a x X replite n x


Prop.: length @replite n xsA a n

relude

Ejemplo de induccin sobre los naturales: Demostracin Caso base (naH): length @replite H xsA = length [por repliteFI] =0 [por def. length] Caso inductivo (namCI): length @replite @mCIA xsA = length @xX@replite m xsAA = I C length @replite m xsA =I C m =m C I

[por repliteFP] [por def. length] [por hip. ind.] [por conmutativa de C]

Ejemplo de induccin sobre los naturales: Vericacin Vericacin con QuickCheck: Especicacin de la propiedad:

proplengthreplite XX snt Eb snt Eb fool proplengthreplite n xs a length @replite m xsA aa m where m a s n


Comprobacin de la propiedad:

Bwinb quikghek proplengthreplite yuD pssed IHH testsF

8.3.
8.3.1.

Razonamiento por induccin sobre listas


Esquema de induccin sobre listas

Para demostrar que todas las listas nitas tienen una propiedad basta probar:

92

Temas de programacin funcional (201011)

1. Caso base xsa: @A. 2. Caso inductivo xsa@yXysA: Suponiendo @ysA demostrar @yXysA. En el caso inductivo, la propiedad @ysA se llama la hiptesis de induccin.

8.3.2.

Asociatividad de ++
relude

Programa:

@CCA XX Eb Eb CC ys a ys EE CCFI @xXxsA CC ys a x X @xs CC ysA EE CCFP


Propiedad: xsCC@ysCCzsAa@xsCCysACCzs Comprobacin con QuickCheck:

propsoitivon XX snt Eb snt Eb snt Eb fool propsoitivon xs ys zs a xsCC@ysCCzsAaa@xsCCysACCzs winb quikghek propsoitividdon yuD pssed IHH testsF
Demostracin por induccin en xs: Caso base xsa: Reduciendo el lado izquierdo xsCC@ysCCzsA = CC@ysCCzsA [por hiptesis] = ysCCzs [por CCFI] y reduciendo el lado derecho

@xsCCysACCzs = @CCysACCzs = ysCCzs

[por hiptesis] [por CCFI]

Luego, xsCC@ysCCzsAa@xsCCysACCzs Demostracin por induccin en xs:

Tema 8. Razonamiento sobre programas

93

Caso inductivo xsaXs: Suponiendo la hiptesis de induccin sCC@ysCCzsAa@sCCysACCzs hay que demostrar que @XsACC@ysCCzsAa@@XsACCysACCzs @XsACC@ysCCzsA = X@sCC@ysCCzsAA [por CCFP] = X@@sCCysACCzsA [por hip. ind.] = @X@sCCysAACCzs [por CCFP] = @@XsACCysACCzs [por CCFP]

8.3.3. [] es la identidad para ++ por la derecha


Propiedad: xsCCaxs Comprobacin con QuickCheck:

propidentiddontenion XX snt Eb fool propidentiddontenion xs a xsCC aa xs winb quikghek propidentiddontenion yuD pssed IHH testsF
Demostracin por induccin en xs: Caso base xsa: xsCC = CC = [por CCFI] Caso inductivo xsa@XsA: Suponiendo la hiptesis de induccin sCCas hay que demostrar que @XsACCa@XsA @XsACC = X@sCCA [por CCFP] = Xs [por hip. ind.]

8.3.4.

Relacin entre length y ++


length XX Eb snt length a H length @xXxsA a I C nlength xs

Programas:

EE lengthFI EE lengthFP

94

Temas de programacin funcional (201011)

@CCA XX Eb Eb CC ys a ys @xXxsA CC ys a x X @xs CC ysA

EE CCFI EE CCFP

Propiedad: length@xsCCysAa@length xsAC@length ysA Comprobacin con QuickCheck:

proplengthppend XX snt Eb snt Eb fool proplengthppend xs ys a length@xsCCysAaa@length xsAC@length ysA winb quikghek proplengthppend yuD pssed IHH testsF
Demostracin por induccin en xs: Caso base xsa: length@CCysA = length ys = HC@length ysA = @length AC@length ysA Demostracin por induccin en xs: Caso inductivo xsa@XsA: Suponiendo la hiptesis de induccin length@sCCysA a @length sAC@length ysA hay que demostrar que length@@XsACCysA a @length @XsAAC@length ysA length@@XsACCysA = length@X@sCCysAA [por CCFP] = I C length@sCCysA [por lengthFP] = I C @@length sA C @length ysAA [por hip. ind.] = @I C @length sAA C @length ysA [por aritmtica] = @length @XsAA C @length ysA [por lengthFP]

[por CCFI] [por aritmtica] [por lengthFI]

8.3.5.

Relacin entre take y drop

Programas:

Tema 8. Razonamiento sobre programas

95

tke tke tke tke drop drop drop drop

XX snt Eb H n @xXxsA XX snt Eb H xs n @XxsA

Eb a a a x X tke @nEIA xs Eb a xs a a drop @nEIA xs

EE tkeFI EE tkeFP EE tkeFQ EE dropFI EE dropDP EE dropFQ EE CCFI EE CCFP

@CCA XX Eb Eb CC ys a ys @xXxsA CC ys a x X @xs CC ysA


Propiedad: tke n xs CC drop n xs a xs Comprobacin con QuickCheck:

proptkedrop XX snt Eb snt Eb roperty proptkedrop n xs a n ba H aab tke n xs CC drop n xs aa xs winb quikghek proptkedrop yuD pssed IHH testsF
Demostracin por induccin en n: Caso base naH: tke H xs CC drop H xs = CC xs = xs

[por tkeFI y dropFI] [por CCFI]

Caso inductivo namCI: Suponiendo la hiptesis de induccin 1 ( xs :: [ a])tke m xs CC drop m xs a xs hay que demostrar que ( xs :: [ a])tke @mCIA xs CC drop @mCIA xs a xs Lo demostraremos por induccin en xs: Caso base xsa: tke @mCIA CC drop @mCIA = CC =

[por tkeFP y dropFP] [por CCFI]

96

Temas de programacin funcional (201011)

Caso inductivo xsa@XsA: Suponiendo la hip. de induccin 2 tke @mCIA s CC drop @mCIA s a s hay que demostrar que tke @mCIA @XsA CC drop @mCIA @XsA a @XsA tke @mCIA @XsA CC drop @mCIA @XsA = @X@tke m sAA CC @drop m sA [tkeFQ y dropFQ] = @X@@tke m sA CC @drop m sAA [por CCFP] = Xs [por hip. de ind. 1]

8.3.6.

La concatenacin de listas vacas es vaca


relude EE nullFI EE nullFP

Programas:

null XX Eb fool null a rue null @XA a plse

@CCA XX Eb Eb CC ys a ys EE @CCAFI @xXxsA CC ys a x X @xs CC ysA EE @CCAFP


Propiedad: null xs a null @xs CC xsA. Demostracin por induccin en xs: Caso 1: xs a : Reduciendo el lado izquierdo null xs = null [por hiptesis] = rue [por nullFI] y reduciendo el lado derecho

null @xs CC xsA = null @ CC A = null = rue

[por hiptesis] [por @CCAFI] [por nullFI]

Luego, null xs a null @xs CC xsA. Demostracin por induccin en xs: Caso xs a @yXysA: Reduciendo el lado izquierdo

Tema 8. Razonamiento sobre programas

97

null xs = null @yXysA = plse

[por hiptesis] [por nullFP

y reduciendo el lado derecho

null @xs CC xsA = null @@yXysA CC @yXysAA = null @yX@ys CC @yXysAA = plse

[por hiptesis] [por (++).2] [por nullFP

Luego, null xs a null @xs CC xsA.

8.4.

Equivalencia de funciones
Programas:

inversID inversP XX Eb inversI a inversI @xXxsA a inversI xs CC x inversP xs a inversPeux xs where inversPeux ys a ys inversPeux @xXxsA ys a inversPeux xs @xXysA
Propiedad: inversI xs a inversP xs Comprobacin con QuickCheck:

EE inversIFI EE inversIFP EE inversPFI EE inversPeuxFI EE inversPeuxFP

propequivinvers XX snt Eb fool propequivinvers xs a inversI xs aa inversP xs


Demostracin: Es consecuencia del siguiente lema: inversI xs CC ys a inversPeux xs ys En efecto,

inversI xs = inversI xs CC = inversPeux xs CC = inversP xs

[por identidad de CC] [por el lema] [por el inversPFI]

Demostracin del lema: Por induccin en xs:

98

Temas de programacin funcional (201011)

Caso base xsa: inversI CC ys = CC ys = ys = inversPeux CC ys

[por inversIFI] [por CCFI] [por inversPeuxFI]

Caso inductivo xsa@XsA: La hiptesis de induccin es (ys :: [ a])inversI s CC ys a inversPeux s ys Por tanto,

inversI @XsA CC ys = @inversI s CC A CC ys = @inversI sA CC @ CC ysA = @inversI sA CC @XysA = @inversPeux s @XysA = @inversPeux @XsA ys

[por inversIFP] [por asociativa de CC] [por ley unitaria] [por hip. de induccin] [por inversPeuxFP]

8.5.

Propiedades de funciones de orden superior


La funcin sum:

Relacin entre sum y mp

sum XX snt Eb snt sum a H sum @xXxsA a x C sum xs

relude

Propiedad: sum @mp @PBA xsA a P B sum xs Comprobacin con QuickCheck:

propsummp XX snt Eb fool propsummp xs a sum @mp @PBA xsA aa P B sum xs Bwinb quikghek propsummp CCC yuD pssed IHH testsF
Demostracin de la propiedad por induccin en xs

Tema 8. Razonamiento sobre programas

99

Caso : sum @mp @PBA xsA = sum @mp @PBA A = sum =H =P B H = P B sum = P B sum xs

[por hiptesis] [por mpFI] [por sumFI] [por aritmtica] [por sumFI] [por hiptesis]

Caso xsa@yXysA: Entonces, sum @mp @PBA xsA = sum @mp @PBA @yXysAA = sum @PBA y X @mp @PBA ysA = @PBA y C @sum @mp @PBA ysAA = @PBA y C @P B sum ysA = @P B yA C @P B sum ysA = P B @y C sum ysA = P B sum @yXysA = P B sum xs

[por hiptesis] [por mpFP] [por sumFP] [por hip. de induccin] [por @PBA] [por aritmtica] [por sumFP] [por hiptesis]

Comprobacin de propiedades con argumentos funcionales La aplicacin de una funcin a los elemntos de una lista conserva su longitud:

propmplength @puntion fA xs a length @mp f xsA aa length xs


En el inicio del chero hay que escribir

import estFuikghekFpuntion
Comprobacin

Bwinb quikghek propmplength CCC yuD pssed IHH testsF

Bibliografa
1. H. C. Cunningham (2007) Notes on Functional Programming with Haskell.

100

Temas de programacin funcional (201011)

2. J. Fokker (1996) Programacin funcional. 3. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 13: Reasoning about programs. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 6: Programacin con listas. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 8: Reasoning about programs. 6. E.P. Wentworth (1994) Introduction to Funcional Programming.

Tema 9 Declaraciones de tipos y clases


Contenido
9.1. Declaraciones de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 9.2. Deniciones de tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . 93 9.3. Denicin de tipos recursivos . . . . . . . . . . . . . . . . . . . . . . . . 95 9.4. Sistema de decisin de tautologas . . . . . . . . . . . . . . . . . . . . . 99 9.5. Mquina abstracta de clculo aritmtico . . . . . . . . . . . . . . . . . . 102 9.6. Declaraciones de clases y de instancias . . . . . . . . . . . . . . . . . . . 104

9.1.

Declaraciones de tipos

Declaraciones de tipos como sinnimos Se puede denir un nuevo nombre para un tipo existente mediante una declaracin de tipo. Ejemplo: Las cadenas son listas de caracteres. relude type tring a ghr El nombre del tipo tiene que empezar por mayscula. Declaraciones de tipos nuevos Las declaraciones de tipos pueden usarse para facilitar la lectura de tipos. Por ejemplo, 101

102

Temas de programacin funcional (201011)

Las posiciones son pares de enteros.

type os a @sntDsntA
origen es la posicin (0,0).

origen XX os origen a @HDHA


@izquierd pA es la posicin a la izquierda de la posicin p. Por ejemplo,

izquierd @QDSA ;

@PDSA

izquierd XX os Eb os izquierd @xDyA a @xEIDyA


Declaraciones de tipos parametrizadas Las declaraciones de tipos pueden tener parmetros. Por ejemplo, r es el tipo de pares de elementos de tipo

type r a @DA
@multipli pA es el producto del par de enteros p. Por ejemplo,

multipli @PDSA ;

IH

multipli XX r snt Eb snt multipli @xDyA a xBy


@opi xA es el par formado con dos copias de x. Por ejemplo,

opi S

@SDSA

opi XX Eb r opi x a @xDxA


Declaraciones anidadas de tipos Las declaraciones de tipos pueden anidarse. Por ejemplo, Las posiciones son pares de enteros.

type os a @sntDsntA
Los movimientos son funciones que va de una posicin a otra.

Tema 9. Declaraciones de tipos y clases

103

type wovimiento a os Eb os
Las declaraciones de tipo no pueden ser recursivas. Por ejemplo, el siguiente cdigo es errneo.

type erol a @sntDerolA


Al intentar cargarlo da el mensaje de error

gyle in type synonym delrtions

9.2.

Deniciones de tipos de datos


En Haskell pueden denirse nuevos tipos mediante dt. El tipo de los booleanos est formado por dos valores para representar lo falso y lo verdadero. relude dt fool a plse | rue El smbolo | se lee como o. Los valores plse y rue se llaman los constructores del tipo fool. Los nombres de los constructores tienen que empezar por mayscula.

Denicin de tipos con dt

Uso de los valores de los tipos denidos Los valores de los tipos denidos pueden usarse como los de los predenidos. Denicin del tipo de movimientos:

dt wov a szquierd | hereh | erri | ejo


Uso como argumento: @movimiento m pA es la posicin obtenida aplicando el movimiento m a la posicin p. Por ejemplo,

movimiento erri @PDSA

; @PDTA

104

Temas de programacin funcional (201011)

movimiento movimiento movimiento movimiento movimiento

XX wov Eb szquierd hereh erri ejo

os Eb os @xDyA a @xEIDyA @xDyA a @xCIDyA @xDyA a @xDyCIA @xDyA a @xDyEIA

Uso en listas: @movimientos ms pA es la posicin obtenida aplicando la lista de movimientos ms a la posicin p. Por ejemplo,

movimientos erriD szquierd @PDSA ;

@IDTA

movimientos XX wov Eb os Eb os movimientos p a p movimientos @mXmsA p a movimientos ms @movimiento m pA


Uso como valor: @opuesto mA es el movimiento opuesto de m.

movimiento @opuesto erriA @PDSA ; @PDRA opuesto opuesto opuesto opuesto opuesto XX wov Eb szquierd hereh erri ejo wov a hereh a szquierd a ejo a erri

Denicin de tipo con constructores con parmetros Los constructores en las deniciones de tipos pueden tener parmetros. Ejemplo de denicin

dt pigur a girulo plot | et plot plot


Tipos de los constructores:

Bwinb Xtype girulo girulo XX plot Eb pigur Bwinb Xtype et et XX plot Eb plot Eb pigur

Tema 9. Declaraciones de tipos y clases

105

Uso del tipo como valor: @udrdo nA es el cuadrado de lado n.

udrdo XX plot Eb pigur udrdo n a et n n


Uso del tipo como argumento: @re fA es el rea de la gura f. Por ejemplo,

re re re re

@girulo IA @girulo PA @et P SA @udrdo QA

; ; ; ;

QFIRISWPU IPFSTTQUI IHFH WFH

re XX pigur Eb plot re @girulo rA a piBrP re @et x yA a xBy


Denicin de tipos con parmetros Los tipos denidos pueden tener parmetros. Ejemplo de tipo con parmetro

relude dt wye a xothing | tust

@divisionegur m nA es la divisin de m entre n si n no es cero y nada en caso contrario. Por ejemplo, divisionegur T Q ; divisionegur T H ; tust P xothing

divisionegur XX snt Eb snt Eb wye snt divisionegur H a xothing divisionegur m n a tust @m div nA @hedegur xsA es la cabeza de xs si xs es no vaca y nada en caso contrario. Por ejemplo, hedegur PDQDS ; hedegur ; tust P xothing

hedegur XX Eb wye hedegur a xothing hedegur xs a tust @hed xsA

106

Temas de programacin funcional (201011)

9.3.

Denicin de tipos recursivos


Los tipos denidos con dt pueden ser recursivos. Los naturales se construyen con el cero y la funcin sucesor.

Denicin de tipos recursivos: Los naturales

dt xt a gero | u xt deriving how


Tipos de los constructores:

Bwinb Xtype gero gero XX xt Bwinb Xtype u u XX xt Eb xt


Ejemplos de naturales:

gero u gero u @u geroA u @u @u geroAA


Deniciones con tipos recursivos

@ntPint nA es el nmero entero correspondiente al nmero natural n. Por ejemplo, ntPint @u @u @u geroAAA ; ntPint XX xt Eb snt ntPint gero a H ntPint @u nA a I C ntPint n @intPnt nA es el nmero natural correspondiente al nmero entero n. Por ejemplo, intPnt Q
;

u @u @u geroAA

Tema 9. Declaraciones de tipos y clases

107

intPnt XX snt Eb xt intPnt H a gero intPnt @nCIA a u @intPnt nA @sum m nA es la suma de los nmero naturales m y n. Por ejemplo, Bwinb sum @u @u geroAA @u geroA u @u @u geroAA sum XX xt Eb xt Eb xt sum gero n a n sum @u mA n a u @sum m nA
Ejemplo de clculo:

sum @u @u geroAA @u geroA a u @sum @u geroA @u geroAA a u @u @sum gero @u geroAAA a u @u @u geroAA
Tipo recursivo con parmetro: Las listas Denicn del tipo lista:

dt vist a xil | gons @vist A @longitud xsA es la longitud de la lista xs. Por ejemplo, longitud @gons P @gons Q @gons S xilAAA longitud XX vist Eb snt longitud xil a H longitud @gons xsA a I C longitud xs
Denicin de tipos recursivos: Los rboles binarios Ejemplo de rbol binario: ;

108

Temas de programacin funcional (201011)

Q G

S G G R T

U G

Denicin del tipo de rboles binarios:

dt erol a roj snt | xodo erol snt erol


Representacin del ejemplo

ejerol a xodo @xodo @roj IA Q @roj RAA S @xodo @roj TA U @roj WAA
Deniciones sobre rboles binarios

@ourre m A se verica si m ocurre en el rbol . Por ejemplo, ourre R ejerol ourre IH ejerol
; ;

rue plse

ourre XX snt Eb erol Eb fool ourre m @roj nA a m aa n ourre m @xodo i n dA a m aa n || ourre m i || ourre m d @pln A es la lista obtenida aplanando el rbol . Por ejemplo, pln ejerol ; IDQDRDSDTDUDW

pln XX erol Eb snt pln @roj nA a n pln @xodo i n dA a pln i CC n CC pln d

Tema 9. Declaraciones de tipos y clases

109

Deniciones sobre rboles binarios Un rbol es ordenado si el valor de cada nodo es mayos que los de su subrbol izquierdo y mayor que los de su subrbol derecho. El rbol del ejemplo es ordenado.

@ourreinerolyrdendo m A se verica si m ocurre en el rbol ordenado . Por ejemplo, ourreinerolyrdendo R ejerol ; ourreinerolyrdendo IH ejerol ; ourreinerolyrdendo ourreinerolyrdendo ourreinerolyrdendo | m aa n a | m ` n a | otherwise a rue plse

XX snt Eb erol Eb fool m @roj nA a m aa n m @xodo i n dA rue ourreinerolyrdendo m i ourreinerolyrdendo m d

Deniciones de distintos tipos de rboles rboles binarios con valores en las hojas:

dt erol a roj | xodo @erol A @erol A


rboles binarios con valores en los nodos:

dt erol a roj | xodo @erol A @erol A


rboles binarios con valores en las hojas y en los nodos:

dt erol a roj | xodo @erol A @erol A


rboles con un nmero variable de sucesores:

dt erol a xodo erol

110

Temas de programacin funcional (201011)

9.4.

Sistema de decisin de tautologas


Denicin de frmula proposicional: Las variables proposicionales son frmulas. Si F es una frmula, entonces F tambin lo es. Si F y G son frmulas, entonces F G y F G tambin lo son. Tipo de dato de frmulas proposicionales:

Sintaxis de la lgica proposicional

dt prop a gonst fool | r ghr | xeg prop | gonj prop prop | smpl prop prop deriving how
Ejemplos de frmulas proposicionales: 1. A A 2. ( A B) A 3. A ( A B) 4. ( A ( A B)) B

pID pPD pQD pR XX prop pI a gonj @r 9e9A @xeg @r 9e9AA pP a smpl @gonj @r 9e9A @r 9f9AA @r 9e9A pQ a smpl @r 9e9A @gonj @r 9e9A @r 9f9AA pR a smpl @gonj @r 9e9A @smpl @r 9e9A @r 9f9AAA @r 9f9A
Semntica de la lgica proposicional Tablas de verdad de las conectivas: i i i j ij i j T F T T T T F T T F F F F T F T F F F T

Tema 9. Declaraciones de tipos y clases

111

Tabla de verdad para ( A B) ( B A): A B ( A B) ( B A) ( A B) ( B A) T T T T T T F F T T F T T F T T T T F F Las interpretaciones son listas formadas por el nombre de una variable proposicional y un valor de verdad.

type snterpretion a @ghrD foolA @vlor i pA es el valor de la frmula p en la interpretacin i. Por ejemplo, vlor @9e9DplseAD@9f9DrueA pQ vlor @9e9DrueAD@9f9DplseA pQ vlor vlor vlor vlor vlor vlor
; ;

rue plse

XX snterpretion Eb prop Eb fool @gonst A a i @r xA a us x i i @xeg pA a not @vlor i pA i @gonj p qA a vlor i p 88 vlor i q i @smpl p qA a vlor i p `a vlor i q

@us tA es el valor del primer elemento de la lista de asociacin t cuya clave es . Por ejemplo, us P @ID99AD@QD9d9AD@PD99A
;

99

us XX iq ab Eb @DvA Eb v us t a hed v | @9DvA `E tD aa 9 @vriles pA es la lista de los nombres de las variables de p. vriles pQ vriles vriles vriles vriles vriles vriles
;

4eef4

XX prop Eb ghr @gonst A a @r xA a x @xeg pA a vriles p @gonj p qA a vriles p CC vriles q @smpl p qA a vriles p CC vriles q

112

Temas de programacin funcional (201011)

@interpretionesr nA es la lista de las interpretaciones con n variables. Por ejemplo, Bwinb interpretionesr P plseDplseD plseDrueD rueDplseD rueDrue interpretionesr XX snt Eb fool interpretionesr H a interpretionesr @nCIA a mp @plseXA ss CC mp @rueXA ss where ss a interpretionesr n @interpretiones pA es la lista de las interpretaciones de la frmula p. Por ejemplo, Bwinb interpretiones pQ @9e9DplseAD@9f9DplseAD @9e9DplseAD@9f9DrueAD @9e9DrueAD@9f9DplseAD @9e9DrueAD@9f9DrueA interpretiones XX prop Eb snterpretion interpretiones p a zip vs i | i `E interpretionesr @length vsA where vs a nu @vriles pA
Decisin de tautologa

@esutologi pA se verica si la frmula p es una tautologa. Por ejemplo, esutologi esutologi esutologi esutologi pI pP pQ pR
; ; ; ;

plse rue plse rue

esutologi XX prop Eb fool esutologi p a nd vlor i p | i `E interpretiones p

Tema 9. Declaraciones de tipos y clases

113

9.5.

Mquina abstracta de clculo aritmtico


Una expresin aritmtica es un nmero entero o la suma de dos expresiones.

Evaluacin de expresiones aritmticas

dt ixpr a

xum snt | um ixpr ixpr

@vlorie xA es el valor de la expresin aritmtica x. vlorie @um @um @xum PA @xum QAA @xum RAA ; vlorie XX ixpr Eb snt vlorie @xum nA a n vlorie @um x yA a vlorie x C vlorie y
Clculo:

a a a a a

vlorie @um @um @xum PA @vlorie @um @xum PA @xum @vlorie @um @xum PA @xum @vlorie @xum PA C @vlorie @P C QA C R W

@xum QAAA QAAA @xum

QAA @xum RAA C @vlorie @xum RAA C R QAAA C R

Mquina de clculo aritmtico La pila de control de la mquina abstracta es una lista de operaciones.

type gontrol a yp
Las operaciones son meter una expresin en la pila o sumar un nmero con el primero de la pila.

dt yp a

wii ixpr | we snt

@evl x pA evala la expresin x con la pila de control p. Por ejemplo, evl evl evl evl @um @um @xum PA @xum QAA @xum RAA @um @xum PA @xum QAA wii @xum RA @xum QA we PD wii @xum RA @xum RA we S
; ; ; ;

W W W W

114

Temas de programacin funcional (201011)

evl XX ixpr Eb gontrol Eb snt evl @xum nA p a eje p n evl @um x yA p a evl x @wii y X pA @eje p nA ejecuta la lista de control p sobre el entero n. Por ejemplo, eje eje eje eje eje eje eje eje eje wii we wii we @xum QAD wii @xum RA P ; PD wii @xum RA Q ; @xum RA S ; S R ; W ; snt Eb snt a n a evl y @we n X pA a eje p @nCmA W W W W W

XX gontrol Eb n @wii y X pA n @we n X pA m

@evlu eA evala la expresin aritmtica e con la mquina abstracta. Por ejemplo, evlu @um @um @xum PA @xum QAA @xum RAA ; evlu XX ixpr Eb snt evlu e a evl e
Evaluacin:

a a a a a a a a a a a a

evl evl evl eje evl eje eje eje evl eje eje eje W

@um @um @xum PA @xum QAA @xum RAA @um @xum PA @xum QAA wii @xum RA @xum PA wii @xum QAD wii @xum RA wii @xum QAD wii @xum RA P @xum QA we PD wii @xum RA we PD wii @xum RA Q wii @xum RA @PCQA wii @xum RA S @xum RA we S we S R @SCRA W

Tema 9. Declaraciones de tipos y clases

115

9.6.

Declaraciones de clases y de instancias


Las clases se declaran mediante el mecanismo lss. Ejemplo de declaracin de clases:

Declaraciones de clases

lss iq where @aaAD @GaA XX Eb Eb fool

relude

EE winiml omplete definitionX @aaA or @GaA x aa y a not @xGayA x Ga y a not @xaayA

Declaraciones de instancias Las instancias se declaran mediante el mecanismo instne. Ejemplo de declaracin de instancia:

instne iq fool where plse aa plse a rue rue aa rue a rue aa a plse

relude

Extensiones de clases Las clases pueden extenderse mediante el mecanismo lss. Ejemplo de extensin de clases:

relude lss @iq A ab yrd where ompre XX Eb Eb yrdering @`AD @`aAD @baAD @bA XX Eb Eb fool mxD min XX Eb Eb EE winiml omplete definitionX @`aA or ompre EE using ompre n e more effiient for omplex types ompre x y | xaay a i | x`ay a v

116

Temas de programacin funcional (201011)

| otherwise a q x x x x `a ` ba b y y y y | | | | x `a y otherwise x `a y otherwise a a a a a a a a ompre ompre ompre ompre y x x y x x x x y y y y Ga aa Ga aa q v v q

mx x y min x y

Instancias de clases extendidas Las instancias de las clases extendidas pueden declararse mediante el mecanismo instne. Ejemplo de declaracin de instancia:

instne yrd fool where plse `a a rue rue `a rue a rue rue `a plse a plse

relude

Clases derivadas Al denir un nuevo tipo con dt puede declarse como instancia de clases mediante el mecanismo deriving. Ejemplo de clases derivadas:

dt fool a plse | rue deriving @iqD yrdD edD howA


Comprobacin:

relude

plse aa plse plse ` rue show plse red 4plse4 XX fool

; ; ; ;

rue rue 4plse4 plse

Tema 9. Declaraciones de tipos y clases

117

Para derivar un tipo cuyos constructores tienen argumentos como derivado, los tipos de los argumentos tienen que ser instancias de las clases derivadas. Ejemplo:

dt pigur a girulo plot | et plot plot deriving @iqD yrdD howA


se cumple que plot es instancia de iq, yrd y how.

Bwinb Xinfo plot FFF instne iq plot instne yrd plot instne how plot FFF

Bibliografa
1. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 10: Declaring types and classes. 2. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 4: Denicin de tipos. Cap. 5: El sistema de clases de Haskell. 3. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 12: Overloading and type classes. Cap. 13: Checking types. Cap. 14: Algebraic types.

118

Temas de programacin funcional (201011)

Tema 10 Evaluacin perezosa


Contenido
10.1. Estrategias de evaluacin . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 10.2. Terminacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 10.3. Nmero de reducciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 10.4. Estructuras innitas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 10.5. Programacin modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 10.6. Aplicacin estricta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

10.1.

Estrategias de evaluacin

Estrategias de evaluacin Para los ejemplos se considera la funcin

mult XX @sntDsntA Eb snt mult @xDyA a xBy


Evaluacin mediante paso de parmetros por valor (o por ms internos): mult (1+2,2+3) = mult (3,5) [por def. de +] = 3*5 [por def. de mult] = 15 [por def. de *]

119

120

Temas de programacin funcional (201011)

Evaluacin mediante paso de parmetros por nombre (o por ms externos): mult (1+2,2+3) = (1+2)*(3+5) [por def. de mult] = 3*5 [por def. de +] = 15 [por def. de *] Evaluacin con lambda expresiones Se considera la funcin

mult9 XX snt Eb snt Eb snt mult9 x a y Eb xBy


Evaluacin: mult (1+2) (2+3) = mult 3 (2+3) = (y 3*y) (2+3) = (y 3*y) 5 = 3*5 = 15

[por def. de +] [por def. de mult] [por def. de +] [por def. de +] [por def. de *]

10.2.

Terminacin

Procesamiento con el innito Denicin de innito

inf XX snt inf a I C inf


Evaluacin de innito en Haskell:

Bwinb inf gE gEsnterruptedF


Evaluacin de innito: inf = 1 + inf [por def. inf] = 1 + (1 + inf) [por def. inf] = 1 + (1 + (1 + inf)) [por def. inf] = ...

Tema 10. Evaluacin perezosa

121

Procesamiento con el innito Evaluacin mediante paso de parmetros por valor: fst (0,inf) = fst (0,1 + inf) [por def. inf] = fst (0,1 + (1 + inf)) [por def. inf] = fst (0,1 + (1 + (1 + inf))) [por def. inf] = ... Evaluacin mediante paso de parmetros por nombre: fst (0,inf) = 0 [por def. fst] Evaluacin Haskell con innito:

Bwinb fst @HDinfA H

10.3.

Nmero de reducciones

Nmero de reducciones segn las estrategias Para los ejemplos se considera la funcin

udrdo XX snt Eb snt udrdo n a n B n


Evaluacin mediante paso de parmetros por valor: cuadrado (1+2) = cuadrado 3 [por def. +] = 3*3 [por def. cuadrado] = 9 [por def. de *] Evaluacin mediante paso de parmetros por nombre: cuadrado (1+2) = (1+2)*(1+2) [por def. cuadrado] = 3*(1+2) [por def. de +] = 3*3 [por def. de +] = 9 [por def. de *]

122

Temas de programacin funcional (201011)

Evaluacin perezosa e impaciente En la evaluacin mediante paso de parmetros por nombre los argumentos pueden evaluarse ms veces que en el paso por valor. Se puede usar punteros para compartir valores de expresiones. La evaluacin mediante paso de parmetros por nombre usando punteros para compartir valores de expresiones se llama evaluacin perezosa. La evaluacin mediante paso de parmetros por valor se llama evaluacin impaciente. Evaluacin perezosa del ejemplo anterior: cuadrado (1+2) = x*x con x = 1+2 [por def. cuadrado] = 3*3 [por def. de +] = 9 [por def. de *] Haskell usa evaluacin perezosa.

10.4.

Estructuras innitas

Programacin con estructuras innitas

unos es una lista innita de unos. unos XX snt unos a I X unos


Evaluacin: unos = 1 : unos = 1 : (1 : unos) = 1 : (1 : (1 : unos)) = ... Evaluacin en Haskell:

[por def. unos] [por def. unos] [por def. unos]

Bwinb unos IDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDIDFFF

Tema 10. Evaluacin perezosa

123

Evaluacin con estructuras innitas Evaluacin impaciente: head unos = head (1 : unos) = head (1 : (1 : unos)) = head (1 : (1 : (1 : unos))) = ...

[por def. unos] [por def. unos] [por def. unos]

Evaluacin perezosa: head unos = head (1 : unos) [por def. unos] = 1 [por def. head] Evaluacin Haskell:

Bwinb hed unos I

10.5.

Programacin modular

Programacin modular La evaluacin perezosa permite separar el control de los datos. Para los ejemplos se considera la funcin relude tke XX snt Eb Eb tke n | n `a H a tke a tke n @xXxsA a x X tke @nEIA xs Ejemplo de separacin del control (tomar 2 elementos) de los datos (una lista innita de unos): take 2 unos = take 2 (1 : unos) [por def. unos] = 1 : (take 1 unos) [por def. take] = 1 : (take 1 (1 : unos)) [por def. unos] = 1 : (1 : (take 0 unos)) [por def. take] = 1 : (1 : []) [por def. take] = [1,1] [por notacin de listas]

124

Temas de programacin funcional (201011)

Terminacin de evaluaciones con estructuras innitas Ejemplo de no terminacin:

Bwinb IFF IDPDQDRDSDTDUDVDWDIHDIIDIPDIQDIRDISDITDIUDIVDIWDPHDFFF


Ejemplo de terminacin:

Bwinb tke Q IFF IDPDQ


Ejemplo de no terminacin:

Bwinb filter @`aQA IFF IDPDQ gE gE snterruptedF


Ejemplo de no terminacin:

Bwinb tkehile @`aQA IFF IDPDQ


La criba de Erasttenes La criba de Erasttenes 2 3 4 5 6 7 8 9 3 5 7 9 5 7 7

10

11 11 11 11 11

12

13 13 13 13 13 13

14

15 . . . 15 . . . ... ... ... ...

Denicin

primos XX snt primos a ri PFF ri XX snt Eb snt ri @pXxsA a p X ri x | x `E xsD x mod p Ga H


Evaluacin:

tke IS primos ; PDQDSDUDIIDIQDIUDIWDPQDPWDQIDQUDRIDRQDRU


Clculo:

Tema 10. Evaluacin perezosa

125

a a a a a a a a

primos ri PFF ri @P X QFFA P X @ri x | x `E QFFD x mod P Ga HA P X @ri @Q X x | x `E RFFD x mod P Ga HAA P X Q X @ri x | x `E RFFD x mod P Ga HD x mod Q Ga HA P X Q X @ri @S X x | x `E TFFD x mod P Ga HD x mod Q Ga HAA P X Q X S X @ri @x | x `E TFFD x mod P Ga HD x mod Q Ga HD x mod S Ga HAA FFF

10.6.

Aplicacin estricta

Ejemplo de programa sin aplicacin estricta

@sumxi xsA es la suma de los nmeros de xs. Por ejemplo, sumxi PDQDS ; IH

sumxi XX snt Eb snt sumxi xs a sumxi9 H xs sumxi9 XX snt Eb snt Eb snt sumxi9 v a v sumxi9 v @xXxsA a sumxi9 @vCxA xs
Evaluacin: : sumaNE [2,3,5] = sumaNE 0 [2,3,5] [por def. sumaNE] = sumaNE (0+2) [3,5] [por def. sumaNE] = sumaNE ((0+2)+3) [5] [por def. sumaNE] = sumaNE (((0+2)+3)+5) [] [por def. sumaNE] = ((0+2)+3)+5 [por def. sumaNE] = (2+3)+5 [por def. +] = 5+5 [por def. +] = 10 [por def. +]

126

Temas de programacin funcional (201011)

Ejemplo de programa con aplicacin estricta

@sumi xsA es la suma de los nmeros de xs. Por ejemplo, sumi PDQDS ; IH

sumi XX snt Eb snt sumi xs a sumi9 H xs sumi9 XX snt Eb snt Eb snt sumi9 v a v sumi9 v @xXxsA a @sumi9 63 @vCxAA xs
Evaluacin: : sumaE [2,3,5] = sumaE 0 [2,3,5] = (sumaE $! (0+2)) [3,5] = sumaE 2 [3,5] = (sumaE $! (2+3)) [5] = sumaE 5 [5] = (sumaE $! (5+5)) [] = sumaE 10 [] = 10

[por def. sumaE] [por def. sumaE] [por aplicacin de $!] [por def. sumaE] [por aplicacin de $!] [por def. sumaE] [por aplicacin de $!] [por def. sumaE]

Comparacin de consumo de memoria Comparacin de consumo de memoria:

Bwinb sumxi IFFIHHHHHH BBB ixeptionX stk overflow Bwinb sumi IFFIHHHHHH IUVRPWQTTR Bwinb Xset Cs Bwinb sumi IFFIHHHHHH IUVRPWQTTR @PFIT sesD IRSRQSUUP ytesA
Plegado estricto Versin estricta de foldl en el htFvist

Tema 10. Evaluacin perezosa

127

foldl9 XX @ Eb Eb A Eb Eb Eb foldl9 f a foldl9 f @xXxsA a @foldl9 f 63 f xA xs


Comparacin de plegado y plegado estricto:s

Bwinb foldl @CA H PDQDS IH Bwinb foldl9 @CA H PDQDS IH Bwinb foldl @CA H IFFIHHHHHH BBB ixeptionX stk overflow Bwinb foldl9 @CA H IFFIHHHHHH SHHHHHSHHHHH

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. Cap. 7: Eciencia. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 12: Lazy evaluation. 3. B. OSullivan, D. Stewart y J. Goerzen Real World Haskell. OReilly, 2008. Cap. 2: Types and Functions. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introduccin a Haskell. Cap. 8: Evaluacin perezosa. Redes de procesos. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 17: Lazy programming.

128

Temas de programacin funcional (201011)

Tema 11 Aplicaciones de programacin funcional


Contenido
11.1. El juego de cifras y letras . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 11.1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 11.1.2. Bsqueda de la solucin por fuerza bruta . . . . . . . . . . . . . . 123 11.1.3. Bsqueda combinando generacin y evaluacin . . . . . . . . . . 125 11.1.4. Bsqueda mejorada mediante propiedades algebraicas . . . . . . 127 11.2. El problema de las reinas . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 11.3. Nmeros de Hamming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

11.1.
11.1.1.

El juego de cifras y letras


Introduccin

Presentacin del juego Cifras y letras es un programa de Canal Sur que incluye un juego numrico cuya esencia es la siguiente: Dada una sucesin de nmeros naturales y un nmero objetivo, intentar construir una expresin cuyo valor es el objetivo combinando los nmeros de la sucesin usando suma, resta, multiplicacin, divisin y parntesis. Cada nmero de la sucesin puede usarse como mximo una vez. Adems, todos los nmeros, incluyendo los resultados intermedios tienen que ser enteros positivos (1,2,3,. . . ). Ejemplos 129

130

Temas de programacin funcional (201011)

Dada la sucesin 1, 3, 7, 10, 25, 50 y el objetivo 765, una solucin es (1+50)*(2510). Para el problema anterior, existen 780 soluciones. Con la sucesin anterior y el objetivo 831, no hay solucin. Formalizacin del problema: Operaciones Las operaciones son sumar, restar, multiplicar o dividir.

dt yp a um | es | wul | hiv instne how show um a show es a show wul a show hiv a yp where 4C4 4E4 4B4 4G4

ops es la lista de las operaciones. ops XX yp ops a umDesDwulDhiv


Operaciones vlidas

@vlid o x yA se verica si la operacin o aplicada a los nmeros naturales x e y da un nmero natural. Por ejemplo, vlid vlid vlid vlid vlid vlid vlid vlid vlid es es hiv hiv S Q T T Q S Q R
; ; ; ;

rue plse rue plse

XX yp um es x wul hiv x

Eb snt Eb snt Eb fool a rue y a x b y a rue y a y Ga H 88 x mod y aa H

Tema 11. Aplicaciones de programacin funcional

131

Aplicacin de operaciones

@pli o x yA es el resultado de aplicar la operacin o a los nmeros naturales x e y. Por ejemplo, pli um P Q pli hiv T Q pli pli pli pli pli
Expresiones Las expresiones son nmeros enteros o aplicaciones de operaciones a dos expresiones. ; ;

S P

XX yp um x es x wul x hiv x

Eb snt Eb snt Eb snt y a x C y y a x E y y a x B y y a x div y

dt ixpr a xum snt | epl yp ixpr ixpr instne how ixpr where show @xum nA a show n show @epl o i dA a prentesis i CC show o CC prentesis d where prentesis @xum nA a show n prentesis e a 4@4 CC show e CC 4A4
Ejemplo: Expresin correspondiente a (1+50)*(2510)

ejixpr XX ixpr ejixpr a epl wul eI eP where eI a epl um @xum IA @xum SHA eP a epl es @xum PSA @xum IHA
Nmeros de una expresin

@numeros eA es la lista de los nmeros que aparecen en la expresin e. Por ejemplo, Bwinb numeros @epl wul @epl um @xum PA @xum QAA @xum UAA PDQDU

132

Temas de programacin funcional (201011)

numeros XX ixpr Eb snt numeros @xum nA a n numeros @epl l rA a numeros l CC numeros r


Valor de una expresin

@vlor eA es la lista formada por el valor de la expresin e si todas las operaciones para calcular el valor de e son nmeros positivos y la lista vaca en caso contrario. Por ejemplo, vlor @epl wul @epl um @xum PA @xum QAA @xum UAA ; QS vlor @epl es @epl um @xum PA @xum QAA @xum UAA ; vlor @epl um @epl es @xum PA @xum QAA @xum UAA ; vlor XX ixpr Eb snt vlor @xum nA a n | n b H vlor @epl o i dA a pli o x y | x `E vlor i D y `E vlor d D vlid o x y
Funciones combinatorias: Sublistas

@sulists xsA es la lista de las sublistas de xs. Por ejemplo, Bwinb sulists 44 44D44D44D44 Bwinb sulists 44 44D44D44D44D44D44D44D44 sulists sulists sulists where XX Eb a @xXxsA a yss CC mp @xXA yss yss a sulists xs

Funciones combinatoria: Intercalado

@interl x ysA es la lista de las listas obtenidas intercalando x entre los elementos de ys. Por ejemplo,

Tema 11. Aplicaciones de programacin funcional

133

interl 9x9 44 interl 9x9 44

; ;

4x4D4x4D4x4 4x4D4x4D4x4D4x4

interl XX Eb Eb interl x a x interl x @yXysA a @xXyXysA X mp @yXA @interl x ysA


Funciones combinatoria: Permutaciones

@permutiones xsA es la lista de las permutaciones de xs. Por ejemplo, Bwinb permutiones 44 44D44 Bwinb permutiones 44 44D44D44D44D44D44 permutiones XX Eb permutiones a permutiones @xXxsA a ont @mp @interl xA @permutiones xsAA
Funciones combinatoria: Elecciones

@eleiones xsA es la lista formada por todas las sublistas de xs en cualquier orden. Por ejemplo, Bwinb eleiones 44 44D44D44D44D44D44D44D44D44D44D 44D44D44D44D44D44 eleiones XX Eb eleiones xs a ont @mp permutiones @sulists xsAA
Reconocimiento de las soluciones

@soluion e ns nA se verica si la expresin e es una solucin para la sucesin ns y objetivo n; es decir. si los nmeros de e es una posible eleccin de ns y el valor de e es n. Por ejemplo,

134

Temas de programacin funcional (201011)

soluion ejixpr IDQDUDIHDPSDSH UTS ab rue soluion XX ixpr Eb snt Eb snt Eb fool soluion e ns n a elem @numeros eA @eleiones nsA 88 vlor e aa n

11.1.2.

Bsqueda de la solucin por fuerza bruta

Divisiones de una lista

@divisiones xsA es la lista de las divisiones de xs en dos listas no vacas. Por ejemplo, Bwinb divisiones 4d4 @44D4d4AD@44D4d4A Bwinb divisiones 4d4 @44D4d4AD@44D4d4AD@44D4d4A divisiones XX Eb @DA divisiones a divisiones a divisiones @xXxsA a @xDxsA X @xXisDdsA | @isDdsA `E divisiones xs
Expresiones construibles

@expresiones nsA es la lista de todas las expresiones construibles a partir de la lista de nmeros ns. Por ejemplo, Bwinb expresiones PDQDS PC@QCSADPE@QCSADPB@QCSADPG@QCSADPC@QESADPE@QESAD PB@QESADPG@QESADPC@QBSADPE@QBSADPB@QBSADPG@QBSAD PC@QGSADPE@QGSADPB@QGSADPG@QGSAD@PCQACSD@PCQAESD FFF expresiones expresiones expresiones expresiones XX snt Eb ixpr a n a xum n ns a e | @isDdsA D i D d D e

`E `E `E `E

divisiones ns expresiones is expresiones ds omin i d

Tema 11. Aplicaciones de programacin funcional

135

Combinacin de expresiones

@omin eI ePA es la lista de las expresiones obtenidas combinando las expresiones eI y eP con una operacin. Por ejemplo, Bwinb omin @xum PA @xum QA PCQDPEQDPBQDPGQ omin XX ixpr Eb ixpr Eb ixpr omin eI eP a epl o eI eP | o `E ops
Bsqueda de las soluciones

@soluiones ns nA es la lista de las soluciones para la sucesin ns y objetivo n calculadas por fuerza bruta. Por ejemplo, Bwinb soluiones IDQDUDIHDPSDSH UTS QB@@UB@SHEIHAAEPSAD @@UB@SHEIHAAEPSABQD FFF Bwinb length @soluiones IDQDUDIHDPSDSH UTSA UVH Bwinb length @soluiones IDQDUDIHDPSDSH VQIA H soluiones XX snt Eb snt Eb ixpr soluiones ns n a e | ns9 `E eleiones ns D e `E expresiones ns9 D vlor e aa n
Estadsticas de la bsqueda por fuerza bruta Estadsticas:

Bwinb Xset Cs Bwinb hed @soluiones IDQDUDIHDPSDSH UTSA QB@@UB@SHEIHAAEPSA @VFRU sesD RHHQHTVQT ytesA Bwinb length @soluiones IDQDUDIHDPSDSH UTSA UVH @WWUFUT sesD RUHURPQWIPH ytesA Bwinb length @soluiones IDQDUDIHDPSDSH VQIA H @IHIWFIQ sesD RUHURSQSRPH ytesA Bwinb Xunset Cs

136

Temas de programacin funcional (201011)

11.1.3.

Bsqueda combinando generacin y evaluacin

Resultados

esultdo es el tipo de los pares formados por expresiones vlidas y su valor. type esultdo a @ixprDsntA @resultdos nsA es la lista de todos los resultados construibles a partir de la lista de nmeros ns. Por ejemplo, Bwinb resultdos PDQDS @PC@QCSADIHAD @PB@QCSADITAD @PC@QBSADIUAD @PB@QBSADQHAD @@PCQACSDIHAD @@PCQABSDPSAD @@PCQAGSDIAD @@PBQACSDIIAD @@PBQAESDIAD @@PBQABSDQHA resultdos resultdos resultdos resultdos XX snt Eb esultdo a n a @xum nDnA | n b H ns a res | @isDdsA `E divisiones ns D ix `E resultdos is D dy `E resultdos ds D res `E omin9 ix dy

Combinacin de resultados

@omin9 rI rPA es la lista de los resultados obtenidos combinando los resultados rI y rP con una operacin. Por ejemplo, Bwinb omin9 @xum PDPA @xum QDQA @PCQDSAD@PBQDTA Bwinb omin9 @xum QDQA @xum PDPA @QCPDSAD@QEPDIAD@QBPDTA Bwinb omin9 @xum PDPA @xum TDTA @PCTDVAD@PBTDIPA Bwinb omin9 @xum TDTA @xum PDPA @TCPDVAD@TEPDRAD@TBPDIPAD@TGPDQA omin9 XX esultdo Eb esultdo Eb esultdo omin9 @iDxA @dDyA a @epl o i dD pli o x yA | o `E ops D vlid o x y

Tema 11. Aplicaciones de programacin funcional

137

Bsqueda combinando generacin y evaluacin

@soluiones9 ns nA es la lista de las soluciones para la sucesin ns y objetivo n calculadas intercalando generacin y evaluacin. Por ejemplo, Bwinb hed @soluiones9 IDQDUDIHDPSDSH UTSA QB@@UB@SHEIHAAEPSA Bwinb length @soluiones9 IDQDUDIHDPSDSH UTSA UVH Bwinb length @soluiones9 IDQDUDIHDPSDSH VQIA H soluiones9 XX snt Eb soluiones9 ns n a e | D D snt Eb ixpr ns9 `E eleiones ns @eDmA `E resultdos ns9 m aa n

Estadsticas de la bsqueda combinada Estadsticas:

Bwinb hed @soluiones9 IDQDUDIHDPSDSH UTSA QB@@UB@SHEIHAAEPSA @HFVI sesD QVVHRPPH ytesA Bwinb length @soluiones9 IDQDUDIHDPSDSH UTSA UVH @THFUQ sesD PWQPQIRHPH ytesA Bwinb length @soluiones9 IDQDUDIHDPSDSH VQIA H @TIFTV sesD PWQPQHQHVV ytesA

11.1.4.

Bsqueda mejorada mediante propiedades algebraicas

Aplicaciones vlidas

@vlid9 o x yA se verica si la operacin o aplicada a los nmeros naturales x e y da un nmero natural, teniendo en cuenta las siguientes reducciones algebraicas x x x I x C B B B G y y I y I a a a a a y C x y B x x y x

138

Temas de programacin funcional (201011)

vlid9 vlid9 vlid9 vlid9 vlid9

XX yp um x es x wul x hiv x

Eb snt Eb snt Eb fool y a x `a y y a x b y y a x Ga I 88 y Ga I 88 x `a y y a y Ga H 88 y Ga I 88 x mod y aa H

Resultados vlidos construibles

@resultdos9 nsA es la lista de todos los resultados vlidos construibles a partir de la lista de nmeros ns. Por ejemplo, Bwinb resultdos9 SDQDP @SE@QEPADRAD@@SEQACPDRAD@@SEQABPDRAD@@SEQAGPDIA resultdos9 resultdos9 resultdos9 resultdos9 XX snt Eb esultdo a n a @xum nDnA | n b H ns a res | @isDdsA `E divisiones ns D ix `E resultdos9 is D dy `E resultdos9 ds D res `E omin99 ix dy

Combinacin de resultados vlidos

@omin rI rPA es la lista de los resultados vlidos obtenidos combinando los resultados rI y rP con una operacin. Por ejemplo, omin99 omin99 omin99 omin99 @xum @xum @xum @xum PDPA QDQA PDPA TDTA @xum @xum @xum @xum QDQA PDPA TDTA PDPA ab ab ab ab @PCQDSAD@PBQDTA @QEPDIA @PCTDVAD@PBTDIPA @TEPDRAD@TGPDQA

omin99 XX esultdo Eb esultdo Eb esultdo omin99 @iDxA @dDyA a @epl o i dD pli o x yA | o `E ops D vlid9 o x y

Tema 11. Aplicaciones de programacin funcional

139

Bsqueda mejorada mediante propiedades algebraicas

@soluiones ns nA es la lista de las soluciones para la sucesin ns y objetivo n calculadas intercalando generacin y evaluacin y usando las mejoras aritmticas. Por ejemplo, Bwinb hed @soluiones99 IDQDUDIHDPSDSH UTSA QB@@UB@SHEIHAAEPSA Bwinb length @soluiones99 IDQDUDIHDPSDSH UTSA RW Bwinb length @soluiones99 IDQDUDIHDPSDSH VQIA H soluiones99 XX snt Eb soluiones99 ns n a e | D D snt Eb ixpr ns9 `E eleiones ns @eDmA `E resultdos9 ns9 m aa n

Estadsticas de la bsqueda mejorada Estadsticas:

Bwinb hed @soluiones99 IDQDUDIHDPSDSH UTSA QB@@UB@SHEIHAAEPSA @HFRH sesD ITRQSIST ytesA Bwinb length @soluiones99 IDQDUDIHDPSDSH UTSA RW @IHFQH sesD RTHPSQUIT ytesA Bwinb length @soluiones99 IDQDUDIHDPSDSH VQIA H @IHFPT sesD RTHPSQWHV ytesA
Comparacin de las bsquedas Comparacin de las bsquedad problema de dados [1,3,7,10,25,50] obtener 765. Bsqueda de la primera solucin:

CEEEEEEEEEEEEEEEEEEEEEC | segsF | ytes | CEEEEEEEEEEEEEECEEEEEEECEEEEEEEEEEEEEC | soluiones | VFRU | RHHFQHTFVQT | | soluiones9 | HFVI | QVFVHRFPPH |

140

Temas de programacin funcional (201011)

| soluiones99 | HFRH | ITFRQSFIST | CEEEEEEEEEEEEEECEEEEEEECEEEEEEEEEEEEEC


Comparacin de las bsquedas Bsqueda de todas las soluciones:

CEEEEEEEECEEEEEEEEEEEEEEEEC | segsF | ytes | CEEEEEEEEEEEEEECEEEEEEEECEEEEEEEEEEEEEEEEC | soluiones | WWUFUT | RUFHURFPQWFIPH | | soluiones9 | THFUQ | PFWQPFQIRFHPH | | soluiones99 | IHFQH | RTHFPSQFUIT | CEEEEEEEEEEEEEECEEEEEEEECEEEEEEEEEEEEEEEEC
Comparacin de las bsquedas Comprobacin de que dados [1,3,7,10,25,50] no puede obtenerse 831

CEEEEEEEEECEEEEEEEEEEEEEEEEC | segsF | ytes | CEEEEEEEEEEEEEECEEEEEEEEECEEEEEEEEEEEEEEEEC | soluiones | IHIWFIQ | RUFHURFSQSFRPH | | soluiones9 | TIFTV | PFWQPFQHQFHVV | | soluiones99 | IHFPT | RTHFPSQFWHV | CEEEEEEEEEEEEEECEEEEEEEEECEEEEEEEEEEEEEEEEC

11.2.

El problema de las reinas

El problema de las N reinas Enunciado: Colocar N reinas en un tablero rectangular de dimensiones N por N de forma que no se encuentren ms de una en la misma lnea: horizontal, vertical o diagonal. El problema se representa en el mdulo eins. Importa la diferencia de conjuntos @A del mdulo vist:

module eins where import htFvist @@AA

Tema 11. Aplicaciones de programacin funcional

141

El tablero se representa por una lista de nmeros que indican las las donde se han colocado las reinas. Por ejemplo, QDS indica que se han colocado las reinas @IDQA y @PDSA.

type lero a snt reins n es la lista de soluciones del problema de las N reinas. Por ejemplo, reins R ;QDIDRDPDPDRDIDQ. La primera solucin QDIDRDP se interpreta como R R R R reins XX snt Eb lero reins n a ux n where ux H a ux @mCIA a rXrs | rs `E ux mD r `E @IFFn rsAD noet r rs I noet r rs d se verica si la reina r no ataca a niguna de las de la lista rs donde la primera de la lista est a una distancia horizontal d. noet XX snt Eb lero Eb snt Eb fool noet a rue noet r @XrsA distr a s@rEA Ga distr 88 noet r rs @distrCIA

11.3.

Nmeros de Hamming

Nmeros de Hamming Enunciado: Los nmeros de Hamming forman una sucesin estrictamente creciente de nmeros que cumplen las siguientes condiciones: 1. El nmero 1 est en la sucesin. 2. Si x est en la sucesin, entonces 2x, 3x y 5x tambin estn. 3. Ningn otro nmero est en la sucesin.

142

Temas de programacin funcional (201011)

hmming es la sucesin de Hamming. Por ejemplo, tke IP hmming ; IDPDQDRDSDTDVDWDIHDIPDISDIT hmming XX snt hmming a I X mezlQ PBi | i `E hmming QBi | i `E hmming SBi | i `E hmming mezlQ xs ys zs es la lista obtenida mezclando las listas ordenadas xs, ys y zs y eliminando los elementos duplicados. Por ejemplo, winb mezlQ PDRDTDVDIH QDTDWDIP SDIH PDQDRDSDTDVDWDIHDIP mezlQ XX snt Eb snt Eb snt Eb snt mezlQ xs ys zs a mezlP xs @mezlP ys zsA mezlP xs ys zs es la lista obtenida mezclando las listas ordenadas xs e ys y eliminando los elementos duplicados. Por ejemplo, winb mezlP PDRDTDVDIHDIP QDTDWDIP PDQDRDTDVDWDIHDIP mezlP XX snt Eb snt Eb snt mezlP pd@xXxsA qd@yXysA | x ` y | x b y | otherwise mezlP ys mezlP xs a a a a a xXmezlP xs q yXmezlP p ys xXmezlP xs ys ys xs

Bibliografa
1. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 11: The countdown problem. 2. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 13: Puzzles y solitarios.

Tema 12 Analizadores sintcticos funcionales


Contenido
12.1. Analizadores sintcticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 12.2. El tipo de los analizadores sintcticos . . . . . . . . . . . . . . . . . . . . 133 12.3. Analizadores sintcticos bsicos . . . . . . . . . . . . . . . . . . . . . . . 134 12.4. Composicin de analizadores sintcticos . . . . . . . . . . . . . . . . . . 135 12.4.1. Secuenciacin de analizadores sintcticos . . . . . . . . . . . . . . 135 12.4.2. Eleccin de analizadores sintcticos . . . . . . . . . . . . . . . . . 136 12.5. Primitivas derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 12.6. Tratamiento de los espacios . . . . . . . . . . . . . . . . . . . . . . . . . . 139 12.7. Analizador de expresiones aritmticas . . . . . . . . . . . . . . . . . . . 140

12.1.

Analizadores sintcticos

Analizadores sintcticos Un analizador sintctico es un programa que analiza textos para determinar su estructura sintctica. Ejemplo de anlisis sintctico aritmtico: La estructura sintctica de la cadena 4PBQCR4 es el rbol

143

144

Temas de programacin funcional (201011)

El anlisis sintctico forma parte del preprocesamiento en la mayora de las aplicaciones reales.

12.2.

El tipo de los analizadores sintcticos

Opciones para el tipo de los analizadores sintcticos Opcin inicial:

type enlizdor a tring Eb ree


Con la parte no analizada:

type enlizdor a tring Eb @reeDtringA


Con todos los anlisis:

type enlizdor a tring Eb @reeDtringA


Con estructuras arbitrarias:

type enlizdor a tring Eb @DtringA


Simplicacin: analizadores que fallan o slo dan un anlisis.

12.3.

Analizadores sintcticos bsicos

Analizadores sintcticos bsicos: resultado

@nliz sA analiza la cadena s mediante el analizador . Por ejemplo, nliz XX enlizdor Eb tring Eb @DtringA nliz s a s

Tema 12. Analizadores sintcticos funcionales

145

El analizador resultdo v siempre tiene xito, devuelve v y no consume nada. Por ejemplo,

Bwinb nliz @resultdo IA 44 @ID44A resultdo XX Eb enlizdor resultdo v a xs Eb @vDxsA


Analizadores sintcticos bsicos: fallo El analizador fllo siempre falla. Por ejemplo,

Bwinb nliz fllo 44 fllo XX enlizdor fllo a xs Eb


Analizadores sintcticos bsicos: elemento El analizador elemento falla si la cadena es vaca y consume el primer elemento en caso contrario. Por ejemplo,

Bwinb nliz elemento 44 Bwinb nliz elemento 44 @99D44A elemento XX enlizdor ghr elemento a xs Eb se xs of Eb @xXxsA Eb @x D xsA

12.4.
12.4.1.

Composicin de analizadores sintcticos


Secuenciacin de analizadores sintcticos

@@p lig fA eA falla si el anlisis de e por p falla, en caso contrario, se obtiene un valor (v) y una salida (s), se aplica la funcin f al valor v obtenindose un nuevo analizador con el que se analiza la salida s.

146

Temas de programacin funcional (201011)

lig XX enlizdor Eb @ Eb enlizdor A Eb enlizdor p lig f a ent Eb se nliz p ent of Eb @vDslA Eb nliz @f vA sl primeroerero es un analizador que devuelve los caracteres primero y tercero de la cadena. Por ejemplo, primeroerero 4el4 ; primeroerero 44 ; @@99D9e9AD4l4A

primeroerero XX enlizdor @ghrDghrA primeroerero a elemento lig x Eb elemento lig Eb elemento lig y Eb resultdo @xDyA

12.4.2.

Eleccin de analizadores sintcticos

@@p CCC qA eA analiza e con p y si falla analiza e con q. Por ejemplo, winBb nliz @elemento CCC resultdo 9d9A 44 @99D44A winBb nliz @fllo CCC resultdo 9d9A 44 @9d9D44A winBb nliz @fllo CCC flloA 44 @CCCA XX enlizdor Eb enlizdor Eb enlizdor p CCC q a ent Eb se nliz p ent of Eb nliz q ent @vDslA Eb @vDslA

12.5.

Primitivas derivadas

Tema 12. Analizadores sintcticos funcionales

147

@st pA es el analizador que consume un elemento si dicho elemento cumple la propiedad p y falla en caso contrario. Por ejemplo, nliz @st isvowerA 4hol4 ; nliz @st isvowerA 4rol4 ; @9h9D4ol4A

st XX @ghr Eb foolA Eb enlizdor ghr st p a elemento lig x Eb if p x then resultdo x else fllo digito analiza si el primer carcter es un dgito. Por ejemplo, nliz digito 4IPQ4 nliz digito 4uno4
; ;

@9I9D4PQ4A

digito XX enlizdor ghr digito a st ishigit minusul analiza si el primer carcter es una letra minscula. Por ejemplo, nliz minusul 4ev4 nliz minusul 4iv4
; ;

@9e9D4v4A

minusul XX enlizdor ghr minusul a st isvower myusul analiza si el primer carcter es una letra mayscula. Por ejemplo, nliz myusul 4iv4 nliz myusul 4ev4
; ;

@9i9D4v4A

myusul XX enlizdor ghr myusul a st ispper letr analiza si el primer carcter es una letra. Por ejemplo, nliz letr 4iv4 nliz letr 4ev4 nliz letr 4IPQ4
; ; ;

@9i9D4v4A @9e9D4v4A

148

Temas de programacin funcional (201011)

letr XX enlizdor ghr letr a st iselph lfnumerio analiza si el primer carcter es una letra o un nmero. Por ejemplo, nliz nliz nliz nliz lfnumerio lfnumerio lfnumerio lfnumerio 4iv4 4ev4 4IPQ4 4 IPQ4
; ; ; ;

@9i9D4v4A @9e9D4v4A @9I9D4PQ4A

lfnumerio XX enlizdor ghr lfnumerio a st iselphxum @rter xA analiza si el primer carcter es igual al carcter x. Por ejemplo, nliz @rter 9i9A 4iv4 ; nliz @rter 9i9A 4ev4 ; @9i9D4v4A

rter XX ghr Eb enlizdor ghr rter x a st @aa xA @den A analiza si empieza con la cadena . Por ejemplo, nliz @den 44A 4def4 ; nliz @den 44A 4def4 ; @44D4def4A

den XX tring Eb enlizdor tring den a resultdo den @xXxsA a rter x lig x Eb den xs lig xs Eb resultdo @xXxsA vrios p aplica el analizador p cero o ms veces. Por ejemplo, nliz @vrios digitoA 4PQS4 ; nliz @vrios digitoA 4PQS4 ; @4PQS4D44A @44D4PQS4A

vrios XX enlizdor Eb enlizdor vrios p a vriosI p CCC resultdo

Tema 12. Analizadores sintcticos funcionales

149

vriosI p aplica el analizador p una o ms veces. Por ejemplo, nliz @vriosI digitoA 4PQS4 ; nliz @vriosI digitoA 4PQS4 ; @4PQS4D44A

vriosI XX enlizdor Eb enlizdor vriosI p a p lig v Eb vrios p lig vs Eb resultdo @vXvsA ident analiza si comienza con un identicador (i.e. una cadena que comienza con una letra minscula seguida por caracteres alfanumricos). Por ejemplo, winBb nliz ident 4lunesIP de ine4 @4lunesIP4D4 de ine4A winBb nliz ident 4vunesIP de ine4 ident XX enlizdor tring ident a minusul lig x Eb vrios lfnumerio lig xs Eb resultdo @xXxsA nt analiza si comienza con un nmero natural. Por ejemplo, nliz nt 4IRheeril4 nliz nt 4 IRheeril4
; ;

@IRD4heeril4A

nt XX enlizdor snt nt a vriosI digito lig xs Eb resultdo @red xsA espio analiza si comienza con espacios en blanco. Por ejemplo, nliz espio 4 4 ; @@AD4 4A

espio XX enlizdor @A espio a vrios @st ispeA lig Eb resultdo @A

150

Temas de programacin funcional (201011)

12.6.

Tratamiento de los espacios

unidd p ignora los espacios en blanco y aplica el analizador p. Por ejemplo, winBb nliz @unidd ntA 4 IRheeril4 @IRD4heeril4A winBb nliz @unidd ntA 4 IR heeril4 @IRD4heeril4A unidd XX enlizdor Eb unidd p a espio lig p lig espio lig resultdo v enlizdor Eb v Eb Eb

identifidor analiza un identicador ignorando los espacios delante y detrs. Por ejemplo, winBb nliz identifidor 4 lunesIP @4lunesIP4D4de ine4A identifidor XX enlizdor tring identifidor a unidd ident nturl analiza un nmero natural ignorando los espacios delante y detrs. Por ejemplo, nliz nturl 4 IRheeril4 ; @IRD4heeril4A de ine4

nturl XX enlizdor snt nturl a unidd nt @simolo xsA analiza la cadena xs ignorando los espacios delante y detrs. Por ejemplo, winBb nliz @simolo 44A 4 @44D4def4A def4

simolo XX tring Eb enlizdor tring simolo xs a unidd @den xsA

Tema 12. Analizadores sintcticos funcionales

151

listxt analiza una lista de naturales ignorando los espacios. Por ejemplo, winBb nliz listxt 4 @PDQDSD44A winBb nliz listxt 4 PD PD QD S QD4 4

listxt XX enlizdor snt listxt a simolo 44 nturl vrios @simolo 4D4 nturlA simolo 44 resultdo @nXnsA

lig lig lig lig lig

Eb n Eb Eb ns Eb Eb

12.7.

Analizador de expresiones aritmticas

Expresiones aritmticas Consideramos expresiones aritmticas: construidas con nmeros, operaciones (+ y ) y parntesis. + y asocian por la derecha. tiene ms prioridad que +. Ejemplos: 2 + 3 + 5 representa a 2 + (3 + 5). 2 3 + 5 representa a (2 3) + 5. Gramticas de las expresiones aritmticas: Gramtica 1 Gramtica 1 de las expresiones aritmticas: expr ::= expr + expr | expr expr | (expr ) | nat nat ::= 0 | 1 | 2 | . . . La gramtica 1 no considera prioridad: acepta 2 + 3 5 como (2 + 3) 5 y como 2 + (3 5) La gramtica 1 no considera asociatividad: acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5) La gramtica 1 es ambigua.

152

Temas de programacin funcional (201011)

Gramticas de las expresiones aritmticas: Gramtica 2 Gramtica 2 de las expresiones aritmticas (con prioridad): expr ::= expr + expr | term term ::= term term | f actor f actor ::= (expr ) | nat nat ::= 0 | 1 | 2 | . . . La gramtica 2 s considera prioridad: acepta 2 + 3 5 slo como 2 + (3 5) La gramtica 2 no considera asociatividad: acepta 2 + 3 + 5 como (2 + 3) + 5 y como 2 + (3 + 5) La gramtica 2 es ambigua. rbol de anlisis sintctico de 2 3 + 5 con la gramtica 2 expr expr term term f actor nat 2

expr term

term f actor f actor nat nat 3 3

Gramticas de las expresiones aritmticas: Gramtica 3 Gramtica 3 de las expresiones aritmticas: expr ::= term + expr | term term ::= f actor term | f actor f actor ::= (expr ) | nat nat ::= 0 | 1 | 2 | . . . La gramtica 3 s considera prioridad: acepta 2 + 3 5 slo como 2 + (3 5)

Tema 12. Analizadores sintcticos funcionales

153

La gramtica 3 s considera asociatividad: acepta 2 + 3 + 5 como 2 + (3 + 5) La gramtica 3 no es ambigua (i.e. es libre de contexto). rbol de anlisis sintctico de 2 + 3 + 5 con la gramtica 3 expr term

expr

f actor term nat f actor 2 nat 3

expr term f actor nat 4

Gramticas de las expresiones aritmticas: Gramtica 4 La gramtica 4 se obtiene simplicando la gramtica 3: expr ::= term (+ expr | ) term ::= f actor ( term | ) f actor ::= (expr ) | nat nat ::= 0 | 1 | 2 | . . . donde es la cadena vaca. La gramtica 4 no es ambigua. La gramtica 4 es la que se usar para escribir el analizador de expresiones aritmticas. Analizador de expresiones aritmticas

expr analiza una expresin aritmtica devolviendo su valor. Por ejemplo, nliz nliz nliz nliz expr expr expr expr 4PBQCS4 4PB@QCSA4 4PCQBS4 4PBQCS4
; ; ; ;

@IID44A @ITD44A @IUD44A @IID44A

154

Temas de programacin funcional (201011)

expr XX enlizdor snt expr a term lig t Eb @simolo 4C4 lig Eb expr lig e Eb resultdo @tCeAA CCC resultdo t
averbterm analiza un trmino de una expresin aritmtica devolviendo su valor. Por ejemplo,

nliz term 4PBQCS4 nliz term 4PCQBS4 nliz term 4@PCQABSCU4

; ; ;

@TD4CS4A @PD4CQBS4A @PSD4CU4A

term XX enlizdor snt term a ftor lig f Eb @simolo 4B4 lig Eb term lig t Eb resultdo @fBtAA CCC resultdo f ftor analiza un factor de una expresin aritmtica devolviendo su valor. Por ejemplo, nliz ftor 4PBQCS4 nliz ftor 4@PCQABS4 nliz ftor 4@PCQBUABS4
; ; ;

@PD4BQCS4A @SD4BS4A @PQD4BS4A

ftor XX enlizdor snt ftor a @simolo 4@4 lig Eb expr lig e Eb simolo 4A4 lig Eb resultdo eA CCC nturl @vlor sA analiza la cadena s devolviendo su valor si es una expresin aritmtica y un mensaje de error en caso contrario. Por ejemplo, vlor 4PBQCS4 vlor 4PB@QCSA4
; ;

II IT

Tema 12. Analizadores sintcticos funcionales

155

vlor 4P B Q C S4 vlor 4PBQx4 vlor 4EI4

; ; ;

II BBB ixeptionX sin usr x BBB ixeptionX entrd no vlid

vlor XX tring Eb snt vlor xs a se @nliz expr xsA of @nDA Eb n @DslA Eb error @4sin usr 4 CC slA Eb error 4entrd no vlid4

Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell. Prentice Hall, 2000. Cap. 11: Anlisis sintctico. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 8: Functional parsers. 3. G. Hutton y E. Meijer. Monadic Parser Combinators. Technical Report NOTTCS TR964, Department of Computer Science, University of Nottingham, 1996. 4. G. Hutton y E. Meijer. Monadic Parsing in Haskell. Journal of Functional Programming, 8(4): 437444, 1998. 5. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 14: Analizadores.

156

Temas de programacin funcional (201011)

Tema 13 Programas interactivos


Contenido
13.1. Programas interactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 13.2. El tipo de las acciones de entrada/salida . . . . . . . . . . . . . . . . . . 148 13.3. Acciones bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 13.4. Secuenciacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 13.5. Primitivas derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 13.6. Ejemplos de programas interactivos . . . . . . . . . . . . . . . . . . . . . 150 13.6.1. Juego de adivinacin interactivo . . . . . . . . . . . . . . . . . . . 150 13.6.2. Calculadora aritmtica . . . . . . . . . . . . . . . . . . . . . . . . . 151 13.6.3. El juego de la vida . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

13.1.

Programas interactivos

Los programas por lote no interactan con los usuarios durante su ejecucin. Los programas interactivos durante su ejecucin pueden leer datos del teclado y escribir resultados en la pantalla. Problema: Los programas interactivos tienen efectos laterales. Los programa Haskell no tiene efectos laterales.

157

158

Temas de programacin funcional (201011)

Ejemplo de programa interactivo Especicacin: El programa pide una cadena y dice el nmero de caracteres que tiene. Ejemplo de sesin:

EE Bwinb longitudgden EE isrie un denX 4roy es lunes4 EE v den tiene IR rteres


Programa:

longitudgden XX sy @A longitudgden a do puttr 4isrie un denX 4 xs `E getvine puttr 4v den tiene 4 puttr @show @length xsAA puttrvn 4 rteres4

13.2.

El tipo de las acciones de entrada/salida

En Haskell se pueden escribir programas interactivos usando tipos que distingan las expresiones puras de las acciones impuras que tienen efectos laterales.

sy es el tipo de las acciones que devuelven un valor del tipo .


Ejemplos: sy ghr es el tipo de las acciones que devuelven un carcter. sy @A es el tipo de las acciones que no devuelven ningn valor.

13.3.

Acciones bsicas

getghr XX sy ghr La accin getghr lee un carcter del teclado, lo muestra en la pantalla y lo devuelve como valor. putghr XX Eb sy @A La accin putghr escribe el carcter en la pantalla y no devuelve ningn valor.

Tema 13. Programas interactivos

159

return Eb sy La accin return devuelve el valor sin ninguna interaccin.


Ejemplo:

Bwinb putghr 99 Bwinb it @A

13.4.

Secuenciacin

Una sucesin de acciones puede combinarse en una accin compuesta mediante expresiones do. Ejemplo:

ejeueniion XX sy @ghrDghrA ejeueniion a do x `E getghr getghr y `E getghr return @xDyA


Lee dos caracteres y devuelve el par formado por ellos. Por ejemplo,

Bwinb ejeueniion f @99D9f9A

13.5.

Primitivas derivadas
getvine XX sy tring getvine a do x `E getghr if x aa 9n9 then return else do xs `E getvine return @xXxsA relude

Lectura de cadenas del teclado:

Escritura de cadenas en la pantalla:

160

Temas de programacin funcional (201011)

puttr XX tring Eb sy @A puttr a return @A puttr @xXxsA a do putghr x puttr xs

relude

Escritura de cadenas en la pantalla y salto de lnea: relude puttrvn XX tring Eb sy @A puttrvn xs a do puttr xs putghr 9n9 Ejecucin de una lista de acciones:

sequene XX sy Eb sy @A sequene a return @A sequene @XsA a do sequene s


Por ejemplo,

relude

Bwinb sequene puttrvn 4uno4D puttrvn 4dos4 uno dos Bwinb it @A


Ejemplo de programa con primitivas derivadas Especicacin: El programa pide una cadena y dice el nmero de caracteres que tiene. Ejemplo de sesin:

EE Bwinb longitudgden EE isrie un denX 4roy es lunes4 EE v den tiene IR rteres


Programa:

Tema 13. Programas interactivos

161

longitudgden XX sy @A longitudgden a do puttr 4isrie un denX 4 xs `E getvine puttr 4v den tiene 4 puttr @show @length xsAA puttrvn 4 rteres4

13.6.
13.6.1.

Ejemplos de programas interactivos


Juego de adivinacin interactivo

Descripcin: El programa le pide al jugador humano que piense un nmero entre 1 y 100 y trata de adivinar el nmero que ha pensado plantendole conjeturas a las que el jugador humano responde con mayor, menor o exacto segn que el nmero pensado sea mayor, menor o igual que el nmero conjeturado por la mquina. Ejemplo de sesin:

winb juego iens un numero entre el I is SHc myorGmenorGexto is USc myorGmenorGexto is TPc myorGmenorGexto is TVc myorGmenorGexto pin del juego
Programa:

y el IHHF myor menor myor exto

juego XX sy @A juego a do puttrvn 4iens un numero entre el I y el IHHF4 divin I IHH puttrvn 4pin del juego4 divin XX snt Eb snt Eb sy @A divin a do puttr @4is 4 CC show onjetur CC 4c myorGmenorGexto 4A s `E getvine se s of 4myor4 Eb divin @onjeturCIA

162

Temas de programacin funcional (201011)

where onjetur a @CA div P

4menor4 Eb divin @onjeturEIA 4exto4 Eb return @A Eb divin

13.6.2.

Calculadora aritmtica

Acciones auxiliares Escritura de caracteres sin eco:

getgh XX sy ghr getgh a do hetiho stdin plse `E getghr hetiho stdin rue return
Limpieza de la pantalla:

limpintllXX sy @A limpintlla puttr 4igPt4


Escritura en una posicin:

type os a @sntDsntA ire XX os Eb sy @A ire @xDyA a puttr @4ig4 CC show y CC 4Y4 CC show x CC 4r4A esriein XX os Eb tring Eb sy @A esriein p xs a do ire p puttr xs
Calculadora

luldor XX sy @A luldor a do limpintll

Tema 13. Programas interactivos

163

esriegluldor limpir esriegluldor XX sy @A esriegluldor a do limpintll sequene esriein @IDyA xs | @yDxsA `E zip IFFIQ imgengluldor puttrvn 44 imgengluldor XX tring imgengluldor a 4CEEEEEEEEEEEEEEEC4D 4| |4D 4CEEECEEECEEECEEEC4D 4| q | | d | a |4D 4CEEECEEECEEECEEEC4D 4| I | P | Q | C |4D 4CEEECEEECEEECEEEC4D 4| R | S | T | E |4D 4CEEECEEECEEECEEEC4D 4| U | V | W | B |4D 4CEEECEEECEEECEEEC4D 4| H | @ | A | G |4D 4CEEECEEECEEECEEEC4

Los primeros cuatro botones permiten escribir las rdenes: q para salir (quit), c para limpiar la agenda (clear), d para borrar un carcter (delete) y = para evaluar una expresin. Los restantes botones permiten escribir las expresiones.

limpir XX sy @A limpir a l 44 l XX tring Eb sy @A

164

Temas de programacin funcional (201011)

l xs a do esrieinntll xs `E getgh if elem otones then proes xs else do l xs esrieinntll xs a do esriein @QDPA 4 4 esriein @QDPA @reverse @tke IQ @reverse xsAAA otones XX tring otones a stndrd CC extr where stndrd a 4qdaIPQCRSTEUVWBH@AG4 extr a 4gh igfhivn4 proes XX ghr Eb tring proes xs | elem 4qig4 a | elem 4dhfhiv4 a | elem 4an4 a | elem 4g4 a | otherwise a slir XX sy @A slir a ire @IDIRA orrr XX tring Eb sy @A orrr 44 a l 44 orrr xs a l @init xsA evlur XX tring Eb sy @A evlur xs a se nliz expr xs of @nD44A Eb l @show nA Eb do l xs gregr XX ghr Eb tring Eb sy @A gregr xs a l @xs CC A Eb sy @A slir orrr xs evlur xs limpir gregr xs

Tema 13. Programas interactivos

165

13.6.3.

El juego de la vida

Descripcin del juego de la vida El tablero del juego de la vida es una malla formada por cuadrados (clulas) que se pliega en todas las direcciones. Cada clula tiene 8 clulas vecinas, que son las que estn prximas a ella, incluso en las diagonales. Las clulas tienen dos estados: estn vivas o muertas. El estado del tablero evoluciona a lo largo de unidades de tiempo discretas. Las transiciones dependen del nmero de clulas vecinas vivas: Una clula muerta con exactamente 3 clulas vecinas vivas nace (al turno siguiente estar viva). Una clula viva con 2 3 clulas vecinas vivas sigue viva, en otro caso muere. El tablero del juego de la vida Tablero:

type lero a os
Dimensiones:

nho XX snt nho a S lto XX snt lto a S


El juego de la vida Ejemplo de tablero:

ejlero XX lero ejlero a @PDQAD@QDRAD@RDPAD@RDQAD@RDRA


Representacin del tablero:

166

Temas de programacin funcional (201011)

IPQR I P y Q y y R yy @vid n tA simula el juego de la vida a partir del tablero t con un tiempo entre generaciones proporcional a n. Por ejemplo, vid IHHHHH ejlero vid XX snt Eb lero Eb sy @A vid n t a do limpintll esrielero t esper n vid n @siguienteqenerion tA
Escritura del tablero:

esrielero XX lero Eb sy @A esrielero t a sequene esriein p 4y4 | p `E t


Espera entre generaciones:

esper XX snt Eb sy @A esper n a sequene return @A | `E IFFn siguienteqenerion tA es el tablero de la siguiente generacin al tablero t. Por ejemplo, Bwinb siguienteqenerion ejlero @RDQAD@QDRAD@RDRAD@QDPAD@SDQA siguienteqenerion XX lero Eb lero siguienteqenerion t a supervivientes t CC nimientos t @supervivientes tA es la listas de posiciones de t que sobreviven; i.e. posiciones con 2 3 vecinos vivos. Por ejemplo, supervivientes ejlero ; @RDQAD@QDRAD@RDRA

Tema 13. Programas interactivos

167

supervivientes XX lero Eb os supervivientes t a p | p `E tD elem @neinosivos t pA PDQ @neinosivos t A es el nmero de vecinos vivos de la clula en el tablero t. Por ejemplo, neinosivos ejlero @QDQA neinosivos ejlero @QDRA
; ;

S Q

neinosivos XX lero Eb os Eb snt neinosivos t a length F filter @tieneid tA F veinos @veinos pA es la lista de los vecinos de la clula en la posicin p. Por ejemplo, veinos veinos veinos veinos veinos veinos veinos @PDQA @IDPA @SDPA @PDIA @PDSA @IDIA @SDSA
; ; ; ; ; ; ;

@IDPAD@PDPAD@QDPAD@IDQAD@QDQAD@IDRAD@PDRAD@QDRA @SDIAD@IDIAD@PDIAD@SDPAD@PDPAD@SDQAD@IDQAD@PDQA @RDIAD@SDIAD@IDIAD@RDPAD@IDPAD@RDQAD@SDQAD@IDQA @IDSAD@PDSAD@QDSAD@IDIAD@QDIAD@IDPAD@PDPAD@QDPA @IDRAD@PDRAD@QDRAD@IDSAD@QDSAD@IDIAD@PDIAD@QDIA @SDSAD@IDSAD@PDSAD@SDIAD@PDIAD@SDPAD@IDPAD@PDPA @RDRAD@SDRAD@IDRAD@RDSAD@IDSAD@RDIAD@SDIAD@IDIA

veinos XX os Eb os veinos @xDyA a mp modulr @xEIDyEIAD @xDyEIAD @xCIDyEIAD @xEIDyAD @xCIDyAD @xEIDyCIAD @xDyCIAD @xCIDyCIA @modulr pA es la posicin correspondiente a p en el tablero considerando los plegados. Por ejemplo, modulr modulr modulr modulr @TDQA @HDQA @QDTA @QDHA
; ; ; ;

@IDQA @SDQA @QDIA @QDSA

modulr XX os Eb os modulr @xDyA a @@@xEIA mod nhoA C ID @@yEIA mod lto C IAA @tieneid t pA se verica si la posicin p del tablero t tiene vida. Por ejemplo,

168

Temas de programacin funcional (201011)

tieneid ejlero @IDIA tieneid ejlero @PDQA

; ;

plse rue

tieneid XX lero Eb os Eb fool tieneid t p a elem p t @noieneid t pA se verica si la posicin p del tablero t no tiene vida. Por ejemplo, noieneid ejlero @IDIA noieneid ejlero @PDQA
; ;

rue plse

noieneid XX lero Eb os Eb fool noieneid t p a not @tieneid t pA @nimientos tA es la lista de los nacimientos de tablero t; i.e. las posiciones sin vida con 3 vecinos vivos. Por ejemplo, nimientos ejlero ; @QDPAD@SDQA

nimientos9 XX lero Eb os nimientos9 t a @xDyA | x `E IFFnhoD y `E IFFltoD noieneid t @xDyAD neinosivos t @xDyA aa Q
Denicin ms eciente de nimientos

nimientos XX lero Eb os nimientos t a p | p `E nu @ont @mp veinos tAAD noieneid t pD neinosivos t p aa Q


donde @nu xsA es la lista obtenida eliminando las repeticiones de xs. Por ejemplo,

nu PDQDPDS ;

PDQDS

Tema 13. Programas interactivos

169

Bibliografa
1. H. Daum III. Yet Another Haskell Tutorial. 2006. Cap. 5: Basic Input/Output. 2. G. Hutton. Programming in Haskell. Cambridge University Press, 2007. Cap. 9: Interactive programs. 3. B. OSullivan, J. Goerzen y D. Stewart. Real World Haskell. OReilly, 2009. Cap. 7: I/O. 4. B.C. Ruiz, F. Gutirrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 7: Entrada y salida. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. AddisonWesley, 1999. Cap. 18: Programming with actions.

170

Temas de programacin funcional (201011)

Tema 14 El TAD de las pilas


Contenido
14.1. Tipos abstractos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 14.1.1. Abstraccin y tipos abstractos de datos . . . . . . . . . . . . . . . 159 14.2. Especicacin del TAD de las pilas . . . . . . . . . . . . . . . . . . . . . 159 14.2.1. Signatura del TAD pilas . . . . . . . . . . . . . . . . . . . . . . . . 159 14.2.2. Propiedades del TAD de las pilas . . . . . . . . . . . . . . . . . . . 160 14.3. Implementaciones del TAD de las pilas . . . . . . . . . . . . . . . . . . . 161 14.3.1. Las pilas como tipos de datos algebraicos . . . . . . . . . . . . . . 161 14.3.2. Las pilas como listas . . . . . . . . . . . . . . . . . . . . . . . . . . 163 14.4. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 164 14.4.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 14.4.2. Generador de pilas . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 14.4.3. Especicacin de las propiedades de las pilas . . . . . . . . . . . . 165 14.4.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 166

14.1.
14.1.1.

Tipos abstractos de datos


Abstraccin y tipos abstractos de datos

Abstraccin y tipos abstractos de datos La abstraccin es un mecanismo para comprender problemas que involucran una gran cantidad de detalles. 171

172

Temas de programacin funcional (201011)

Aspectos de la abstraccin: Destacar los detalles relevantes. Ocultar los detalles irrelevantes. Un tipo abstracto de datos (TAD) es una coleccin de valores y operaciones que se denen mediante una especicacin que es independiente de cualquier representacin. Un TAD es una abstraccin: Se destacan los detalles (normalmente pocos) de la especicacin (el qu). Se ocultan los detalles (normalmente numerosos) de la implementacin (el cmo). Analoga con las estructuras algebraicas.

14.2.
14.2.1.

Especicacin del TAD de las pilas


Signatura del TAD pilas

Descripcin informal de las pilas Una pila es una estructura de datos, caracterizada por ser una secuencia de elementos en la que las operaciones de insercin y extraccin se realizan por el mismo extremo. La pilas tambin se llaman estructuras LIFO (del ingls Last In First Out), debido a que el ltimo elemento en entrar ser el primero en salir. Analoga con las pilas de platos. Signatura del TAD de las pilas Signatura:

vi pil im despil esi

XX XX XX XX XX

il Eb il il il

il Eb Eb Eb

Eb il il fool

Descripcin:

Tema 14. El TAD de las pilas

173

vi es la pila vaca. @pil x pA es la pila obtenida aadiendo x al principio de p. @im pA es la cima de la pila p. @despil pA es la pila obtenida suprimiendo la cima de p. @esi pA se verica si p es la pila vaca.

14.2.2.

Propiedades del TAD de las pilas

Propiedades de las pilas 1. im @pil x pA aa x 2. despil @pil x pA aa p 3. esi vi 4. not @esi @pil x pAA

14.3.
14.3.1.

Implementaciones del TAD de las pilas


Las pilas como tipos de datos algebraicos

Cabecera del mdulo:

module ilgonipohehtoelgerio @ilD viD EE il pilD EE Eb il Eb il imD EE il Eb despilD EE il Eb il esi EE il Eb fool A where
Tipo de dato algebraico de las pilas.

dt il a i | @il A deriving iq
Procedimiento de escritura de pilas.

174

Temas de programacin funcional (201011)

instne @how A ab how @il A where showsre p i d a showghr 9E9 d showsre p @ x sA d a shows x @showghr 9|9 @shows s dAA
Ejemplo de pila: Denicin

pI XX il snt pI a pil I @pil P @pil Q viAA


Sesin

ghib pI I|P|Q|E vi es la pila vaca. Por ejemplo, ghib vi E vi XX il vi a i @pil x pA es la pila obtenida aadiedo x encima de la pila p. Por ejemplo, pil R pI ab R|I|P|Q|E

pil XX Eb il Eb il pil x p a x p @im pA es la cima de la pila p. Por ejemplo, im pI aa I

im XX il Eb im i a error 4imX pil vi4 im @ x A a x @despil pA es la pila obtenida suprimiendo la cima de la pila p. Por ejemplo,

Tema 14. El TAD de las pilas

175

despil pI

ab

P|Q|E

despil XX il Eb il despil i a error 4despilX pil vi4 despil @ pA a p @esi pA se verica si p es la pila vaca. Por ejemplo, esi pI aa plse esi vi aa rue esi XX il Eb fool esi i a rue esi a plse

14.3.2.

Las pilas como listas

Cabecera del mdulo

module ilgonvists @ilD viD EE il pilD EE Eb imD EE il despilD EE il esi EE il A where


Tipo de datos de las pilas:

il Eb Eb Eb

Eb il il fool

newtype il a deriving iq
Procedimiento de escritura de pilas.

instne @how A ab how @il A where showsre p @ A d a showghr 9E9 d showsre p @ @xXxsAA d a shows x @showghr 9|9 @shows @ xsA dAA

176

Temas de programacin funcional (201011)

Ejemplo de pila: pI es la pila obtenida anadindole los elementos 3, 2 y 1 a la pila vaca. Por ejemplo,

ghib pI I|P|Q|E pI a pil I @pil P @pil Q viAA vi es la pila vaca. Por ejemplo, ghib vi E vi XX il vi a @pil x pA es la pila obtenida aadiendo x encima de la pila p. Por ejemplo, pil R pI ab R|I|P|Q|E|

pil XX Eb il Eb il pil x @ xsA a @xXxsA @im pA es la cima de la pila p. Por ejemplo, im pI aa I

im XX il Eb im @ @xXAA a x im @ A a error 4im de l pil vi4 @despil pA es la pila obtenida suprimiendo la cima de la pila p. Por ejemplo, despil pI ab P|Q|E

despil XX il Eb il despil @ A a error 4despil l pil vi4 despil @ @XxsAA a xs @esi pA se verica si p es la pila vaca. Por ejemplo,

Tema 14. El TAD de las pilas

177

esi pI aa plse esi vi aa rue esi XX il Eb fool esi @ xsA a null xs

14.4.
14.4.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de libreras Importacin de la implementacin de pilas que se desea comprobar.

import ilgonipohehtoelgerio EE import ilgonvists


Importacin de las libreras de comprobacin

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

14.4.2.

Generador de pilas

Generador de pilas

genil es un generador de pilas. Por ejemplo, ghib smple genil H|H|E ET|R|EQ|Q|H|E E W|S|EI|EQ|H|EV|ES|EU|P|E FFF genil XX @xum D eritrry A ab qen @il A genil a do xs `E listyf ritrry return @foldr pil vi xsA

178

Temas de programacin funcional (201011)

instne @eritrry D xum A ab eritrry @il A where ritrry a genil

14.4.3.

Especicacin de las propiedades de las pilas

La cima de la pila que resulta de aadir x a la pila p es x.

propimpil XX snt Eb il snt Eb fool propimpil x p a im @pil x pA aa x


La pila que resulta de desapilar despus de aadir cualquier elemento a una pila p es p.

propdespilpil XX snt Eb il snt Eb fool propdespilpil x p a despil @pil x pA aa p


La pila vaca est vaca.

propviestvi XX fool propviestvi a esi vi


La pila que resulta de aadir un elemento en un pila cualquiera no es vaca.

proppilnoesvi XX snt Eb il snt Eb fool proppilnoesvi x p a not @esi @pil x pAA

14.4.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin

Tema 14. El TAD de las pilas

179

testqroup 4ropieddes del eh pils4 testroperty 4I4 propimpilD testroperty 4P4 propdespilpilD testroperty 4Q4 propviestviD testroperty 4R4 proppilnoesvi
Comprobacin de las propiedades de las pilas

ghib omprueropieddes ropieddes del eh pilsX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests roperties otl ssed R R piled H H otl R R

180

Temas de programacin funcional (201011)

Tema 15 El TAD de las colas


Contenido
15.1. Especicacin del TAD de las colas . . . . . . . . . . . . . . . . . . . . . 167 15.1.1. Signatura del TAD de las colas . . . . . . . . . . . . . . . . . . . . 167 15.1.2. Propiedades del TAD de las colas . . . . . . . . . . . . . . . . . . 168 15.2. Implementaciones del TAD de las colas . . . . . . . . . . . . . . . . . . 168 15.2.1. Implementacin de las colas mediante listas . . . . . . . . . . . . 168 15.2.2. Implementacin de las colas mediante pares de listas . . . . . . . 170 15.3. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 173 15.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 15.3.2. Generador de colas . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 15.3.3. Especicacin de las propiedades de las colas . . . . . . . . . . . 174 15.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 176

15.1.
15.1.1.

Especicacin del TAD de las colas


Signatura del TAD de las colas

Descripcin informal de las colas Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operacin de insercin se realiza por un extremo (el posterior o nal) y la operacin de extraccin por el otro (el anterior o frente). Las colas tambin se llaman estructuras FIFO (del ingls First In First Out), debido a que el primer elemento en entrar ser tambin el primero en salir. 181

182

Temas de programacin funcional (201011)

Analoga con las colas del cine. Signatura del TAD colas Signatura:

vi insert primero resto esi vlid

XX XX XX XX XX XX

gol Eb gol gol gol gol

gol Eb Eb Eb Eb

Eb gol gol fool fool

Descripcin de las operaciones: vi es la cola vaca. @insert x A es la cola obtenida aadiendo x al nal de . @primero A es el primero de la cola . @resto A es la cola obtenida eliminando el primero de . @esi A se verica si es la cola vaca. @vlid A se verica si representa una cola vlida.

15.1.2.

Propiedades del TAD de las colas

Propiedades del TAD de las colas 1. primero @insert x viA aa x 2. Si es una cola no vaca, entonces primero @insert x A aa primero , 3. resto @insert x viA aa vi 4. Si es una cola no vaca, entonces resto @insert x A aa insert x @resto A 5. esi vi 6. not @esi @insert x AA

Tema 15. El TAD de las colas

183

15.2.
15.2.1.

Implementaciones del TAD de las colas


Implementacin de las colas mediante listas

Cabecera del mdulo:

module golgonvists @golD viD EE gol insertD EE Eb primeroD EE gol restoD EE gol esiD EE gol vlid EE gol A where

gol Eb Eb Eb Eb

Eb gol gol fool fool

Representacin de las colas mediante listas:

newtype gol a g deriving @howD iqA


Ejemplo de cola: I es la cola obtenida aadindole a la cola vaca los nmeros del 1 al 10. Por ejemplo,

ghib I g IHDWDVDUDTDSDRDQDPDI I a foldr insert vi IFFIH vi es la cola vaca. Por ejemplo, ghib vi g vi XX gol vi a g @insert x A es la cola obtenida aadiendo x al nal de la cola . Por ejemplo, insert IP I ; g IHDWDVDUDTDSDRDQDPDIDIP

insert XX Eb gol Eb gol insert x @g A a g @ CC xA

184

Temas de programacin funcional (201011)

@primero A es el primer elemento de la cola . Por ejemplo, primero I


;

IH

primero XX gol Eb primero @g @xXAA a x primero @g A a error 4primeroX ol vi4 @resto A es la cola obtenida eliminando el primer elemento de la cola . Por ejemplo, resto I
;

g WDVDUDTDSDRDQDPDI

resto XX gol Eb gol resto @g @XxsAA a g xs resto @g A a error 4restoX ol vi4 @esi A se verica si es la cola vaca. Por ejemplo, esi I ; esi vi ; plse rue

esi XX gol Eb fool esi @g xsA a null xs @vlid A se verica si representa una cola vlida. Con esta representacin, todas las colas son vlidas. vlid XX gol Eb fool vlid a rue

15.2.2.

Implementacin de las colas mediante pares de listas

Las colas como pares de listas En esta implementacin, una cola se representa mediante un par de listas @xsDysA de modo que los elementos de son, en ese orden, los elementos de la lista xsCC@reverse ysA. Al dividir la lista en dos parte e invertir la segunda de ellas, esperamos hacer ms eciente las operaciones sobre las colas.

Tema 15. El TAD de las colas

185

Impondremos tambin una restriccin adicional sobre la representacin: las colas sern representadas mediante pares @xsDysA tales que si xs es vaca, entonces ys ser tambin vaca. Esta restriccin ha de mantenerse por las operaciones que crean colas. Implementacin de las colas como pares de listas Cabecera del mdulo

module golgonhosvists @golD viD EE gol insertD EE Eb gol primeroD EE gol Eb restoD EE gol Eb esiD EE gol Eb vlid EE gol Eb A where
Las colas como pares de listas

Eb gol gol fool fool

newtype gol a g @DA @vlid A se verica si la cola es vlida; es decir, si su primer elemento es vaco entonces tambin lo es el segundo. Por ejemplo, vlid @g @PDSAA vlid @g @PDAA vlid @g @DSAA
; ; ;

rue rue plse

vlidXX gol Eb fool vlid @g @xsDysAA a not @null xsA || null ys


Procedimiento de escritura de colas como pares de listas.

instne how ab how @gol A where showsre p @g @xsDysAA d a showtring 4g 4 @showvist @xs CC @reverse ysAA dA
Ejemplo de cola: I es la cola obtenida aadindole a la cola vaca los nmeros del 1 al 10. Por ejemplo,

186

Temas de programacin funcional (201011)

ghib I g IHDWDVDUDTDSDRDQDPDI I XX gol snt I a foldr insert vi IFFIH vi es la cola vaca. Por ejemplo, ghib I g IHDWDVDUDTDSDRDQDPDI vi XX gol vi a g @DA @insert x A es la cola obtenida aadiendo x al nal de la cola . Por ejemplo, insert IP I ; g IHDWDVDUDTDSDRDQDPDIDIP

insert XX Eb gol Eb gol insert y @g @xsDysAA a g @normliz @xsDyXysAA @normliz pA es la cola obtenida al normalizar el par de listas p. Por ejemplo, normliz @DPDSDQA ; normliz @RDPDSDQA ; @QDSDPDA @RDPDSDQA

normliz XX @DA Eb @DA normliz @D ysA a @reverse ysD A normliz p a p @primero A es el primer elemento de la cola . Por ejemplo, primero I
;

IH

primero XX gol Eb primero @g @xXxsDysAA a x primero a error 4primeroX ol vi4 @resto A es la cola obtenida eliminando el primer elemento de la cola . Por ejemplo,

Tema 15. El TAD de las colas

187

resto I

g WDVDUDTDSDRDQDPDI

resto XX gol Eb gol resto @g @xXxsDysAA a g @normliz @xsDysAA resto @g @DAA a error 4restoX ol vi4 @esi A se verica si es la cola vaca. Por ejemplo, esi I ; esi vi ; plse rue

esi XX gol Eb fool esi @g @xsDAA a null xs @elementos A es la lista de los elementos de la cola en el orden de la cola. Por ejemplo, elementos @g @QDPDSDRDUAA
;

QDPDUDRDS

elementosXX gol Eb elementos @g @xsDysAA a xs CC @reverse ysA @igulgols I PA se verica si las colas I y P son iguales. ghib igulgols @g @QDPDSDRDUAA @g @QDSDRDUDPAA rue ghib igulgols @g @QDPDSDRDUAA @g @DSDRDUDPDQAA plse igulgols I P a vlid I 88 vlid P 88 elementos I aa elementos P
Extensin de la igualdad a las colas:

instne @iq A ab iq @gol A where @aaA a igulgols

188

Temas de programacin funcional (201011)

15.3.
15.3.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de libreras Importacin de la implementacin de las colas que se desea comprobar.

import golgonvists EE import golgonhosvists


Importacin de libreras auxiliares

import import import import

htFvist estFuikghek estFprmework estFprmeworkFrovidersFuikghekP

15.3.2.

Generador de colas

Generador de colas

gengol es un generador de colas de enteros. Por ejemplo, ghib smple gengol g @UDVDRDQDUDSDQDQA g @IDIQA FFF gengol XX qen @gol sntA gengol a frequeny @ID return viAD @QHD do n `E hoose @IHDIHHA xs `E vetoryf n ritrry return @regol xsAA where regol a foldr insert vi instne eritrry @gol sntA where ritrry a gengol

Tema 15. El TAD de las colas

189

Correccin del generador de colas Propiedad: Todo los elementos generados por gengol son colas vlidas.

propgengolorreto XX gol snt Eb fool propgengolorreto a vlid


Comprobacin.

ghib quikghek propgengolorreto CCC yuD pssed IHH testsF

15.3.3.

Especicacin de las propiedades de las colas

El primero de la cola obtenida aadiendo x a la cola vaca es x.

propprimeroinsertvi XX snt Eb fool propprimeroinsertvi x a primero @insert x viA aa x


Si una cola no est vaca, su primer elemento no vara al aadirle un elemento.

propprimeroinsertnovi XX gol snt Eb snt Eb snt Eb fool propprimeroinsertnovi x y a primero @insert x 9A aa primero 9 where 9 a insert y vi
El resto de la cola obtenida insertando un elemento en la cola vaca es la cola vaca.

proprestoinsertvi XX snt Eb fool proprestoinsertvi x a resto @insert x viA aa vi


Las operaciones de encolar y desencolar conmutan.

proprestoinsertennovi XX gol snt Eb snt Eb snt Eb fool proprestoinsertennovi x y a resto @insert x 9A aa insert x @resto 9A where 9 a insert y

190

Temas de programacin funcional (201011)

vi es una cola vaca. propviesvi XX fool propviesvi a esi vi


La cola obtenida insertando un elemento no es vaca.

propinsertnoesvi XX snt Eb gol snt Eb fool propinsertnoesvi x a not @esi @insert x AA


La cola vaca es vlida.

propvlidvi XX fool propvlidvi a vlid vi


Al aadirle un elemento a una cola vlida se obtiene otra vlida.

propvlidinsert XX gol snt Eb snt Eb roperty propvlidinsert x a vlid aab vlid @insert x A
El resto de una cola vlida y no vaca es una cola vlida.

propvlidresto XX gol snt Eb roperty propvlidresto a vlid 88 not @esi A aab vlid @resto A

15.3.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin testqroup 4ropieddes del eh ol4 testqroup 4ropieddes del eh ol4 testroperty 4I4 propprimeroinsertviD testroperty 4P4 propprimeroinsertnoviD

Tema 15. El TAD de las colas

191

testroperty testroperty testroperty testroperty testroperty testroperty testroperty

4Q4 4R4 4S4 4T4 4U4 4V4 4W4

proprestoinsertviD proprestoinsertennoviD propviesviD propinsertnoesviD propvlidviD propvlidinsertD propvlidresto

Comprobacin de las propiedades de las colas

ghib omprueropieddes ropieddes del eh ol IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests UX yuD pssed IHH tests VX yuD pssed IHH tests WX yuD pssed IHH tests roperties otl ssed W W piled H H otl W W

192

Temas de programacin funcional (201011)

Tema 16 El TAD de las colas de prioridad


Contenido
16.1. Especicacin del TAD de las colas de prioridad . . . . . . . . . . . . . 179 16.1.1. Signatura del TAD colas de prioridad . . . . . . . . . . . . . . . . 179 16.1.2. Propiedades del TAD de las colas de prioridad . . . . . . . . . . . 180 16.2. Implementaciones del TAD de las colas de prioridad . . . . . . . . . . . 180 16.2.1. Las colas de prioridad como listas . . . . . . . . . . . . . . . . . . 180 16.2.2. Las colas de prioridad como montculos . . . . . . . . . . . . . . . 182 16.3. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 182 16.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 16.3.2. Generador de colas de prioridad . . . . . . . . . . . . . . . . . . . 183 16.3.3. Especicacin de las propiedades de las colas de prioridad . . . . 184 16.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 185

16.1.
16.1.1.

Especicacin del TAD de las colas de prioridad


Signatura del TAD colas de prioridad

Descripcin de las colas de prioridad Una cola de prioridad es una cola en la que cada elemento tiene asociada una prioridad. La operacin de extraccin siempre elige el elemento de menor prioridad. Ejemplos: 193

194

Temas de programacin funcional (201011)

La cola de las ciudades ordenadas por su distancia al destino nal. Las colas de las tareas pendientes ordenadas por su fecha de terminacin. Signatura de las colas de prioridad Signatura:

viD insertD primeroD restoD esiD vlid

XX XX XX XX XX XX

yrd yrd yrd yrd yrd yrd

ab ab ab ab ab ab

grioridd Eb grioridd grioridd Eb grioridd Eb grioridd Eb grioridd Eb

Eb grioridd grioridd fool fool

Descripcin de las operaciones: vi es la cola de prioridad vaca. @insert x A aade el elemento x a la cola de prioridad . @primero A es el primer elemento de la cola de prioridad . @resto A es el resto de la cola de prioridad . @esi A se verica si la cola de prioridad es vaca. @vlid A se verica si es una cola de prioridad vlida.

16.1.2.

Propiedades del TAD de las colas de prioridad

1. insert x @insert y A aa insert y @insert x A 2. primero @insert x viA aa x 3. Si x `a y, entonces primero @insert y @insert x AA aa primero @insert x A 4. resto @insert x viA aa vi 5. Si x `a y, entonces resto @insert y @insert x AA aa insert y @resto @insert x AA 6. esi vi 7. not @esi @insert x AA

Tema 16. El TAD de las colas de prioridad

195

16.2.
16.2.1.

Implementaciones del TAD de las colas de prioridad


Las colas de prioridad como listas

Cabecera del mdulo:

module golherioriddgonvists @grioriddD viD EE yrd ab grioridd insertD EE yrd ab Eb grioridd primeroD EE yrd ab grioridd Eb restoD EE yrd ab grioridd Eb esiD EE yrd ab grioridd Eb vlid EE yrd ab grioridd Eb A where
Colas de prioridad mediante listas:

Eb grioridd grioridd fool fool

newtype grioridd a g deriving @iqD howA


Ejemplo de cola de prioridad: pI es la cola de prioridad obtenida aadindole a la cola vaca los elementos 3, 1, 7, 2 y 9.

pI

; g IDPDQDUDW

pI XX grioridd snt pI a foldr insert vi QDIDUDPDW @vlid A se verica si es una cola de prioridad vlida; es decir, est ordenada crecientemente. Por ejemplo, vlid @g IDQDSA vlid @g IDSDQA
; ;

rue plse

vlid XX yrd ab grioridd Eb fool vlid @g xsA a ordend xs where ordend @xXyXzsA a x `a y 88 ordend @yXzsA ordend a rue vi es la cola de prioridad vaca. Por ejemplo,

196

Temas de programacin funcional (201011)

vi

vi XX yrd ab grioridd vi a g @insert x A es la cola obtenida aadiendo el elemento x a la cola de prioridad . Por ejemplo, pI ; insert S pI ; g IDPDQDUDW g IDPDQDSDUDW

insert XX yrd ab Eb grioridd Eb grioridd insert x @g qA a g @ins x qA where ins x a x ins x rd@eXr9A | x ` e a xXr | otherwise a eXins x r9 @primero A es el primer elemento de la cola de prioridad . pI primero pI
; ;

g IDPDQDUDW I

primero XX yrd ab grioridd Eb primero @g@xXAA a x primero a error 4primeroX ol vi4 @resto A es la cola de prioridad obtenida eliminando el primer elemento de la cola de prioridad . Por ejemplo, pI resto pI
; ;

g IDPDQDUDW g PDQDUDW

resto XX yrd ab grioridd Eb grioridd resto @g @XxsAA a g xs resto a error 4restoX ol vi4 @esi A se verica si la cola de prioridad es vaca. Por ejemplo, esi pI ; esi vi ; plse rue

Tema 16. El TAD de las colas de prioridad

197

esi XX yrd ab grioridd Eb fool esi @g xsA a null xs

16.2.2.

Las colas de prioridad como montculos

La implementacin de las colas de prioridad como montculos (golherioriddgonwontiulos se encuentra en en el tema 20 (El TAD de los montculos).

16.3.
16.3.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de la implementacin de colas de prioridad que se desea vericar.

import golherioriddgonvists EE golherioriddgonwontiulosFhs


Importacin de las libreras de comprobacin

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

16.3.2.

Generador de colas de prioridad

gengrioridd es un generador de colas de prioridad. Por ejemplo, ghib smple gengrioridd g ER g EPDEIDEIDPDS FFF gengrioridd XX @eritrry D xum D yrd A ab qen @grioridd A gengrioridd a do xs `E listyf ritrry return @foldr insert vi xsA

198

Temas de programacin funcional (201011)

instne @eritrry D xum D yrd A ab eritrry @grioridd A where ritrry a gengrioridd


Correccin del generador de colas de prioridad Las colas de prioridad producidas por gengrioridd son vlidas.

propgengrioriddorreto XX grioridd snt Eb fool propgengrioriddorreto a vlid


Comprobacin.

ghib quikghek propgengrioriddorreto CCC yuD pssed IHH testsF

16.3.3.

Especicacin de las propiedades de las colas de prioridad

Si se aade dos elementos a una cola de prioridad se obtiene la misma cola de prioridad idependientemente del orden en que se aadan los elementos.

propinsertonmut XX snt Eb snt Eb grioridd snt Eb fool propinsertonmut x y a insert x @insert y A aa insert y @insert x A
La cabeza de la cola de prioridad obtenida anadiendo un elemento x a la cola de prioridad vaca es x.

propprimeroinsertvi XX snt Eb grioridd snt Eb fool propprimeroinsertvi x a primero @insert x viA aa x


El primer elemento de una cola de prioridad no cambia cuando se le aade un elemento mayor o igual que algn elemento de .

propprimeroinsert XX snt Eb snt Eb grioridd snt Eb roperty propprimeroinsert x y a x `a y aab primero @insert y 9A aa primero 9 where 9 a insert x

Tema 16. El TAD de las colas de prioridad

199

El resto de aadir un elemento a la cola de prioridad vaca es la cola vaca.

proprestoinsertvi XX snt Eb fool proprestoinsertvi x a resto @insert x viA aa vi


El resto de la cola de prioridad obtenida aadiendo un elemento y a una cola 9 (que tiene algn elemento menor o igual que y) es la cola que se obtiene aadiendo y al resto de 9.

proprestoinsert XX snt Eb snt Eb grioridd snt Eb roperty proprestoinsert x y a x `a y aab resto @insert y 9A aa insert y @resto 9A where 9 a insert x vi es una cola vaca. propviesvi XX fool propviesvi a esi @vi XX grioridd sntA
Si se aade un elemento a una cola de prioridad se obtiene una cola no vaca.

propinsertnoesvi XX snt Eb grioridd snt Eb fool propinsertnoesvi x a not @esi @insert x AA

16.3.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin testqroup 4gorrein del generdor4 testroperty 4H4 propgengrioriddorretoD testqroup 4ropiedde de ols de prioridX4

200

Temas de programacin funcional (201011)

testroperty testroperty testroperty testroperty testroperty testroperty testroperty

4I4 4P4 4Q4 4R4 4S4 4T4 4U4

propinsertonmutD propprimeroinsertviD propprimeroinsertD proprestoinsertviD proprestoinsertD propviesviD propinsertnoesvi

Comprobacin de las propiedades de las colas de prioridad

ghib omprueropieddes gorrein del generdorX HX yuD pssed IHH tests ropieddes de ols de prioriddX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests UX yuD pssed IHH tests roperties otl ssed V V piled H H otl V V

Tema 17 El TAD de los conjuntos


Contenido
17.1. Especicacin del TAD de los conjuntos . . . . . . . . . . . . . . . . . . 187 17.1.1. Signatura del TAD de los conjuntos . . . . . . . . . . . . . . . . . 187 17.1.2. Propiedades del TAD de los conjuntos . . . . . . . . . . . . . . . . 187 17.2. Implementaciones del TAD de los conjuntos . . . . . . . . . . . . . . . 188 17.2.1. Los conjuntos como listas no ordenadas con duplicados . . . . . 188 17.2.2. Los conjuntos como listas no ordenadas sin duplicados . . . . . . 191 17.2.3. Los conjuntos como listas ordenadas sin duplicados . . . . . . . . 193 17.2.4. Los conjuntos de nmeros enteros mediante nmeros binarios . . 195 17.3. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 199 17.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 17.3.2. Generador de conjuntos . . . . . . . . . . . . . . . . . . . . . . . . 199 17.3.3. Especicacin de las propiedades de los conjuntos . . . . . . . . . 199 17.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 201

17.1.
17.1.1.

Especicacin del TAD de los conjuntos


Signatura del TAD de los conjuntos
XX gonj XX iq ab Eb gonj Eb gonj XX iq ab Eb gonj Eb gonj
201

Signatura:

vioD insert elimin

202

Temas de programacin funcional (201011)

pertenee esio

XX iq ab Eb gonj Eb fool XX gonj Eb fool

Descripcin de las operaciones: vio es el conjunto vaco. @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . @elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . @pertenee x A se verica si x pertenece al conjunto . @esio A se verica si es el conjunto vaco.

17.1.2.

Propiedades del TAD de los conjuntos

1. insert x @insert x A aa insert x 2. insert x @insert y A aa insert y @insert x A 3. not @pertenee x vioA 4. pertenee y @insert x A aa @xaayA || pertenee y 5. elimin x vio aa vio 6. Si x aa y, entonces elimin x @insert y A aa elimin x 7. Si x Ga y, entonces elimin x @insert y A aa insert y @elimin x A 8. esio vio 9. not @esio @insert x AA

17.2.
17.2.1.

Implementaciones del TAD de los conjuntos


Los conjuntos como listas no ordenadas con duplicados

Cabecera del mdulo:

Tema 17. El TAD de los conjuntos

203

module gonjuntogonvistsxoyrdendsgonhuplidos @gonjD vioD EE gonj insertD EE iq ab Eb gonj Eb gonj eliminD EE iq ab Eb gonj Eb gonj perteneeD EE iq ab Eb gonj Eb fool esioD EE gonj Eb fool A where
El tipo de los conjuntos.

newtype gonj a gj
Procedimiento de escritura de los conjuntos.

instne how ab how @gonj A where showsre @gj sA d a showgonj s d showgonj d a showgonj @xXxsA d a showghr 9{9 @shows where showl d a showl @xXxsA d a showtring 4{}4 d x @showl xs dAA showghr 9}9 d showghr 9D9 @shows x @showl xs dAA

Ejemplo de conjunto: I es el conjunto obtenido aadindole al conjunto vaco los elementos 2, 5, 1, 3, 7, 5, 3, 2, 1, 9 y 0.

ghi b I {PDSDIDQDUDSDQDPDIDWDH} I XX gonj snt I a foldr insert vio PDSDIDQDUDSDQDPDIDWDH vio es el conjunto vaco. Por ejemplo, ghib vio {}

204

Temas de programacin funcional (201011)

vio XX gonj vio a gj @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . Por ejemplo, I aa {PDSDIDQDUDSDQDPDIDWDH} insert S I aa {SDPDSDIDQDUDSDQDPDIDWDH} insert XX iq ab Eb gonj Eb gonj insert x @gj ysA a gj @xXysA @elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . Por ejemplo, I aa {PDSDIDQDUDSDQDPDIDWDH} elimin Q I aa {PDSDIDUDSDPDIDWDH} elimin XX iq ab Eb gonj Eb gonj elimin x @gj ysA a gj @filter @Ga xA ysA @pertenee x A se verica si x pertenece al conjunto . Por ejemplo, I aa {PDSDIDQDUDSDQDPDIDWDH} pertenee Q I aa rue pertenee R I aa plse pertenee XX iq ab Eb gonj Eb fool pertenee x @gj xsA a elem x xs @esio A se verica si es el conjunto vaco. Por ejemplo, esio I ; esio vio ; plse rue

esio XX gonj Eb fool esio @gj xsA a null xs @suonjunto I PA se verica si I es un subconjunto de P. Por ejemplo,

Tema 17. El TAD de los conjuntos

205

suonjunto @gj IDQDPDIA @gj QDIDQDPA suonjunto @gj IDQDRDIA @gj QDIDQDPA

; ;

rue plse

suonjunto XX iq ab gonj Eb gonj Eb fool suonjunto @gj xsA @gj ysA a sulist xs ys where sulist a rue sulist @xXxsA ys a elem x ys 88 sulist xs ys @igulgonjunto I PA se verica si los conjuntos I y P son iguales. Por ejemplo, igulgonjunto @gj IDQDPDIA @gj QDIDQDPA igulgonjunto @gj IDQDRDIA @gj QDIDQDPA
; ;

rue plse

igulgonjunto XX iq ab gonj Eb gonj Eb fool igulgonjunto I P a suonjunto I P 88 suonjunto P I


Los conjuntos son comparables por igualdad.

instne iq ab iq @gonj A where @aaA a igulgonjunto

17.2.2.

Los conjuntos como listas no ordenadas sin duplicados

Cabecera del mdulo.

module gonjuntogonvistsxoyrdendsinhuplidos @gonjD vioD EE gonj esioD EE gonj Eb fool perteneeD EE iq ab Eb gonj Eb fool insertD EE iq ab Eb gonj Eb gonj elimin EE iq ab Eb gonj Eb gonj A where
Los conjuntos como listas no ordenadas sin repeticiones.

newtype gonj a gj

206

Temas de programacin funcional (201011)

Procedimiento de escritura de los conjuntos.

instne @how A ab how @gonj A where showsre @gj sA d a showgonj s d showgonj d a showtring 4{}4 d showgonj @xXxsA d a showghr 9{9 @shows x @showl xs dAA where showl d a showghr 9}9 d showl @xXxsA d a showghr 9D9 @shows x @showl xs dAA
Ejemplo de conjunto: I es el conjunto obtenido aadindole al conjunto vaco los elementos 2, 5, 1, 3, 7, 5, 3, 2, 1, 9 y 0.

ghib I {UDSDQDPDIDWDH} I XX gonj snt I a foldr insert vio PDSDIDQDUDSDQDPDIDWDH vio es el conjunto vaco. Por ejemplo, ghib vio {} vio XX gonj vio a gj @esio A se verica si es el conjunto vaco. Por ejemplo, esio I ; esio vio ; plse rue

esio XX gonj Eb fool esio @gj xsA a null xs @pertenee x A se verica si x pertenece al conjunto . Por ejemplo, I aa {PDSDIDQDUDSDQDPDIDWDH} pertenee Q I aa rue pertenee R I aa plse

Tema 17. El TAD de los conjuntos

207

pertenee XX iq ab Eb gonj Eb fool pertenee x @gj xsA a elem x xs @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . Por ejemplo, insert R I insert S I aa aa {RDUDSDQDPDIDWDH} {UDSDQDPDIDWDH}

insert XX iq ab Eb gonj Eb gonj insert x sd@gj xsA | pertenee x s a s | otherwise a gj @xXxsA @elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . Por ejemplo, elimin Q I aa {UDSDPDIDWDH}

elimin XX iq ab Eb gonj Eb gonj elimin x @gj ysA a gj y | y `E ysD y Ga x @suonjunto I PA se verica si I es un subconjunto de P. Por ejemplo, suonjunto @gj IDQDPA @gj QDIDPA suonjunto @gj IDQDRDIA @gj IDQDPA
; ;

rue plse

suonjunto XX iq ab gonj Eb gonj Eb fool suonjunto @gj xsA @gj ysA a sulist xs ys where sulist a rue sulist @xXxsA ys a elem x ys 88 sulist xs ys @igulgonjunto I PA se verica si los conjuntos I y P son iguales. Por ejemplo, igulgonjunto @gj QDPDIA @gj IDQDPA igulgonjunto @gj IDQDRA @gj IDQDPA
; ;

rue plse

208

Temas de programacin funcional (201011)

igulgonjunto XX iq ab gonj Eb gonj Eb fool igulgonjunto I P a suonjunto I P 88 suonjunto P I


Los conjuntos son comparables por igualdad.

instne iq ab iq @gonj A where @aaA a igulgonjunto

17.2.3.

Los conjuntos como listas ordenadas sin duplicados

Cabecera del mdulo

module gonjuntogonvistsyrdendsinhuplidos @gonjD vioD EE gonj esioD EE gonj Eb fool perteneeD EE yrd ab Eb gonj Eb fool insertD EE yrd ab Eb gonj Eb gonj elimin EE yrd ab Eb gonj Eb gonj A where
Los conjuntos como listas ordenadas sin repeticiones.

newtype gonj a gj deriving iq


Procedimiento de escritura de los conjuntos.

instne @how A ab how @gonj A where showsre @gj sA d a showgonj s d showgonj d a showtring 4{}4 d showgonj @xXxsA d a showghr 9{9 @shows x @showl xs dAA where showl d a showghr 9}9 d showl @xXxsA d a showghr 9D9 @shows x @showl xs dAA
Ejemplo de conjunto: I es el conjunto obtenido aadindole al conjunto vaco los elementos 2, 5, 1, 3, 7, 5, 3, 2, 1, 9 y 0.

Tema 17. El TAD de los conjuntos

209

ghib I {HDIDPDQDSDUDW} I XX gonj snt I a foldr insert vio PDSDIDQDUDSDQDPDIDWDH vio es el conjunto vaco. Por ejemplo, ghib vio {} vio XX gonj vio a gj @esio A se verica si es el conjunto vaco. Por ejemplo, esio I ; esio vio ; plse rue

esio XX gonj Eb fool esio @gj xsA a null xs @pertenee x A se verica si x pertenece al conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} pertenee Q I aa rue pertenee R I aa plse pertenee XX yrd ab Eb gonj Eb fool pertenee x @gj ysA a elem x @tkehile @`a xA ysA @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} insert S I aa {HDIDPDQDSDUDW} insert R I aa {HDIDPDQDRDSDUDW}

210

Temas de programacin funcional (201011)

insert XX yrd ab Eb gonj Eb insert x @gj sA a gj @greg x sA greg x a greg x sd@yXysA | x b y a | x ` y a | otherwise a

gonj where x y X @greg x ysA x X s s

@elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} elimin Q I aa {HDIDPDSDUDW} elimin XX yrd ab Eb gonj Eb gonj elimin x @gj sA a gj @elimin x sA where elimin x a elimin x sd@yXysA | x b y a y X elimin x ys | x ` y a s | otherwise a ys

17.2.4.

Los conjuntos de nmeros enteros mediante nmeros binarios

Los conjuntos que slo contienen nmeros (de tipo snt) entre 0 y n 1, se pueden representar como nmeros binarios con n bits donde el bit i (0 i < n) es 1 syss el nmero i pertenece al conjunto. Por ejemplo, 43210 {3,4} en binario es 11000 en decimal es 24 {1,2,3,4} en binario es 11110 en decimal es 30 {1,2,4} en binario es 10110 en decimal es 22 Cabecera del mdulo

module gonjuntogonxumerosfinrios @gonjD vioD EE gonj esioD EE gonj Eb fool perteneeD EE snt Eb gonj Eb fool insertD EE snt Eb gonj Eb gonj elimin EE snt Eb gonj Eb gonj A where

Tema 17. El TAD de los conjuntos

211

Los conjuntos de nmeros enteros como nmeros binarios.

newtype gonj a gj snt deriving iq @onjPvist A es la lista de los elementos del conjunto . Por ejemplo, onjPvist @gj PRA ; onjPvist @gj QHA ; onjPvist @gj PPA ; QDR IDPDQDR IDPDR H a a i X Pl @n div PA @iCIA a Pl @n div PA @iCIA

onjPvist @gj sA a Pl s where Pl H Pl n i | odd n | otherwise

Procedimiento de escritura de conjuntos.

instne how gonj where showsre s d a showgonj @onjPvist sA d showgonj d a showtring 4{}4 d showgonj @xXxsA d a showghr 9{9 @shows x @showl xs dAA where showl d a showghr 9}9 d showl @xXxsA d a showghr 9D9 @shows x @showl xs dAA mxgonj es el mximo nmero que puede pertenecer al conjunto. Depende de la implementacin de Haskell. Por ejemplo, mxgonj ; PW

mxgonj XX snt mxgonj a trunte @logfse P @fromsntegrl mxsntAA E I where mxsnt a mxfoundXXsnt
Ejemplo de conjunto: I es el conjunto obtenido aadindole al conjunto vaco los elementos 2, 5, 1, 3, 7, 5, 3, 2, 1, 9 y 0.

212

Temas de programacin funcional (201011)

ghib I {HDIDPDQDSDUDW} I XX gonj I a foldr insert vio PDSDIDQDUDSDQDPDIDWDH vio es el conjunto vaco. Por ejemplo, ghib vio {} vio XX gonj vio a gj H @esio A se verica si es el conjunto vaco. Por ejemplo, esio I ; esio vio ; plse rue

esio XX gonj Eb fool esio @gj nA a n aa H @pertenee x A se verica si x pertenece al conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} pertenee Q I aa rue pertenee R I aa plse pertenee XX snt Eb gonj Eb fool pertenee i @gj sA | @ibaHA 88 @i`amxgonjA a odd @s div @PiAA | otherwise a error @4perteneeX elemento ilegl a4 CC show iA @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} insert S I aa {HDIDPDQDSDUDW} insert R I aa {HDIDPDQDRDSDUDW}

Tema 17. El TAD de los conjuntos

213

insert i @gj sA | @ibaHA 88 @i`amxgonjA a gj @d9BeCmA | otherwise a error @4insertX elemento ilegl a4 CC show iA where @dDmA a divwod s e e a Pi d9 a if odd d then d else dCI @elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . Por ejemplo, I aa {HDIDPDQDSDUDW} elimin Q I aa {HDIDPDSDUDW} elimin i @gj sA | @ibaHA 88 @i`amxgonjA a gj @d9BeCmA | otherwise a error @4eliminX elemento ilegl a4 CC show iA where @dDmA a divwod s e e a Pi d9 a if odd d then dEI else d

17.3.
17.3.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de la implementacin de los conjuntos que se desea vericar.

import gonjuntogonvistsxoyrdendsgonhuplidos EE import gonjuntogonvistsxoyrdendsinhuplidos EE import gonjuntogonvistsyrdendsinhuplidos


Importacin de las libreras de comprobacin

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

214

Temas de programacin funcional (201011)

17.3.2.

Generador de conjuntos

gengonjunto es un generador de conjuntos. Por ejemplo, ghib smple gengonjunto {QDEPDEPDEQDEPDR} {EVDHDRDTDESDEP} {} gengonjunto XX qen @gonj sntA gengonjunto a do xs `E listyf ritrry return @foldr insert vio xsA instne eritrry @gonj sntA where ritrry a gengonjunto

17.3.3.

Especicacin de las propiedades de los conjuntos

El nmero de veces que se aada un elemento a un conjunto no importa.

propindependenirepetiiones XX snt Eb gonj snt Eb fool propindependenirepetiiones x a insert x @insert x A aa insert x


El orden en que se aadan los elementos a un conjunto no importa.

propindependenidelorden XX snt Eb snt Eb gonj snt Eb fool propindependenidelorden x y a insert x @insert y A aa insert y @insert x A
El conjunto vaco no tiene elementos.

propvionoelementosXX snt Eb fool propvionoelementos x a not @pertenee x vioA


Un elemento pertenece al conjunto obtenido aadiendo x al conjunto syss es igual a x o pertenece a .

Tema 17. El TAD de los conjuntos

215

propperteneeinsert XX snt Eb snt Eb gonj snt Eb fool propperteneeinsert x y a pertenee y @insert x A aa @xaayA || pertenee y
Al eliminar cualquier elemento del conjunto vaco se obtiene el conjunto vaco.

propeliminvio XX snt Eb fool propeliminvio x a elimin x vio aa vio


El resultado de eliminar x en el conjunto obtenido aadindole x al conjunto c es c menos x, si x e y son iguales y es el conjunto obtenido aadindole y a c menos x, en caso contrario.

propelimininsert XX snt Eb snt Eb gonj snt Eb fool propelimininsert x y a elimin x @insert y A aa if x aa y then elimin x else insert y @elimin x A
vacio es vaco.

propvioesvio XX fool propvioesvio a esio @vio XX gonj sntA


Los conjuntos construidos con insert no son vaco.

propinsertesnovio XX snt Eb gonj snt Eb fool propinsertesnovio x a not @esio @insert x AA

17.3.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin.

216

Temas de programacin funcional (201011)

omprueropieddes a defultwin testqroup 4ropieddes del eh onjuntoX4 testroperty 4I4 propvioesvioD testroperty 4P4 propinsertesnovioD testroperty 4Q4 propindependenirepetiionesD testroperty 4R4 propindependenidelordenD testroperty 4S4 propvionoelementosD testroperty 4T4 propperteneeinsertD testroperty 4U4 propeliminvioD testroperty 4V4 propelimininsert
Comprobacin de las propiedades de los conjuntos

ghib omprueropieddes ropieddes del eh onjuntoX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests UX yuD pssed IHH tests VX yuD pssed IHH tests roperties otl ssed V V piled H H otl V V

Tema 18 El TAD de las tablas


Contenido
18.1. El tipo predenido de las tablas (arrays) . . . . . . . . . . . . . . . . . 203 18.1.1. La clase de los ndices de las tablas . . . . . . . . . . . . . . . . . . 203 18.1.2. El tipo predenido de las tablas (arrays) . . . . . . . . . . . . . 204 18.2. Especicacin del TAD de las tablas . . . . . . . . . . . . . . . . . . . . . 208 18.2.1. Signatura del TAD de las tablas . . . . . . . . . . . . . . . . . . . . 208 18.2.2. Propiedades del TAD de las tablas . . . . . . . . . . . . . . . . . . 208 18.3. Implementaciones del TAD de las tablas . . . . . . . . . . . . . . . . . . 209 18.3.1. Las tablas como funciones . . . . . . . . . . . . . . . . . . . . . . . 209 18.3.2. Las tablas como listas de asociacin . . . . . . . . . . . . . . . . . 210 18.3.3. Las tablas como matrices . . . . . . . . . . . . . . . . . . . . . . . 212 18.4. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 214 18.4.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 18.4.2. Generador de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . 214 18.4.3. Especicacin de las propiedades de las tablas . . . . . . . . . . . 215 18.4.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 216

18.1.
18.1.1.

El tipo predenido de las tablas (arrays)


La clase de los ndices de las tablas

La clase de los ndices de las tablas es sx.

sx se encuentra en la librera htFsx


217

218

Temas de programacin funcional (201011)

Informacin de la clase sx:

ghib Xinfo sx lss @yrd A ab sx where rnge XX @D A Eb index XX @D A Eb Eb snt innge XX @D A Eb Eb fool rngeize XX @D A Eb snt instne sx yrdering EE hefined in qrgFerr instne sx snteger EE hefined in qrgFerr instne sx snt EE hefined in qrgFerr instne sx ghr EE hefined in qrgFerr instne sx fool EE hefined in qrgFerr instne @sx D sx A ab sx @D A @rnge m nA es la lista de los ndices desde m hasta n, en el orden del ndice. Por ejemplo, rnge rnge rnge rnge @HDRA @QDWA @99D9f9A @@HDHAD@IDPAA
; ; ; ;

HDIDPDQDR QDRDSDTDUDVDW 4def4 @HDHAD@HDIAD@HDPAD @IDHAD@IDIAD@IDPA

@index @mDnA iA es el ordinal del ndice i dentro del rango @mDnA. Por ejemplo, index @QDWA S index @99D9f9A 9e9 index @@HDHAD@IDPAA @IDIA
; ; ;

P Q R

@innge @mDnA iA se verica si el ndice i est dentro del rango limitado por m y n. Por ejemplo, innge innge innge innge @HDRA Q @HDRA U @@HDHAD@IDPAA @IDIA @@HDHAD@IDPAA @IDSA
; ; ; ;

rue plse rue plse

@rngeize @mDnAA es el nmero de elementos en el rango limitado por m y n. Por ejemplo, rngeize @QDWA ; rngeize @99D9f9A ; rngeize @@HDHAD@IDPAA ; U S T

Tema 18. El TAD de las tablas

219

18.1.2.

El tipo predenido de las tablas (arrays)

El tipo predenido de las tablas (arrays) La librera de las tablas es htFerry. Para usar las tablas hay que escribir al principio del chero

import htFerry
Al importar htFerry tambin se importa htFsx.

@erry i vA es el tipo de las tablas con ndice en i y valores en v.


Creacin de tablas

@rry @mDnA ivsA es la tabla de ndices en el rango limitado por m y n denida por la lista de asociacin ivs (cuyos elementos son pares de la forma (ndice, valor)). Por ejemplo, ghib rry ghib rry rry @IDQA rry @IDQA @IDQA @QDTAD@IDPAD@PDRA @IDPAD@PDRAD@QDTA @IDQA @iDPBiA | i `E IFFQ @IDPAD@PDRAD@QDTA

Ejemplos de deniciones de tablas

@udrdos nA es un vector de n+1 elementos tal que su elemento isimo es i2 . Por ejemplo, ghib udrdos S rry @HDSA @HDHAD@IDIAD@PDRAD@QDWAD@RDITAD@SDPSA udrdos XX snt Eb erry snt snt udrdos n a rry @HDnA @iDiPA | i `E HFFn v es un vector con 4 elementos de tipo carcter. Por ejemplo, v XX erry snteger ghr v a rry @IDRA @QD99AD@PD99AD @ID9f9AD @RD9e9A m es la matriz con 2 las y 3 columnas tal que el elemento de la posicin (i,j) es el producto de i por j.

220

Temas de programacin funcional (201011)

m XX erry @sntD sntA snt m a rry @@IDIAD@PDQAA @@iDjADiBjAA | i`EIFFPDj`EIFFQ


Una tabla est indenida si algn ndice est fuera de rango.

ghib rry @IDRA @i D iBiA | i `E IFFR rry @IDRA @IDIAD@PDRAD@QDWAD@RDITA ghib rry @IDRA @i D iBiA | i `E IFFS rry BBB ixeptionX irror in rry index ghib rry @IDRA @i D iBiA | i `E IFFQ rry @IDRA @IDIAD@PDRAD@QDWAD@RDBBB ixeptionX @erryF3AX undefined rry element
Descomposicin de tablas

@t 3 iA es el valor del ndice i en la tabla t. Por ejemplo, ghib rry ghib 99 ghib rry v @IDRA @ID9f9AD@PD99AD@QD99AD@RD9e9A v3Q

m @@IDIAD@PDQAA @@IDIADIAD@@IDPADPAD@@IDQADQAD @@PDIADPAD@@PDPADRAD@@PDQADTA ghib m3@PDQA T @ounds tA es el rango de la tabla t. Por ejemplo, ounds m
;

@@IDIAD@PDQAA

@indies tA es la lista de los ndices de la tabla t. Por ejemplo, indies m


;

@IDIAD@IDPAD@IDQAD@PDIAD@PDPAD@PDQA

@elems tA es la lista de los elementos de la tabla t. Por ejemplo, elems m


;

IDPDQDPDRDT

@ssos tA es la lista de asociaciones de la tabla t. Por ejemplo, ghib ssos m @@IDIADIAD@@IDPADPAD@@IDQADQAD @@PDIADPAD@@PDPADRAD@@PDQADTA

Tema 18. El TAD de las tablas

221

Modicacin de tablas

@t GG ivsA es la tabla t asignndole a los ndices de la lista de asociacin ivs sus correspondientes valores. Por ejemplo, ghib m GG @@IDIADRAD @@PDPADVA rry @@IDIAD@PDQAA @@IDIADRAD@@IDPADPAD@@IDQADQAD @@PDIADPAD@@PDPADVAD@@PDQADTA ghib m rry @@IDIAD@PDQAA @@IDIADIAD@@IDPADPAD@@IDQADQAD @@PDIADPAD@@PDPADRAD@@PDQADTA
Denicin de tabla por recursin

@fis nA es el vector formado por los n primeros trminos de la sucesin de Fibonacci. Por ejemplo, ghib fis U rry @HDUA @HDIAD@IDIAD@PDPAD@QDQAD @RDSAD@SDVAD@TDIQAD@UDPIA fis XX snt Eb erry snt snt fis n a where a rry @HDnA @@HDIAD@IDIA CC @iD3@iEIAC3@iEPAA | i `E PFFnA
Otras funciones de creacin de tablas

@listerry @mDnA vsA es la tabla cuyo rango es @mDnA y cuya lista de valores es vs. Por ejemplo, ghib rry ghib rry listerry @PDSA 4om4 @PDSA @PD99AD@QD9o9AD@RD9m9AD@SD99A listerry @@IDPAD@PDRAA SFFIP @@IDPAD@PDRAA @@IDPADSAD@@IDQADTAD@@IDRADUAD @@PDPADVAD@@PDQADWAD@@PDRADIHA

222

Temas de programacin funcional (201011)

Construccin acumulativa de tablas

@umerry f v @mDnA ivsA es la tabla de rango @mDnA tal que el valor del ndice i se obtiene acumulando la aplicacin de la funcin f al valor inicial v y a los valores de la lista de asociacin ivs cuyo ndice es i. Por ejemplo, ghib rry ghib rry umerry @CA H @IDQA @IDRAD@PDSAD@IDPA @IDQA @IDTAD@PDSAD@QDHA umerry @BA I @IDQA @IDRAD@PDSAD@IDPA @IDQA @IDVAD@PDSAD@QDIA

@histogrm r isA es el vector formado contando cuantas veces aparecen los elementos del rango r en la lista de ndices is. Por ejemplo, ghib histogrm @HDSA QDIDRDIDSDRDPDU rry @HDSA @HDHAD@IDPAD@PDIAD@QDIAD@RDPAD@SDIA histogrm XX @sx D xum A ab @DA Eb Eb erry histogrm r is a umerry @CA H r @iDIA | i `E isD innge r i

18.2.
18.2.1.

Especicacin del TAD de las tablas


Signatura del TAD de las tablas

Signatura:

tl XX iq i ab @iDvA Eb l i v vlor XX iq i ab l i v Eb i Eb v modifi XX iq i ab @iDvA Eb l i v Eb l i v


Descripcin de las operaciones: @tl ivsA es la tabla correspondiente a la lista de asociacin ivs (que es una lista de pares formados por los ndices y los valores). @vlor t iA es el valor del ndice i en la tabla t. @modifi @iDvA tA es la tabla obtenida modicando en la tabla t el valor de i por v.

Tema 18. El TAD de las tablas

223

18.2.2.

Propiedades del TAD de las tablas

1. modifi @iDv9A @modifi @iDvA tA a modifi @iDv9A t 2. Si i Ga i9, entonces modifi @i9Dv9A @modifi @iDvA tA a modifi @iDvA @modifi @i9Dv9A tA 3. vlor @modifi @iDvA tA i a v 4. Si i Ga i9, entonces vlor @modifi @iDvA @modifi @k9Dv9A tAA i9 a vlor @modifi @k9Dv9A tA i9

18.3.
18.3.1.

Implementaciones del TAD de las tablas


Las tablas como funciones

Cabecera del mdulo:

module lgonpuniones @lD tlD EE iq i ab @iDvA Eb l i v vlorD EE iq i ab l i v Eb i Eb v modifi EE iq i ab @iDvA Eb l i v Eb l i v A where


Las tablas como funciones.

newtype l i v a l @i Eb vA
Procedimiento de escritura.

instne how @l i vA where showsre d a showtring 4``n tlbb4 d


Ejemplos de tablas:

tI a tl @iDf iA | i `E IFFT where f x | x ` Q a x | otherwise a QEx

224

Temas de programacin funcional (201011)

tP a tl @RDVWAD @IDWHAD @PDTUA @vlor t iA es el valor del ndice i en la tabla t. Por ejemplo, vlor tI T ; vlor tP P ; vlor tP S ; EQ TU BBB ixeptionX fuer de rngo

vlor XX iq i ab l i v Eb i Eb v vlor @l fA i a f i @modifi @iDvA tA es la tabla obtenida modicando en la tabla t el valor de i por v. Por ejemplo, vlor @modifi @TDWA tIA T ; W

modifi XX iq i ab @iDvA Eb l i v Eb l i v modifi @iDvA @l fA a l g where g j | j aa i a v | otherwise a f j @tl ivsA es la tabla correspondiente a la lista de asociacin ivs (que es una lista de pares formados por los ndices y los valores). Por ejemplo, ghib tl @RDVWAD @IDWHAD @PDTUA ``n tlbb tl XX iq i ab @iDvA Eb l i v tl ivs a foldr modifi @l @ Eb error 4fuer de rngo4AA ivs

18.3.2.

Las tablas como listas de asociacin

Cabecera del mdulo

Tema 18. El TAD de las tablas

225

module lgonvistsheesoiion @lD tlD EE iq i ab @iDvA Eb l i v vlorD EE iq i ab l i v Eb i Eb v modifi EE iq i ab @iDvA Eb l i v Eb l i v A where


Las tablas como listas de asociacin.

newtype l i v a l @iDvA deriving how


Ejemplos de tablas Denicin:

tI a tl @iDf iA | i `E IFFT where f x | x ` Q a x | otherwise a QEx tP a tl @RDVWAD @IDWHAD @PDTUA


Evaluacin:

ghib tI l @IDIAD@PDPAD@QDHAD@RDEIAD@SDEPAD@TDEQA ghib tP l @RDVWAD@IDWHAD@PDTUA @tl ivsA es la tabla correspondiente a la lista de asociacin ivs (que es una lista de pares formados por los ndices y los valores). Por ejemplo, ghib tl @RDVWAD@IDWHAD@PDTUA l @RDVWAD@IDWHAD@PDTUA tl XX iq i ab @iDvA Eb l i v tl ivs a l ivs @vlor t iA es el valor del ndice i en la tabla t. Por ejemplo,

226

Temas de programacin funcional (201011)

vlor tI T ; vlor tP P ; vlor tP S ;

EQ TU BBB ixeptionX fuer de rngo

vlor XX iq i ab l i v Eb i Eb v vlor @l A i a error 4fuer de rngo4 vlor @l @@jDvAXrAA i | i aa j a v | otherwise a vlor @l rA i @modifi @iDxA tA es la tabla obtenida modicando en la tabla t el valor de i por x. Por ejemplo, vlor tI T ; vlor @modifi @TDWA tIA T ; EQ W

modifi XX iq i ab @iDvA Eb l i v Eb l i v modifi p @l A a @l pA modifi p9d@iDA @l @pd@jDAXrAA | i aa j a l @p9XrA | otherwise a l @pXr9A where l r9 a modifi p9 @l rA

18.3.3.

Las tablas como matrices

Cabecera del mdulo:

module lgonwtries @lD tlD EE iq i vlorD EE iq i modifiD EE iq i tienelor EE sx i A where

ab ab ab ab

@iDvA Eb l i v l i v Eb i Eb v @iDvA Eb l i v Eb l i v l i v Eb i Eb fool

Importacin de la librera auxiliar:

import htFerry
Las tablas como matrices.

Tema 18. El TAD de las tablas

227

newtype l i v a l @erry i vA deriving @howD iqA


Ejemplos de tablas: Denicin:

tI a tl @iDf iA | i `E IFFT where f x | x ` Q a x | otherwise a QEx tP a tl @IDSAD@PDRAD@QDUA


Evaluacin:

ghib tI l @rry @IDTA @IDIAD@PDPAD@QDHAD @RDEIAD@SDEPAD@TDEQAA ghib tP l @rry @IDQA @IDSAD@PDRAD@QDUAA @tl ivsA es la tabla correspondiente a la lista de asociacin ivs (que es una lista de pares formados por los ndices y los valores). Por ejemplo, ghib tl @IDSAD@QDUAD@PDRA l @rry @IDQA @IDSAD@PDRAD@QDUAA tl XX sx i ab @iDvA Eb l i v tl ivs a l @rry @mDnA ivsA where indies a i | @iDA `E ivs m a minimum indies n a mximum indies @vlor t iA es el valor del ndice i en la tabla t. Por ejemplo, vlor tI T ; vlor tP P ; vlor tP S ; EQ TU BBB ixeptionX fuer de rngo

vlor XX sx i ab l i v Eb i Eb v vlor @l tA i a t 3 i

228

Temas de programacin funcional (201011)

@modifi @iDxA tA es la tabla obtenida modicando en la tabla t el valor de i por x. Por ejemplo, vlor tI T ; vlor @modifi @TDWA tIA T ; EQ W

modifi XX sx i ab @iDvA Eb l i v Eb l i v modifi p @l tA a l @t GG pA @ots tA son las cotas de la tabla t. Por ejemplo, tP ots tP
; ;

l @rry @IDQA @IDSAD@PDRAD@QDUAA @IDQA

ots XX sx i ab l i v Eb @iDiA ots @l tA a ounds t @tienelor t xA se verica si x es una clave de la tabla t. Por ejemplo, tienelor tP Q ; tienelor tP R ; rue plse

tienelor XX sx i ab l i v Eb i Eb fool tienelor t a innge @ots tA

18.4.
18.4.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de la implementacin de las tablas que se desea vericar.

import lgonvistsheesoiion
Importacin de las libreras de comprobacin.

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

Tema 18. El TAD de las tablas

229

18.4.2.

Generador de tablas

genl es un generador de tablas. Por ejemplo, ghib smple genl l @IDHA l @IDEIA l @IDHAD@PDEIAD@QDIAD@RDIAD@SDHA genl XX qen @l snt sntA genl a do x `E ritrry xs `E listyf ritrry return @tl @zip IFF @xXxsAAA instne eritrry @l snt sntA where ritrry a genl

18.4.3.

Especicacin de las propiedades de las tablas

Al modicar una tabla dos veces con la misma clave se obtiene el mismos resultado que modicarla una vez con el ltimo valor.

propmodifimodifiI XX snt Eb snt Eb snt Eb l snt snt Eb fool propmodifimodifiI i v v9 t a modifi @iDv9A @modifi @iDvA tA aa modifi @iDv9A t
Al modicar una tabla con dos pares con claves distintas no importa el orden en que se aadan los pares.

propmodifimodifiP XX snt Eb snt Eb snt Eb snt Eb l snt snt Eb roperty propmodifimodifiP i i9 v v9 t a i Ga i9 aab modifi @i9Dv9A @modifi @iDvA tA aa modifi @iDvA @modifi @i9Dv9A tA
El valor de la clave i en la tabla obtenida aadindole el par @iDvA a la tabla t es v.

230

Temas de programacin funcional (201011)

propvlormodifiI XX snt Eb snt Eb l snt snt Eb fool propvlormodifiI i v t a vlor @modifi @iDvA tA i aa v
Sean i e j dos claves distintas. El valor de la clave j en la tabla obtenida aadindole el par @iDvA a la tabla t9 (que contiene la clave j) es el valor de j en t9.

propvlormodifiP XX snt Eb snt Eb snt Eb snt Eb l snt snt Eb roperty propvlormodifiP i v j v9 t a i Ga j aab vlor @modifi @iDvA t9A j aa vlor t9 j where t9 a modifi @jDv9A t

18.4.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. Por ejemplo, omprueropieddes a defultwin testqroup 4ropieddes del eh tl4 testroperty 4I4 propmodifimodifiID testroperty 4P4 propmodifimodifiPD testroperty 4Q4 propvlormodifiID testroperty 4R4 propvlormodifiP
Comprobacin de las propiedades de las tablas

ropieddes del eh tlX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests roperties otl

Tema 18. El TAD de las tablas

231

ssed R piled H otl R

R H R

232

Temas de programacin funcional (201011)

Tema 19 El TAD de los rboles binarios de bsqueda


Contenido
19.1. Especicacin del TAD de los rboles binarios de bsqueda . . . . . . 217 19.1.1. Signatura del TAD de los rboles binarios de bsqueda . . . . . . 217 19.1.2. Propiedades del TAD de los rboles binarios de bsqueda . . . . 218 19.2. Implementacin del TAD de los rboles binarios de bsqueda . . . . . 219 19.2.1. Los ABB como tipo de dato algebraico . . . . . . . . . . . . . . . . 219 19.3. Comprobacin de la implementacin con QuickCheck . . . . . . . . . 223 19.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 19.3.2. Generador de rboles binarios de bsqueda . . . . . . . . . . . . 223 19.3.3. Especicacin de las propiedades de los rboles de bsqueda . . 224 19.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 227

19.1.
19.1.1.

Especicacin del TAD de los rboles binarios de bsqueda


Signatura del TAD de los rboles binarios de bsqueda

Descripcin de los rboles binarios de bsqueda Un rbol binario de bsqueda (ABB) es un rbol binario tal que el valor de cada nodo es mayor que los valores de su subrbol izquierdo y es menor que los valores de su subrbol derecho y, adems, ambos subrboles son rboles binarios de bsqueda. 233

234

Temas de programacin funcional (201011)

Por ejemplo, al almacenar los valores de [2,3,4,5,6,8,9] en un ABB se puede obtener los siguientes ABB:

G P G Q

P W

G Q G

R T

V G

El objetivo principal de los ABB es reducir el tiempo de acceso a los valores. Signatura del TAD de los rboles binarios de bsqueda Signatura:

vio insert elimin re menor elementos pertenee vlido

XX XX XX XX XX XX XX XX

eff @yrd Dhow A @yrd Dhow A @yrd Dhow A yrd ab eff @yrd Dhow A @yrd Dhow A @yrd Dhow A

ab ab ab Eb ab ab ab

Eb eff Eb eff Eb eff Eb eff Eb eff eff Eb Eb eff Eb fool eff Eb fool

Descripcin de las operaciones:

vio es el ABB vaco. @pertenee v A se verica si v es el valor de algn nodo del ABB a. @insert v A es el rbol obtenido aadiendo el valor v al ABB a, si no es uno de sus valores. @re vsA es el ABB cuyos valores son vs. @elementos A es la lista de los valores de los nodos del ABB en el recorrido inorden. @elimin v A es el ABB obtenido eliminando el valor v del ABB a. @menor A es el mnimo valor del ABB a. @vlido A se verica si a es un ABB correcto.

Tema 19. El TAD de los rboles binarios de bsqueda

235

19.1.2.

Propiedades del TAD de los rboles binarios de bsqueda

1. vlido vio 2. vlido @insert v A 3. insert x Ga vio 4. pertenee x @insert x A 5. not @pertenee x vioA 6. pertenee y @insert x A aa @x aa yA || pertenee y 7. vlido @elimin v A 8. elimin x @insert x A aa elimin x 9. vlido @re xsA 10. elementos @re xsA aa sort @nu xsA 11. pertenee v aa elem v @elementos A 12. x elementos @menor `a xA

19.2.
19.2.1.

Implementacin del TAD de los rboles binarios de bsqueda


Los ABB como tipo de dato algebraico

Cabecera del mdulo:

module erolfin @effD vioD insertD eliminD reD re9D menorD elementosD perteneeD

EE EE EE EE EE EE EE EE

eff @yrd Dhow A @yrd Dhow A @yrd Dhow A @yrd Dhow A yrd ab eff @yrd Dhow A @yrd Dhow A

ab ab ab ab Eb ab ab

Eb eff Eb eff Eb eff Eb eff Eb eff Eb eff eff Eb Eb eff Eb fool

236

Temas de programacin funcional (201011)

vlido A where

EE @yrd Dhow A ab eff Eb fool

Los ABB como tipo de dato algebraico.

dt yrd ab eff a io | xodo @eff A @eff A deriving @howD iqA


Procedimiento de escritura de rboles binarios de bsqueda.

instne show show 4

@how D yrd io @xodo x i dA @4 CC show x

A ab how @eff A where a 4 E4 a CC show i CC show d CC 4A4

I y P son rboles de bsqueda binarios. ghib I @S @P E @R @Q E EA EAA @T E @V E @W E EAAAA ghib P @S @P E @R @Q E EA EAA @V @T E @U E EAA @IH @W E EA @II E EAAAA ID P XX eff snt I a re @reverse SDPDTDRDVDQDWA P a foldr insert vio @reverse SDPDRDQDVDTDUDIHDWDIIA vio es el ABB vaco. vio XX eff vio a io @pertenee v A se verica si v es el valor de algn nodo del ABB . Por ejemplo, pertenee Q I ; pertenee U I ; rue plse

pertenee XX @yrd Dhow A ab Eb eff Eb fool pertenee v9 io a plse pertenee v9 @xodo v i dA | vaav9 a rue

Tema 19. El TAD de los rboles binarios de bsqueda

237

| v9`v a pertenee v9 i | v9bv a pertenee v9 d @insert v A es el rbol obtenido aadiendo el valor v al ABB , si no es uno de sus valores. Por ejemplo, ghib insert U I @S @P E @R @Q E EA EAA @T E @V @U E EA @W E EAAAA insert XX @yrd Dhow A ab Eb eff Eb eff insert v9 io a xodo v9 io io insert v9 @xodo v i dA | v9 aa v a xodo v i d | v9 ` v a xodo v @insert v9 iA d | otherwise a xodo v i @insert v9 dA @re vsA es el ABB cuyos valores son vs. Por ejemplo ghib re QDUDP @P E @U @Q E EA EAA re XX @yrd Dhow A ab Eb eff re a foldr insert io @re9 vsA es el ABB de menor profundidad cuyos valores son los de la lista ordenada vs. Por ejemplo, ghib re9 PDQDU @Q @P E EA @U E EAA re9 XX @yrd Dhow A ab Eb eff re9 a io re9 vs a xodo x @re9 lIA @re9 lPA where n a length vs div P lI a tke n vs @xXlPA a drop n vs @elementos A es la lista de los valores de los nodos del ABB en el recorrido inorden. Por ejemplo,

238

Temas de programacin funcional (201011)

elementos I ; elementos P ; elementos XX @yrd elementos io a elementos @xodo v elementos i CC

PDQDRDSDTDVDW PDQDRDSDTDUDVDWDIHDII

Dhow A ab eff Eb i dA a v CC elementos d

@elimin v A el ABB obtenido eliminando el valor v del ABB . ghib elimin Q I @S @P E @R E EAA @T E @V E @W E EAAAA ghib elimin P I @S @R @Q E EA EA @T E @V E @W E EAAAA elimin XX @yrd Dhow A ab Eb eff Eb eff elimin v9 io a io elimin v9 @xodo v i ioA | v9aav a i elimin v9 @xodo v io dA | v9aav a d elimin v9 @xodo v i dA | v9`v a xodo v @elimin v9 iA d | v9bv a xodo v i @elimin v9 dA | v9aav a xodo k i @elimin k dA where k a menor d @menor A es el mnimo valor del ABB . Por ejemplo, menor I
;

menor XX yrd ab eff Eb menor @xodo v io A a v menor @xodo i A a menor i @menorodos v A se verica si v es menor que todos los elementos del ABB . menorodos XX @yrd D how A ab Eb eff Eb fool menorodos v io a rue menorodos v a v ` minimum @elementos A @myorodos v A se verica si v es mayor que todos los elementos del ABB .

Tema 19. El TAD de los rboles binarios de bsqueda

239

myorodos XX @yrd D how A ab Eb eff Eb fool myorodos v io a rue myorodos v a v b mximum @elementos A @vlido A se verica si es un ABB correcto. Por ejemplo, vlido I ; rue vlido XX @yrd D how A ab eff Eb fool vlido io a rue vlido @xodo v i dA a myorodos v i 88 menorodos v d 88 vlido i 88 vlido d

19.3.
19.3.1.

Comprobacin de la implementacin con QuickCheck


Libreras auxiliares

Importacin de la implementacin de ABB.

import erolfin
Importacin de libreras auxiliares.

import import import import

htFvist estFuikghek estFprmework estFprmeworkFrovidersFuikghekP

19.3.2.

Generador de rboles binarios de bsqueda

geneff es un generador de rboles binarios de bsqueda. Por ejemplo, ghib smple geneff E @I @EI E EA EA @I E EA @EI @EQ E EA @I E @R E EAAA

240

Temas de programacin funcional (201011)

geneff XX qen @eff sntA geneff a do xs `E listyf ritrry return @foldr insert vio xsA instne eritrry @eff sntA where ritrry a geneff
Propiedad. Todo los elementos generados por genABB son rboles binarios de bsqueda.

propgenefforreto XX eff snt Eb fool propgenefforreto a vlido listyrdend es un generador de listas ordenadas de nmeros enteros. Por ejemplo, ghib smple listyrdend I EPDEIDH listyrdend XX qen snt listyrdend a frequeny @IDreturn AD @RDdo xs `E orderedvist n `E ritrry return @nu @@se xs of Eb n xX Eb n min xA XxsAAA @ordend xsA se verica si xs es una lista ordenada creciente. Por ejemplo, ordend QDSDW ; ordend QDWDS ; rue plse

ordend XX snt Eb fool ordend xs a nd x`y | @xDyA `E zip xs @til xsA


Propiedad. El generador listyrdend produce listas ordenadas.

Tema 19. El TAD de los rboles binarios de bsqueda

241

proplistyrdendorret XX snt Eb roperty proplistyrdendorret xs a forell listyrdend ordend

19.3.3.

Especicacin de las propiedades de los rboles de bsqueda

vio es un ABB. propvioeseff XX fool propvioeseff a vlido @vio XX eff sntA


Si es un ABB, entonces @insert v A tambin lo es.

propinsertesvlid XX snt Eb eff snt Eb fool propinsertesvlid v a vlido @insert v A


El rbol que resulta de aadir un elemento a un ABB es no vaco.

propinsertesnovio XX snt Eb eff snt Eb fool propinsertesnovio x a insert x Ga vio


Para todo x y , x es un elemento de @insert x A.

propelementodeinsert XX snt Eb eff snt Eb fool propelementodeinsert x a pertenee x @insert x A


En un rbol vacio no hay ningn elemento.

propviosinelementos XX snt Eb fool propviosinelementos x a not @pertenee x vioA


Los elementos de @insert x A son x y los elementos de .

242

Temas de programacin funcional (201011)

propelementosdeinsert XX snt Eb snt Eb eff snt Eb fool propelementosdeinsert x y a pertenee y @insert x A aa @x aa yA || pertenee y
Si es un ABB, entonces @elimin v A tambin lo es.

propeliminesvlid XX snt Eb eff snt Eb fool propeliminesvlid v a vlido @elimin v A


El resultado de eliminar el elemento x en @insert x A es @elimin x A.

propelimingreg XX snt Eb eff snt Eb fool propelimingreg x a elimin @insert x A aa elimin x @re xsA es un ABB. propreesvlid XX snt Eb fool propreesvlid xs a vlido @re xsA
Para todas las listas ordenadas xs, se tiene que @re9 xsA es un ABB.

propre9esvlid XX snt Eb roperty propre9esvlid xs a forell listyrdend @vlido F re9A @elementos @re xsAA es igual a la lista xs ordenada y sin repeticiones. propelementosre XX snt Eb fool propelementosre xs a elementos @re xsA aa sort @nu xsA
Si ys es una lista ordenada sin repeticiones, entonces @elementos @re9 ysAA es igual ys.

Tema 19. El TAD de los rboles binarios de bsqueda

243

propelementosre9 XX snt Eb fool propelementosre9 xs a elementos @re9 ysA aa ys where ys a sort @nu xsA
Un elemento pertenece a @elementos A syss es un valor de .

propenelementos XX snt Eb eff snt Eb fool propenelementos v a pertenee v aa elem v @elementos A @menor A es menor o igual que todos los elementos de ABB . propmenoreswinimo XXsnt Eb eff snt Eb fool propmenoreswinimo v a nd menor `a v | v `E elementos

19.3.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin testqroup 4ropieddes del tipo eff4 testroperty 4I4 proplistyrdendorretD testroperty 4P4 proporderedvistorretD testroperty 4Q4 propvioeseffD testroperty 4R4 propinsertesvlidD testroperty 4S4 propinsertesnovioD testroperty 4T4 propelementodeinsertD testroperty 4U4 propviosinelementosD testroperty 4V4 propelementosdeinsertD testroperty 4W4 propeliminesvlidD testroperty 4IH4 propelimingregD testroperty 4II4 propreesvlidD testroperty 4IP4 propre9esvlidD testroperty 4IQ4 propelementosreD

244

Temas de programacin funcional (201011)

testroperty 4IR4 propelementosre9D testroperty 4IS4 propenelementosD testroperty 4IT4 propmenoreswinimoD testqroup 4gorrein del generdor4 testroperty 4IV4 propgenefforreto
Comprobacin de las propiedades de los ABB

ghib omprueropieddes ropieddes del tipo effX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests UX yuD pssed IHH tests VX yuD pssed IHH tests WX yuD pssed IHH tests IHX yuD pssed IHH tests IIX yuD pssed IHH tests IPX yuD pssed IHH tests IQX yuD pssed IHH tests IRX yuD pssed IHH tests ISX yuD pssed IHH tests ITX yuD pssed IHH tests gorrein del generdorX IVX yuD pssed IHH tests roperties ssed IU piled H otl IU otl IU H IU

Tema 20 El TAD de los montculos


Contenido
20.1. Especicacin del TAD de los montculos . . . . . . . . . . . . . . . . . 229 20.1.1. Signatura del TAD de los montculos . . . . . . . . . . . . . . . . 229 20.1.2. Propiedades del TAD de los montculos . . . . . . . . . . . . . . . 230 20.2. Implementacin del TAD de los montculos . . . . . . . . . . . . . . . . 230 20.2.1. Los montculos como tipo de dato algebraico . . . . . . . . . . . . 230 20.3. Comprobacin de la implementacin con QuickCheck . . . . . . . . . 235 20.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 20.3.2. Generador de montculos . . . . . . . . . . . . . . . . . . . . . . . 235 20.3.3. Especicacin de las propiedades de los montculos . . . . . . . . 237 20.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 238 20.4. Implementacin de las colas de prioridad mediante montculos . . . . 239 20.4.1. Las colas de prioridad como montculos . . . . . . . . . . . . . . . 239

20.1.
20.1.1.

Especicacin del TAD de los montculos


Signatura del TAD de los montculos

Descripcin de los montculos Un montculo es un rbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos. Por ejemplo,

I G

I G
245

246

Temas de programacin funcional (201011)

G P T G G Q V W U

G Q T G G R P W U

el de la izquierda es un montculo, pero el de la derecha no lo es. Signatura del TAD de los montculos Signatura:

vio insert menor resto esio vlido

XX XX XX XX XX XX

yrd yrd yrd yrd yrd yrd

ab ab ab ab ab ab

wontiulo Eb wontiulo wontiulo Eb wontiulo Eb wontiulo Eb wontiulo Eb

Eb wontiulo wontiulo fool fool

Descripcin de las operaciones:

vio es el montculo vaco. @insert x mA es el montculo obtenido aadiendo el elemento x al montculo m. @menor mA es el menor elemento del montculo m. @resto mA es el montculo obtenido eliminando el menor elemento del montculo m. @esio mA se verica si m es el montculo vaco. @vlido mA se verica si m es un montculo; es decir, es un rbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos.

20.1.2.

Propiedades del TAD de los montculos

1. esio vio 2. vlido @insert x mA 3. not @esio @insert x mAA 4. not @esio mA aab vlido @resto mA 5. resto @insert x vioA aa vio 6. x `a menor m aab resto @insert x mA aa m

Tema 20. El TAD de los montculos

247

7. Si m es no vaco y x b menor m, entonces resto @insert x mA aa insert x @resto mA 8. esio m || esio @resto mA || menor m `a menor @resto mA

20.2.
20.2.1.

Implementacin del TAD de los montculos


Los montculos como tipo de dato algebraico

Cabecera del mdulo:

module wontiulo @wontiuloD vioD EE insertD EE menorD EE restoD EE esioD EE vlido EE A where
Librera auxiliar:

yrd yrd yrd yrd yrd yrd

ab ab ab ab ab ab

wontiulo Eb wontiulo wontiulo Eb wontiulo Eb wontiulo Eb wontiulo Eb

Eb wontiulo wontiulo fool fool

import htFvist @sortA


Los montculos como tipo de dato algebraico

dt yrd ab wontiulo a io | w snt @wontiulo A @wontiulo A deriving how


La forma de los montculos no vaco es (M v r i d) donde v es el valor de la raz del montculo. r es el rango del montculo; es decir, la menor distancia de la raz a un montculo vaco. i es el submontculo izquierdo y

248

Temas de programacin funcional (201011)

f es el submontculo derecho. Ejemplos de montculos Denicin:

mID mPD mQ XX wontiulo snt mI a foldr insert vio TDIDRDV mP a foldr insert vio UDS mQ a mezl mI mP
Representacin:

mI @IDPA G @RDIA @TDIA G @VDIA

mP G @UDIA @SDIA

mQ @IDPA G G @SDPA @RDIA G G @UDIA @TDIA @VDIA

vio es el montculo vaco. vio XX yrd ab wontiulo vio a io @rngo mA es el rango del montculo m; es decir, la menor distancia a un montculo vaco. Por ejemplo, rngo mI rngo mP
; ;

P I

rngo XX yrd ab wontiulo Eb snt rngo io a H rngo @w r A a r @rew x A es el montculo creado a partir del elemento x y los montculos y . Se supone que x es menor o igual que el mnimo de y de . Por ejemplo, ghib w I P ghib w S I mI @w R I @w V I io ioA ioA @w T I io ioA mP @w U I io ioA io

Tema 20. El TAD de los montculos

249

ghib rew H mI mP w H P @w I P @w R I @w V I io ioA ioA @w T I io ioAA @w S I @w U I io ioA ioA rew XX yrd ab Eb wontiulo Eb wontiulo Eb wontiulo rew x | rngo ba rngo a w x @rngo C IA | otherwise a w x @rngo C IA @mezl mI mPA es el montculo obtenido mezclando los montculos mI y mP. Por ejemplo, ghib mezl mI mP w I P @w S P @w U I io ioA @w T I io ioAA @w R I @w V I io ioA ioA mezl XX yrd ab wontiulo Eb wontiulo Eb wontiulo

mezl m io a m mezl io m a m mezl mId@w x I IA mPd@w y P PA | x `a y a rew x I @mezl I mPA | otherwise a rew y P @mezl mI PA

@insert x mA es el montculo obtenido aadiendo el elemento x al montculo m. Por ejemplo, ghib mI w I P @w R I @w V I io ioA ioA @w T I io ioA ghib insert Q mI w I P @w R I @w V I io ioA ioA @w Q I @w T I io ioA ioA insert XX yrd ab Eb wontiulo Eb wontiulo insert x m a mezl @w x I io ioA m @menor mA es el menor elemento del montculo m. Por ejemplo, menor mI menor mP
; ;

I S

250

Temas de programacin funcional (201011)

menor XX yrd ab wontiulo Eb menor @w x A a x menor io a error 4menorX montiulo vio4 @resto mA es el montculo obtenido eliminando el menor elemento del montculo m. Por ejemplo, ghib resto mI w R P @w V I io ioA @w T I io ioA resto XX yrd ab wontiulo Eb wontiulo resto io a error 4restoX montiulo vio4 resto @w x A a mezl @esio mA se verica si m es el montculo vaco. esio XX yrd ab wontiulo Eb fool esio io a rue esio a plse @vlido mA se verica si m es un montculo; es decir, es un rbol binario en el que los valores de cada nodo es menor o igual que los valores de sus hijos. Por ejemplo, vlido mI ; rue vlido @w Q S @w P I io ioA ioA vlido XX yrd ab wontiulo vlido io a rue vlido @w x io ioA a vlido @w x mId@w xI nI I x `a xI 88 vlido mI vlido @w x io mPd@w xP x `a xP 88 vlido mP vlido @w x mId@w xI nI I x `a xI 88 vlido mI 88 x `a xP 88 vlido mP Eb fool rue IA ioA a nP P PAA a IA mPd@w xP nP P PAA a
;

plse

@elementos mA es la lista de los elementos del montculo m. Por ejemplo, elementos mI


;

IDRDVDT

Tema 20. El TAD de los montculos

251

elementos XX yrd ab wontiulo Eb elementos io a elementos @w x A a x X elementos CC elementos @equivwontiulos mI mPA se verica si los montculos mI y mP tienen los mismos elementos. Por ejemplo, ghib mI w I P @w R I @w V I io ioA ioA @w T I io ioA ghib let mI9 a foldr insert vio TDVDRDI w I P @w R I io ioA @w T I @w V I io ioA ioA ghib equivwontiulos mI mI9 rue equivwontiulos XX yrd ab wontiulo Eb wontiulo Eb fool equivwontiulos mI mP a sort @elementos mIA aa sort @elementos mPA
Los montculos son comparables por igualdad.

instne yrd ab iq @wontiulo A where @aaA a equivwontiulos

20.3.
20.3.1.

Comprobacin de la implementacin con QuickCheck


Libreras auxiliares

Importacin de la implementacin a vericar.

import wontiulo
Importacin de libreras auxiliares.

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

252

Temas de programacin funcional (201011)

20.3.2.

Generador de montculos

@rewontiulo xsA es el montculo correspondiente a la lista xs. Por ejemplo, ghib rewontiulo TDIDRDV w I P @w R I @w V I io ioA ioA @w T I io ioA ghib rewontiulo TDVDRDI w I P @w R I io ioA @w T I @w V I io ioA ioA rewontiulo XX snt Eb wontiulo snt rewontiulo a foldr insert vio genwontiulo es un generador de montculos. Por ejemplo, ghib smple genwontiulo iow w @EIA I @w I I iow iowA iow FFF genwontiulo XX qen @wontiulo sntA genwontiulo a do xs `E listyf ritrry return @rewontiulo xsA instne eritrry @wontiulo sntA where ritrry a genwontiulo
Correccin del generador de montculos Prop.: genwontiulo genera montculos vlidos.

propgenwontiulo XX wontiulo snt Eb fool propgenwontiulo m a vlido m


Comprobacin:

ghib quikghek propgenwontiulo CCC yuD pssed IHH testsF

Tema 20. El TAD de los montculos

253

Generador de montculos no vacos

montiulox es un generador de montculos no vaco. Por ejemplo, ghib smple montiulox w H I iow iow w I I @w I I @w I I iow iowA iowA iow FFF montiulox XX qen @wontiulo sntA montiulox a do xs `E listyf ritrry x `E ritrry return @rewontiulo @xXxsAA
Correccin del generador de montculos no vacos Prop.: montiulox genera montculos no vaco.

propmontiulox XX wontiulo snt Eb roperty propmontiulox m a forell montiulox @m Eb @vlido mA 88 not @esio mAA
Comprobacin:

ghib quikghek propmontiulox CCC yuD pssed IHH testsF

20.3.3.

Especicacin de las propiedades de los montculos

vio es un montculo. propvioesmontiulo XX fool propvioesmontiulo a esio @vio XX wontiulo sntA insert produce montculos vlidos. propinsertesvlid XX snt Eb wontiulo snt Eb fool propinsertesvlid x m a vlido @insert x mA

254

Temas de programacin funcional (201011)

Los montculos creados con insert son no vaco.

propinsertnovio XX snt Eb wontiulo snt Eb fool propinsertnovio x m a not @esio @insert x mAA
Al borrar el menor elemento de un montculo no vaco se obtiene un montculo vlido.

proprestoesvlid XX wontiulo snt Eb roperty proprestoesvlid m a forell montiulox @m Eb vlido @resto mAA
El resto de @insert x mA es m si m es el montculo vaco o x es menor o igual que el menor elemento de m y es @insert x @resto mAA, en caso contrario.

proprestoinsert XX snt Eb wontiulo snt Eb fool proprestoinsert x m a resto @insert x mA aa if esio m || x `a menor m then m else insert x @resto mA @menor mA es el menor elemento del montculo m. propmenoresminimo XX wontiulo snt Eb fool propmenoresminimo m a esio m || esio @resto mA || menor m `a menor @resto mA

20.3.4.

Comprobacin de las propiedades

Denicin del procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin testqroup 4ropieddes del eh montiulo4 testroperty 4I4 propgenwontiuloD testroperty 4P4 propmontiuloxD testroperty 4Q4 propvioesmontiuloD

Tema 20. El TAD de los montculos

255

testroperty testroperty testroperty testroperty testroperty

4R4 4S4 4T4 4U4 4V4

propinsertesvlidD propinsertnovioD proprestoesvlidD proprestoinsertD propmenoresminimo

Comprobacin de las propiedades de los montculos

ghib omprueropieddes ropieddes del eh montiuloX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests UX yuD pssed IHH tests VX yuD pssed IHH tests roperties otl ssed V V piled H H otl V V

20.4.
20.4.1.

Implementacin de las colas de prioridad mediante montculos


Las colas de prioridad como montculos

Cabecera del mdulo:

module golherioriddgonwontiulos @grioriddD viD EE yrd ab grioridd insertD EE yrd ab Eb grioridd primeroD EE yrd ab grioridd Eb restoD EE yrd ab grioridd Eb esiD EE yrd ab grioridd Eb vlid EE yrd ab grioridd Eb A where

Eb grioridd grioridd fool fool

256

Temas de programacin funcional (201011)

Importacin cualicada:

import qulified wontiulo s w


Descripcin de las operaciones: vi es la cola de prioridad vaca. @insert x A aade el elemento x a la cola de prioridad . @primero A es el primer elemento de la cola de prioridad . @resto A es el resto de la cola de prioridad . @esi A se verica si la cola de prioridad es vaca. @vlid A se verica si es una cola de prioridad vlida. Las colas de prioridad como montculos.

newtype grioridd a g @wFwontiulo A deriving @iqD howA


Ejemplo de cola de prioridad:

pI XX grioridd snt pI a foldr insert vi QDIDUDPDW


Evaluacin:

ghib pI g @w I P @w P P @w W I iow iowA @w U I iow iowAA @w Q I iow iowAA vi es la cola de prioridad vaca. Por ejemplo, vi
; g io

vi XX yrd ab grioridd vi a g wFvio @insert x A aade el elemento x a la cola de prioridad . Por ejemplo,

Tema 20. El TAD de los montculos

257

ghib insert g @w I P @w P P @w W @w U @w Q I @w S

S pI I iow iowA I iow iowAA I iow iowA iowAA

insert XX yrd ab Eb grioridd Eb grioridd insert v @g A a g @wFinsert v A @primero A es la cabeza de la cola de prioridad . Por ejemplo, primero pI
;

primero XX yrd ab grioridd Eb primero @g A a wFmenor @resto A elimina la cabeza de la cola de prioridad . Por ejemplo, ghib resto pI g @w P P @w W I iow iowA @w Q I @w U I iow iowA iowAA resto XX yrd ab grioridd Eb grioridd resto @g A a g @wFresto A @esi A se verica si la cola de prioridad es vaca. Por ejemplo, esi pI ; esi vi ; plse rue

esi XX yrd ab grioridd Eb fool esi @g A a wFesio @vlid A se verica si es una cola de prioridad vlida. En la representacin mediante montculo todas las colas de prioridad son vlidas. vlid XX yrd ab grioridd Eb fool vlid a rue

258

Temas de programacin funcional (201011)

Tema 21 El TAD de los polinomios


Contenido
21.1. Especicacin del TAD de los polinomios . . . . . . . . . . . . . . . . . 243 21.1.1. Signatura del TAD de los polinomios . . . . . . . . . . . . . . . . 243 21.1.2. Propiedades del TAD de los polinomios . . . . . . . . . . . . . . . 244 21.2. Implementacin del TAD de los polinomios . . . . . . . . . . . . . . . . 244 21.2.1. Los polinomios como tipo de dato algebraico . . . . . . . . . . . . 244 21.2.2. Los polinomios como listas dispersas . . . . . . . . . . . . . . . . 247 21.2.3. Los polinomios como listas densas . . . . . . . . . . . . . . . . . . 250 21.3. Comprobacin de las implementaciones con QuickCheck . . . . . . . . 253 21.3.1. Libreras auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 21.3.2. Generador de polinomios . . . . . . . . . . . . . . . . . . . . . . . 253 21.3.3. Especicacin de las propiedades de los polinomios . . . . . . . . 254 21.3.4. Comprobacin de las propiedades . . . . . . . . . . . . . . . . . . 255 21.4. Operaciones con polinomios . . . . . . . . . . . . . . . . . . . . . . . . . 256 21.4.1. Operaciones con polinomios . . . . . . . . . . . . . . . . . . . . . 256

21.1.
21.1.1.

Especicacin del TAD de los polinomios


Signatura del TAD de los polinomios

Signatura del TAD de los polinomios Signatura:

259

260

Temas de programacin funcional (201011)

polgero esolgero onsol grdo oefvider restool

XX XX XX XX XX XX

olinomio xum ab olinomio Eb fool xum ab snt Eb Eb olinomio Eb olinomio olinomio Eb snt xum ab olinomio Eb olinomio Eb olinomio

Descripcin de las operaciones:

polgero es el polinomio cero. @esolgero pA se verica si p es el polinomio cero. @onsol n pA es el polinomio bx n + p. @grdo pA es el grado del polinomio p. @oefvider pA es el coeciente lder del polinomio p. @restool pA es el resto del polinomio p.
Ejemplos de polinomios Ejemplos de polinomios que se usarn en lo sucesivo. Denicin:

ejolID ejolPD ejolQD ejermXX olinomio snt ejolI a onsol R Q @onsol P @ESA @onsol H Q polgeroAA ejolP a onsol S I @onsol P S @onsol I R polgeroAA ejolQ a onsol R T @onsol I P polgeroA ejerm a onsol I R polgero
Evaluacin:

ejolI ejolP ejolQ ejerm

; ; ; ;

QBxR C ESBxP C Q xS C SBxP C RBx TBxR C PBx RBx

21.1.2.

Propiedades del TAD de los polinomios

1. esolgero polgero 2. n b grdo p 88 Ga H aab not @esolgero @onsol n pAA

Tema 21. El TAD de los polinomios

261

3. onsol @grdo pA @oefvider pA @restool pA aa p 4. n b grdo p 88 Ga H aab grdo @onsol n pA aa n 5. n b grdo p 88 Ga H aab oefvider @onsol n pA aa 6. n b grdo p 88 Ga H aab restool @onsol n pA aa p

21.2.
21.2.1.

Implementacin del TAD de los polinomios


Los polinomios como tipo de dato algebraico

Cabecera del mdulo:

module olephe @ olinomioD polgeroD EE esolgeroD EE onsolD EE EE grdoD EE oefviderD EE restool EE A where

olinomio xum ab olinomio Eb fool @xum A ab snt Eb Eb olinomio Eb olinomio olinomio Eb snt xum ab olinomio Eb olinomio Eb olinomio

Representamos un polinomio mediante los constructores gonsol y olgero. Por ejemplo, el polinomio

TxR ESxP C Rx EU
se representa por

gonsol R T @gonsol P @ESA @gonsol I R @gonsol H @EUA olgeroAAA


El tipo de los polinomios.

262

Temas de programacin funcional (201011)

dt olinomio a olgero | gonsol snt @olinomio A deriving iq


Procedimiento de escritura de los polinomios.

instne show show show show show show show show show

xum ab olgero @gonsol @gonsol @gonsol @gonsol @gonsol @gonsol @gonsol @gonsol

how @olinomio A where a 4H4 H olgeroA a show H pA a ont show D4 C 4Dshow p I olgeroA a ont show D4Bx4 I pA a ont show D4Bx C 4Dshow p n I olgeroA a ont 4x4Dshow n n olgeroA a ont show D4Bx4Dshow n n I pA a ont 4x4Dshow nD4 C 4Dshow p n pA a ont show D4Bx4Dshow nD4 C 4Dshow p

polgero es el polinomio cero. Por ejemplo, ghib polgero H polgero XX olinomio polgero a olgero @esolgero pA se verica si p es el polinomio cero. Por ejemplo, esolgero polgero ; esolgero ejolI ; rue plse

esolgero XX olinomio Eb fool esolgero olgero a rue esolgero a plse @onsol n pA es el polinomio bx n + p. Por ejemplo, ejolP onsol Q H ejolP onsol Q P polgero onsol T U ejolP
; ; ; ;

xS C SBxP C RBx xS C SBxP C RBx PBxQ UBxT C xS C SBxP C RBx

Tema 21. El TAD de los polinomios

263

onsol R U ejolP onsol S U ejolP

; ;

xS C UBxR C SBxP C RBx VBxS C SBxP C RBx

onsol XX xum ab snt Eb Eb olinomio Eb olinomio onsol H p a p onsol n olgero a gonsol n olgero onsol n @gonsol m pA | n b m a gonsol n @gonsol m pA | n ` m a gonsol m @onsol n pA | C aa H a p | otherwise a gonsol n @CA p @grdo pA es el grado del polinomio p. Por ejemplo, ejolQ grdo ejolQ
; ;

TBxR C PBx R

grdoXX olinomio Eb snt grdo olgero a H grdo @gonsol n A a n @oefvider pA es el coeciente lder del polinomio p. Por ejemplo, oefvider ejolQ ; T

oefviderXX xum t ab olinomio t Eb t oefvider olgero a H oefvider @gonsol A a @restool pA es el resto del polinomio p. Por ejemplo, ejolQ ; restool ejolQ ; ejolP ; restool ejolP ; TBxR C PBx PBx xS C SBxP C RBx SBxP C RBx

restool XX olinomio t Eb olinomio t restool olgero a olgero restool @gonsol pA a p

264

Temas de programacin funcional (201011)

21.2.2.

Los polinomios como listas dispersas

Cabecera del mdulo

module olephispers @ olinomioD polgeroD EE olinomio esolgeroD EE xum ab olinomio Eb fool onsolD EE @xum A ab snt Eb Eb olinomio EE Eb olinomio grdoD EE olinomio Eb snt oefviderD EE xum ab olinomio Eb restool EE olinomio Eb olinomio A where
Representaremos un polinomio por la lista de sus coecientes ordenados en orden decreciente segn el grado. Por ejemplo, el polinomio

TxR ESxP C Rx EU
se representa por la lista

TDHDEPDRDEU
Los polinomios como listas dispersas.

dt olinomio a ol deriving iq
Procedimiento de escritura de los polinomios.

instne xum t ab show pol | esolgero | n aa H 88 | n aa H | n aa I 88 | n aa I | aa I 88 | esolgero | aa I

how @olinomio tA where pol a 4H4 esolgero p a show a ont esolgero p a ont a ont esolgero p a ont p a ont a ont

show D4 C 4Dshow p show D4Bx4 show D4Bx C 4Dshow p 4x4Dshow n show D4Bx4Dshow n 4x4Dshow nD4 C 4Dshow p

Tema 21. El TAD de los polinomios

265

| otherwise where n a grdo pol a oefvider pol p a restool pol

a ont show D4Bx4Dshow nD4 C 4Dshow p

polgero es el polinomio cero. Por ejemplo, ghib polgero H polgero XX olinomio polgero a ol @esolgero pA se verica si p es el polinomio cero. Por ejemplo, esolgero polgero ; esolgero ejolI ; rue plse

esolgero XX olinomio Eb fool esolgero @ol A a rue esolgero a plse @onsol n pA es el polinomio bx n + p. Por ejemplo, ejolP onsol onsol onsol onsol onsol Q Q T R S H P U U U ejolP polgero ejolP ejolP ejolP
; ; ; ; ; ;

xS C xS C PBxQ UBxT xS C VBxS

SBxP C RBx SBxP C RBx C xS C SBxP C RBx UBxR C SBxP C RBx C SBxP C RBx

onsol XX xum ab snt Eb Eb olinomio Eb olinomio onsol H p a p onsol n pd@ol xsA | esolgero p a ol @Xreplite n HA | n b m a ol @X@replite @nEmEIA HACCxsA | n ` m a onsol m @onsol n @restool pAA | C aa H a ol @drophile @aaHA @til xsAA | otherwise a ol @@CAXtil xsA where

266

Temas de programacin funcional (201011)

a oefvider p m a grdo p @grdo pA es el grado del polinomio p. Por ejemplo, ejolQ grdo ejolQ
; ;

TBxR C PBx R

grdoXX olinomio Eb snt grdo @ol A a H grdo @ol xsA a length xs E I @oefvider pA es el coeciente lder del polinomio p. Por ejemplo, oefvider ejolQ ; T

oefviderXX xum t ab olinomio t Eb t oefvider @ol A a H oefvider @ol @XAA a @restool pA es el resto del polinomio p. Por ejemplo, ejolQ ; restool ejolQ ; ejolP ; restool ejolP ; TBxR C PBx PBx xS C SBxP C RBx SBxP C RBx

restool XX xum t ab olinomio t Eb olinomio t restool @ol A a polgero restool @ol A a polgero restool @ol @XXsAA | aa H a ol @drophile @aaHA sA | otherwise a ol @XsA

21.2.3.

Los polinomios como listas densas

Cabecera del mdulo.

Tema 21. El TAD de los polinomios

267

module olephens @ olinomioD polgeroD EE olinomio esolgeroD EE xum ab olinomio Eb fool onsolD EE xum ab snt Eb Eb olinomio EE Eb olinomio grdoD EE olinomio Eb snt oefviderD EE xum ab olinomio Eb restool EE olinomio Eb olinomio A where
Representaremos un polinomio mediante una lista de pares (grado,coef), ordenados en orden decreciente segn el grado. Por ejemplo, el polinomio

TxR ESxP C Rx EU
se representa por la lista de pares

@RDTAD@PDESAD@IDRAD@HDEUAF
Los polinomios como listas densas.

dt olinomio a ol @sntDA deriving iq


Procedimiento de escritura de polinomios

instne xum t ab how @olinomio tA where show pol | esolgero pol a 4H4 | n aa H 88 esolgero p a show | n aa H a ont show D4 C 4Dshow p | n aa I 88 esolgero p a ont show D4Bx4 | n aa I a ont show D4Bx C 4Dshow p | aa I 88 esolgero p a ont 4x4Dshow n | esolgero p a ont show D4Bx4Dshow n | aa I a ont 4x4Dshow nD4 C 4Dshow p | otherwise a ont show D4Bx4Dshow nD4 C 4Dshow p where n a grdo pol a oefvider pol p a restool pol

268

Temas de programacin funcional (201011)

polgero es el polinomio cero. Por ejemplo, ghib polgero H polgero XX xum ab olinomio polgero a ol @esolgero pA se verica si p es el polinomio cero. Por ejemplo, esolgero polgero ; esolgero ejolI ; rue plse

esolgero XX xum ab olinomio Eb fool esolgero @ol A a rue esolgero a plse @onsol n pA es el polinomio bx n + p. Por ejemplo, ejolP onsol onsol onsol onsol onsol Q Q T R S H P U U U ejolP polgero ejolP ejolP ejolP
; ; ; ; ; ;

xS C xS C PBxQ UBxT xS C VBxS

SBxP C RBx SBxP C RBx C xS C SBxP C RBx UBxR C SBxP C RBx C SBxP C RBx

onsol XX xum ab snt Eb Eb olinomio Eb olinomio onsol H p a p onsol n pd@ol xsA | esolgero p a ol @nDA | n b m a ol @@nDAXxsA | n ` m a onsol m @onsol n @ol @til xsAAA | C aa H a ol @til xsA | otherwise a ol @@nDCAX@til xsAA where a oefvider p m a grdo p @grdo pA es el grado del polinomio p. Por ejemplo, ejolQ grdo ejolQ
; ;

TBxR C PBx R

Tema 21. El TAD de los polinomios

269

grdoXX olinomio Eb snt grdo @ol A a H grdo @ol @@nDAXAA a n @oefvider pA es el coeciente lder del polinomio p. Por ejemplo, oefvider ejolQ ; T

oefviderXX xum t ab olinomio t Eb t oefvider @ol A a H oefvider @ol @@DAXAA a @restool pA es el resto del polinomio p. Por ejemplo, ejolQ ; restool ejolQ ; ejolP ; restool ejolP ; restool restool restool restool TBxR C PBx PBx xS C SBxP C RBx SBxP C RBx

XX xum t ab olinomio t Eb olinomio t @ol A a polgero @ol A a polgero @ol @XxsAA a ol xs

21.3.
21.3.1.

Comprobacin de las implementaciones con QuickCheck


Libreras auxiliares

Importacin de la implementacin a vericar.

import olephe EE import olephispers EE import olephens


Libreras auxiliares.

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP

270

Temas de programacin funcional (201011)

21.3.2.

Generador de polinomios

@genol nA es un generador de polinomios. Por ejemplo, ghib smple @genol IA UBxW C WBxV C IHBxU C EIRBxS C EISBxP C EIH ERBxV C PBx genol XX snt Eb qen @olinomio sntA genol H a return polgero genol n a do n `E hoose @HDIHA `E hoose @EIHDIHA p `E genol @div n PA return @onsol n pA instne eritrry @olinomio sntA where ritrry a sized genol

21.3.3.

Especicacin de las propiedades de los polinomios

polgero es el polinomio cero. proppolgeroesero XX fool proppolgeroesero a esolgero polgero


Si n es mayor que el grado de p y no es cero, entonces @onsol n pA es un polinomio distinto del cero.

proponsolnoero XX snt Eb snt Eb olinomio snt Eb roperty proponsolnoero n p a n b grdo p 88 Ga H aab not @esolgero @onsol n pAA @onsol @grdo pA @oefvider pA @restool pAA es igual a p. proponsol XX olinomio snt Eb fool proponsol p a onsol @grdo pA @oefvider pA @restool pA aa p

Tema 21. El TAD de los polinomios

271

Si n es mayor que el grado de p y no es cero, entonces el grado de @onsol n pA es n.

propgrdo XX snt Eb snt Eb olinomio snt Eb roperty propgrdo n p a n b grdo p 88 Ga H aab grdo @onsol n pA aa n
Si n es mayor que el grado de p y no es cero, entonces el coeciente lder de @onsol n pA es .

propoefvider XX snt Eb snt Eb olinomio snt Eb roperty propoefvider n p a n b grdo p 88 Ga H aab oefvider @onsol n pA aa
Si n es mayor que el grado de p y no es cero, entonces el resto de @onsol n pA es p.

proprestool XX snt Eb snt Eb olinomio snt Eb roperty proprestool n p a n b grdo p 88 Ga H aab restool @onsol n pA aa p

21.3.4.

Comprobacin de las propiedades

Procedimiento de comprobacin

omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. Por ejemplo, omprueropieddes a defultwin testqroup 4ropieddes del eh polinomioX4 testroperty 4I4 proppolgeroeseroD testroperty 4P4 proponsolnoeroD testroperty 4Q4 proponsolD testroperty 4R4 propgrdoD testroperty 4S4 propoefviderD testroperty 4T4 proprestool

272

Temas de programacin funcional (201011)

Comprobacin de las propiedades de los polinomios

ghib omprueropieddes ropieddes del eh polinomioXX IX yuD pssed IHH tests PX yuD pssed IHH tests QX yuD pssed IHH tests RX yuD pssed IHH tests SX yuD pssed IHH tests TX yuD pssed IHH tests roperties otl ssed T T piled H H otl T T

21.4.
21.4.1.

Operaciones con polinomios


Operaciones con polinomios

Importacin de la implementacin a utilizar.

import olephe EE import olephispers EE import olephens


Importacin de libreras auxiliares.

import estFuikghek import estFprmework import estFprmeworkFrovidersFuikghekP


Funciones sobre trminos

@reermino n A es el trmino ax n . Por ejemplo, reermino P S ; SBxP

reerminoXX xum t ab snt Eb t Eb olinomio t reermino n a onsol n polgero

Tema 21. El TAD de los polinomios

273

@termvider pA es el trmino lder del polinomio p. Por ejemplo, ejolP ; termvider ejolP ; xS C SBxP C RBx xS

termviderXX xum t ab olinomio t Eb olinomio t termvider p a reermino @grdo pA @oefvider pA


Suma de polinomios

@sumol p qA es la suma de los polinomios p y q. Por ejemplo, ejolI ; ejolP ; sumol ejolI ejolP ; QBxR C ESBxP C Q xS C SBxP C RBx xS C QBxR C RBx C Q Eb olinomio Eb olinomio

sumolXX xum ab olinomio sumol p q | esolgero p a q | esolgero q a p | nI b nP a onsol | nI ` nP a onsol | ICP Ga H a onsol | otherwise a sumol where nI a grdo p I a oefvider p rI a restool p nP a grdo q P a oefvider q rP a restool q
Propiedades de la suma de polinomios

nI nP nI rI

I @sumol rI qA P @sumol p rPA @ICPA @sumol rI rPA rP

El polinomio cero es el elemento neutro de la suma.

propneutroumol XX olinomio snt Eb fool propneutroumol p a sumol polgero p aa p


La suma es conmutativa.

274

Temas de programacin funcional (201011)

proponmuttivum XX olinomio snt Eb olinomio snt Eb fool proponmuttivum p q a sumol p q aa sumol q p


Producto de polinomios

@multorerm t pA es el producto del trmino t por el polinomio p. Por ejemplo, ejerm ejolP multorerm ejerm ejolP
; ; ;

RBx xS C SBxP C RBx RBxT C PHBxQ C ITBxP

multorerm XX xum t ab olinomio t Eb olinomio t Eb olinomio t multorerm term pol | esolgero pol a polgero | otherwise a onsol @nCmA @BA @multorerm term rA where n a grdo term a oefvider term m a grdo pol a oefvider pol r a restool pol @multol p qA es el producto de los polinomios p y q. Por ejemplo, ghib QBxR ghib xS C ghib QBxW ejolI C ESBxP C Q ejolP SBxP C RBx multol ejolI ejolP C ESBxU C ISBxT C ISBxS C EPSBxR C EPHBxQ C ISBxP C IPBx

multol XX xum ab olinomio Eb olinomio Eb olinomio multol p q | esolgero p a polgero | otherwise a sumol @multorerm @termvider pA qA @multol @restool pA qA

Tema 21. El TAD de los polinomios

275

Propiedades del producto polinomios El producto de polinomios es conmutativo.

proponmuttivroduto XX olinomio snt Eb olinomio snt Eb fool proponmuttivroduto p q a multol p q aa multol q p


El producto es distributivo respecto de la suma.

propdistriutiv XX olinomio snt Eb olinomio snt Eb olinomio snt Eb fool propdistriutiv p q r a multol p @sumol q rA aa sumol @multol p qA @multol p rA
Polinomio unidad

polnidd es el polinomio unidad. Por ejemplo, ghib polnidd I polniddXX xum t ab olinomio t polnidd a onsol H I polgero
El polinomio unidad es el elemento neutro del producto.

proppolnidd XX olinomio snt Eb fool proppolnidd p a multol p polnidd aa p


Valor de un polinomio en un punto

@vlor p A es el valor del polinomio p al sustituir su variable por . Por ejemplo, ejolI vlor ejolI H vlor ejolI I vlor ejolI @EPA
; ; ; ;

QBxR C ESBxP C Q Q I QI

276

Temas de programacin funcional (201011)

vlorXX xum ab olinomio Eb Eb vlor p | esolgero p a H | otherwise a Bn C vlor r where n a grdo p a oefvider p r a restool p
Vericacin de raices de polinomios

@esiz pA se verica si es una raiz del polinomio p. por ejemplo, ejolQ ; esiz I ejolQ ; esiz H ejolQ ; TBxR C PBx plse rue

esizXX xum ab Eb olinomio Eb fool esiz p a vlor p aa H


Derivacin de polinomios

@derivd pA es la derivada del polinomio p. Por ejemplo, ejolP ; derivd ejolP ; xS C SBxP C RBx SBxR C IHBx C R

derivd XX olinomio snt Eb olinomio snt derivd p | n aa H a polgero | otherwise a onsol @nEIA @nBA @derivd rA where n a grdo p a oefvider p r a restool p
Propiedades de las derivadas de polinomios La derivada de la suma es la suma de las derivadas.

Tema 21. El TAD de los polinomios

277

propderivd XX olinomio snt Eb olinomio snt Eb fool propderivd p q a derivd @sumol p qA aa sumol @derivd pA @derivd qA

278

Temas de programacin funcional (201011)

Tema 22 Algoritmos sobre grafos


Contenido
22.1. El TAD de los grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 22.1.1. Deniciones y terminologa sobre grafos . . . . . . . . . . . . . . 261 22.1.2. Signatura del TAD de los grafos . . . . . . . . . . . . . . . . . . . 262 22.1.3. Implementacin de los grafos como vectores de adyacencia . . . 263 22.1.4. Implementacin de los grafos como matrices de adyacencia . . . 266 22.2. Recorridos en profundidad y en anchura . . . . . . . . . . . . . . . . . . 269 22.2.1. Recorrido en profundidad . . . . . . . . . . . . . . . . . . . . . . . 269 22.2.2. Recorrido en anchura . . . . . . . . . . . . . . . . . . . . . . . . . 272 22.3. Ordenacin topolgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 22.3.1. Ordenacin topolgica . . . . . . . . . . . . . . . . . . . . . . . . . 272 22.4. rboles de expansin mnimos . . . . . . . . . . . . . . . . . . . . . . . . 274 22.4.1. rboles de expansin mnimos . . . . . . . . . . . . . . . . . . . . 274 22.4.2. El algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . 275 22.4.3. El algoritmo de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . 278

22.1.
22.1.1.

El TAD de los grafos


Deniciones y terminologa sobre grafos

Un grafo G es un par (V , A) donde V es el conjunto de los vrtices (o nodos) y A el de las aristas. Una arista del grafo es un par de vrtices. 279

280

Temas de programacin funcional (201011)

Un arco es una arista dirigida. |V| es el nmero de vrtices. |A| es el nmero de aristas. Un camino de v1 a vn es una sucesin de vrtices v1 , v2 , . . . , vn tal que para todo i, vi1 vi es una arista del grafo. Un camino simple es un camino tal que todos sus vrtices son distintos. Un ciclo es un camino tal que v1 = vn y todos los restantes vrtices son distintos. Un grafo acclico es un grafo sin ciclos. Un grafo conexo es un grafo tal que para cualquier par de vrtices existe un camino del primero al segundo. Un rbol es un grafo acclico conexo. Un vrtice v es adjacente a v si vv es una arista del grafo. En un grafo dirigido, el grado positivo de un vrtice es el nmero de aristas que salen de l y el grado negativo es el nmero de aristas que llegan a l. Un grafo ponderado es un grafo cuyas aristas tienen un peso.

22.1.2.

Signatura del TAD de los grafos

Signatura del TAD de los grafos

reqrfo

XX @sx vDxum pA ab fool Eb @vDvA Eb @vDvDpA Eb qrfo v p dyentes XX @sx vDxum pA ab @qrfo v pA Eb v Eb v nodos XX @sx vDxum pA ab @qrfo v pA Eb v ristsxh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristsh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristin XX @sx vDxum pA ab @qrfo v pA Eb @vDvA Eb fool peso XX @sx vDxum pA ab v Eb v Eb @qrfo v pA Eb p

Tema 22. Algoritmos sobre grafos

281

Descripcin de la signatura del TAD de grafos

@reqrfo d s sA es un grafo (dirigido si d es True y no dirigido en caso contrario), con el par de cotas s y listas de aristas s (cada arista es un tro formado por los dos vrtices y su peso). Ver un ejemplo en la siguiente transparencia. @dyentes g vA es la lista de los vrtices adyacentes al nodo v en el grafo g. @nodos gA es la lista de todos los nodos del grafo g. @ristsxh gA es la lista de las aristas del grafo no dirigido g. @ristsh gA es la lista de las aristas del grafo dirigido g. @ristin g A se verica si es una arista del grafo g. @peso vI vP gA es el peso de la arista que une los vrtices vI y vP en el grafo g.
Ejemplo de creacin de grafos.

reqrfo plse @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA


crea el grafo

I | | | QR| | | | Q

IP EEEEEEEE P UV G| QPG | G | S |SS G | GRR | G WQ| EEEEEEEE R TI

282

Temas de programacin funcional (201011)

22.1.3.

Implementacin de los grafos como vectores de adyacencia

Cabecera del mdulo:

module qrfogonetorheedyeni @qrfoD reqrfoD EE @sx vDxum pA ab EE dyentesD EE @sx vDxum pA ab nodosD EE @sx vDxum pA ab ristsxhD EE @sx vDxum pA ab ristshD EE @sx vDxum pA ab ristinD EE @sx vDxum pA ab peso EE @sx vDxum pA ab A where where
Libreras auxiliares.

fool Eb @vDvA Eb @vDvDpA Eb qrfo v p @qrfo v pA Eb v Eb v @qrfo v pA Eb v @qrfo v pA Eb @vDvDpA @qrfo v pA Eb @vDvDpA @qrfo v pA Eb @vDvA Eb fool v Eb v Eb @qrfo v pA Eb p

import htFerry @qrfo v pA es un grafo con vrtices de tipo v y pesos de tipo p. type qrfo v p a erry v @vDpA grfoe es la representacin del grafo del ejemplo de la pgina 262 mediante un vector de adyacencia. grfoe a rry @IDSA @ID@PDIPAD@QDQRAD@SDUVAAD @PD@IDIPAD@RDSSAD@SDQPAAD @QD@IDQRAD@RDTIAD@SDRRAAD @RD@PDSSAD@QDTIAD@SDWQAAD @SD@IDUVAD@PDQPAD@QDRRAD@RDWQAA @reqrfo d s sA es un grafo (dirigido si d es True y no dirigido en caso contrario), con el par de cotas s y listas de aristas s (cada arista es un tro formado por los dos vrtices y su peso). Ver un ejemplo a continuacin. reqrfo XX @sx vD xum pA ab fool Eb @vDvA Eb @vDvDpA Eb qrfo v p reqrfo d s vs a umerry

Tema 22. Algoritmos sobre grafos

283

@xs x Eb xsCCxA s @@if d then else @xPD@xIDpAA|@xIDxPDpA `E vsD xI Ga xPA CC @xID@xPDpAA | @xIDxPDpA `E vsA grfoe9 es el mismo grafo que grfoe pero creado con reqrfo. Por ejemplo, ghib grfoe9 rry @IDSA @ID@PDIPAD@QDQRAD@SDUVAAD @PD@IDIPAD@RDSSAD@SDQPAAD @QD@IDQRAD@RDTIAD@SDRRAAD @RD@PDSSAD@QDTIAD@SDWQAAD @SD@IDUVAD@PDQPAD@QDRRAD@RDWQAA grfoe9 a reqrfo plse @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA @dyentes g vA es la lista de los vrtices adyacentes al nodo v en el grafo g. Por ejemplo, dyentes grfoe9 R ; PDQDS

dyentes XX @sx vDxum pA ab @qrfo v pA Eb v Eb v dyentes g v a mp fst @g3vA @nodos gA es la lista de todos los nodos del grafo g. Por ejemplo, nodos grfoe9 ; IDPDQDRDS

nodos XX @sx vDxum pA ab @qrfo v pA Eb v nodos g a indies g @ristin g A se verica si es una arista del grafo g. Por ejemplo, ristin grfoe9 @SDIA ristin grfoe9 @RDIA
; ;

rue plse

284

Temas de programacin funcional (201011)

ristin XX @sx vDxum pA ab @qrfo v pA Eb @vDvA Eb fool ristin g @xDyA a elem y @dyentes g xA @peso vI vP gA es el peso de la arista que une los vrtices vI y vP en el grafo g. Por ejemplo, peso I S grfoe9
;

UV

peso XX @sx vDxum pA ab v Eb v Eb @qrfo v pA Eb p peso x y g a hed | @DA `E g3x D aa y @ristsh gA es la lista de las aristas del grafo dirigido g. Por ejemplo, ghib ristsh grfoe9 @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDIDIPAD@PDRDSSAD@PDSDQPAD @QDIDQRAD@QDRDTIAD@QDSDRRAD @RDPDSSAD@RDQDTIAD@RDSDWQAD @SDIDUVAD@SDPDQPAD@SDQDRRAD@SDRDWQA ristsh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristsh g a @vIDvPDwA | vI `E nodos g D @vPDwA `E g3vI @ristsxh gA es la lista de las aristas del grafo no dirigido g. Por ejemplo, ghib ristsxh grfoe9 @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA ristsxh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristsxh g a @vIDvPDwA | vI `E nodos gD @vPDwA `E g3vID vI ` vP

Tema 22. Algoritmos sobre grafos

285

22.1.4.

Implementacin de los grafos como matrices de adyacencia

Cabecera del mdulo.

module qrfogonwtrizheedyeni @qrfoD reqrfoD EE @sx vDxum pA ab EE dyentesD EE @sx vDxum pA ab nodosD EE @sx vDxum pA ab ristsxhD EE @sx vDxum pA ab ristshD EE @sx vDxum pA ab ristinD EE @sx vDxum pA ab peso EE @sx vDxum pA ab A where
Libreras auxiliares

fool Eb @vDvA Eb @vDvDpA Eb qrfo v p @qrfo v pA Eb v Eb v @qrfo v pA Eb v @qrfo v pA Eb @vDvDpA @qrfo v pA Eb @vDvDpA @qrfo v pA Eb @vDvA Eb fool v Eb v Eb @qrfo v pA Eb p

import htFerry @qrfo v pA es un grafo con vrtices de tipo v y pesos de tipo p. type qrfo v p a erry @vDvA @wye pA grfowe es la representacin del grafo del ejemplo de la pgina 262 mediante una matriz de adyacencia. grfowe a rry @@IDIAD@SDSAA @@IDIADxothingAD@@IDPADtust IHAD@@IDQADtust PHAD @@IDRADxothingAD@@IDSADxothingAD@@PDIADxothingAD @@PDPADxothingAD@@PDQADxothingAD@@PDRADtust QHAD @@PDSADxothingAD@@QDIADxothingAD@@QDPADxothingAD @@QDQADxothingAD@@QDRADtust RHAD@@QDSADxothingAD @@RDIADxothingAD@@RDPADxothingAD@@RDQADxothingAD @@RDRADxothingAD@@RDSADtust SHAD@@SDIADxothingAD @@SDPADxothingAD@@SDQADxothingAD@@SDRADxothingAD @@SDSADxothingA @reqrfo d s sA es un grafo (dirigido si d es True y no dirigido en caso contrario), con el par de cotas s y listas de aristas s (cada arista es un tro formado por los dos vrtices y su peso). Ver un ejemplo a continuacin.

286

Temas de programacin funcional (201011)

reqrfo XX @sx vD xum pA ab fool Eb @vDvA Eb @vDvDpA Eb qrfo v p reqrfo dir sd@lDuA s a mtrizi GG @@@xIDxPADtust wA | @xIDxPDwA `E s CC if dir then else @@xPDxIADtust wA | @xIDxPDwA `E sD xI Ga xPA where mtrizi a rry @@lDlAD@uDuAA @@xIDxPADxothingA | xI `E rnge sD xP `E rnge s grfowe9 es el mismo grafo que grfowe pero creado con reqrfo. Por ejemplo, ghib grfowe9 rry @@IDIAD@SDSAA @@IDIADxothingAD@@IDPADtust IPAD@@IDQADtust QRAD @@IDRADxothingAD@@IDSADtust UVAD@@PDIADtust IPAD @@PDPADxothingAD@@PDQADxothingAD@@PDRADtust SSAD @@PDSADtust QPAD@@QDIADtust QRAD@@QDPADxothingAD @@QDQADxothingAD@@QDRADtust TIAD@@QDSADtust RRAD @@RDIADxothingAD@@RDPADtust SSAD@@RDQADtust TIAD @@RDRADxothingAD@@RDSADtust WQAD@@SDIADtust UVAD @@SDPADtust QPAD@@SDQADtust RRAD@@SDRADtust WQAD @@SDSADxothingA grfowe9 a reqrfo plse @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA @dyentes g vA es la lista de los vrtices adyacentes al nodo v en el grafo g. Por ejemplo, dyentes grfowe9 R ; PDQDS

dyentes XX @sx vDxum pA ab @qrfo v pA Eb v Eb v dyentes g vI a vP | vP `E nodos gD @g3@vIDvPAA Ga xothing

Tema 22. Algoritmos sobre grafos

287

@nodos gA es la lista de todos los nodos del grafo g. Por ejemplo, nodos grfowe9 ; IDPDQDRDS

nodos XX @sx vDxum pA ab @qrfo v pA Eb v nodos g a rnge @lDuA where @@lDAD@uDAA a ounds g @ristin g A se verica si es una arista del grafo g. Por ejemplo, ristin grfowe9 @SDIA ristin grfowe9 @RDIA
; ;

rue plse

ristin XX @sx vDxum pA ab @qrfo v pA Eb @vDvA Eb fool ristin g @xDyAa @g3@xDyAA Ga xothing @peso vI vP gA es el peso de la arista que une los vrtices vI y vP en el grafo g. Por ejemplo, peso I S grfowe9
;

UV

peso XX @sx vDxum pA ab v Eb v Eb @qrfo v pA Eb p peso x y g a w where @tust wA a g3@xDyA @ristsh gA es la lista de las aristas del grafo dirigido g. Por ejemplo, ghib ristsh grfowe9 @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDIDIPAD@PDRDSSAD@PDSDQPAD @QDIDQRAD@QDRDTIAD@QDSDRRAD @RDPDSSAD@RDQDTIAD@RDSDWQAD @SDIDUVAD@SDPDQPAD@SDQDRRAD@SDRDWQA ristsh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristsh g a @vIDvPDextre@g3@vIDvPAAA | vI `E nodos gD vP `E nodos gD ristin g @vIDvPA where extre @tust wA a w @ristsxh gA es la lista de las aristas del grafo no dirigido g. Por ejemplo,

288

Temas de programacin funcional (201011)

ghib ristsxh grfowe9 @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA ristsxh XX @sx vDxum pA ab @qrfo v pA Eb @vDvDpA ristsxh g a @vIDvPDextre@g3@vIDvPAAA | vI `E nodos gD vP `E rnge @vIDuAD ristin g @vIDvPA where @D@uDAA a ounds g extre @tust wA a w

22.2.
22.2.1.

Recorridos en profundidad y en anchura


Recorrido en profundidad

Importaciones de libreras auxiliares.

EE xotX ilegir un implementin de los grfosF import qrfogonetorheedyeni EE import qrfogonwtrizheedyeni EE xotX ilegir un implementin de ls pilsF import ilgonvists EE import ilgonipohehtoelgerio
En los ejemplos se usar el grafo g

CEEEb P `EEEC | | | | I EEb Q EEb T EEb S | | | | CEEEb R `EEEEEEEEEC


que se dene por

Tema 22. Algoritmos sobre grafos

289

g a reqrfo rue @IDTA @IDPDHAD@IDQDHAD@IDRDHAD@QDTDHAD @SDRDHAD@TDPDHAD@TDSDHA


Procedimiento elemental de recorrido en profundidad

@reorridoinrofundidd i gA es el recorrido en profundidad del grafo g desde el vrtice i. Por ejemplo, reorridoinrofundidd I g
;

IDPDQDTDSDR

reorridoinrofundidd i g a rp i where rp vis a vis rp @XsA vis | elem vis a rp s vis | otherwise a rp @@dyentes g ACCsA @visCCA
Traza del clculo de @reorridoinrofundidd I gA

reorridoinrofundidd I g a rp I a rp PDQDR I a rp QDR IDP a rp TDR IDPDQ a rp PDSDR IDPDQDT a rp SDR IDPDQDT a rp RDR IDPDQDTDS a rp R IDPDQDTDSDR a rp IDPDQDTDSDR a IDPDQDTDSDR
Recorrido en profundidad con acumuladores

@reorridoinrofundidd9 i gA es el recorrido en profundidad del grafo, usando la lista de los visitados como acumulador. Por ejemplo, reorridoinrofundidd9 I g
;

IDPDQDTDSDR

290

Temas de programacin funcional (201011)

reorridoinrofundidd9 i g a reverse @rp i A where rp vis a vis rp @XsA vis | elem vis a rp s vis | otherwise a rp @@dyentes g ACCsA @XvisA
Traza del clculo de @reorridoinrofundidd9 I gA

reorridoinrofundidd9 I g a reverse @rp I A a reverse @rp PDQDR IA a reverse @rp QDR PDIA a reverse @rp TDR QDPDIA a reverse @rp PDSDR TDQDPDIA a reverse @rp SDR TDQDPDIA a reverse @rp RDR SDTDQDPDIA a reverse @rp R RDSDTDQDPDIA a reverse @rp RDSDTDQDPDIA a reverse RDSDTDQDPDI a IDPDQDTDSDR
Recorrido en profundidad con pilas

@reorridoinrofundidd i gA es el recorrido en profundidad del grafo g desde el vrtice i, usando pilas. Por ejemplo, reorridoinrofundidd99 I g
;

IDPDQDTDSDR

reorridoinrofundidd99 i g a reverse @rp @pil i viA A where rp s vis | esi s a vis | elem @im sA vis a rp @despil sA vis | otherwise a rp @foldr pil @despil sA @dyentes g AA @XvisA where a im s

Tema 22. Algoritmos sobre grafos

291

22.2.2.

Recorrido en anchura

Importaciones de libreras auxiliares.

EE xotX ilegir un implementin de los grfosF import qrfogonetorheedyeni EE import qrfogonwtrizheedyeni EE xotX ilegir un implementin de ls ols import golgonvists EE import golgonhosvists @reorridoinenhur i gA es el recorrido en anchura del grafo g desde el vrtice i, usando colas. Por ejemplo, reorridoinenhur I g
;

IDRDQDPDTDS

reorridoinenhur i g a reverse @r @insert i viA A where r q vis | esi q a vis | elem @primero qA vis a r @resto qA vis | otherwise a r @foldr insert @resto qA @dyentes g AA @XvisA where a primero q

22.3.
22.3.1.

Ordenacin topolgica
Ordenacin topolgica

Dado un grafo dirigido acclico, una ordenacin topolgica es una ordenacin de los vrtices del grafo tal que si existe un camino de v a v9, entonces v9 aparece despus que v en el orden. Libreras auxiliares.

EE xotX ilegir un implementin de los grfosF import qrfogonetorheedyeni EE import qrfogonwtrizheedyeni

292

Temas de programacin funcional (201011)

import htFerry
Se usar para los ejemplos el grafo g de la pgina 269.

@grdoint g nA es el grado de entrada del nodo n en el grafo g; es decir, el nmero de aristas de g que llegan a n. Por ejemplo, grdoint g I ; grdoint g P ; grdoint g Q ; H P I

grdoint XX @sx D xum pA ab qrfo p Eb Eb snt grdoint g n a length t | v `E nodos gD t `E dyentes g vD naat @ordenionopologi gA es una ordenacin topolgica del grafo g. Por ejemplo, ordenionopologi g ; IDQDTDSDRDP

ordenionopologi g a ordop n | n `E nodos g D grdoint g n aa H where ordop r a r ordop @XsA vis | elem vis a ordop s vis | otherwise a ordop s @X@ordop @dyentes g A visAA
Ejemplo de ordenacin topolgica de cursos.

dt gursos a wtemtis | gomputilidd | vengujes | rogrmion | gonurreni | erquitetur | rlelismo deriving @iqDyrdDinumDsxDhowA g a reqrfo rue @wtemtisDrlelismoA @wtemtisDgomputiliddDIAD @vengujesDgomputiliddDIAD @rogrmionDvengujesDIAD @rogrmionDgonurreniDIAD @gonurreniDrlelismoDIAD @erquiteturDrlelismoDIA

Tema 22. Algoritmos sobre grafos

293

La ordenacin topolgica es

ghib ordenionopologi g erquiteturDrogrmionDgonurreniDrlelismoDvengujesD wtemtisDgomputilidd

22.4.
22.4.1.

rboles de expansin mnimos


rboles de expansin mnimos

Sea G = (V , A) un grafo conexo no orientado en el que cada arista tiene un peso no negativo. Un rbol de expansin mnimo de G es un subgrafo G = (V , A ) que conecta todos los vrtices de G y tal que la suma de sus pesos es mnima. Aplicacin: Si los vrtices representan ciudades y el coste de una arista { a, b} es el construir una carretera de a a b, entonces un rbol de expansin mnimo representa el modo de enlazar todas las ciudades mediante una red de carreteras de coste mnimo. Terminologa de algoritmos voraces: Sea G = (V , A) un grafo y T un conjunto de aristas de G. T es una solucin si es un grafo de expansin. T es completable si no tiene ciclos. T es prometedor si es completable y puede ser completado hasta llegar a una solucin ptima. Una arista toca un conjunto de vrtices B si exactamente uno de sus extremos pertenece a B. Teorema: Sea G = (V , A) un grafo conexo no orientado cuyas aristas tienen un peso asociado. Sea B un subjconjunto propio del conjunto de vrtices V y T un conjunto prometedor de aristas tal que ninguna arista de T toca a B. Sea e una arista de peso mnimo de entre todas las que tocan a B. Entonces ( T {e}) es prometedor.

22.4.2.

El algoritmo de Kruskal

Para los ejemplos se considera el siguiente grafo:

I P I EEEEE P EEEEE Q

294

Temas de programacin funcional (201011)

| G| G| | G | G | | G | G | R| GT |R GS |T | G | G | | G | G | |G |G | R EEEEE S EEEEE T Q | V G | G | G R |U GQ | G | G |G U
Aplicacin del algoritmo de Kruskal al grafo anterior:

itp H I P Q R S T U

erist gomponentes onexs {I} {P} {Q} {R} {S} {T} {U} {IDP} {IDP} {Q} {R} {S} {T} {U} {PDQ} {IDPDQ} {R} {S} {T} {U} {RDS} {IDPDQ} {RDS} {T} {U} {TDU} {IDPDQ} {RDS} {TDU} {IDR} {IDPDQDRDS} {TDU} {PDS} rist rehzd {RDU} {IDPDQDRDSDTDU}

El rbol de expansin mnimo contiene las aristas no rechazadas:

{IDP}D {PDQ}D {RDS}D {TDU}D {IDR} y {RDU}F


Libreras auxiliares.

EE xotX eleionr un implementin del eh grfoF EE import qrfogonetorheedyeni import qrfogonwtrizheedyeni EE xotX eleionr un implementin del eh ol EE de prioriddF import golherioriddgonvists EE import golherioriddgonwontiulos

Tema 22. Algoritmos sobre grafos

295

EE xotX eleionr un implementin del eh tlF EE import lgonpuniones import lgonvistsheesoiion EE import lgonwtries import htFvist import htFsx
Grafos usados en los ejemplos.

gI XX qrfo snt snt gI a reqrfo rue @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA gP XX qrfo snt snt gP a reqrfo rue @IDSA @IDPDIQAD@IDQDIIAD@IDSDUVAD @PDRDIPAD@PDSDQPAD @QDRDIRAD@QDSDRRAD @RDSDWQA @kruskl gA es el rbol de expansin mnimo del grafo g calculado mediante el algoritmo de Kruskal. Por ejemplo, kruskl gI kruskl gP
; ;

@SSDPDRAD@QRDIDQAD@QPDPDSAD@IPDIDPA @QPDPDSAD@IQDIDPAD@IPDPDRAD@IIDIDQA p Eb @pDnDnA EE EE EE EE gol de prioridd l de ries rol de expnsin erists por olor

kruskl XX @xum pD sx nD yrd pA ab qrfo n kruskl g a kruskl9 @lleng @ristsxh gA viA @tl @xDxA | x `E nodos gA @@length @nodos gAA E IA

kruskl9 p t e n | naaH a e | tulizdo a kruskl9 p9 t9 @XeA @nEIA | otherwise a kruskl9 p9 t e n where d@DxDyA a primero p

296

Temas de programacin funcional (201011)

p9 a resto p @tulizdoDt9A a usetuliz @xDyA t @lleng xs pA es la cola de prioridad obtenida aadindole a la cola de prioridad p (cuyos elementos son ternas formadas por los dos nodos de una arista y su peso) la lista xs (cuyos elementos son ternas formadas por un nodo de una arista, su peso y el otro nodo de la arista). Por ejemplo, con golherioriddgonvists ghib lleng @QDUDSAD@RDPDTAD@WDQDHA vi g @HDWDQAD@SDQDUAD@TDRDPA
y con golherioriddgonwontiulos

ghib lleng @QDUDSAD@RDPDTAD@WDQDHA vi g @w @HDWDQA I @w @SDQDUA I @w @TDRDPA I iow iowA iowA iowA lleng XX @yrd nD yrd pD yrd A ab @nDpDA Eb grioridd @DnDpA Eb grioridd @DnDpA lleng p a p lleng @@xDyDpAXesA p a lleng es @insert @pDxDyA pA @riz t nA es la raz de n en la tabla t. Por ejemplo, b riz @re @IDIAD@QDIAD@RDQAD@SDRAD@PDTAD@TDTAA S I b riz @re @IDIAD@QDIAD@RDQAD@SDRAD@PDTAD@TDTAA P T rizXX iq n ab l n n Eb n Eb n riz t x | v aa x a v | otherwise a riz t v where v a vlor t x @usetuliz tA es el par formado por plse y la tabla t, si los dos vrtices de la arista tienen la misma raz en t y el par formado por rue y la tabla obtenida aadindole a t la arista formada por el vrtice de de mayor raz y la raz del vrtice de de menor raz. Por ejemplo, ghib let t a re @IDIAD@PDPAD@QDIAD@RDIA ghib usetuliz @PDQA t

Tema 22. Algoritmos sobre grafos

297

@rueDl @IDIAD@PDIAD@QDIAD@RDIAA ghib usetuliz @QDRA t @plseDl @IDIAD@PDPAD@QDIAD@RDIAA usetuliz XX @iq nD yrd nA ab @nDnA Eb l n n Eb @foolDl n nA usetuliz @xDyA t | x9 aa y9 a @plseD tA | y9 ` x9 a @rueD modifi @xDy9A tA | otherwise a @rueD modifi @yDx9A tA where x9 a riz t x y9 a riz t y

22.4.3.

El algoritmo de Prim

@prim gA es el rbol de expansin mnimo del grafo g calculado mediante el algoritmo de Prim. Por ejemplo, prim gI prim gP
; ;

@SSDPDRAD@QRDIDQAD@QPDPDSAD@IPDIDPA @QPDPDSAD@IPDPDRAD@IQDIDPAD@IIDIDQA

prim XX @xum pD sx nD yrd pA ab qrfo n p Eb @pDnDnA prim g a prim9 n EE xodos olodos ns EE xodos por olor EE rol de expnsin @ristsxh gA EE erists del grfo where @nXnsA a nodos g prim9 t e s a e prim9 t r e s a prim9 @v9XtA @delete v9 rA @eXeA s where ed@Du9D v9A a minimum @DuDvA| @uDvDA `E sD elem u tD elem v r

298

Temas de programacin funcional (201011)

Tema 23 Tcnicas de diseo descendente de algoritmos


Contenido
23.1. La tcnica de divide y vencers . . . . . . . . . . . . . . . . . . . . . . . . 279 23.1.1. La tcnica de divide y vencers . . . . . . . . . . . . . . . . . . . . 279 23.1.2. La ordenacin por mezcla como ejemplo de DyV . . . . . . . . . 280 23.1.3. La ordenacin rpida como ejemplo de DyV . . . . . . . . . . . . 280 23.2. Bsqueda en espacios de estados . . . . . . . . . . . . . . . . . . . . . . 281 23.2.1. El patrn de bsqueda en espacios de estados . . . . . . . . . . . 281 23.2.2. El problema del 8 puzzle . . . . . . . . . . . . . . . . . . . . . . . . 282 23.2.3. El problema de las n reinas . . . . . . . . . . . . . . . . . . . . . . 285 23.2.4. El problema de la mochila . . . . . . . . . . . . . . . . . . . . . . . 287 23.3. Bsqueda por primero el mejor . . . . . . . . . . . . . . . . . . . . . . . 289 23.3.1. El patrn de bsqueda por primero el mejor . . . . . . . . . . . . 289 23.3.2. El problema del 8 puzzle por BPM . . . . . . . . . . . . . . . . . . 289 23.4. Bsqueda en escalada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 23.4.1. El patrn de bsqueda en escalada . . . . . . . . . . . . . . . . . . 290 23.4.2. El problema del cambio de monedas por escalada . . . . . . . . . 291 23.4.3. El algoritmo de Prim del rbol de expansin mnimo por escalada 292

299

300

Temas de programacin funcional (201011)

23.1.
23.1.1.

La tcnica de divide y vencers


La tcnica de divide y vencers

La tcnica divide y vencers consta de los siguientes pasos: 1. Dividir el problema en subproblemas menores. 2. Resolver por separado cada uno de los subproblemas: si los subproblemas son complejos, usar la misma tcnica recursivamente; si son simples, resolverlos directamente. 3. Combinar todas las soluciones de los subproblemas en una solucin simple.

@divideeners ind resuelve divide omin psniilA resuelve el problema psniil mediante la tcnica de divide y vencers, donde
@ind pA se verica si el problema p es indivisible, @resuelve pA es la solucin del problema indivisible p, @divide pA es la lista de subproblemas de p, @omin p ssA es la combinacin de las soluciones ss de los subproblemas del problema p y psniil es el problema inicial.

divideeners XX @p Eb foolA Eb @p Eb sA Eb @p Eb pA Eb @p Eb s Eb sA Eb p Eb s divideeners ind resuelve divide omin psniil a dv9 psniil where dv9 p | ind p a resuelve p | otherwise a omin p dv9 sp | sp `E divide p

23.1.2.

La ordenacin por mezcla como ejemplo de DyV

@ordenorwezl xsA es la lista obtenida ordenando xs por el procedimiento de ordenacin por mezcla. Por ejemplo, ghib ordenorwezl QDIDRDIDSDWDPDV IDIDPDQDRDSDVDW

Tema 23. Tcnicas de diseo descendente de algoritmos

301

ordenorwezl XX yrd ab Eb ordenorwezl xs a divideeners ind id divide omin xs where ind xs a length xs `a I divide xs a tke n xsD drop n xs where n a length xs div P omin lIDlP a mezl lI lP @mezl xs ysA es la lista obtenida mezclando xs e ys. Por ejemplo, mezl IDQ PDRDT mezl XX yrd mezl a mezl a mezl d@xXxsA | x `a y | otherwise
;

IDPDQDRDT

ab Eb Eb d@yXysA a x X @mezl xs A a y X @mezl ysA

23.1.3.

La ordenacin rpida como ejemplo de DyV

@ordenpid xsA es la lista obtenida ordenando xs por el procedimiento de ordenacin rpida. Por ejemplo, ghib ordenpid QDIDRDIDSDWDPDV IDIDPDQDRDSDVDW ordenpid XX yrd ab Eb ordenpid xs a divideeners ind id divide omin xs where ind xs a length xs `a I divide @xXxsA a y | y `E xsD y `a xD y | y `E xsD y b x omin @xXA lIDlP a lI CC x CC lP

302

Temas de programacin funcional (201011)

23.2.
23.2.1.

Bsqueda en espacios de estados


El patrn de bsqueda en espacios de estados

Descripcin de los problemas de espacios de estados Las caractersticas de los problemas de espacios de estados son: un conjunto de las posibles situaciones o nodos que constituye el espacio de estados (estos son las potenciales soluciones que se necesitan explorar), un conjunto de movimientos de un nodo a otros nodos, llamados los sucesores del nodo, un nodo inicial y un nodo objetivo que es la solucin. En estos problemas usaremos las siguientes libreras auxiliares:

EE xotX ry que elegir un implementin de ls pilsF import ilgonvists EE import ilgonipohehtoelgerio import htFerry import htFvist @sortA
El patrn de bsqueda en espacios de estados Se supone que el grafo implcito de espacios de estados es acclico.

@usii s o eA es la lista de soluciones del problema de espacio de estado denido por la funcin sucesores (s), el objetivo (o) y estado inicial (e). usiiXX @iq nodeA ab @node Eb nodeA Eb @node Eb foolA Eb node Eb node usii suesores espinl x a us9 @pil x viA where us9 p | esi p a | espinl @im pA a im p X us9 @despil pA | otherwise a us9 @foldr pil @despil pA @suesores xAA where x a im p

Tema 23. Tcnicas de diseo descendente de algoritmos

303

23.2.2.

El problema del 8 puzzle

El problema del 8 puzzle Para el 8puzzle se usa un cajn cuadrado en el que hay situados 8 bloques cuadrados. El cuadrado restante est sin rellenar. Cada bloque tiene un nmero. Un bloque adyacente al hueco puede deslizarse hacia l. El juego consiste en transformar la posicin inicial en la posicin nal mediante el deslizamiento de los bloques. En particular, consideramos el estado inicial y nal siguientes:

CEEECEEECEEEC | P | T | Q | CEEECEEECEEEC | S | | R | CEEECEEECEEEC | I | U | V | CEEECEEECEEEC istdo iniil

CEEECEEECEEEC | I | P | Q | CEEECEEECEEEC | V | | R | CEEECEEECEEEC | U | T | S | CEEECEEECEEEC istdo finl

Una posicin es un par de enteros.

type osiion a @sntDsntA


Un tablero es un vector de posiciones, en el que el ndice indica el elemento que ocupa la posicin.

type lero a erry snt osiion iniilV es el estado inicial del 8 puzzle. En el ejemplo es CEEECEEECEEEC | P | T | Q | CEEECEEECEEEC | S | | R | CEEECEEECEEEC | I | U | V | CEEECEEECEEEC iniilV XX lero iniilV a rry @HDVA @PD@IDQAAD@TD@PDQAAD@QD@QDQAAD @SD@IDPAAD@HD@PDPAAD@RD@QDPAAD @ID@IDIAAD@UD@PDIAAD@VD@QDIAA

304

Temas de programacin funcional (201011)

finlV es el estado nal del 8 puzzle. En el ejemplo es CEEECEEECEEEC | I | P | Q | CEEECEEECEEEC | V | | R | CEEECEEECEEEC | U | T | S | CEEECEEECEEEC finlV XX lero finlV a rry @HDVA @ID@IDQAAD@PD@PDQAAD@QD@QDQAAD @VD@IDPAAD@HD@PDPAAD@RD@QDPAAD @UD@IDIAAD@TD@PDIAAD@SD@QDIAA @distni pI pPA es la distancia Manhatan entre las posiciones pI y pP. Por ejemplo, distni @PDUA @RDIA ; V

distni XX osiion Eb osiion Eb snt distni @xIDyIA @xPDyPA a s @xIExPA C s @yIEyPA @dyente pI pPA se verica si las posiciones pI y pP son adyacentes. Por ejemplo, dyente @QDPA @QDIA ; dyente @QDPA @IDPA ; rue plse

dyente XX osiion Eb osiion Eb fool dyente pI pP a distni pI pP aa I @todoswovimientos tA es la lista de los tableros obtenidos aplicndole al tablero t todos los posibles movimientos; es decir, intercambiando la posicin del hueco con sus adyacentes. todoswovimientos XX lero Eb lero todoswovimientos t a tGG@HDt3iAD@iDt3HA | i`EIFFVD dyente @t3HA @t3iA

Tema 23. Tcnicas de diseo descendente de algoritmos

305

Los nodos del espacio de estados son listas de tableros [tn , . . . , t1 ] tal que ti es un sucesor de ti1 .

dt leros a ist lero deriving @iqD howA @suesoresV eA es la lista de sucesores del estado e. suesoresV XX leros Eb leros suesoresV @ist@nd@tXtsAAA a filter @noin tsA ist @t9XnA | t9 `E todoswovimientos t where noin ts @ist@tXAA a not @elem @elems tA @mp elems tsAA
Solucin del 8 puzzle por bsqueda en espacios de estados

@espinlV eA se verica si e es un estado nal del 8 puzzle. espinlV XX leros Eb fool espinlV @ist @nXAA a elems n aa elems finlV @usiiVA es la lista de las soluciones del problema del 8 puzzle. usiiV XX osiion usiiV a mp elems ls where @@ist lsAXA a usii suesoresV espinlV @ist iniilVA
Nota: No termina.

23.2.3.

El problema de las n reinas

El problema de las n reinas El problema de las n reinas consiste en colocar n reinas en un tablero cuadrado de dimensiones n por n de forma que no se encuentren ms de una en la misma lnea: horizontal, vertical o diagonal. Las posiciones de las reinas en el tablero se representan por su columna y su la.

306

Temas de programacin funcional (201011)

type golumn a snt type pil a snt


Una solucin del problema de las n reinas es una lista de posiciones.

type olx a @golumnDpilA @vlid sp pA se verica si la posicin p es vlida respecto de la solucin parcial sp; es decir, la reina en la posicin p no amenaza a ninguna de las reinas de la sp (se supone que estn en distintas columnas). Por ejemplo, vlid @IDIA @PDPA vlid @IDIA @PDQA
; ;

plse rue

vlid XX olx Eb @golumnDpilA Eb fool vlid solp @DrA a nd test s | s `E solp where test @9Dr9A a nd 9Cr9GaCrD 9Er9GaErD r9Gar
Los nodos del problema de las n reinas son ternas formadas por la columna de la ltima reina colocada, el nmero de columnas del tablero y la solucin parcial de las reinas colocadas anteriormente.

type xodox a @golumnDgolumnDolxA @suesoresx eA es la lista de los sucesores del estado e en el problema de las n reinas. Por ejemplo, ghib suesoresx @IDRDA @PDRD@IDIAAD@PDRD@IDPAAD@PDRD@IDQAAD@PDRD@IDRAA suesoresx XX xodox Eb xodox suesoresx @DnDsolpA a @CIDnDsolpCC@DrAA | r `E IFFnD vlid solp @DrA @espinlx eA se verica si e es un estado nal del problema de las n reinas. espinlx XX xodox Eb fool espinlx @DnDsolpA a b n

Tema 23. Tcnicas de diseo descendente de algoritmos

307

Solucin del problema de las n reinas por EE

@usiix nA es la primera solucin del problema de las n reinas, por bsqueda en espacio de estados. Por ejemplo, ghib usiix V @IDIAD@PDSAD@QDVAD@RDTAD@SDQAD@TDUAD@UDPAD@VDRA usiix XX golumn Eb olx usiix n a s where @@DDsAXA a usii suesoresx espinlx @IDnDA @noluionesx nA es el nmero de soluciones del problema de las n reinas, por bsqueda en espacio de estados. Por ejemplo, noluionesx V ; WP

noluionesx XX golumn Eb snt noluionesx n a length @usii suesoresx espinlx @IDnDAA

23.2.4.

El problema de la mochila

El problema de la mochila Se tiene una mochila de capacidad de peso p y una lista de n objetos para colocar en la mochila. Cada objeto i tiene un peso wi y un valor vi . Considerando la posibilidad de colocar el mismo objeto varias veces en la mochila, el problema consiste en determinar la forma de colocar los objetos en la mochila sin sobrepasar la capacidad de la mochila colocando el mximo valor posible. Los pesos son nmero enteros.

type eso a snt


Los valores son nmeros reales.

308

Temas de programacin funcional (201011)

type lor a plot


Los objetos son pares formado por un peso y un valor.

type yjeto a @esoDlorA


Una solucin del problema de la mochila es una lista de objetos.

type olwoh a yjeto


Los estados del problema de la mochila son 5tuplas de la forma @vDpDlDoDsA donde v es el valor de los objetos colocados, p es el peso de los objetos colocados, l es el lmite de la capacidad de la mochila, o es la lista de los objetos colocados (ordenados de forma creciente segn sus pesos) y s es la solucin parcial.

type xodowoh a @lorDesoDesoDyjetoDolwohA @suesoreswoh eA es la lista de los sucesores del estado e en el problema de la mochila. suesoreswoh XX xodowoh Eb xodowoh suesoreswoh @vDpDlimiteDojetosDsolpA a @ vCv9D pCp9D limiteD o | od@p99DA `E ojetosD@p99bap9AD @p9Dv9AXsolp A | @p9Dv9A `E ojetosD pCp9 `a limite @esyjetivowoh eA se verica si e es un estado nal el problema de la mochila. esyjetivowoh XX xodowoh Eb fool esyjetivowoh @DpDlimiteD@@p9DAXADA a pCp9blimite

Tema 23. Tcnicas de diseo descendente de algoritmos

309

Solucin del problema de la mochila por EE

@usiiwohil os lA es la solucin del problema de la mochila para la lista de objetos os y el lmite de capacidad l. Por ejemplo, b usiiwohil @PDQAD@QDSAD@RDTAD@SDIHA V @@SDIHFHAD@QDSFHADISFHA b usiiwohil @PDQAD@QDSAD@SDTA IH @@QDSFHAD@QDSFHAD@PDQFHAD@PDQFHADITFHA b usiiwohil @PDPFVAD@QDRFRAD@SDTFIA IH @@QDRFRAD@QDRFRAD@PDPFVAD@PDPFVADIRFRA usiiwohil XX yjeto Eb eso Eb @olwohDlorA usiiwohil ojetos limite a @solDvA where @vDDDDsolA a mximum @usii suesoreswoh esyjetivowoh @HDHDlimiteDsort ojetosDAA

23.3.
23.3.1.

Bsqueda por primero el mejor


El patrn de bsqueda por primero el mejor

El patrn de bsqueda por primero el mejor

@usw s o eA es la lista de soluciones del problema de espacio de estado denido por la funcin sucesores (s), el objetivo (o) y estado inicial (e), obtenidas buscando por primero el mejor. import golherioriddgonwontiulos usw XX @yrd nodoA ab @nodo Eb nodoA Eb @nodo Eb foolA Eb nodo Eb @nodoDsntA usw suesores espinl x a us9 @insert x viA H where us9 t | esi a | espinl @primero A a @@primero ADtCIAX@us9 @resto A@tCIAA | otherwise

310

Temas de programacin funcional (201011)

a us9 @foldr insert @resto A @suesores xAA @tCIA where x a primero

23.3.2.

El problema del 8 puzzle por BPM

El problema del 8 puzzle por BPM

@heurI tA es la suma de la distancia Manhatan desde la posicin de cada objeto del tablero t a su posicin en el estado nal. Por ejemplo, heurI iniilV ; IP

heurI XX lero Eb snt heurI a sum distni @3iA @finlV3iA | i `E HFFV


Dos estados se consideran iguales si tienen la misma heurstica.

instne iq leros where ist@tIXA aa ist@tPXA a heurI tI aa heurI tP


Un estado es menor o igual que otro si tiene una heurstica menor o igual.

instne yrd leros where ist @tIXA `a ist @tPXA a heurI tI `a heurI tP @uswVA es la lista de las soluciones del 8 puzzle por bsqueda primero el mejor. uswV a usw suesoresV espinlV @ist iniilVA @noluioneswVA es el nmero de soluciones del 8 puzzle por bsqueda primero el mejor. Por ejemplo, noluioneswV
;

RQ

noluioneswV a length ls where @@@ist lsADAXA a usw suesoresV espinlV @ist iniilVA

Tema 23. Tcnicas de diseo descendente de algoritmos

311

23.4.
23.4.1.

Bsqueda en escalada
El patrn de bsqueda en escalada

El patrn de bsqueda en escalada

@usisld s o eA es la lista de soluciones del problema de espacio de estado denido por la funcin sucesores (s), el objetivo (o) y estado inicial (e), obtenidas buscando por escalada. usisld XX yrd nodo ab @nodo Eb nodoA Eb @nodo Eb foolA Eb nodo Eb nodo usisld suesores espinl x a us9 @insert x viA where us9 | esi a | espinl @primero A a primero | otherwise a us9 @foldr insert vi @suesores xAA where x a primero

23.4.2.

El problema del cambio de monedas por escalada

El problema del cambio de monedas consiste en determinar cmo conseguir una cantidad usando el menor nmero de monedas disponibles. Las monedas son nmeros enteros.

type woned a snt moneds es la lista del tipo de monedas disponibles. Se supone que hay un nmero innito de monedas de cada tipo. moneds XX woned moneds a IDPDSDIHDPHDSHDIHH
Las soluciones son listas de monedas.

type oluiones a woned


Los estados son pares formados por la cantidad que falta y la lista de monedas usadas.

312

Temas de programacin funcional (201011)

type xodowoneds a @sntD wonedA @suesoreswoneds eA es la lista de los sucesores del estado e en el problema de las monedas. Por ejemplo, ghib suesoreswoneds @IWWDA @IWVDIAD@IWUDPAD@IWRDSAD@IVWDIHAD @IUWDPHAD@IRWDSHAD@WWDIHHA suesoreswoneds XX xodowoneds Eb xodowoneds suesoreswoneds @rDpA a @rEDXpA | `E monedsD rE ba H @espinlwoneds eA se verica si e es un estado nal del problema de las monedas. espinlwoneds XX xodowoneds Eb fool espinlwoneds @vDA a vaaH @mio nA es la solucin del problema de las monedas por bsqueda en escalada. Por ejemplo, mio IWW
;

PDPDSDPHDPHDSHDIHH

mio XX snt Eb oluiones mio n a snd @hed @usisld suesoreswoneds espinlwoneds @nDAAA

23.4.3.

El algoritmo de Prim del rbol de expansin mnimo por escalada

Ejemplo de grafo.

gI XX qrfo snt snt gI a reqrfo rue @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA

Tema 23. Tcnicas de diseo descendente de algoritmos

313

Una arista esta formada dos nodos junto con su peso.

type erist a @DDA


Un nodo @xodoeiw @pDtDrDemAA est formado por el peso p de la ltima arista aadida el rbol de expansin mnimo (em), la lista t de nodos del grafo que estn en el em, la lista r de nodos del grafo que no estn en el em y el em.

type xodoeiw a @DDDerist A @suesoreseiw g nA es la lista de los sucesores del nodo n en el grafo g. Por ejemplo, ghib suesoreseiw gI @HDIDPFFSDA @IPDPDIDQDRDSD@IDPDIPAAD @QRDQDIDPDRDSD@IDQDQRAAD @UVDSDIDPDQDRD@IDSDUVAA suesoreseiw XX @sx Dxum A ab @qrfo A Eb @xodoeiw A Eb @xodoeiw A suesoreseiw g @DtDrDemA a @peso x y gD @yXtAD delete y rD @xDyDpeso x y gAXemA | x `E t D y `E rD ristin g @xDyA @espinleiw nA se verica si n es un estado nal; es decir, si no queda ningn elemento en la lista de nodos sin colocar en el rbol de expansin mnimo. espinleiw @DDDA a rue espinleiw a plse @prim gA es el rbol de expansin mnimo del grafo g, por el algoritmo de Prim como bsqueda en escalada. Por ejemplo, prim gI ; @PDRDSSAD@IDQDQRAD@PDSDQPAD@IDPDIPA

314

Temas de programacin funcional (201011)

prim g a sol where @DDDsolA a usisld @suesoreseiw gA espinleiw @HDnDnsDA @nXnsA a nodos g

Tema 24 Tcnicas de diseo ascendente de algoritmos


Contenido
24.1. Programacin dinmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 24.1.1. Introduccin a la programacin dinmica . . . . . . . . . . . . . . 295 24.1.2. El patrn de la programacin dinmica . . . . . . . . . . . . . . . 296 24.2. Fibonacci como ejemplo de programacin dinmica . . . . . . . . . . . 297 24.2.1. Denicin de Fibonacci mediante programacin dinmica . . . . 297 24.3. Producto de cadenas de matrices (PCM) . . . . . . . . . . . . . . . . . . 299 24.3.1. Descripcin del problema PCM . . . . . . . . . . . . . . . . . . . . 299 24.3.2. Solucin del PCM mediante programacin dinmica . . . . . . . 300 24.3.3. Solucin del PCM mediante divide y vencers . . . . . . . . . . . 302 24.4. rboles binarios de bsqueda optimales (ABBO) . . . . . . . . . . . . . 303 24.4.1. Descripcin del problema de ABBO . . . . . . . . . . . . . . . . . 303 24.4.2. Solucin del ABBO mediante programacin dinmica . . . . . . . 304 24.5. Caminos mnimos entre todos los pares de nodos de un grafo(CM) . . 306 24.5.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . . 306 24.5.2. Solucin del problema de los caminos mnimos (CM) . . . . . . . 306 24.6. Problema del viajante (PV) . . . . . . . . . . . . . . . . . . . . . . . . . . 308 24.6.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . . 308 24.6.2. Solucin del problema del viajante (PV) . . . . . . . . . . . . . . . 309

315

316

Temas de programacin funcional (201011)

24.1.
24.1.1.

Programacin dinmica
Introduccin a la programacin dinmica

Divide y vencers vs programacin dinmica Inconveniente de la tcnica divide y vencers: la posibilidad de crear idnticos supbroblemas y repeticin del trabajo. Idea de la programacin dinmica: resolver primero los subproblemas menores, guardar los resultados y usar los resultados de los subproblemas intermedios para resolver los mayores. Clculo de Fibonacci por divide y vencers Denicin de Fibonacci por divide y vencers.

fi H a H fi I a I fi n a fi @nEIA C fi @nEPA
Clculo de (b 4) por divide y vencers

CEEEEEC CEEC | | fi Q fi P G G fi P fi I fi I fi H G fi I fi H
Calcula 2 veces (b 2) y 3 veces (b 1) y (b 0). Clculo de Fibonacci por programacin dinmica Clculo de (b 4) por programacin dinmica

fi R G

fi H | fi I | | CEEEEECaaa fi P

Tema 24. Tcnicas de diseo ascendente de algoritmos

317

| | CEEEEECaaa fi Q | | CEEEEECaaa fi R

24.1.2.

El patrn de la programacin dinmica


where

Cabecera del mdulo:

module hinmi @module lD dinmiA


Libreras auxiliares

EE ry que elegir un implementin de eh l EE import lgonpuniones s l import lgonvistsheesoiion s l EE import lgonwtries s l import htFerry
El patrn de la programacin dinmica

dinmi XX sx i ab @l i v Eb i Eb vA Eb @iDiA Eb l i v dinmi lul ots a t where t a tl @iDlul t iA | i `E rnge ots @lul t iA es el valor del ndice i calculado a partir de los anteriores que ya se encuentran en la tabla t. ots son las cotas de la matriz t en la que se almacenan los valores calculados.

24.2.
24.2.1.

Fibonacci como ejemplo de programacin dinmica


Denicin de Fibonacci mediante programacin dinmica

Denicin de Fibonacci mediante programacin dinmica Importacin del patrn de programacin dinmica

import hinmi

318

Temas de programacin funcional (201011)

@fi nA es el n-simo trmino de la sucesin de Fibonacci, calculado mediante programacin dinmica. Por ejemplo, fi V
;

PI

fi XX snt Eb snt fi n a vlor t n where t a dinmi lulpi @otspi nA @lulpi t iA es el valor de i-simo trmino de la sucesin de Fibonacci calculado mediante la tabla t que contiene los anteriores. Por ejemplo, lulpi @tl A H ; H lulpi @tl @HDHAD@IDIAD@PDIAD@QDPA R ; Q
Adems,

ghib dinmi lulpi @HDTA l @HDHAD@IDIAD@PDIAD@QDPAD@RDQAD@SDSAD@TDVA lulpi XX l snt snt Eb snt Eb snt lulpi t i | i `a I a i | otherwise a vlor t @iEIA C vlor t @iEPA @otspi nA son las cotas del vector que se necesita para calcular el n-simo trmino de la sucesin de Fibonacci mediante programacin dinmica. otspi XX snt Eb @sntDsntA otspi n a @HDnA
Denicin de Fibonacci mediante divide y vencers

@fi nA es el nsimo trmino de la sucesin de Fibonacci calculado mediante divide y vencers. fi fi fi fi XX snt Eb snt H a H I a I n a fi @nEIA C fi @nEPA

Tema 24. Tcnicas de diseo ascendente de algoritmos

319

Comparacin:

ghib fi QH VQPHRH @HFHI sesD H ytesA ghib fi QH VQPHRH @TFRT sesD PPPTHPRHR ytesA
Denicin de Fibonacci mediante evaluacin perezosa

fis es la lista de los trminos de la sucesin de Fibonacci. Por ejemplo, tke IH fis ; HDIDIDPDQDSDVDIQDPIDQR

fis XX snt fis a HXIXxCy | @xDyA `E zip fis @til fisA @fi9 nA es el n-simo trmino de la sucesin de Fibonacci, calculado a partir de bs. Por ejemplo, fi9 V
;

PI

fi9 XX snt Eb snt fi9 n a fis33n


Comparaciones:

ghib fi QH VQPHRH @HFHP sesD SPRVHV ytesA ghib fi9 QH VQPHRH @HFHI sesD SRPQVR ytesA ghib fi QH VQPHRH @TFRT sesD PPPTHPRHR ytesA

320

Temas de programacin funcional (201011)

24.3.
24.3.1.

Producto de cadenas de matrices (PCM)


Descripcin del problema PCM

Descripcin del problema Para multiplicar una matriz de orden m p y otra de orden p n se necesitan mnp multiplicaciones de elementos. El problema del producto de una cadena de matrices (en ingls, matrix chain multiplication) consiste en dada una sucesin de matrices encontrar la manera de multiplicarlas usando el menor nmero de productos de elementos. Ejemplo: Dada la sucesin de matrices A(30x1), B(1x40), C (40x10), D (10x25) las productos necesarios en las posibles asociaciones son (( AB)C ) D 30x1x40 + 30x40x10 + 30x10x25 = 20700 A( B(CD )) 40x10x25 + 1x40x25 + 30x1x25 = 11750 ( AB)(CD ) 30x1x40 + 40x10x25 + 30x40x25 = 41200 A(( BC ) D ) 1x40x10 + 1x10x25 + 30x1x25 = 1400 ( A( BC )) D 1x40x10 + 30x1x10 + 30x10x25 = 8200 El algoritmo del PCM El PCM correspondiente a la sucesin d0 , . . . , dn consiste en encontrar la manera de multiplicar una sucesin de matrices A1 , . . . , An (tal que el orden de Ai es di1 di ) usando el menor nmero de productos de elementos. Sea ci, j el mnimo nmero de multiplicaciones necesarias para multiplicar la cadena Ai , . . . , A j (1 i j n). Relacin de recurrencia de ci, j : c i ,i = 0 ci, j = minimo {ci,k + ck+1, j + di1 dk d j |i k < j} La solucin del problema es c1,n .

24.3.2.

Solucin del PCM mediante programacin dinmica

Importacin de libreras auxiliares:

import hinmi

Tema 24. Tcnicas de diseo ascendente de algoritmos

321

gden representa el producto de una cadena de matrices. Por ejemplo, @e IA @ @e PA @e QAA @ @e IA @e PAA @e QA
; ;

@eIB@ePBeQAA @@eIBePABeQA

dt gden a e snt | gden gden instne how gden where show @e xA a 4e4 CC show x show @ pI pPA a ont 4@4Dshow pID4B4Dshow pPD4A4
Los ndices de la matriz de clculo son de la forma @iDjA y sus valores @vDkA donde v es el mnimo nmero de multiplicaciones necesarias para multiplicar la cadena Ai , . . . , A j y k es la posicin donde dividir la cadena de forma ptima.

type sndiegw a @sntDsntA type lorgw a @sntDsntA @pm dsA es el par formado por el mnimo nmero de multiplicaciones elementales para multiplicar una sucesin de matrices A1 , . . . , An (tal que el orden de Ai es di1 di y ds = [d0 , . . . , dn ]). Por ejemplo, pm QHDIDRHDIHDPS ; @IRHHD@eIB@@ePBeQABeRAAA pm XX snt Eb @sntD gdenA pm ds a @vD den t I nA where n a length ds E I t a dinmi @lulgw dsA @otsgw nA @vDA a vlor t @IDnA @lulgw ds t @iDjAA es el valor del ndice @iDjA calculado a partir de la lista ds de dimensiones de las matrices y la tabla t de valores previamente calculados. lulgw XX snt Eb l sndiegw lorgw Eb sndiegw Eb lorgw lulgw ds t @iDjA | i aa j a @HDiA | otherwise a minimum @fst@vlor t @iDkAA C fst@vlor t @kCIDjAA

322

Temas de programacin funcional (201011)

C ds33@iEIA B ds33k B ds33jD kA | k `E iFFjEI @otsgw nA son las cotas de los ndices para el producto de una cadena de n matrices. otsgw XX snt Eb @sndiegwDsndiegwA otsgw n a @@IDIAD@nDnAA @den t i jA es la cadena que resultar de agrupar las matrices Ai , . . . , A j segn los valores de la tabla t. den XX l den t i j | i aa jEI | k aa i | k aa jEI | otherwise where @DkA sndiegw lorgw Eb snt Eb snt Eb gden a a a a a @e iA @e jA @e iA @den t @iCIA jA @den t i @jEIAA @e jA @den t i @kEIAA @den t k jA vlor t @iDjA

@pm9 dsA es la lista de los ndices y valores usados en el clculo del mnimo nmero de multiplicaciones necesarias para multiplicar una sucesin de matrices A1 , . . . , An (tal que el orden de Ai es di1 di y ds = [d0 , . . . , dn ]). Por ejemplo, ghib pm9 QHDIDRHDIHDPS @@IDIAD@HDIAAD@@IDPAD@IPHHDIAAD@@IDQAD@UHHDIAAD@@IDRAD@IRHHDIAAD @@PDPAD@HDPAAD@@PDQAD@RHHDPAAD@@PDRAD@TSHDQAAD @@QDQAD@HDQAAD@@QDRAD@IHHHHDQAAD @@RDRAD@HDRAA pm9 XX snt Eb @@sntD sntAD lorgwA pm9 ds a @@iDjADvlor t @iDjAA | i `E IFFnD j `E iFFn where n a length ds E I t a dinmi @lulgw dsA @otsgw nA

24.3.3.

Solucin del PCM mediante divide y vencers

@pmhy dsA es la solucin del PCM correspondiente a ds mediante divide y vencers. Por ejemplo, pmhy QHDIDRHDIHDPS ; @IHRHD@eIB@@ePBeQABeRAAA

Tema 24. Tcnicas de diseo ascendente de algoritmos

323

pmhy XX snt Eb @sntD gdenA pmhy ds a denhy ds I n where n a length ds E I denhy ds i jA es la solucin del PCM correspondiente a [di , . . . , d j ]. Por ejemplo, denhy QHDIDRHDIHDPS I R ; denhy QHDIDRHDIHDPS P R ; @IHRHD@eIB@@ePBeQABeRAAA @PWHD@@ePBeQABeRAA

denhy XX snt Eb snt Eb snt Eb @sntD gdenA denhy ds i j | i aa j a @HD e iA | i aa jEI a @ds33IBds33PD @e iA @e jAA | k aa i a @vD @e iA @suden @iCIA jAA | k aa jEI a @vD @suden i @jEIAA @e jAA | otherwise a @vD @suden i @kEIAA @suden k jAA where @vDkA a minimum @@vlor i kA C @vlor @kCIA jA C ds33@iEIA B ds33k B ds33jD kA | k `E iFFjEI vlor p q a fst @denhy ds p qA suden p q a snd @denhy ds p qA
Comparacin de las mtodos de solucionar el PCM

ghib Xset Cs ghib fst @pm IFFPHA PTSV @HFVH sesD QWISVWTR ytesA ghib fst @pmhy IFFPHA IQUR @PVUIFRU sesD IQQTIWURPUTR ytesA

324

Temas de programacin funcional (201011)

24.4.
24.4.1.

rboles binarios de bsqueda optimales (ABBO)


Descripcin del problema de ABBO

Descripcin del problema de ABBO Para cada clave ci , sea pi la probabilidad de acceso a ci . Un rbol binario de bsqueda es optimal (ABBO) si la media del nmero de comparaciones para todas las claves a ( T ) = di pi donde di es la distancia de la clave ci a la raz (es decir, el nmero de comparaciones necesarias para llegar a ci ), es mnima. El algoritmo del ABBO Sea ci, j el mnimo valor a( T ) cuando el rbol T contiene las claves ci , . . . , c j . Relacin de recurrencia para calcular ci, j : Si i > j, ci, j = 0. Si i = j, ci, j = pi . Si i < j,
l = k 1

ci, j = minik j ((ci,k1 +

l =i

l=j

pl ) + (ck+1, j +

l = k +1 l=j l =i

pl ) + pk )

El tercer caso puede simplicarse ci, j = minik j (ci,k1 + ck+1, j ) + p(l )

24.4.2.

Solucin del ABBO mediante programacin dinmica

En la matriz de clculo del ABBO el valor @vDkA correspondiente al ndice @iDjA indica que v es el mnimo valor @A cuando el rbol contiene las claves ci , . . . , c j y que la divisin ptima se obtiene dividiendo las claves en dos mediante ck .

type sndie a @sntDsntA type lor a @plotDsntA @eff A es el tipo de los rboles binarios de bsqueda sobre .

Tema 24. Tcnicas de diseo ascendente de algoritmos

325

dt eff a io | xodo @eff A @eff A deriving how @o s psA es el par formado por un ABBO correspondiente a la lista de claves s cuyas correspondientes probabilidades de acceso son los elementos de la lista ps y por su valor. Por ejemplo, ghib o ejrolem @xodo R @xodo I io @xodo Q io ioAA @xodo IH @xodo V io ioA @xodo IS @xodo II io ioA ioAAD PFISA
Denicin de o:

o XX rolem Eb @eff sntDplotA o p a @soluion t @IDnA D fst @vlor t @IDnAAA where @sDpsA a p n a length ps a listerry @IDnA s p a listerry @IDnA ps t a dinmi @lul pA @ots nA @lul p t @iDjAA es el valor del ndice @iDjA donde p es el vector de probabilidades y t es la tabla calculada hasta el momento. lul XX erry snt plot Eb l sndie lor Eb sndie Eb lor lul p t @iDjA | i b j a @HFHDHA | i aa j a @p3iDiA | otherwise a sumI @minimum @fst@vlor t @iDkEIAA C fst@vlor t @kCIDjAAD kA | k `E iFFjA @sumegmento i j pA where sumI @xDyA z a @xCzDyA

326

Temas de programacin funcional (201011)

@sumegmento i j pA es la suma de los valores de los elementos del vector p desde la posicin i a la j. Por ejemplo, b sumegmento P R @rry @IDSA @iDfromsntegrl iGPA | i `E IFFSA RFS sumegmento XX snt Eb snt Eb erry snt plot Eb plot sumegmento i j p a sum p3l | l `E iFFj @ots nA son las cotas de la matriz revesaria para resolver el problema del rbol de bsqueda minimal ptimo con n claves. ots XX snt Eb @@sntDsntAD@sntDsntAA ots n a @@IDHAD@nCIDnAA @soluion s @iDjAA es el ABBO correspondiente a las claves @iA,...,@jA a partir de la tabla de clculo t. soluion XX erry snt Eb sndie soluion s t @iDjA | i b j a | i aa j a | otherwise a snt Eb l sndie lor Eb eff snt

io xodo io io xodo @soluion s t @iDkEIAA @soluion s t @kCIDjAA where @DkA a vlor t @iDjA a s 3 k

24.5.
24.5.1.

Caminos mnimos entre todos los pares de nodos de un grafo(CM)


Descripcin del problema

Clculo de los caminos de coste mnimo entre todos los pares de nodos de un grafo no dirigido. Notacin: ci, j es el mnimo coste del camino del vrtice i al j.

Tema 24. Tcnicas de diseo ascendente de algoritmos

327

pi, j

si i = j 0, = peso del arco entre i y j, si i = j y hay arco de i a j , en otro caso

ci, j,k es el mnimo coste del camino del vrtice i al j, usando los vrtices 1, . . . , k. Relacin de recurrencia para calcular ci, j : ci, j,0 = pi, j ci, j,k = min{ci, j,k1) , ci,k,k1 + ck, j,k1 } El algoritmo se conoce como el algoritmo de Floyd.

24.5.2.

Solucin del problema de los caminos mnimos (CM)

Importacin de libreras auxiliares:

import hinmi EE xotX ilegir un implementin de los grfosF import qrfogonetorheedyeni EE import qrfogonwtrizheedyeni
Ejemplos de grafos para el problema:

ejIqrfo XX qrfo snt snt ejIqrfo a reqrfo rue @IDTA @iDjD@v33@iEIAA33@jEIAA | i `E IFFTD j `E IFFT vXXsnt v a HD RD ID TDIHHDIHHD RD HD IDIHHD SDIHHD ID ID HDIHHD VD PD TDIHHDIHHD HDIHHD PD IHHD SD VDIHHD HD SD IHHDIHHD PD PD SD H
Ejemplos de grafos para el problema:

328

Temas de programacin funcional (201011)

ejPqrfo XX qrfo snt snt ejPqrfo a reqrfo rue @IDTA @iDjD@v933@iEIAA33@jEIAA | i `E IFFTD j `E IFFT v9XXsnt v9 a HD RDIHHDIHHDIHHD PD ID HD QD RDIHHDIHHD TD QD HD UDIHHDIHHD TDIHHDIHHD HD PDIHHD IHHDIHHDIHHD SD HDIHHD IHHDIHHDIHHD PD QD H
En la matriz del clculo del camino mnimo, los ndices son de la forma @iDjDkA y los valores de la forma @vDxsA representando que el camino mnimo desde el vrtice i al j usando los vrtices I, . . . , k tiene un coste v y est fomado por los vrtices xs.

type sndiegw a @sntDsntDsntA type lorgw a @sntDsntA @minoswinimos gA es la lista de los caminos mnimos entre todos los nodos del grafo g junto con sus costes. Por ejemplo, ghib minoswinimos ejIqrfo @@IDPAD@PDIDQDPAAD @@IDQAD@IDIDQAAD @@IDRAD@SDIDQDTDRAAD @@IDSAD@UDIDQDPDSAAD@@IDTAD@QDIDQDTAAD@@PDQAD@IDPDQAAD @@PDRAD@SDPDQDTDRAAD@@PDSAD@SDPDSAAD @@PDTAD@QDPDQDTAAD @@QDRAD@RDQDTDRAAD @@QDSAD@TDQDPDSAAD@@QDTAD@PDQDTAAD @@RDSAD@UDRDTDSAAD @@RDTAD@PDRDTAAD @@SDTAD@SDSDTAA minoswinimos XX @qrfo snt sntA Eb @@sntDsntAD lorgwA minoswinimos g a @@iDjAD vlor t @iDjDnAA | i `E IFFnD j `E iCIFFn where n a length @nodos gA t a dinmi @lulgw gA @otsgw nA @lulgw g t @iDjDkAA es el valor del camino mnimo desde el vrtice i al j usando los vrtices I, . . . , k del grafo g y la tabla t de los valores anteriores al ndice @iDjDkA.

Tema 24. Tcnicas de diseo ascendente de algoritmos

329

lulgw XX @qrfo snt sntA Eb l sndiegw lorgw Eb sndiegw Eb lorgw lulgw g t @iDjDkA | kaaH a @peso i j gD if iaaj then i else iDjA | vI`avP a @vIDpA | otherwise a @vPDpICCpPA where @vIDpA a vlor t @iDjDkEIA @DpIA a vlor t @iDkDkEIA @DXpPA a vlor t @kDjDkEIA vP a C @otsgw nA son las cotas de la matriz para resolver el problema de los caminos mnimos en un grafo con n nodos. otsgw XX snt Eb @@sntDsntDsntAD@sntDsntDsntAA otsgw n a @@IDIDHAD@nDnDnAA

24.6.
24.6.1.

Problema del viajante (PV)


Descripcin del problema

Dado un grafo no dirigido con pesos encontrar una camino en el grafo que visite todos los nodos exactamente una vez y cuyo coste sea mnimo. Notacin: Los vrtices del grafo son 1, 2, . . . , n. si i = j 0, pi, j = peso del arco entre i y j, si i = j y hay arco de i a j , en otro caso El vrtice inicial y nal es el n. ci,S es el camino ms corto que comienza en i, termina en n y pasa exactamente una vez por cada uno de los vrtices del conjunto S. Relacin de recurrencia de ci,S : ci, = pi,n , si i = n. ci,S = min{ pi, j + c j,S{ j} : j S}, si i = n, i S. La solucin es cn,{1,...,n1} .

330

Temas de programacin funcional (201011)

24.6.2.

Solucin del problema del viajante (PV)

Importacin de libreras auxiliares

import hinmi EE xotX ilegir un implementin de los grfosF import qrfogonetorheedyeni EE import qrfogonwtrizheedyeni
Nota: Para el PV se usar la representacin de los de conjuntos de enteros como nmeros enteros que se describe a continuacin. Los conjuntos se representan por nmeros enteros.

type gonj a snt @onjPvist A es la lista de los elementos del conjunto . Por ejemplo, onjPvist PR ; onjPvist QH ; onjPvist PP ; QDR IDPDQDR IDPDR

onjPvist XX gonj Eb snt onjPvist s a Pl s H where Pl H a Pl n i | odd n a i X Pl @n div PA @iCIA | otherwise a Pl @n div PA @iCIA mxgonj es el mximo nmero que puede pertenecer al conjunto. Depende de la implementacin de Haskell. mxgonj XX snt mxgonj a trunte @logfse P @fromsntegrl mxsntAA E I where mxsnt a mxfoundXXsnt vio es el conjunto vaco. vio XX gonj vio a H

Tema 24. Tcnicas de diseo ascendente de algoritmos

331

@esio A se verica si es el conjunto vaco. esio XX gonj Eb fool esio n a naaH @onjgompleto nA es el conjunto de los nmeros desde 1 hasta n. onjgompleto XX snt Eb gonj onjgompleto n | @nbaHA 88 @n`amxgonjA a P@nCIAEP | otherwise a error @4onjgompletoX4 CC show nA @insert x A es el conjunto obtenido aadiendo el elemento x al conjunto . insert XX snt Eb gonj Eb gonj insert i s | ibaH 88 i`amxgonj a d9BeCm | otherwise a error @4insertX4 CC show iA where @dDmA a divwod s e e a Pi d9 a if odd d then d else dCI @elimin x A es el conjunto obtenido eliminando el elemento x del conjunto . elimin XX snt Eb gonj Eb gonj elimin i s a d9BeCm where @dDmA a divwod s e e a Pi d9 a if odd d then dEI else d
Ejemplo de grafo para el problema:

R CEEEEE | | I IEEEEE | | T CEEEEE

S P EEEEEC |I | | V | Q EEEEES P G P GS R EET

332

Temas de programacin funcional (201011)

La denicin del grafo anterior es

ejI XX qrfo snt snt ejI a reqrfo rue @IDTA @iDjD@vI33@iEIAA33@jEIAA | i `E IFFTD j `E IFFT vIXXsnt vI a HD RD ID TDIHHDIHHD RD HD IDIHHD SDIHHD ID ID HDIHHD VD PD TDIHHDIHHD HDIHHD PD IHHD SD VDIHHD HD SD IHHDIHHD PD PD SD H
Los ndices de la matriz de clculo son de la forma @iDA y sus valores @vDxsA donde xs es el camino mnimo desde i hasta n visitando cada vrtice de exactamente una vez y v es el coste de xs.

type sndie a @sntDgonjA type lor a @sntDsntA @vijnte gA es el par @vDxsA donde xs es el camino de menor coste que pasa exactamente una vez por todos los nodos del grafo g empezando en su ltimo nodo y v es su coste. Por ejemplo, ghib vijnte ejI @PHDTDRDIDQDPDSDTA vijnte XX qrfo snt snt Eb @sntDsntA vijnte g a vlor t @nDonjgompleto @nEIAA where n a length @nodos gA t a dinmi @lul g nA @ots nA @lul g n t @iDkAA es el valor del camino mnimo en el grafo g desde i hasta n, calculado usando la tabla t, visitando cada nodo del conjunto k exactamente una vez. lul XX qrfo snt snt Eb snt Eb l sndie lor Eb sndie Eb lor lul g n t @iDkA | esio k a @peso i n gDiDnA

Tema 24. Tcnicas de diseo ascendente de algoritmos

333

| otherwise a minimum sumrim @vlor t @jD elimin j kAA @peso i j gA | j `E onjPvist k where sumrim @vDxsA v9 a @vCv9DiXxsA @ots nA son las cotas de la matriz de clculo del problema del viajante en un grafo con n nodos. ots XX snt Eb @@sntDgonjAD@sntDgonjAA ots n a @@IDvioAD@nDonjgompleto nAA

334

Temas de programacin funcional (201011)

Apndice A Resumen de funciones predenidas de Haskell


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

x C y es la suma de x e y. x E y es la resta de x e y. x G y es el cociente de x entre y. x y es x elevado a y. x aa y se verica si x es igual a y. x Ga y se verica si x es distinto de y. x ` y se verica si x es menor que y. x `a y se verica si x es menor o igual que y. x b y se verica si x es mayor que y. x ba y se verica si x es mayor o igual que y. x 88 y es la conjuncin de x e y. x || y es la disyuncin de x e y. xXys es la lista obtenida aadiendo x al principio de ys. xs CC ys es la concatenacin de xs e ys. xs 33 n es el elemento nsimo de xs. f F g es la composicin de f y g. s x es el valor absoluto de x. nd xs es la conjuncin de la lista de booleanos xs. eiling x es el menor entero no menor que x. hr n es el carcter cuyo cdigo ASCII es n. ont xss es la concatenacin de la lista de listas xss. onst x y es x.
335

336

Temas de programacin funcional (201011)

23. 24. 25. 26.

urry f es la versin currycada de la funcin f. div x y es la divisin entera de x entre y. drop n xs borra los n primeros elementos de xs.

drophile p xs borra el mayor prejo de xs cuyos elementos satisfacen el predicado p. 27. elem x ys se verica si x pertenece a ys.
28. 29. 30. 31. 32.

even x se verica si x es par. filter p xs es la lista de elementos de la lista xs que verican el predicado p. flip f x y es f y x.

floor x es el mayor entero no mayor que x. foldl f e xs pliega xs de izquierda a derecha usando el operador f y el valor inicial e. 33. foldr f e xs pliega xs de derecha a izquierda usando el operador f y el valor inicial e. 34. fromsntegrl x transforma el nmero entero x al tipo numrico correspondiente. 35. fst p es el primer elemento del par p.
36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.

gd x y es el mximo comn divisor de de x e y. hed xs es el primer elemento de la lista xs. init xs es la lista obtenida eliminando el ltimo elemento de xs. ispe x se verica si x es un espacio. ispper x se verica si x est en mayscula. isvower x se verica si x est en minscula. iselph x se verica si x es un carcter alfabtico. ishigit x se verica si x es un dgito. iselphxum x se verica si x es un carcter alfanumrico. iterte f x es la lista xD f@xAD f@f@xAAD FFF. lst xs es el ltimo elemento de la lista xs. length xs es el nmero de elementos de la lista xs. mp f xs es la lista obtenida aplicado f a cada elemento de xs. mx x y es el mximo de x e y. mximum xs es el mximo elemento de la lista xs. min x y es el mnimo de x e y. minimum xs es el mnimo elemento de la lista xs. mod x y es el resto de x entre y. not x es la negacin lgica del booleano x.

Apndice A. Resumen de funciones predenidas de Haskell

337

55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75.

noilem x ys se verica si x no pertenece a ys. null xs se verica si xs es la lista vaca. odd x se verica si x es impar. or xs es la disyuncin de la lista de booleanos xs. ord es el cdigo ASCII del carcter . produt xs es el producto de la lista de nmeros xs. rem x y es el resto de x entre y. repet x es la lista innita xD xD xD FFF. replite n x es la lista formada por n veces el elemento x. reverse xs es la inversa de la lista xs. round x es el redondeo de x al entero ms cercano. snr f e xs es la lista de los resultados de plegar xs por la derecha con f y e. show x es la represantacin de x como cadena. signum x es 1 si x es positivo, 0 si x es cero y -1 si x es negativo. snd p es el segundo elemento del par p. splitet n xs es @tke n xsD drop n xsA. sqrt x es la raz cuadrada de x.

sum xs es la suma de la lista numrica xs. til xs es la lista obtenida eliminando el primer elemento de xs. tke n xs es la lista de los n primeros elementos de xs. tkehile p xs es el mayor prejo de xs cuyos elementos satisfacen el predicado p. 76. unurry f es la versin cartesiana de la funcin f.
77. 78.

until p f x aplica f a x hasta que se verique p.

zip xs ys es la lista de pares formado por los correspondientes elementos de xs e ys. 79. zipith f xs ys se obtiene aplicando f a los correspondientes elementos de xs e ys.

338

Temas de programacin funcional (201011)

Bibliografa
[1] Richard Bird: Introduccin a la programacin funcional con Haskell. (Prentice Hall, 2000). [2] Antony Davie: An Introduction to Functional Programming Systems Using Haskell. (Cambridge University Press, 1992). [3] Paul Hudak: The Haskell School of Expression: Learning Functional Programming through Multimedia. (Cambridge University Press, 2000). [4] Graham Hutton: Programming in Haskell. (Cambridge University Press, 2007). [5] Bryan OSullivan, Don Stewart y John Goerzen: Real World Haskell. (OReilly, 2008). [6] F. Rabhi y G. Lapalme Algorithms: A functional programming approach (Addison Wesley, 1999). [7] Blas C. Ruiz, Francisco Gutirrez, Pablo Guerrero y Jos E. Gallardo: Razonando con Haskell. (Thompson, 2004). [8] Simon Thompson: Haskell: The Craft of Functional Programming, Second Edition. (Addison-Wesley, 1999).

339

S-ar putea să vă placă și