Documente Academic
Documente Profesional
Documente Cultură
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
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
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 . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
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
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 . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
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
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
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
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
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:
import estFuikghek
Refutacin de propiedades Propiedad: El producto de dos nmeros cualequiera es distinto de su suma. Expresin de la propiedad:
13
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
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
1.3.
15
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:
16
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 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.
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
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
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>
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
21
reludeb PQR PRIUVSITQWPPWPSVQRWRIPQSP reludeb P@QRA PRIUVSITQWPPWPSVQRWRIPQSP reludeb PEQER ES reludeb @PEQAER ES
2.2.3.
Clculo con listas: Seleccionar y eliminar Seleccionar el primer elemento de una lista no vaca:
hed IDPDQDRDS ;
til IDPDQDRDS ;
PDQDRDS
IDPDQDRDS 33 P ;
tke Q IDPDQDRDS ;
IDPDQ
drop Q IDPDQDRDS ;
RDS
22
length IDPDQDRDS ;
sum IDPDQDRDS ;
IS
produt IDPDQDRDS ;
Concatenar dos listas:
IPH
IDPDQ CC RDS ;
Invertir una lista:
IDPDQDRDS
reverse IDPDQDRDS ;
SDRDQDPDI
2.2.4.
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
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.
Iniciar emacs y abrir dos ventanas: gEx P En la primera ventana ejecutar Haskell: wEx runEhskell Cambiar a la otra ventana: gEx o
24
Iniciar el guin: gEx gEf ejemploFhs Escribir en el guin las siguientes deniciones
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
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.
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:
26
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.
3.1.
Qu es un tipo?
28
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 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:
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.
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
30
3.3.
3.3.1.
Tipos compuestos
Tipos listas
Una lista es una sucesin de elementos del mismo tipo.
99D99D99 XX ghr
3.3.2.
Tipos tuplas
31
No estn permitidas las tuplas de longitud 1. Comentarios: El tipo de una tupla informa sobre su longitud:
@@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:
32
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.
33
Bwinb @sum9 PA Q S
Pueden denirse funciones usando aplicaciones parciales. Por ejemplo,
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:
34
es una variable de tipos. Las variables de tipos tienen que empezar por minscula. Ejemplos:
R Q P
fst XX @D A Eb fst @ID9x9A ; fst @rueD4roy4A ; hed XX Eb hed PDIDR ; hed 99D99 ; P 99 I rue
@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:
35
; ;
IH IHFTUS
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
plse aa rue plse Ga rue 99 aa 99 4ei4 aa 4ei4 PDQ aa PDQDP @99DSA aa @99DSA
; ; ; ; ; ;
plse ` rue min 99 99 4elegnte4 ` 4elefnte4 IDPDQ ` IDP @99DPA ` @99DIA @99DPA ` @99DIA
; ; ; ; ; ;
37
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:
; ; ; ; ;
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:
4plse4 XX fool 4994 XX ghr 4IPQ4 XX snt 4IDPDQ4 XX snt 4@99DrueA4 XX @ghrDfoolA
; ; ; ; ;
38
; ; ; ; ;
S TFS EPFU S EI
div XX Eb Eb mod XX Eb Eb
Instancias: snt e snteger. Ejemplos:
II div R ; II mod R ;
P Q
@GA XX Eb Eb reip XX Eb
Instancias: plot y houle.
39
Ejemplos:
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
4.1.
relude
42
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.
4.3.
4.4.
4.4.1.
43
relude
XX 88 88 88 88
relude
4.4.2.
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.
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
4.4.4.
@testI xsA se verica si xs es una lista de 3 caracteres que empieza por 99.
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:
relude
relude
relude
4.4.5.
Patrones enteros
pred XX snt Eb snt pred H a H pred @nCIA a n relude
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:
46
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:
@BA
a x Eb @y Eb xByA
47
a a a a a
relude
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
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:
49
50
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
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,
IDPDT
51
5.2.
Guardas
Las listas por comprensin pueden tener guardas para restringir los valores. Ejemplo de guarda:
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
@4tun4DUAD@4en4DWAD@4iv4DQA @us tA es la lista de los valores de la lista de asociacin t cuyas claves valen . Por ejemplo,
52
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
@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
53
@posiiones x xsA es la lista de las posiciones ocupadas por el elemento x en la lista xs. Por ejemplo, posiiones S IDSDQDSDSDU
;
IDQDR
5.4.
Comprensin de cadenas
44 XX tring
es equivalente a
99D99D99 XX ghr
Las funciones sobre listas se aplican a las cadenas:
; ; ; ;
@minusuls A es la cadena formada por las letras minsculas de la cadena . Por ejemplo, minusuls 4istoisnrue4 ; 4stosnrue4
54
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
;
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
55
5.5.1.
Codicacin y descodicacin
@ord A es el cdigo del carcter . Por ejemplo, ord 99 ord 99 ord 9e9
; ; ;
WU WV 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
@intPlet nA es la letra minscula correspondiente al entero n. Por ejemplo, intPlet H intPlet Q intPlet PS
; ; ;
99 9d9 9z9
56
@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
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.
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
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
IQFTVD HFTWD IFHID RFWUD QFISD TFUID UFWVD RFTQD QFWQD HFSP
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
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
@rot n xsA es la lista obtenida rotando n posiciones los elementos de la lista xs. Por ejemplo, rot P 4mnolo4 ; 4nolom4
Bwinb odifi S 4odo pr nd4 4tit ufwf sfif4 Bwinb desifr 4tit ufwf sfif4 4odo pr nd4
59
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
6.1.
Recursin numrica
La funcin factorial:
ftoril Q a a a a a a a
Q Q Q Q Q Q T
B B B B B B
61
62
Q por P a a a a a
Q Q Q Q T
C C C C
6.2.
relude
produt UDSDP a a a a a a a
U B U B U B U B U B U B UH
63
relude
length PDQDS a a a a a a a
I I I I I I Q
C C C C C C
relude
reverse PDSDQ a a a a a a a
Recursin sobre listas: CC
Concatenacin de listas:
relude
64
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
@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
@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
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.
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
relude
Clculo:
66
| | | |
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
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
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
| | | | |
a a a a
@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
6.6.
69
drop XX snt Eb Eb
Paso 2: Enumerar los casos:
70
init XX Eb
Paso 2: Enumerar los casos:
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.
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
7.1.
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
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
@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
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
relude
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
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:
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,
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.
a a a a a a a a
relude
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
78
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:
ustituiones
79
ustituiones
ustituiones
7.4.
sum XX snteger Eb snteger sum a sumeux H where sumeux v a v sumeux v @xXxsA a sumeux @vCxA xs
80
sum PDQDU a a a a a a a a
f v a v f v @xXxsA a f @vBxA xs
Denicin con el patrn foldl:
sum produt or nd
a a a a
7.5.
Composicin de funciones
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:
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
7.6.
82
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.
7.6.1.
Cambio de bases
@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
IDHDIDI
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.
7.6.2.
Codicacin y descodicacin
@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
@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
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
@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
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.
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.
87
88
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
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:
89
8.1.3.
EE inversFI EE inversFP
8.1.4.
Negacin lgica:
90
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]
8.2.
8.2.1.
bar:
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.
@replite n xA es la lista formda por n elementos iguales a x. Por ejemplo, replite Q S ; SDSDS
91
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:
8.3.
8.3.1.
Para demostrar que todas las listas nitas tienen una propiedad basta probar:
92
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:
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
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]
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.
Programas:
EE lengthFI EE lengthFP
94
EE CCFI EE CCFP
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]
8.3.5.
Programas:
95
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
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 =
96
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.
Programas:
Luego, null xs a null @xs CC xsA. Demostracin por induccin en xs: Caso xs a @yXysA: Reduciendo el lado izquierdo
97
null @xs CC xsA = null @@yXysA CC @yXysAA = null @yX@ys CC @yXysAA = plse
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:
98
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.
relude
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
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:
import estFuikghekFpuntion
Comprobacin
Bibliografa
1. H. C. Cunningham (2007) Notes on Functional Programming with Haskell.
100
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.
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
type os a @sntDsntA
origen es la posicin (0,0).
izquierd @QDSA ;
@PDSA
type r a @DA
@multipli pA es el producto del par de enteros p. Por ejemplo,
multipli @PDSA ;
IH
opi S
@SDSA
type os a @sntDsntA
Los movimientos son funciones que va de una posicin a otra.
103
type wovimiento a os Eb os
Las declaraciones de tipo no pueden ser recursivas. Por ejemplo, el siguiente cdigo es errneo.
9.2.
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:
; @PDTA
104
Uso en listas: @movimientos ms pA es la posicin obtenida aplicando la lista de movimientos ms a la posicin p. Por ejemplo,
@IDTA
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
Bwinb Xtype girulo girulo XX plot Eb pigur Bwinb Xtype et et XX plot Eb plot Eb pigur
105
re re re re
; ; ; ;
@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
106
9.3.
@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
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
Q G
S G G R T
U G
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
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
Deniciones de distintos tipos de rboles rboles binarios con valores en las hojas:
110
9.4.
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
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
@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
; ; ; ;
113
9.5.
dt ixpr a
@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
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
@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
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
@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
115
9.6.
Declaraciones de clases
relude
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
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:
relude
; ; ; ;
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:
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
10.1.
Estrategias de evaluacin
119
120
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
[por def. de +] [por def. de mult] [por def. de +] [por def. de +] [por def. de *]
10.2.
Terminacin
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:
10.3.
Nmero de reducciones
Nmero de reducciones segn las estrategias Para los ejemplos se considera la funcin
122
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
123
Evaluacin con estructuras innitas Evaluacin impaciente: head unos = head (1 : unos) = head (1 : (1 : unos)) = head (1 : (1 : (1 : unos))) = ...
Evaluacin perezosa: head unos = head (1 : unos) [por def. unos] = 1 [por def. head] Evaluacin Haskell:
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
10
11 11 11 11 11
12
13 13 13 13 13 13
14
Denicin
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
@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
@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]
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
127
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
11.1.
11.1.1.
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
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
@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
; ; ; ;
XX yp um es x wul hiv x
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
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
@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
@interl x ysA es la lista de las listas obtenidas intercalando x entre los elementos de ys. Por ejemplo,
133
; ;
4x4D4x4D4x4 4x4D4x4D4x4D4x4
@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
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.
@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
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
11.1.3.
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
137
@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
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.
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
XX yp um x es x wul x hiv x
@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
@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
139
@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
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
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 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:
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
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.
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
El anlisis sintctico forma parte del preprocesamiento en la mayora de las aplicaciones reales.
12.2.
12.3.
@nliz sA analiza la cadena s mediante el analizador . Por ejemplo, nliz XX enlizdor Eb tring Eb @DtringA nliz s a s
145
El analizador resultdo v siempre tiene xito, devuelve v y no consume nada. 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.
@@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
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.
@@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
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
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
; ; ; ;
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
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
150
12.6.
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
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
Eb n Eb Eb ns Eb Eb
12.7.
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
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
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)
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
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
; ; ; ;
154
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,
; ; ;
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
; ; ;
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
155
; ; ;
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
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
Ejemplo de programa interactivo Especicacin: El programa pide una cadena y dice el nmero de caracteres que tiene. Ejemplo de sesin:
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.
En Haskell se pueden escribir programas interactivos usando tipos que distingan las expresiones puras de las acciones impuras que tienen efectos laterales.
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.
159
13.4.
Secuenciacin
Una sucesin de acciones puede combinarse en una accin compuesta mediante expresiones do. Ejemplo:
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
160
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:
relude
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.
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:
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
13.6.2.
Calculadora aritmtica
getgh XX sy ghr getgh a do hetiho stdin plse `E getghr hetiho stdin rue return
Limpieza de la pantalla:
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
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.
164
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
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:
166
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:
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
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
; ; ; ; ; ; ;
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
; ; ; ;
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
; ;
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
nu PDQDPDS ;
PDQDS
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
14.1.
14.1.1.
Abstraccin y tipos abstractos de datos La abstraccin es un mecanismo para comprender problemas que involucran una gran cantidad de detalles. 171
172
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.
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:
XX XX XX XX XX
il Eb il il il
il Eb Eb Eb
Eb il il fool
Descripcin:
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 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.
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
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
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
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,
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.
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
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|
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,
177
14.4.
14.4.1.
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
14.4.3.
14.4.4.
omprueropieddes comprueba todas las propiedades con la plataforma de vericacin. omprueropieddes a defultwin
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
15.1.
15.1.1.
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
Analoga con las colas del cine. Signatura del TAD colas Signatura:
XX XX XX XX XX XX
gol Eb Eb Eb Eb
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 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
183
15.2.
15.2.1.
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
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
184
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.
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.
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
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
; ; ;
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
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,
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:
188
15.3.
15.3.1.
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
189
Correccin del generador de colas Propiedad: Todo los elementos generados por gengol son colas vlidas.
15.3.3.
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.
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
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.
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
191
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
16.1.
16.1.1.
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
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:
XX XX XX XX XX XX
ab ab ab ab ab ab
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.
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
195
16.2.
16.2.1.
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:
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
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
197
16.2.2.
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.
16.3.2.
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
16.3.3.
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.
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
199
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.
16.3.4.
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
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
17.1.
17.1.1.
Signatura:
202
pertenee esio
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.
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.
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
ghi b I {PDSDIDQDUDSDQDPDIDWDH} I XX gonj snt I a foldr insert vio PDSDIDQDUDSDQDPDIDWDH vio es el conjunto vaco. Por ejemplo, ghib vio {}
204
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,
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
17.2.2.
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
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
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
17.2.3.
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.
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.
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
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
@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 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
211
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
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
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}
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.
214
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.
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.
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.
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.
17.3.4.
216
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
18.1.
18.1.1.
218
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
; ; ; ;
@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
; ; ; ;
@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
219
18.1.2.
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.
@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
@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
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
@IDIAD@IDPAD@IDQAD@PDIAD@PDPAD@PDQA
IDPDQDPDRDT
@ssos tA es la lista de asociaciones de la tabla t. Por ejemplo, ghib ssos m @@IDIADIAD@@IDPADPAD@@IDQADQAD @@PDIADPAD@@PDPADRAD@@PDQADTA
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
@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.
Signatura:
223
18.2.2.
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.
newtype l i v a l @i Eb vA
Procedimiento de escritura.
224
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.
225
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
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.
ab ab ab ab
import htFerry
Las tablas como matrices.
227
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
@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
; ;
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
18.4.
18.4.1.
import lgonvistsheesoiion
Importacin de las libreras de comprobacin.
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.
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
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.
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
231
R H R
232
19.1.
19.1.1.
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
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:
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
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.
235
19.1.2.
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.
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
236
vlido A where
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
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
PDQDRDSDTDVDW PDQDRDSDTDUDVDWDIHDII
@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 .
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.
import erolfin
Importacin de libreras auxiliares.
19.3.2.
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
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
241
19.3.3.
242
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.
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.
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.
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
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
20.1.
20.1.1.
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
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:
XX XX XX XX XX XX
ab ab ab ab ab ab
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.
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
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.
module wontiulo @wontiuloD vioD EE insertD EE menorD EE restoD EE esioD EE vlido EE A where
Librera auxiliar:
ab ab ab ab ab ab
248
mID mPD mQ XX wontiulo snt mI a foldr insert vio TDIDRDV mP a foldr insert vio UDS mQ a mezl mI mP
Representacin:
mP G @UDIA @SDIA
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
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
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
IDRDVDT
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.
20.3.
20.3.1.
import wontiulo
Importacin de libreras auxiliares.
252
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.
253
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:
20.3.3.
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
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.
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
255
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.
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
256
Importacin cualicada:
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,
257
ghib insert g @w I P @w P P @w W @w U @w Q I @w S
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
21.1.
21.1.1.
259
260
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
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:
; ; ; ;
21.1.2.
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.
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
262
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
; ; ; ;
263
; ;
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
264
21.2.2.
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.
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
265
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
; ; ; ; ; ;
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
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.
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.
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
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
; ; ; ; ; ;
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
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
21.3.
21.3.1.
270
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.
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
271
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.
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
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.
273
@termvider pA es el trmino lder del polinomio p. Por ejemplo, ejolP ; termvider ejolP ; xS C SBxP C RBx xS
@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
274
@multorerm t pA es el producto del trmino t por el polinomio p. Por ejemplo, ejerm ejolP multorerm ejerm ejolP
; ; ;
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
275
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.
@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
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
@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.
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
22.1.
22.1.1.
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
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.
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
281
@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.
I | | | QR| | | | Q
282
22.1.3.
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
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
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
285
22.1.4.
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
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
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
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.
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
289
@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
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
291
22.2.2.
Recorrido en anchura
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.
292
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
293
La ordenacin topolgica es
22.4.
22.4.1.
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
I P I EEEEE P EEEEE Q
294
| 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}
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
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
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
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
299
300
23.1.
23.1.1.
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.
@ordenorwezl xsA es la lista obtenida ordenando xs por el procedimiento de ordenacin por mezcla. Por ejemplo, ghib ordenorwezl QDIDRDIDSDWDPDV IDIDPDQDRDSDVDW
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
23.1.3.
@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
23.2.
23.2.1.
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
303
23.2.2.
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:
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
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
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 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
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
307
@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
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.
308
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
309
@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.
@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
23.3.2.
@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
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
311
23.4.
23.4.1.
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 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.
312
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.
Ejemplo de grafo.
gI XX qrfo snt snt gI a reqrfo rue @IDSA @IDPDIPAD@IDQDQRAD@IDSDUVAD @PDRDSSAD@PDSDQPAD @QDRDTIAD@QDSDRRAD @RDSDWQA
313
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
prim g a sol where @DDDsolA a usisld @suesoreseiw gA espinleiw @HDnDnsDA @nXnsA a nodos g
315
316
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
317
| | CEEEEECaaa fi Q | | CEEEEECaaa fi R
24.1.2.
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.
Denicin de Fibonacci mediante programacin dinmica Importacin del patrn de programacin dinmica
import hinmi
318
@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
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
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
24.3.
24.3.1.
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.
import hinmi
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
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.
@pmhy dsA es la solucin del PCM correspondiente a ds mediante divide y vencers. Por ejemplo, pmhy QHDIDRHDIHDPS ; @IHRHD@eIB@@ePBeQABeRAAA
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
24.4.
24.4.1.
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
l =i
l=j
pl ) + (ck+1, j +
l = k +1 l=j l =i
pl ) + pk )
24.4.2.
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 .
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
@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.
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.
327
pi, j
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.
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
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.
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.
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
24.6.2.
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
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:
332
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
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
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
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.
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.
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
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