Está en la página 1de 15

R AZONANDO CON H ASKELL

U N CURSO SOBRE
F UNCIONAL
P ROGRAMACI ON

A Charo, Pepa, Ana y Chari

INTERNATIONAL THOMSON EDITORES SPAIN PARANINFO

hola


Blas Carlos Ruiz Jimenez,

Francisco Gutierrez
Lopez
y
Jose Enrique Gallardo Ruiz
Profesores del Departamento de Lenguajes y
Ciencias de la Computacion

Pablo Guerrero Garca


Profesor del Departamento de Matematica Aplicada

E.T.S.I. Informatica. Universidad de Malaga

R AZONANDO CON H ASKELL


U N CURSO SOBRE
F UNCIONAL
P ROGRAMACI ON

Malaga, enero de 2004

c Blas C. Ruiz, Francisco Gutierrez,

Pablo Guerrero y Jose E. Gallardo


c ITES-Paraninfo

Edita:
Imprime:
ISBN: ...
Deposito Legal: ...
Composicion: Realizada por los autores en LATEX2.

INDICE GENERAL

Indice
de figuras

XIII

Prologo

XVII

Convenios

XXIII

Programacion funcional basica con H ASKELL 98

1. Programacion funcional
1.1. Funciones . . . . . . . . . . . . . . . . . . . . .
1.2. Sesiones y declaraciones . . . . . . . . . . . . . .
1.3. Reduccion de expresiones . . . . . . . . . . . . .

1.3.1. Ordenes
de reduccion aplicativo y normal
1.3.2. Evaluacion perezosa . . . . . . . . . . .
1.4. Sobre H ASKELL . . . . . . . . . . . . . . . . . .
2. Introduccion a H ASKELL
2.1. El lenguaje H ASKELL . . . . . . . . . .
2.2. Tipos simples predefinidos . . . . . . .
2.2.1. El tipo Bool . . . . . . . . . .
2.2.2. El tipo Int . . . . . . . . . . .
2.2.3. El tipo Integer . . . . . . . . .
2.2.4. El tipo Float . . . . . . . . . .
2.2.5. El tipo Double . . . . . . . . .
2.2.6. El tipo Char . . . . . . . . . .
2.2.7. Operadores de igualdad y orden
2.3. Constructores de tipos predefinidos . . .
2.3.1. Tuplas . . . . . . . . . . . . .
2.3.2. Listas . . . . . . . . . . . . . .
2.3.3. El constructor de tipo () . . .
2.4. Comentarios . . . . . . . . . . . . . . .
2.5. Operadores . . . . . . . . . . . . . . . .
2.5.1. Operadores frente a funciones .
2.6. Comparacion de patrones . . . . . . . .
2.6.1. Patrones constantes . . . . . . .

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

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

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

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

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

1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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

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

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

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

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

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

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

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

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

.
.
.
.
.
.

3
3
4
6
9
9
11

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

13
13
15
15
16
16
17
18
18
19
20
20
21
22
24
24
27
28
29

Indice general

VI

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

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

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

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

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

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

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

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

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

32
33
34
35
36
36
37
38
38
39
40
41
42
43
45
46

3. Funciones de orden superior y polimorfismo


3.1. Parcializacion . . . . . . . . . . . . . . . . . . . . . .
3.1.1. Aplicacion parcial . . . . . . . . . . . . . . .
3.1.2. Secciones . . . . . . . . . . . . . . . . . . . .
3.1.3. Funciones de orden superior . . . . . . . . . .
3.1.4. Una funcion de orden superior sobre naturales
3.2. Polimorfismo . . . . . . . . . . . . . . . . . . . . . . .
3.2.1. La composicion de funciones . . . . . . . . .
3.2.2. Otras funciones polimorficas . . . . . . . . . .
3.2.3. Polimorfismo en listas . . . . . . . . . . . . .
3.2.4. Polimorfismo en tuplas . . . . . . . . . . . . .
3.2.5. Un iterador polimorfico sobre los naturales . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

49
49
51
54
56
58
60
62
65
67
69
70

4. Definicion de tipos
4.1. Sinonimos de tipo . . . . . . . . . . . . . . . .
4.2. Definicion de tipos de datos . . . . . . . . . . .
4.2.1. Tipos enumerados . . . . . . . . . . .
4.2.2. Uniones . . . . . . . . . . . . . . . . .
4.2.3. Productos . . . . . . . . . . . . . . . .
4.2.4. Tipos recursivos . . . . . . . . . . . .
4.2.5. Tipos parametrizados (o polimorficos) .
4.2.6. Definiciones newtype . . . . . . . . .
4.3. Propiedades de funciones . . . . . . . . . . . .
4.3.1. La propiedad universal de foldNat . .
4.4. Sobrecarga y polimorfismo restringido . . . . .
4.4.1. Un ejemplo de sobrecarga . . . . . . .
4.5. Ejercicios . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

71
. 71
. 72
. 72
. 73
. 74
. 78
. 87
. 89
. 90
. 97
. 99
. 101
. 103

2.7.
2.8.
2.9.
2.10.
2.11.
2.12.
2.13.
2.14.
2.15.

2.6.2. Patrones para listas . . . . . . . . .


2.6.3. Patrones para tuplas . . . . . . . .
2.6.4. Patrones aritmeticos . . . . . . . .
2.6.5. Patrones nombrados o seudonimos
2.6.6. El patron subrayado . . . . . . . .
2.6.7. Errores comunes . . . . . . . . . .
2.6.8. Patrones y evaluacion perezosa . .
Expresiones case . . . . . . . . . . . . . .
La funcion error . . . . . . . . . . . . . . .
Funciones a trozos . . . . . . . . . . . . . .
Expresiones condicionales . . . . . . . . . .
Definiciones locales . . . . . . . . . . . . .
Expresiones lambda . . . . . . . . . . . . .
Sangrado . . . . . . . . . . . . . . . . . . .

Ambitos
y modulos . . . . . . . . . . . . .
Ejercicios . . . . . . . . . . . . . . . . . .

c ITES-Paraninfo

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

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

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

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

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

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

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

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

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

Indice general

VII

5. El sistema de clases de H ASKELL


5.1. Tipos y clases de tipos. Jerarqua de clases . . . . . . . . .
5.1.1. El sistema de clases . . . . . . . . . . . . . . . .
5.1.2. Declaracion de clase . . . . . . . . . . . . . . . .
5.1.3. La clase Eqde P RELUDE . . . . . . . . . . . . . .
5.2. Contextos . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1. Instancias parametricas . . . . . . . . . . . . . .
5.3. Subclases. La clase Ord de P RELUDE . . . . . . . . . . .
5.3.1. Un ejemplo: los enteros modulo n . . . . . . . . .
5.3.2. Interseccion de clases . . . . . . . . . . . . . . .
5.4. Visualizando y leyendo datos. Read y Show . . . . . . . .
5.5. Las clases Num, Integral y Fractional de P RELUDE . . .
5.5.1. Los tipos numericos de H ASKELL . . . . . . . .
5.5.2. Ambiguedad en las constantes numericas . . . . .
5.5.3. Promocion numerica . . . . . . . . . . . . . . . .
5.5.4. Ejemplo: los racionales como instancias genericas
5.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

105
105
105
109
111
112
115
115
118
118
119
122
123
125
126
128
129

6. Programacion con listas


6.1. El tipo lista . . . . . . . . . . . . . . . . . . . . .
6.1.1. Secuencias aritmeticas. La clase Enum .
6.2. Concatenacion de listas . . . . . . . . . . . . . .
6.3. Induccion sobre listas . . . . . . . . . . . . . . .
6.4. Selectores . . . . . . . . . . . . . . . . . . . . .
6.5. Emparejando listas . . . . . . . . . . . . . . . . .
6.6. Aplicando una funcion a los elementos de una lista
6.7. Filtros . . . . . . . . . . . . . . . . . . . . . . .
6.8. Listas por comprension . . . . . . . . . . . . . .
6.8.1. Semantica de listas por comprension . .
6.9. Plegado de listas . . . . . . . . . . . . . . . . . .
6.9.1. foldr . . . . . . . . . . . . . . . . . . .
6.9.2. La propiedad universal de foldr . . . . .
6.9.3. foldl . . . . . . . . . . . . . . . . . . .
6.10. Ordenacion de listas . . . . . . . . . . . . . . . .
6.10.1. Ordenacion por insercion . . . . . . . .
6.10.2. Ordenacion por mezcla . . . . . . . . . .
6.10.3. Ordenacion rapida . . . . . . . . . . . .
6.11. Problemas combinatorios . . . . . . . . . . . . .
6.11.1. Los segmentos iniciales de una lista . . .
6.11.2. Los segmentos consecutivos de una lista
6.11.3. Permutaciones de una lista . . . . . . . .
6.12. Otras funciones predefinidas . . . . . . . . . . . .
6.13. Ejercicios . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

131
131
132
134
136
137
140
141
142
144
147
148
148
151
153
154
155
156
158
159
159
160
161
162
164

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

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

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

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

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

c ITES-Paraninfo

Indice general

VIII

7. Entrada y salida
7.1. Operaciones de entrada y salida . . . . . . . . . .
7.1.1. El problema de la entrada y salida . . . .
7.1.2. El tipo IO . . . . . . . . . . . . . . . .
7.1.3. Excepciones . . . . . . . . . . . . . . .
7.2. Un formateador de textos . . . . . . . . . . . . .
7.2.1. Una implementacion ineficiente . . . . .
7.2.2. Una implementacion eficiente . . . . . .
7.2.3. Utilidades para el manejo de documentos
7.2.4. Una clase de tipos documentables . . . .
7.2.5. Ejemplos . . . . . . . . . . . . . . . . .

II

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

Programacion avanzada

8. Evaluacion perezosa. Redes de procesos


8.1. Evaluacion perezosa . . . . . . . . . . . . . . . . . . . . .
8.1.1. Argumentos estrictos . . . . . . . . . . . . . . . .
8.1.2. Procesando estructuras infinitas en forma perezosa
8.2. Listas parciales y listas infinitas . . . . . . . . . . . . . . .
8.2.1. Aproximaciones o listas parciales . . . . . . . . .
8.2.2. Induccion sobre listas parciales . . . . . . . . . .
8.3. Redes finitas de procesos . . . . . . . . . . . . . . . . . .
8.3.1. La criba de Eratostenes . . . . . . . . . . . . . .
8.3.2. El triangulo de Pascal . . . . . . . . . . . . . . .
8.3.3. Procesos con varias entradas . . . . . . . . . . . .
8.3.4. La lista de factoriales . . . . . . . . . . . . . . . .
8.3.5. Los numeros de Fibonacci . . . . . . . . . . . . .
8.3.6. Sucesiones genericas . . . . . . . . . . . . . . . .
8.3.7. Los numeros de Hamming . . . . . . . . . . . . .
8.4. Sucesiones contadoras . . . . . . . . . . . . . . . . . . . .
8.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . .

169
169
169
170
172
174
175
177
179
179
180

183
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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

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

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

185
185
185
186
189
189
190
191
193
195
196
196
198
199
202
203
207

9. Programacion con a rboles y grafos

9.1. Arboles
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1.1. Funciones de orden superior sobre a rboles . . . . . . .

9.2. Arboles
binarios . . . . . . . . . . . . . . . . . . . . . . . . . .

9.2.1. Arboles
binarios de busqueda . . . . . . . . . . . . . .
9.2.2. Funciones de orden superior para a rboles binarios . . .
9.2.3. Induccion para a rboles binarios . . . . . . . . . . . . .
9.3. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3.1. Una implementacion ineficiente . . . . . . . . . . . . .
9.3.2. Una implementacion eficiente . . . . . . . . . . . . . .
9.4. Grafos y busqueda en grafos . . . . . . . . . . . . . . . . . . . .
9.4.1. Busqueda en anchura y en profundidad . . . . . . . . .
9.4.2. Los grafos como instancias de una clase uniparametrica

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

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

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

211
211
213
215
215
219
220
222
222
224
226
227
229

c ITES-Paraninfo

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

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

Indice general
9.5.

9.6.

IX

Grafos con pesos . . . . . . . . . . . . . . . . . . . . . . . . . . .


9.5.1. Grafos con pesos como instancias de clases biparametricas
9.5.2. Una clase H ASKELL para grafos con pesos . . . . . . . .
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.

.
.
.
.

232
232
234
236

10. Programacion modular y tipos abstractos de datos


10.1. Modulos . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2. Bibliotecas estandarizadas . . . . . . . . . . . . . . . . .
10.3. Declaraciones de modulos . . . . . . . . . . . . . . . . .
10.4. Importacion . . . . . . . . . . . . . . . . . . . . . . . .
10.4.1. Importacion cualificada . . . . . . . . . . . . .
10.5. Tipos abstractos de datos . . . . . . . . . . . . . . . . .
10.6. Representacion . . . . . . . . . . . . . . . . . . . . . . .
10.6.1. Representacion con una interfaz no sobrecargada
10.6.2. Representacion con una interfaz sobrecargada . .
10.7. El TAD Conjunto (Conjunto) . . . . . . . . . . . . . . .
10.8. El TAD Lista Ordenada (OrdLista) . . . . . . . . . . . .
10.9. El TAD Diccionario (Diccionario) . . . . . . . . . . . .
10.10. Un ndice KWIC (KeyWord In Context) . . . . . . . . .
10.10.1. Datos del problema . . . . . . . . . . . . . . . .
10.10.2. La funcion kwic . . . . . . . . . . . . . . . . .
10.10.3. Algunas funciones y sinonimos de tipos u tiles .
10.10.4. La funcion creaNoClaves . . . . . . . . . . . .
10.10.5. Modelo de datos para la resolucion . . . . . . .
10.10.6. La funcion kwic 0 . . . . . . . . . . . . . . . . .
10.11. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

243
243
243
243
245
246
247
247
247
249
253
254
255
257
258
259
259
261
261
262
264

11. Programacion con monadas


11.1. Concepto de monada . . . . . . . . . . . . . . . .
11.2. Clases de constructores de tipos . . . . . . . . . .
11.2.1. La clase Functor . . . . . . . . . . . . .
11.2.2. La clase Monad . . . . . . . . . . . . .
11.2.3. La clase MonadPlus . . . . . . . . . . .
11.3. Interpretacion de las propiedades . . . . . . . . .
11.3.1. Interpretacion del operador (>>=) . . .
11.4. Relacion entre funtor y monada . . . . . . . . . .
11.5. La notacion do . . . . . . . . . . . . . . . . . . .
11.6. Ejemplos de monadas . . . . . . . . . . . . . . .
11.6.1. La monada identidad . . . . . . . . . . .
11.6.2. La monada escritora . . . . . . . . . . .
11.6.3. La monada lectora . . . . . . . . . . . .
11.6.4. La monada de transformadores de estado
11.6.5. La lista como monada indeterminista . .
11.6.6. La monada error . . . . . . . . . . . . .
11.7. Operaciones con monadas . . . . . . . . . . . . .
11.7.1. Combinando monadas . . . . . . . . . .

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

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

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

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

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

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

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

265
265
266
266
269
272
273
276
277
280
283
283
284
286
288
291
292
296
297

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

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

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

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

c ITES-Paraninfo

Indice general

11.7.2. Transformadores monadicos . . . . . . . . . . . . . . . . . . 298


11.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

III

Aplicaciones

303

12. Algoritmos numericos programados funcionalmente


12.1. Introduccion . . . . . . . . . . . . . . . . . . .
12.2. Busqueda de puntos fijos . . . . . . . . . . . .
12.3. Extrapolacion por paso al lmite . . . . . . . . .

12.4. Algebra
lineal numerica . . . . . . . . . . . . .
12.5. Series de potencias . . . . . . . . . . . . . . . .
12.6. Ejercicios . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

305
305
305
308
312
314
316

13. Puzzles y solitarios


13.1. Algunos problemas combinatorios . . . . . . . . . . . .
13.1.1. El producto maximo con un conjunto de dgitos .
13.1.2. El problema de las vasijas . . . . . . . . . . . .
13.1.3. El problema de los canbales y los misioneros . .
13.1.4. El solitario de Abreu . . . . . . . . . . . . . . .
13.2. La sopa de letras . . . . . . . . . . . . . . . . . . . . . .
13.2.1. Un esbozo de la solucion . . . . . . . . . . . . .
13.2.2. Buscando las apariciones de una palabra . . . .
13.2.3. Movimiento de matrices y lecturas de lneas . .
13.3. El problema de las ocho reinas . . . . . . . . . . . . . .
13.3.1. Soluciones mediante listas por comprension . .
13.3.2. Solucion mediante busqueda en grafos . . . . .
13.3.3. Grafos acclicos . . . . . . . . . . . . . . . . .
13.4. Programacion funcional estilo P ROLOG . . . . . . . . . .
13.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

319
319
319
320
322
324
327
327
329
330
333
333
336
338
339
342

14. Analizadores
14.1. Analizadores y la clase Read . . . . .
14.1.1. Gramaticas y la notacion BNF
14.1.2. El tipo Read . . . . . . . . .
14.1.3. La clase Read . . . . . . . .
14.2. Analizadores monadicos . . . . . . . .
14.2.1. Secuenciacion . . . . . . . .
14.2.2. Alternancia . . . . . . . . . .
14.2.3. Filtros . . . . . . . . . . . .
14.2.4. Iteracion . . . . . . . . . . .
14.2.5. Eleccion parcial . . . . . . .
14.2.6. Un analizador para terminos .
14.3. Ejercicios . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

345
345
346
347
356
357
358
359
360
361
362
363
366

c ITES-Paraninfo

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

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

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

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

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

.
.
.
.
.
.

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

.
.
.
.
.
.

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

.
.
.
.
.
.

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

.
.
.
.
.
.

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

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

Indice general

XI

15. Simulacion
15.1. Generacion de aleatorios por congruencias . . . . . . . . .
15.1.1. Programando secuencias pseudo-aleatorias . . . .
15.1.2. Algunos resultados teoricos . . . . . . . . . . . .
15.2. Simulacion en el juego del poquer . . . . . . . . . . . . . .
15.2.1. Generando un mazo de cartas . . . . . . . . . . .
15.2.2. Busqueda de ciertas jugadas: parejas, tros, etc. . .
15.2.3. Contando todas las jugadas . . . . . . . . . . . .
15.3. Obteniendo semillas y aleatorios a traves del sistema . . . .
15.3.1. Un modelo monadico para la simulacion . . . . .
15.4. El juego de la lotera primitiva . . . . . . . . . . . . . . . .
15.4.1. Realizando escrutinios . . . . . . . . . . . . . . .
15.4.2. Generacion de sorteos . . . . . . . . . . . . . . .
15.4.3. Estudio estadstico de ciertas combinaciones . . .
15.4.4. Descripcion monadica del juego de la primitiva . .
15.5. Simulacion monadica de juegos con dados . . . . . . . . .
15.5.1. Mezclando valores producidos por varias acciones
15.5.2. Plegando valores monadicos . . . . . . . . . . . .
15.5.3. Repeticion de varias tiradas con varios dados . . .
15.5.4. Contabilizando jugadas . . . . . . . . . . . . . .

IV

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

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

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

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

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

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

Aspectos teoricos

369
369
370
373
374
374
375
376
379
380
383
383
384
385
387
388
389
389
391
392

395

16. Tecnicas de programacion y transformaciones de programas


16.1. Induccion estructural . . . . . . . . . . . . . . . . . . . . . . . .
16.2. Parametros acumuladores . . . . . . . . . . . . . . . . . . . . . .
16.2.1. Los numeros de Fibonacci . . . . . . . . . . . . . . . . .
16.2.2. Calculo del factorial de un natural . . . . . . . . . . . . .
16.2.3. Plegados estrictos . . . . . . . . . . . . . . . . . . . . .
16.3. Transformacion de programas. El modelo desplegar/plegar . . . .
16.3.1. Un ejemplo sencillo de transformacion . . . . . . . . . .
16.3.2. Las reglas desplegar/plegar . . . . . . . . . . . . . . . .
16.3.3. Reduccion de la complejidad por transformacion . . . . .
16.3.4. Correccion parcial de los programas transformados . . . .
16.4. Programas a partir de especificaciones . . . . . . . . . . . . . . .
16.4.1. Especificaciones ejecutables . . . . . . . . . . . . . . . .
16.4.2. Especificaciones no ejecutables . . . . . . . . . . . . . .
16.4.3. Transformacion de una especificacion no ejecutable . . .
16.5. Semantica denotacional de un lenguaje imperativo . . . . . . . . .
16.5.1. Representacion de entornos con tuplas . . . . . . . . . .
16.5.2. Representacion de entornos con funciones . . . . . . . .
16.5.3. El lenguaje imperativo de Dijkstra . . . . . . . . . . . . .
16.5.4. Una semantica determinista para el lenguaje de Dijkstra .
16.5.5. Una semantica indeterminista para el lenguaje de Dijkstra
16.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

397
397
405
405
410
414
417
417
418
420
425
425
426
426
427
430
432
434
437
439
441
443

c ITES-Paraninfo

XII

Indice general

17. Introduccion al -calculo


17.1. Sintaxis del lambda calculo . . . . . . . . . . . . . . . . . . . . .
17.2. -reduccion y -reduccion . . . . . . . . . . . . . . . . . . . . . .
17.2.1. -teoras . . . . . . . . . . . . . . . . . . . . . . . . . .
17.2.2. Eta-conversion y extensionalidad . . . . . . . . . . . . .
17.2.3. Reduccion generada por un programa . . . . . . . . . . .
17.3. Formas normales. Teoremas de Church-Rosser . . . . . . . . . . .

17.4. Ordenes
de reduccion. Teorema de estandarizacion . . . . . . . . .
17.5. Lambda definibilidad . . . . . . . . . . . . . . . . . . . . . . . .
17.5.1. Operaciones logicas . . . . . . . . . . . . . . . . . . . .
17.5.2. Computabilidad . . . . . . . . . . . . . . . . . . . . . .
17.5.3. Puntos fijos y recursion . . . . . . . . . . . . . . . . . .
17.5.4. Listas en el C . . . . . . . . . . . . . . . . . . . . . . .
17.6. Los sistemas de tipos de Church y de Curry . . . . . . . . . . . . .
17.6.1. Propiedades del sistema Curry . . . . . . . . . . . . .
17.6.2. La correspondencia de Howard-Curry-de Bruijn . . . . .
17.7. Ejemplos practicos de inferencia de tipos . . . . . . . . . . . . . .
17.7.1. Caso de un u nico argumento . . . . . . . . . . . . . . . .
17.7.2. Caso de varios argumentos . . . . . . . . . . . . . . . . .
17.7.3. Caso en que aparecen otras variables predefinidas . . . .
17.8. Inferencia de tipos en presencia de recursion . . . . . . . . . . . .
17.9. Inferencia de tipos en presencia de patrones . . . . . . . . . . . .
17.10. Reglas elementales para inferencia de tipos . . . . . . . . . . . . .
17.11. El -calculo polimorfico . . . . . . . . . . . . . . . . . . . . . . .
17.11.1. Inferencia de tipos en presencia de polimorfismo . . . . .
17.11.2. Un teorema de parametricidad para funciones polimorficas

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

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

451
451
453
457
459
460
461
465
468
469
469
471
473
474
475
478
478
479
480
482
484
487
490
492
494
496

Bibliografa

499

Indice
alfabetico

503

c ITES-Paraninfo

INDICE DE FIGURAS

1.1.
1.2.

Representacion perezosa de la funcion doble . . . . . . . . . . . . . .


Reduccion perezosa de doble (doble 3) . . . . . . . . . . . . . . . . .

10
10

2.1.
2.2.
2.3.

Asociatividad y prioridad de los operadores predefinidos . . . . . . . .


Sangrando una declaracion . . . . . . . . . . . . . . . . . . . . . . .
Sangrando dos declaraciones . . . . . . . . . . . . . . . . . . . . . .

26
44
44

3.1.
3.2.
3.3.
3.4.

Aplicaciones parciales . . . .
La funcion unaVez . . . . .
La funcion dosVeces . . . .
La composicion de funciones

.
.
.
.

52
61
62
63

4.1.

Calculo de esPar usando foldNat

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

86

5.1.
5.2.
5.3.

Jerarqua de clases de P RELUDE . . . . . . . . . . . . . . . . . . . . 108


Instancias H ASKELL estandarizadas para los tipos de P RELUDE . . . . 109
La clase Ord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.

La clase Enum . . . . . . . . . . . . . . .
head , tail , init y last . . . . . . . . . . . .
take, drop y (!!) . . . . . . . . . . . . . . .
Reduccion de foldr f z [x1 , . . . , xn1 , xn ]
Reduccion de foldr 1 f [x1 , . . . , xn1 , xn ] .
Reduccion de foldl f z [x1 , . . . , xn1 , xn ] .
Ordenacion por mezcla . . . . . . . . . . .
Ordenacion rapida . . . . . . . . . . . . . .

7.1.
7.2.

Dialogos con pretty printer . . . . . . . . . . . . . . . . . . . . . . . 181


Dialogos con pretty printer . . . . . . . . . . . . . . . . . . . . . . . 181

8.1.
8.2.
8.3.
8.4.
8.5.
8.6.
8.7.

La funcion incr . . . . . . . . . . . . . . . . . .
Red para la evaluacion de los enteros positivos . .
Red de procesos para sucesiones . . . . . . . . .
Red de procesos para la criba de Eratostenes . . .
Red para el triangulo de Pascal . . . . . . . . . .
Red de procesos para la lista de factoriales . . . .
Red para el computo de los numeros de Fibonacci

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

132
138
139
150
151
153
157
158

192
192
193
195
196
197
199

Indice de figuras

XIV

8.8. Red para el calculo de la sucesion xn . . . . . . . . . . . . . . . . . . 201


8.9. Red para el computo de los numeros de Hamming . . . . . . . . . . . 202
8.10. Red de procesos para los pares de naturales . . . . . . . . . . . . . . . 208
9.1.
9.2.
9.3.
9.4.
9.5.
9.6.
9.7.
9.8.
9.9.
9.10.
9.11.

Un a rbol con 7 elementos . . .


Un a rbol ordenado . . . . . . .
Eliminacion de un dato . . . .

Arbol
para creaArray [0..7] . .
Un grafo . . . . . . . . . . . .
Otro grafo . . . . . . . . . . .

Arbol
de visitas en profundidad

Arbol de visitas en anchura . .


Un grafo sencillo . . . . . . . .
Un grafo con pesos . . . . . .
Un diccionario . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

211
216
217
225
227
227
228
228
231
235
238

10.1. Cabecera del modulo Conjunto . . . . . . . . . . . . . . . . . . . . . 253


11.1. Definicion de (>>=) . . . . . . . . . . . . .
11.2. Propiedad (m1) . . . . . . . . . . . . . . . .
11.3. Propiedad (m2) . . . . . . . . . . . . . . . .
11.4. Propiedad (k1) . . . . . . . . . . . . . . . . .
11.5. Propiedad (k2) . . . . . . . . . . . . . . . . .
11.6. Propiedad (k3). Primera funcion . . . . . . .
11.7. Propiedad (k3). Segunda funcion . . . . . . .
11.8. Computos con (>>=) . . . . . . . . . . . . .
11.9. Computos con (>>=) graficamente . . . . .
11.10. Definicion de fmap a traves de una monada .
11.11. Definicion de join a partir de una monada . .
11.12. Definicion de (>>=) a partir de join y fmap
11.13. El operador (>>=) de la monada Lectora . .
11.14. Un transformador de estados . . . . . . . . .
11.15. (>>=) para transformadores de estados . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

266
273
273
274
274
275
276
277
277
278
278
279
287
289
289

12.1. Calculo de la raz n-esima por el metodo de Newton-Raphson . . . . . 307


12.2. Traspuesta de una matriz . . . . . . . . . . . . . . . . . . . . . . . . 313
13.1. El problema de las vasijas . . . . . . . . . . . . . . . . . . . . .
13.2. El problema de los canbales y misioneros . . . . . . . . . . . .
13.3. Tablero de cuatro filas para el solitario de Abreu. Un movimiento
13.4. Posicion inicial y final del ocho-puzzle. Un movimiento . . . . .
13.5. Direcciones en la lectura . . . . . . . . . . . . . . . . . . . . . .
13.6. Reconstruccion de las diagonales . . . . . . . . . . . . . . . . .
13.7. noAtaca 2 [5, 1, 4] = True . . . . . . . . . . . . . . . . . . .
13.8. noAtaca 3 [5, 1, 4] = False . . . . . . . . . . . . . . . . . . .
13.9. Dos reinas que se atacan . . . . . . . . . . . . . . . . . . . . . .
13.10. El problema de las ocho reinas . . . . . . . . . . . . . . . . . .
c ITES-Paraninfo

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

321
323
325
326
331
332
334
334
335
337

Indice de figuras
13.11. Las torres de Hanoi . . . . . . . . . . . . . . . . .
13.12. El problema de las Torres de Hanoi con cuatro torres
13.13. El tablero del solitario . . . . . . . . . . . . . . . .
13.14. Un cuadrado magico . . . . . . . . . . . . . . . . .
13.15. El problema de los tres sombreros . . . . . . . . . .
13.16. Los cuatro caballos . . . . . . . . . . . . . . . . .
13.17. El problema de los trenes . . . . . . . . . . . . . .
13.18. Un polgono . . . . . . . . . . . . . . . . . . . . .
13.19. La va . . . . . . . . . . . . . . . . . . . . . . . .

XV

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

338
339
339
340
340
342
343
343
343

17.1. Algunos terminos notables . . . . . . . . . . . . . . . . . . . . . . . 468


17.2. El sistema de tipos de Curry . . . . . . . . . . . . . . . . . . . . . . . 475
17.3. El -calculo polimorfico . . . . . . . . . . . . . . . . . . . . . . . . . 493

c ITES-Paraninfo