Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Grupo de Lgica Computacional Dpto. de Ciencias de la Computacin e Inteligencia Articial Universidad de Sevilla Sevilla, 8 de Agosto de 2007 (Versin de 20 de septiembre de 2007)
2 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. Factorial . . . . . . . . . . . . . . . . . . 1.2. Nmero de combinaciones . . . . . . . . 1.3. Comprobacin de nmero impar . . . . 1.4. Cuadrado . . . . . . . . . . . . . . . . . 1.5. Suma de cuadrados . . . . . . . . . . . . 1.6. Raices de ecuaciones de segundo grado 1.7. Valor absoluto . . . . . . . . . . . . . . . 1.8. Signo . . . . . . . . . . . . . . . . . . . . 1.9. Conjuncin . . . . . . . . . . . . . . . . . 1.10. Anterior de un nmero natural . . . . . 1.11. Potencia . . . . . . . . . . . . . . . . . . 1.12. Funcin identidad . . . . . . . . . . . . . 7 7 9 10 11 12 13 13 14 15 15 16 17 19 20 20 21 22 23 23 24 25 26 27 27 28 29 30 30 31
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
2. Nmeros y funciones 2.1. Casi igual . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Siguiente de un nmero . . . . . . . . . . . . . . . . . . 2.3. Doble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Mitad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5. Inverso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6. Potencia de dos . . . . . . . . . . . . . . . . . . . . . . . 2.7. Reconocimiento de nmeros positivos . . . . . . . . . . 2.8. Aplicacin de una funcin a los elementos de una lista 2.9. Filtrado mediante una propiedad . . . . . . . . . . . . . 2.10. Suma de los elementos de una lista . . . . . . . . . . . . 2.11. Producto de los elementos de una lista . . . . . . . . . . 2.12. Conjuncin sobre una lista . . . . . . . . . . . . . . . . . 2.13. Disyuncin sobre una lista . . . . . . . . . . . . . . . . . 2.14. Plegado por la derecha . . . . . . . . . . . . . . . . . . . 2.15. Plegado por la izquierda . . . . . . . . . . . . . . . . . . 2.16. Resultados acumulados . . . . . . . . . . . . . . . . . . 3
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
4 2.17. 2.18. 2.19. 2.20. 2.21. 2.22. 2.23. 2.24. 2.25. 2.26. 2.27. 2.28. Lista de factoriales . . . . . . . . . . Iteracin hastaque . . . . . . . . . . Composicin de funciones . . . . . . Intercambio de orden de argumentos Relacin de divisibilidad . . . . . . . Lista de divisores de un nmero . . Comprobacin de nmero primo . . Lista de primos . . . . . . . . . . . . Clculo del da de la semana . . . . . Diferenciacin numrica . . . . . . . Clculo de la raz cuadrada . . . . . Clculo de ceros de una funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ndice general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 33 33 34 34 35 35 36 36 37 38 39 41 43 43 44 45 45 45 47 48 48 49 50 50 51 52 53 54 56 57 58 59 61 62 64 64 65 65 66
3. Estructuras de datos 3.1. Relacin de igualdad entre listas . . . . . . . . . . . . . . . . 3.2. Concatenacin de listas . . . . . . . . . . . . . . . . . . . . . . 3.3. Concatenacin de una lista de listas . . . . . . . . . . . . . . 3.4. Cabeza de una lista . . . . . . . . . . . . . . . . . . . . . . . . 3.5. Resto de una lista . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. ltimo elemento . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7. Lista sin el ltimo elemento . . . . . . . . . . . . . . . . . . . 3.8. Segmento inicial . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9. Segmento inicial ltrado . . . . . . . . . . . . . . . . . . . . . 3.10. Segmento nal . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11. Segmento nal ltrado . . . . . . . . . . . . . . . . . . . . . . 3.12. Nsimo elemento de una lista . . . . . . . . . . . . . . . . . 3.13. Inversa de una lista . . . . . . . . . . . . . . . . . . . . . . . . 3.14. Longitud de una lista . . . . . . . . . . . . . . . . . . . . . . . 3.15. Comprobacin de pertenencia de un elemento a una lista . . 3.16. Comprobacin de no pertenencia de un elemento a una lista 3.17. Comprobacin de que una lista est ordenada . . . . . . . . 3.18. Comprobacin de la igualdad de conjuntos . . . . . . . . . . 3.19. Insercin ordenada de un elemento en una lista . . . . . . . . 3.20. Ordenacin por insercin . . . . . . . . . . . . . . . . . . . . 3.21. Mnimo elemento de una lista . . . . . . . . . . . . . . . . . . 3.22. Mezcla de dos listas ordenadas . . . . . . . . . . . . . . . . . 3.23. Ordenacin por mezcla . . . . . . . . . . . . . . . . . . . . . . 3.24. Dgito correspondiente a un carcter numrico . . . . . . . . 3.25. Carcter correspondiente a un dgito . . . . . . . . . . . . . . 3.26. Lista innita de nmeros . . . . . . . . . . . . . . . . . . . . . 3.27. Lista con un elemento repetido . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
ndice general 3.28. 3.29. 3.30. 3.31. 3.32. 3.33. 3.34. 3.35. 3.36. 3.37. 3.38. 3.39. 3.40. 3.41. 3.42. 3.43. 3.44. 3.45. 3.46. 3.47. 3.48. 3.49. 3.50. 3.51. 3.52. 3.53. 3.54. Lista con un elemento repetido un nmero dado de veces Iteracin de una funcin . . . . . . . . . . . . . . . . . . . Conversin de nmero entero a cadena . . . . . . . . . . Clculo de primos mediante la criba de Erasttenes . . . Comprobacin de que todos los elementos son pares . . . Comprobacin de que todos los elementos son impares . Tringulos numricos . . . . . . . . . . . . . . . . . . . . . Posicin de un elemento en una lista . . . . . . . . . . . . Ordenacin rpida . . . . . . . . . . . . . . . . . . . . . . Primera componente de un par . . . . . . . . . . . . . . . Segunda componente de un par . . . . . . . . . . . . . . . Componentes de una terna . . . . . . . . . . . . . . . . . Creacin de variables a partir de pares . . . . . . . . . . . Divisin de una lista . . . . . . . . . . . . . . . . . . . . . Sucesin de Fibonacci . . . . . . . . . . . . . . . . . . . . . Incremento con el mnimo . . . . . . . . . . . . . . . . . . Longitud de camino entre puntos bidimensionales . . . . Nmeros racionales . . . . . . . . . . . . . . . . . . . . . . Mximo comn divisor . . . . . . . . . . . . . . . . . . . . Bsqueda en una lista de asociacin . . . . . . . . . . . . Emparejamiento de dos listas . . . . . . . . . . . . . . . . Emparejamiento funcional de dos listas . . . . . . . . . . Curricacin . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones sobre rboles . . . . . . . . . . . . . . . . . . . Bsqueda en lista ordenada . . . . . . . . . . . . . . . . . Movimiento segn las direcciones . . . . . . . . . . . . . Los racionales como tipo abstracto de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. Aplicaciones de programacin funcional 4.1. Segmentos iniciales . . . . . . . . . . . . . . 4.2. Segmentos nales . . . . . . . . . . . . . . . 4.3. Segmentos . . . . . . . . . . . . . . . . . . . 4.4. Sublistas . . . . . . . . . . . . . . . . . . . . 4.5. Comprobacin de subconjunto . . . . . . . 4.6. Comprobacin de la igualdad de conjuntos 4.7. Permutaciones . . . . . . . . . . . . . . . . . 4.8. Combinaciones . . . . . . . . . . . . . . . . 4.9. El problema de las reinas . . . . . . . . . . . 4.10. Nmeros de Hamming . . . . . . . . . . . . Bibliografa
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
6 Indice de deniciones
1.3. Comprobacin de nmero impar . . . . . . . . . . . . . . . . . . . . . . . 10 1.4. Cuadrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5. Suma de cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.6. Raices de ecuaciones de segundo grado . . . . . . . . . . . . . . . . . . . 13 1.7. Valor absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.8. Signo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.9. Conjuncin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.10. Anterior de un nmero natural . . . . . . . . . . . . . . . . . . . . . . . . 15 1.11. Potencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.12. Funcin identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.
Factorial
Ejercicio 1.1. Denir la funcin ftoril tal que ftoril n es el factorial de n. Por ejemplo,
ftoril R ;PR
Solucin: Vamos a presentar distintas deniciones. 7
ftP ftP | |
ftR ftR | |
propequivleni XX snteger Eb roperty propequivleni x a x ba H aab @ftP x aa ftI x 88 ftQ x aa ftI x 88 ftR x aa ftI x 88 ftS x aa ftI x 88 ftT x aa ftI x 88 ftU x aa ftI xA
Comprobacin
ftoril a ftS
1.2.
Nmero de combinaciones
Ejercicio 1.2. Denir la funcin om tal que om n k es el nmero de combinaciones de n elementos tomados de k en k; es decir, n m Por ejemplo.
n! k! (n k)!
om T P ; IS
Solucin:
10
1.3.
Ejercicio 1.3. Denir la funcin impr tal que impr x se verica si el nmero x es impar. Por ejemplo,
impr U impr T
; ;
rue plse
imprR XX snteger Eb fool imprR x | x b H a imprRux | otherwise a imprRux where imprRux H a imprRux I a imprRux @nCPA a
Las deniciones son equivalentes:
propequivleni XX snteger Eb fool propequivleni x a imprP x aa imprI x 88 imprQ x aa imprI x 88 imprR x aa imprI x
Comprobacin
1.4. Cuadrado
11
1.4.
Cuadrado
Ejercicio 1.4. Denir la funcin udrdo tal que udrdo x es el cuadrado del nmero x. Por ejemplo,
udrdo Q ;
udrdo a udrdoI
Las deniciones son equivalentes:
12
1.5.
Suma de cuadrados
Ejercicio 1.5. Denir la funcin sumdeudrdos tal que sumdeudrdos l es la suma de los cuadrados de los elementos de la lista l. Por ejemplo,
sumdeudrdos IDPDQ ;
IR
propequivleni XX snteger Eb fool propequivleni xs a sumdeudrdosP xs aa sumdeudrdosI xs 88 sumdeudrdosQ xs aa sumdeudrdosI xs 88 sumdeudrdosR xs aa sumdeudrdosI xs
Comprobacin
13
1.6.
Ejercicio 1.6. Denir la funcin ries tal que ries es la lista de las raices de la ecuacin ax2 + bc + c = 0. Por ejemplo,
ries I Q P
EIFHDEPFH
riesP XX houle Eb houle Eb houle Eb houle riesP a @ECdAGnD @EEdAGn where d a sqrt@BERBBA n a PB
La segunda es mejor en legibilidad y en eciencia:
winb Xset Cs winb riesI I EIFHDEPFH @IQR redutionsD winb riesP I EIFHDEPFH @IHR redutionsD
1.7.
Valor absoluto
Ejercicio 1.7. Redenir la funcin s tal que s x es el valor absoluto de x. Por ejemplo,
s @EQA ; Q s Q ; Q
Solucin: Presentamos distintas deniciones: 1. Con condicionales:
14
1.8.
Signo
Ejercicio 1.8. Redenir la funcin signum tal que signum x es -1 si x es negativo, 0 si x es cero y 1 si x es positivo. Por ejemplo,
nsignum x | x b H a I | x aa H a H | otherwise a EI
Las deniciones son equivalentes:
1.9. Conjuncin
15
1.9.
Conjuncin
propequivleni x y a @x 888 yA aa @x 88 yA
Comprobacin
1.10.
Ejercicio 1.10. Denir la funcin nterior tal que nterior x es el anterior del nmero natural x. Por ejemplo,
16
1.11.
Potencia
Ejercicio 1.11. Redenir la funcin poteni tal que poteni x y es x y . Por ejemplo,
poteniQ XX xum ab Eb snt Eb poteniQ x H a I poteniQ x n | n b H a f x @nEIA x where f H y a y f x n y a g x n where g x n | even n a g @xBxA @nquotPA | otherwise a f x @nEIA @xByA
Las deniciones son equivalentes:
17
1.12.
Funcin identidad
id Q ; Q
Solucin: La denicin es
nid XX Eb nid x a x
18
19
20
2.1.
Casi igual
Ejercicio 2.1. Denir el operador ~a tal que x ~a y se verica si | x y| < 0,0001. Por ejemplo,
2.2.
Siguiente de un nmero
Ejercicio 2.2. Denir la funcin siguiente tal que siguiente x sea el siguiente del nmero entero x. Por ejemplo,
siguiente Q ; R
Solucin: Presentamos distintas deniciones: 1. Mediante seccin:
2.3. Doble
21
siguiente a siguienteI
Las deniciones son equivalentes:
2.3.
Doble
Ejercicio 2.3. Denir la funcin dole tal que dole x es el doble de x. Por ejemplo,
dole Q ; T
Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:
22 Comprobacin
2.4.
Mitad
Ejercicio 2.4. Denir la funcin mitd tal que mitd x es la mitad de x. Por ejemplo,
2.5. Inverso
23
2.5.
Inverso
Ejercicio 2.5. Denir la funcin inverso tal que inverso x es el inverso de x. Por ejemplo,
inverso P ; HFS
Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:
2.6.
Potencia de dos
Ejercicio 2.6. Denir la funcin dosilevdoe tal que dosilevdoe x es 2x . Por ejemplo,
dosilevdoe Q ; V
Solucin: Se presentan distintas deniciones:
24 1. Denicin ecuacional:
2.7.
Ejercicio 2.7. Denir la funcin esositivo tal que esositivo se verica si x es positivo. Por ejemplo,
2.8. Aplicacin de una funcin a los elementos de una lista 2. Denicin con instanciacin parcial:
25
2.8.
Ejercicio 2.8. Redenir la funcin mp tal que mp f l es la lista obtenida aplicando f a cada elemento de l. Por ejemplo,
nmpP XX @ Eb A Eb Eb nmpP f xs a f x | x `E xs
propequivleni XX snt Eb fool propequivleni xs a nmpI @BPA xs aa mp @BPA xs 88 nmpP @BPA xs aa mp @BPA xs
Comprobacin
2.9.
Ejercicio 2.9. Redenir la funcin filter tal que filter p l es la lista de los elementos de l que cumplen la propiedad p. Por ejemplo,
propequivleni XX snt Eb fool propequivleni xs a nfilterI even xs aa filter even xs 88 nfilterP even xs aa filter even xs
Comprobacin
27
2.10.
Ejercicio 2.10. Redenir la funcin sum tal que sum l es la suma de los elementos de l. Por ejemplo,
nsum IDQDT ; IH
Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:
2.11.
Ejercicio 2.11. Redenir la funcin produt tal que produt l es el producto de los elementos de l. Por ejemplo,
produt PDQDS ; QH
Solucin: Presentamos distintas deniciones: 1. Denicin recursiva
28
2.12.
Ejercicio 2.12. Redenir la funcin nd tal que nd l se verica si todos los elementos de l son verdaderos. Por ejemplo,
29
XX fool Eb fool xs a nd xs 88 nd xs
2.13.
Ejercicio 2.13. Redenir la funcin or tal que or l se verica si algn elemento de l es verdadero. Por ejemplo,
propequivleni XX fool Eb fool propequivleni xs a norI xs aa or xs 88 norP xs aa or xs winb quikghek propequivleni yuD pssed IHH testsF
30
2.14.
Ejercicio 2.14. Redenir la funcin foldr tal que foldr op e l pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al nal. Es decir,
foldr op e [x1,x2,x3] ; x1 op (x2 op (x3 op e)) foldr op e [x1,x2,...,xn] ; x1 op (x2 op (... op (xn op e)))
Por ejemplo,
2.15.
Ejercicio 2.15. Redenir la funcin foldl tal que foldl op e l pliega por la izquierda la lista l colocando el operador op entre sus elementos y el elemento e al principio. Es decir,
foldl op e [x1,x2,x3] ; (((e op x1) op x2) op x3 foldl op e [x1,x2,...,xn] ; (...((e op x1) op x2) ... op xn
Por ejemplo,
31
2.16.
Resultados acumulados
Ejercicio 2.16. Redenir la funcin snr tal que snr op e l pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al nal y escribe los resultados acumulados. Es decir,
2.17.
Lista de factoriales
Ejercicio 2.17. Denir la funcin ftoriles tal que ftoriles n es la lista de los factoriales desde el factorial de H hasta el factorial de n. Por ejemplo,
ftoriles S ; IDIDPDTDPRDIPH
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva
32
ftorilesI XX snteger Eb snteger ftorilesI n a reverse @ux nA where ux H a I ux @nCIA a @ftoril @nCIAA X ux n
2. Denicin recursiva con acumuladores:
ftorilesP XX snteger Eb snteger ftorilesP n a reverse @ux @nCIA H IA where ux n m @xXxsA a if naam then xs else ux n @mCIA @@@mCIABxAXxXxsA
3. Denicin con listas intensionales:
propequivleni XX snteger Eb roperty propequivleni n a n ba H aab @ftorilesS n aa ftorilesI n 88 ftorilesP n aa ftorilesI n 88 ftorilesQ n aa ftorilesI n 88 ftorilesR n aa ftorilesI n 88 ftorilesS n aa ftorilesI nA
Comprobacin
33
winb Xset Cs winb ftorilesI IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @IUITWT redutionsD QPPTSW ellsA winb ftorilesP IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @PRSU redutionsD IQSVI ellsA winb ftorilesQ IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @ITWWPW redutionsD QIWTHW ellsA winb ftorilesR IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @ITWWQH redutionsD QIWTII ellsA winb ftorilesS IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @PSSW redutionsD IPVUT ellsA winb
Se observa que las ms ecientes son la 2 y la 5.
2.18.
Iteracin hastaque
Ejercicio 2.18. Redenir la funcin until tal que until p f x aplica la f a x el menor nmero posible de veces, hasta alcanzar un valor que satisface el predicado p. Por ejemplo,
2.19.
Composicin de funciones
Ejercicio 2.19. Redenir la funcin @FA tal que f F g es la composicin de las funciones f y g; es decir, la funcin que aplica x en f@g@xAA. Por ejemplo,
34
ompuest XX @ Eb A Eb @ Eb A Eb @ Eb A @f ompuest gA x a f @g xA
Por ejemplo,
2.20.
Ejercicio 2.20. Redenir la funcin flip que intercambia el orden de sus argumentos. Por ejemplo,
flip XX @ Eb Eb A Eb Eb Eb flip f x y a f y x
2.21.
Relacin de divisibilidad
Ejercicio 2.21. Denir la funcin divisile tal que divisile x y se verica si x es divisible por y. Por ejemplo,
35
2.22.
Ejercicio 2.22. Denir la funcin divisores tal que divisores x es la lista de los divisores de x. Por ejemplo,
divisores IP ; IDPDQDRDTDIP
Solucin: Se presentan distintas deniciones: 1. Mediante ltro:
divisores a divisoresP
2.23.
Ejercicio 2.23. Denir la funcin primo tal que primo x se verica si x es primo. Por ejemplo,
36
2.24.
Lista de primos
Ejercicio 2.24. Denir la funcin primos tal que primos x es la lista de los nmeros primos menores o iguales que x. Por ejemplo,
primos RH ; PDQDSDUDIIDIQDIUDIWDPQDPWDQIDQU
Solucin: Se presentan distintas deniciones: 1. Mediante ltrado:
2.25.
Ejercicio 2.25. Denir la funcin d tal que di d m es el da de la semana correspondiente al da d del mes m del ao . Por ejemplo,
d QI IP PHHU ; 4lunes4
Solucin:
nmeroh d m es el nmero de das trancurridos desde el 1 de enero del ao 0 hasta el da d del mes m del ao . Por ejemplo, nmerohehs QI IP PHHU ; UQQHRI nmerohehs d m a @EIABQTS C nmerohefisiestos C sum @tke @mEIA @meses AA C d
37
nmerohefisiestos a length @filter isiesto IFFEIA isiesto se verica si el ao es bisiesto. La denicin de ao bisiesto es
un ao divisible por 4 es un ao bisiesto (por ejemplo 1972); excepcin: si es divisible por 100, entonces no es un ao bisiesto excepcin de la excepcin: si es divisible por 400, entonces es un ao bisiesto (por ejemplo 2000).
isiesto a divisile R 88 @not@divisile IHHA || divisile RHHA meses es la lista con el nmero de das del los meses del ao . Por ejemplo, meses PHHH ; QIDPWDQIDQHDQIDQHDQIDQIDQHDQIDQHDQI meses a QID feD QID QHD QID QHD QID QID QHD QID QHD QI where fe | isiesto a PW | otherwise a PV demn n es el nsimo da de la semana comenzando con 0 el domingo. Por ejemplo, demn P ; 4mrtes4 demn demn demn demn demn demn demn H I P Q R S T a a a a a a a 4domingo4 4lunes4 4mrtes4 4miroles4 4jueves4 4viernes4 4sdo4
2.26.
Diferenciacin numrica
Ejercicio 2.26. Denir la funcin derivd tal que derivd f x es el valor de la derivada de la funcin f en el punto x con aproximacin . Por ejemplo,
38
derivdfurd cuando la aproximacin es 0.01. derivdpin cuando la aproximacin es 0.0001. derivduper cuando la aproximacin es 0.000001.
Por ejemplo,
derivdpinheleno pi ; EHFWWVWUQV
Solucin:
2.27.
Ejercicio 2.29. Denir la funcin izgudrd tal que riz x es la raz cuadrada de x calculada usando la siguiente propiedad x Si y es una aproximacin de x, entonces 1 2 ( y + y ) es una aproximacin mejor. Por ejemplo,
39
rizgudrd W ; QFHHHHHHHHIQWTWV
Solucin:
rizgudrd XX houle Eb houle rizgudrd x a until eptle mejorr I where mejorr y a HFSB@yCxGyA eptle y a s@yByExA ` HFHHHHI
2.28.
Ejercicio 2.30. Denir la funcin puntogero tal que puntogero f es un cero de la funcin f calculado usando la siguiente propiedad Si b es una aproximacin para el punto cero de f , entonces b aproximacin. Por ejemplo,
f (b) f (b)
es una mejor
puntogero os ; IFSUHUWT
Solucin:
rzudrd tal que rzudrd x es la raz cuadrada de x. rzi tal que rzi x es la raz cbica de x. roseno tal que roseno x es el arco cuyo seno es x. rooseno tal que rooseno x es el arco cuyo coseno es x.
Solucin:
40
a a a a
41
42
43
3.1.
Ejercicio 3.1. Denir la funcin igulvist tal que igulvist xs ys se verica si las dos listas xs e ys son iguales. Por ejemplo,
igulvist XX iq ab Eb Eb fool igulvist IDPDQDRDS IFFS ; rue igulvist IDQDPDRDS IFFS ; plse
Nota: igulvist es equivalente a aa. Solucin:
3.2.
Concatenacin de listas
Ejercicio 3.2. Denir la funcin on tal que on lI lP es la concatenacin de lI y lP. Por ejemplo,
3.3.
Ejercicio 3.3. Redenir la funcin ont tal que ont l es la concatenacin de las lista de l. Por ejemplo,
45
3.4.
Ejercicio 3.4. Redenir la funcin hed tal que hed l es la cabeza de la lista l. Por ejemplo,
3.5.
Ejercicio 3.5. Redenir la funcin til tal que til l es el resto de la lista l. Por ejemplo,
til QDSDP ; SDP til @til IA ; rogrm errorX pttern mth filureX til
Solucin:
3.6.
ltimo elemento
Ejercicio 3.6. Redenir la funcin lst tal que lst l es el ltimo elemento de la lista l. Por ejemplo,
46
propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @nlstI xs aa lst xs 88 nlstP xs aa lst xs 88 nlstQ xs aa lst xs 88 nlstR xs aa lst xs 88 nlstS xs aa lst xsA
Comprobacin
47
3.7.
Ejercicio 3.7. Redenir la funcin init tal que init l es la lista l sin el ltimo elemento. Por ejemplo,
propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @ninitI xs aa init xs 88 ninitP xs aa init xs 88 ninitQ xs aa init xsA
Comprobacin
48
3.8.
Segmento inicial
Ejercicio 3.8. Denir la funcin tke tal que tke n l es la lista de los n primeros elementos de l. Por ejemplo,
XX snt Eb n | n `a H n @xXxsA
Eb a a a
x X ntke @nEIA xs
3.9.
Ejercicio 3.9. Redenir la funcin tkehile tal que tkehile p l es la lista de los elementos iniciales de l que verican el predicado p. Por ejemplo,
49
3.10.
Segmento nal
Ejercicio 3.10. Redenir la funcin drop tal que drop n l es la lista obtenida eliminando los primeros n elementos de la lista l. Por ejemplo,
XX snt Eb n xs | n `a H n @XxsA
Eb a xs a a ndrop @nEIA xs
50
3.11.
Ejercicio 3.11. Redenir la funcin drophile tal que drophile p l es la lista l sin los elementos iniciales que verican el predicado p. Por ejemplo,
3.12.
Ejercicio 3.12. Denir la funcin nth tal que nth l n es elemento nsimo de l, empezando a numerar con el 0. Por ejemplo,
nth IDQDPDRDWDU Q ; R
Nota: nth es equivalente a @33A. Solucin:
51
3.13.
Ejercicio 3.13. Redenir la funcin reverse tal que reverse l es la inversa de l. Por ejemplo,
fool xs 88 xs 88 xs
52 Comprobacin
3.14.
Ejercicio 3.14. Redenir la funcin length tal que length l es el nmero de elementos de l. Por ejemplo,
length IDQDT ; Q
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
3.15. Comprobacin de pertenencia de un elemento a una lista Las deniciones son equivalentes:
53
XX xs aa aa aa aa
3.15.
Ejercicio 3.15. Redenir la funcin elem tal que elem e l se verica si e es un elemento de l. Por ejemplo,
54
snt Eb fool ys ys ys ys ys ys ys 88 88 88 88 88 88
3.16.
Ejercicio 3.16. Redenir la funcin notilem tal que notilem e l se verica si e no es un elemento de l. Por ejemplo,
55
56
Eb fool ys ys ys ys ys ys ys 88 88 88 88 88 88
3.17.
Ejercicio 3.17. Denir la funcin listordend tal que listordend l se verica si la lista l est ordenada de menor a mayor. Por ejemplo,
XX yrd @xXyXxsA
57
3.18.
Ejercicio 3.18. Denir la funcin igulonjunto tal que igulonjunto lI lP se verica si las listas lI y lP vistas como conjuntos son iguales Por ejemplo,
igulonjuntoP XX iq ab Eb Eb fool igulonjuntoP xs ys a ux @nu xsA @nu ysA where ux a rue ux @xXA a plse ux @yXA a plse ux @xXxsA ys a x elem ys 88 ux xs @delete x ysA
3. Usando sort
igulonjuntoQ XX @iq D yrd A ab Eb Eb fool igulonjuntoQ xs ys a sort @nu xsA aa sort @nu ysA
3.19.
Ejercicio 3.19. Denir la funcin insert tal que insert e l inserta el elemento e en la lista l delante del primer elemento de l mayor o igual que e. Por ejemplo,
ab Eb Eb a e a eXxXxs a x X insert e xs
Se puede denir el generador de QuickCheck para que cree lista ordenadas y compruebe que insert las mantiene ordenada
listyrdend XX qen snteger listyrdend a do n `E ritrry listhesde n where listhesde n a frequeny @ID return AD
59
@SD do i `E ritrry ns `E listhesde @nCs iA return @nXnsAA propinsert x a forell listyrdend 6 xs Eb ollet @length xsA 6 listordend @insert x xsA
En efecto,
snsertb quikghek propinsert yuD pssed IHH testsF IV7 PF IT7 IF IH7 SF IH7 HF W7 TF U7 UF U7 QF R7 WF R7 IPF Q7 RF P7 VF P7 IWF P7 IQF I7 PPF I7 IVF I7 IUF I7 ISF I7 IIF I7 IHF
3.20.
Ejercicio 3.20. Denir la funcin ordenporinserin tal que ordenporinserin l es la lista l ordenada mediante insercin, Por ejemplo,
60 1. Denicin recursiva
winb Xset Cs winb ordenporinserinI IHHDWWFFI DDD @SIWSW redutionsD TVIQP ellsA winb ordenporinserinP IHHDWWFFI DDD @SIWTH redutionsD TVHQR ellsA winb ordenporinserinQ IHHDWWFFI FFF @QRSI redutionsD SIUP ellsA
se observa que la tercera denicin es ms eciente. En los sucesivo usaremos como ordenporinserin la tercera
61
propordenporinserinordend XX snt Eb fool propordenporinserinordend xs a listordend @ordenporinserin xsA yrdenporinserionb quikghek propordenporinserinordend yuD pssed IHH testsF
3.21.
Ejercicio 3.21. Redenir la funcin minimum tal que minimum l es el menor elemento de la lista l. Por ejemplo,
minimum QDPDS ; P
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
62
propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @nminimumI xs aa minimum xs 88 nminimumP xs aa minimum xs 88 nminimumQ xs aa minimum xs A
Comprobacin
win Xset Cs winb nminimumI I @PTRR redutionsD winb nminimumP I @PSRV redutionsD winb nminimumQ I @PSSP redutionsD minimumQ minimumQ minimumQ minimumQ
IHHDWWFFI QSTV ellsA IHHDWWFFI QQUQ ellsA IHHDWWFFI QRUU ellsA @ QHH @ PSSH @ PSHSH @PSHHSH redutionsD RIT ellsA redutionsD QRUT ellsA redutionsD QRHUT ellsA redutionsD QRHHUU ellsA @ USH @ SIWTH @ SHIWHTH @SHHIWHHTH redutionsD IHPV redutionsD TVHQR redutionsD TSQHRVS redutionsD TSHQIQWVU ellsA ellsA ellsA ellsA
3.22.
Ejercicio 3.22. Denir la funcin mezl tal que mezl lI lP es la lista ordenada obtenida al mezclar las listas ordenadas lI y lP. Por ejemplo,
63
propmezlordend XX snt Eb snt Eb roperty propmezlordend xs ys a listordend xs 88 listordend ys aab listordend @mezl xs ysA
Comprobacin
64
3.23.
Ejercicio 3.23. Denir la funcin ordenporm tal que ordenporm l es la lista l ordenada mediante mezclas, Por ejemplo,
ordenporm XX yrd ab Eb ordenporm a ordenporm x a x ordenporm xs a mezl @ordenporm ysA @ordenporm zsA where medio a @length xsA div P ys a tke medio xs zs a drop medio xs
El valor de ordenporm es una lista ordenada
propordenpormordend XX snt Eb fool propordenpormordend xs a listordend @ordenporm xsA hb quikghek propordenpormordend yuD pssed IHH testsF
3.24.
Ejercicio 3.24. Denir la funcin dgitohegrter tal que dgitohegrter es el dgito correspondiente al carcter numrico . Por ejemplo,
dgitohegrter 9Q9 ; Q
Solucin:
65
3.25.
Ejercicio 3.25. Denir la funcin rterhehgito tal que rterhehgito n es el carcter correspondiente al dgito n. Por ejemplo,
rterhehgito Q ; 9Q9
Solucin:
propinvers ; rue
3.26.
Ejercicio 3.26. Denir la funcin desde tal que desde n es la lista de los nmeros enteros a partir de n. Por ejemplo,
desde S
; SDTDUDVDWDIHDIIDIPDIQDIRD{snterrupted3}
66
3.27.
Ejercicio 3.27. Redenir la funcin repet tal que repet x es una lista innita con el nico elemento x. Por ejemplo,
repet 99 ; 4{snterrupted3}
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
propequivleni XX snt Eb snt Eb fool propequivleni n m a tke n @nrepetI mA aa tke n @repet mA 88 tke n @nrepetP mA aa tke n @repet mA 88 tke n @nrepetQ mA aa tke n @repet mA
Comprobacin
67
3.28.
Ejercicio 3.28. Redenir la funcin replite tal que replite n x es una lista con n copias del elemento x. Por ejemplo,
XX snt n m a n m aa n m aa n m aa
68
3.29.
Ejercicio 3.29. Redenir la funcin iterte tal que iterte f x es la lista cuyo primer elemento es x y los siguientes elementos se calculan aplicando la funcin f al elemento anterior. Por ejemplo,
iterte @CIA Q ; QDRDSDTDUDVDWDIHDIIDIPD{snterrupted3} iterte @BPA I ; IDPDRDVDITDQPDTRD{snterrupted3} iterte @div IHA IWUP ; IWUPDIWUDIWDIDHDHDHDHDHDHD{snterrupted3}
Solucin:
propequivleni XX snt Eb snt Eb fool propequivleni n m a tke n @niterte @CIA mA aa tke n @iterte @CIA mA
Comprobacin
3.30.
Ejercicio 3.30. Denir la funcin deinteroegden tal que deinteroegden n es la cadena correspondiente al nmero entero n. Por ejemplo,
deinteroegdenI XX snt Eb tring deinteroegdenI a mp rterhehgito F reverse F mp @rem IHA F tkehile @Ga HA F iterte @div IHA
69
iterte @div IHA IWUP ; IWUPDIWUDIWDIDHDHDHDFFF @tkehile @Ga HA F iterte @div IHAA IWUP ; IWUPDIWUDIWDI mp @rem IHA IWUPDIWUDIWDI ; PDUDWDI reverse PDUDWDI ; IDWDUDP mp rterhehgito IDWDUDP ; 4IWUP4
2. Mediante la funcin show
3.31.
Ejercicio 3.31. Denir la funcin primosporri tal que primosporri es la lista de los nmeros primos mediante la criba de Erasttenes.
primosporriI XX snt primosporriI a mp hed @iterte eliminr PFFA where eliminr @xXxsA a filter @nomultiplo xA xs nomultiplo x y a y mod x Ga H
Para ver el clculo, consideramos la siguiente variacin
70
primosporriIux a mp @tke IHA @iterte eliminr PFFA where eliminr @xXxsA a filter @nomultiplo xA xs nomultiplo x y a y mod x Ga H
Entonces,
3.32.
todosres xs se verica si todos los elementos de la lista xs son pares. Por ejemplo, todosres PDRDT ; rue todosres PDRDTDU ; plse
Solucin: Se presentan distintas deniciones:
3.33. Comprobacin de que todos los elementos son impares 1. Denicin recursiva:
71
3.33.
todossmpres xs se verica si todos los elementos de la lista xs son impares. Por ejemplo, todossmpres IDQDS ; rue todossmpres IDQDSDT ; plse
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
72
3.34.
Tringulos numricos
Ejercicio 3.34. Denir la funcin tringulo tal que tringulo n es la lista de las lista de nmeros consecutivos desde I hasta IDPDFFFDn. Por ejemplo,
tringulo R ; IDIDPDIDPDQDIDPDQDR
Solucin: Denicin por comprensin:
73
3.35.
Ejercicio 3.35. Denir la funcin posiin tal que posiin x ys es la primera posicin del elemento x en la lista ys y H en el caso de que no pertenezca a la lista. Por ejemplo,
posiin S IDSDQDSDTDSDQDR ; P
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
posiinI XX iq ab Eb Eb snt posiinI x ys a if elem x ys then ux x ys else H where ux x a H ux x @yXysA | xaa y a I | otherwise a I C ux x ys
2. Denicin con listas de comprensin:
74
propposiin XX snt Eb snt Eb fool propposiin x xs a let naposiin x xs in if naaH then notilem x xs else xs33@nEIAaax
3.36.
Ordenacin rpida
Ejercicio 3.36. Denir la funcin orden tal que orden xs es la lista xs ordenada mediante el procedimiento de ordenacin rpida. Por ejemplo,
orden XX yrd ab Eb orden a orden @xXxsA a orden menores CC x CC orden myores where menores a e | e`ExsD e`x myores a e | e`ExsD ebax
El valor de orden es una lista ordenada
propordenordend XX snt Eb fool propordenordend xs a listordend @orden xsA yrdenporinserionb quikghek propordenordend yuD pssed IHH testsF
3.37.
Ejercicio 3.37. Redenir la funcin fst tal que fst p es la primera componente del par p. Por ejemplo,
fst @QDPA ; Q
Solucin:
75
3.38.
Ejercicio 3.38. Redenir la funcin snd tal que snd p es la segunda componente del par p. Por ejemplo,
snd @QDPA ; P
Solucin:
76
3.39.
fstQ t es la primera componente de la terna t. sndQ t es la segund componente de la terna t. thdQ t es la tercera componente de la terna t.
Por ejemplo,
nfstQ XX @DDA Eb nfstQ @xDDA a x nsndQ XX @DDA Eb nsndQ @DyDA a y nthdQ XX @DDA Eb nthdQ @DDzA a z
Se verica la siguiente propiedad:
3.40.
Ejercicio 3.40. Denir la funcin vrile tal que vrile p es la cadena correspondiente al par p formado por un carcter y un nmero. Por ejemplo,
77
3.41.
Ejercicio 3.41. Redenir la funcin splitet tal que splitet n l es el par formado por la lista de los n primeros elementos de la lista l y la lista l sin los n primeros elementos. Por ejemplo,
propsplitet XX snt Eb snt Eb fool propsplitet n xs a nsplitet n xs aa @tke n xsD drop n xsA
Comprobacin
3.42.
Sucesin de Fibonacci
Ejercicio 3.42. Denir la funcin fi n tal que fi n es el nsimo trmino de la sucesin de Fibonacci 1,1,2,3,5,8,13,21,34,55,. . . Por ejemplo,
fi S
vlor
78
fiP XX snt Eb snt fiP n a fiPux n I I where fiPux H p q a p fiPux @nCIA p q a fiPux n q @pCqA
3. Denicin con mediante listas innitas:
propequivleni XX fool propequivleni a fiI n | n `E IFFPH aa fiP n | n `E IFFPH 88 fiQ n | n `E IFFPH aa fiP n | n `E IFFPH
Comprobacin
79
3.43.
Ejercicio 3.43. Denir la funcin inmin tal que inmin l es la lista obtenida aadiendo a cada elemento de l el menor elemento de l. Por ejemplo,
inminI XX snt Eb snt inminI l a mp @CeA l where e a mnimo l mnimo x a x mnimo @xXyXxsA a min x @mnimo @yXxsAA
2. Con la denicin anterir se recorre la lista dos veces: una para calcular el mnimo y otra para sumarlo. Con la siguiente denicin la lista se recorre slo una vez.
inminP XX snt Eb snt inminP a inminP l a nuevlist where @minvD nuevlistA a unpso l unpso x a @xD xCminvA unpso @xXxsA a @min x yD @xCminvAXysA where @yDysA a unpso xs
Las deniciones son equivalentes:
80
3.44.
Ejercicio 3.44. Denir el tipo unto como un par de nmeros reales Por ejemplo,
@QFHDRFHA XX unto
Solucin:
@IDPAD@RDTAD@UDIHA XX gmino
Solucin:
81
longitudminoP XX gmino Eb houle longitudminoP xs a sum distni p q | @pDqA `E zip @init xsA @til xsA
Evaluacin paso a paso:
longitudminoP @IDPAD@RDTAD@UDIHA a sum distni p q | @pDqA `E zip @init @IDPAD@RDTAD@UDIHAA @til @IDPAD@RDTAD@UDIHAA a sum distni p q | @pDqA `E zip @IDPAD@RDTA @RDTAD@UDIHA a sum distni p q | @pDqA `E @@IDPAD@RDTAAD@@RDTAD@UDIHAA a sum SFHDSFH a IH
Las deniciones son equivalentes:
propequivleni xs a not @null xsA aab longitudminoI xs ~a longitudminoP xs infix R ~a @~aA XX houle Eb houle Eb fool x ~a y a s@xEyA ` HFHHHI
Comprobacin
3.45.
Solucin:
Nmeros racionales
Ejercicio 3.49. Denir el tipo ionl de los nmeros racionales como pares de enteros.
82
; ; ; ;
; ; ; ;
Solucin:
qwul XX ionl Eb ionl Eb ionl qwul @xIDyIA @xPDyPA a simplifir @xIBxPD yIByPA qhiv XX ionl Eb ionl Eb ionl qhiv @xIDyIA @xPDyPA a simplifir @xIByPD yIBxPA qum XX ionl Eb ionl Eb ionl qum @xIDyIA @xPDyPA a simplifir @xIByPCyIBxPD yIByPA qes XX ionl Eb ionl Eb ionl qes @xIDyIA @xPDyPA a simplifir @xIByPEyIBxPD yIByPA
Ejercicio 3.52. Denir la funcin esrieionl tal que esrieionl x es la cadena correspodiente al nmero racional x. Por ejemplo,
esrieionl @IHDIPA ; 4SGT4 esrieionl @IPDIPA ; 4I4 esrieionl @qwul @IDPA @PDQAA ; 4IGQ4
83
esrieionl XX ionl Eb tring esrieionl @xDyA | y9 aa I a show x9 | otherwise a show x9 CC 4G4 CC show y9 where @x9Dy9A a simplifir @xDyA
3.46.
Ejercicio 3.53. Redenir la funcin gd tal que gd x y es el mximo comn divisor de x e y. Por ejemplo,
gd T IS ; Q
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:
ngdI XX snt Eb snt Eb snt ngdI H H a error 4gd H H no est definido4 ngdI x y a ngdI9 @s xA @s yA where ngdI9 x H a x ngdI9 x y a ngdI9 y @x rem yA
2. Denicin con divisile y divisores
XX snt Eb snt Eb snt H H a error 4gd H H no est definido4 H y a s y x y a lst @filter @divisile y9A @divisores x9AA where x9 a s x y9 a s y divisores x a filter @divisile xA IFFx divisile x y a x rem y aa H
propequivleni XX snt Eb snt Eb roperty propequivleni x y a @xDyA Ga @HDHA aab ngdI x y aa gd x y 88 ngdP x y aa gd x y
84 Comprobacin
3.47.
Ejercicio 3.54. Redenir la funcin lookup tal que lookup l z es el valor del primer elemento de la lista de bsqueda l cuya clave es z. Por ejemplo,
lookup @99DIAD@99DPAD@99DQAD@99DRA 99 ; P
Solucin:
nlookup XX iq ab Eb @DA Eb wye nlookup k a xothing nlookup k @@xDyAXxysA | kaax a tust y | otherwise a nlookup k xys
Las deniciones son equivalentes:
propequivleni XX snt Eb @sntDsntA Eb fool propequivleni z xys a nlookup z xys aa nlookup z xys
Comprobacin
proplookup XX snt Eb snt Eb @sntDsntA Eb fool proplookup x y xys a if nlookup x xys aa tust y then elem @xDyA xys else notilem @xDyA xys
Sin embargo, no es cierta la siguiente
XX snt Eb snt Eb @sntDsntA Eb fool x y xys a xys then nlookup x xys aa tust y x xys aa xothing
85
3.48.
Ejercicio 3.55. Redenir la funcin zip tal que zip x y es la lista obtenida emparejando los correspondientes elementos de x e y. Por ejemplo,
XX xs aa aa
86
3.49.
Ejercicio 3.56. Redenir la funcin zipith tal que zipith f x y es la lista obtenida aplicando la funcin f a los elementos correspondientes de las listas x e y. Por ejemplo,
zipith @CA IDPDQ RDSDT ; SDUDW zipith @BA IDPDQ RDSDT ; RDIHDIV
Solucin:
3.50.
Curricacin
Ejercicio 3.57. Una funcin est en forma cartesiana si su argumento es una tupla. Por ejemplo,
urry sumrtesin P Q ; S
87
y la funcin unurry tal que unurry f es la versin cartesiana de la funcin f. Por ejemplo,
3.51.
Ejercicio 3.58. Un rbol de tipo es una hoja de tipo o es un nodo de tipo con dos hijos que son rboles de tipo . Denir el tipo rol. Solucin:
Solucin:
88
I Q S U
Ejercicio 3.60. Denir la funcin tmo tal que tmo es el tamao del rbol ; es decir, el nmero de nodos internos. Por ejemplo,
tmo ejrolI ; U
Solucin:
elemrol XX yrd ab Eb rol Eb elemrol e roj a plse elemrol e @xodo x izq derA | eaax a | e`x a | ebx a
Ejercicio 3.62. Denir la funcin insertrol tal que insertrol e inserta el elemento e en el rbol de bsqueda . Por ejemplo,
89
@xodo U roj @xodo V roj rojAAA winb insertrol Q ejrolI xodo R @xodo P @xodo I roj rojA @xodo Q @xodo Q roj rojA rojAA @xodo T @xodo S roj rojA @xodo U roj rojAA
Solucin:
XX yrd ab Eb rol Eb rol e roj a xodo e roj roj e @xodo x izq derA a xodo x @insertrol e izqA der a xodo x izq @insertrol e derA
Ejercicio 3.63. Denir la funcin listrol tal que listrol l es el rbol de bsqueda obtenido a partir de la lista l. Por ejemplo,
winb listrol QDPDRDI xodo I roj @xodo R @xodo P roj @xodo Q roj rojAA rojA
Solucin:
90 Solucin:
pln XX rol Eb pln roj a pln @xodo x izq derA a pln izq CC x CC pln der
Ejercicio 3.65. Denir la funcin ordendporrol tal que ordendporrol l es la lista l ordenada mediante rbol de bsqueda. Por ejemplo,
3.52.
Ejercicio 3.66. Denir la funcin elemord tal que elemord e l se verica si e es un elemento de la lista ordenada l. Por ejemplo,
elemord XX yrd ab Eb Eb fool elemord a plse elemord e @xXxsA | x ` e a elemord e xs | x aa e a rue | otherwise a plse
91
3.53.
Ejercicio 3.67. Denir el tipo nito hireim tal que sus constructores son Norte, Sur, Este y Oeste. Solucin:
XX hirein Eb @sntDsntA Eb @sntDsntA xorte @xDyA a @xDyCIA ur @xDyA a @xDyEIA iste @xDyA a @xCIDyA yeste @xDyA a @xEIDyA
3.54.
Ejercicio 3.69. Denir el tipo de datos tio para representar los racionales como un par de enteros (su numerador y denominador). Solucin:
dt tio a
snt snt
Ejercicio 3.70. Denir tio como una instancia de how de manera que la funcin show muestra la forma simplicada obtenida mediante la funcin simplifirtio tal que simplifirtio x es el nmero racional x simplicado. Por ejemplo,
@ IP @ IP @ EIP @ EIP
92
instne how tio where show @ x IA a show x show @ x yA a show x9 CC 4G4 CC show y9 where @ x9 y9A a simplifirtio @ x yA simplifirtio XX tio Eb tio simplifirtio @ n dA a @@@signum dABnA div mA @@s dA div mA where m a gd n d
Ejercicio 3.71. Denir los nmeros racionales 0, 1, 2, 3, 1/2, 1/3 y 1/4. Por ejemplo,
a a a a a a a
H I P Q I I I
I I I I P Q R
Ejercicio 3.72. Denir las operaciones entre nmeros racionales rwul, rhiv, rum y res. Por ejemplo,
@ @ @ @
I I I I
PA PA PA PA
@ @ @ @
P I Q Q
QA RA RA RA
Solucin:
rwul XX tio Eb tio Eb tio rwul @ A @ dA a simplifirtio @ @BA @BdAA rhiv XX tio Eb tio Eb tio rhiv @ A @ dA a simplifirtio @ @BdA @BAA
93
rum XX tio Eb tio Eb tio rum @ A @ dA a simplifirtio @ @BdCBA @BdAA res XX tio Eb tio Eb tio res @ A @ dA a simplifirtio @ @BdEBA @BdAA
94
4.1.
Segmentos iniciales
Ejercicio 4.1. Denir la funcin iniiles tal que iniiles l es la lista de los segmentos iniciales de la lista l. Por ejemplo,
96
4.2.
Segmentos nales
Ejercicio 4.2. Denir la funcin finles tal que finles l es la lista de los segmentos nales de la lista l. Por ejemplo,
4.3. Segmentos
97
4.3.
Segmentos
Ejercicio 4.3. Denir la funcin segmentos tal que segmentos l es la lista de los segmentos de la lista l. Por ejemplo,
4.4.
Sublistas
Ejercicio 4.4. Denir la funcin sulists tal que sulists l es la lista de las sublistas de la lista l. Por ejemplo,
winb sulists PDQDR PDQDRDPDQDPDRDPDQDRDQDRD winb sulists IDPDQDR IDPDQDRDIDPDQDIDPDRDIDPDIDQDRDIDQDIDRDID PDQDRD PDQD PDRD PD QDRD QD RD
Solucin:
4.5.
Comprobacin de subconjunto
Ejercicio 4.5. Denir la funcin suonjunto tal que suonjunto xs ys se verica si xs es un subconjunto de ys. Por ejemplo,
98
4.6.
Ejercicio 4.6. Denir la funcin igulonjunto tal que igulonjunto lI lP se verica si las listas lI y lP vistas como conjuntos son iguales Por ejemplo,
99
igulonjuntoP XX iq ab Eb Eb fool igulonjuntoP xs ys a ux @nu xsA @nu ysA where ux a rue ux @xXA a plse ux @yXA a plse ux @xXxsA ys a x elem ys 88 ux xs @delete x ysA
3. Usando sort
igulonjuntoQ XX @iq D yrd A ab Eb Eb fool igulonjuntoQ xs ys a sort @nu xsA aa sort @nu ysA
4. Usaremos como igulonjunto la primera
4.7.
Permutaciones
Ejercicio 4.7. Denir la funcin permutiones tal que permutiones l es la lista de las permutaciones de la lista l. Por ejemplo,
interl I PDQ ; IDPDQDPDIDQDPDQDI interl XX Eb Eb interl e a e interl e @xXxsA a @eXxXxsA X @xXysA | ys `E @interl e xsA
Las deniciones son equivalentes:
propequivleni XX snt Eb roperty propequivleni xs a length xs `a T aab igulonjunto @permutionesI xsA @permutionesP xsA
Comprobacin
propnmeropermutiones XX snt Eb roperty propnmeropermutiones xs a length xs `a T aab length @permutionesP xsA aa ftoril @length xsA where ftoril n a produt IFFn
4.8. Combinaciones
101
En la propiedades hemos acotado la longitude mxima de las listas generadas para facilitar los clculos. La segunda denicin es ms eciente: n permutionesI permutionesP 2 140 102 3 334 172 4 1.170 428 5 5.656 1.740 6 34.192 10.036 7 243.744 71.252 donde las columnas segunda y tercera contiene el nmero de reducciones.
4.8.
Combinaciones
Ejercicio 4.8. Denir la funcin ominiones tal que ominiones n l es la lista de las combinaciones narias de la lista l. Por ejemplo,
winb Xset Cs winb length @ominionesI P IFFISA IHS @IWIUWTR redutionsD PQPUWVQ ellsD Q grge olletionsA winb length @ominionesP P IFFISA IHS @TPIU redutionsD WIQP ellsA
102
4.9.
Ejercicio 4.9. El problema de las N reinas consiste en 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. Denir la funcin reins tal que reins n es la lista de las soluciones del problema de las N reinas. Por ejemplo,
reins R ; QDIDRDPDPDRDIDQ
La primera solucin QDIDRDP se interpreta como R R R R Solucin: Se importa la diferencia de conjuntos @A del mdulo vist:
reins XX snt Eb lero reins n a reinseux n where reinseux H a reinseux @mCIA a rXrs | rs `E reinseux mD r `E @IFFn rsAD noet r rs I
donde 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
103
4.10.
Nmeros de Hamming
Ejercicio 4.10. 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 2 x, 3 x y 5 x tambin estn. 3. Ningn otro nmero est en la sucesin. Denir la funcin hmming tal que hmming es la sucesin de Hamming. Por ejemplo,
hmming XX snt hmming a I X mezlQ PBi | i `E hmming QBi | i `E hmming SBi | i `E hmming
donde mezlQ xs ys zs es la lista obtenida mezclando las listas ordenadas xs, ys y zs y eliminando los elementos duplicados. Por ejemplo,
mezlQ PDRDTDVDIH QDTDWDIP SDIH ; PDQDRDSDTDVDWDIHDIP mezlQ XX snt Eb snt Eb snt Eb snt mezlQ xs ys zs a mezlP xs @mezlP ys zsA
y mezlP xs ys zs es la lista obtenida mezclando las listas ordenadas xs e ys y eliminando los elementos duplicados. Por ejemplo,
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
104
Bibliografa
[1] H. C. Cunningham. Notes on functional programming with haskell. Technical report, University of Mississippi, 2007. [2] J. Fokker. Programacin funcional. Technical report, Universidad de Utrech, 1996. [3] B. C. Ruiz, F. Gutirrez, P. Guerrero, and J. Gallardo. Razonando con Haskell (Un curso sobre programacin funcional). Thompson, 2004. [4] S. Thompson. Haskell: The Craft of Functional Programming. AddisonWesley, second edition, 1999. En Bib. [5] E. P. Wentworth. Introduction to Funcional Programming. Technical report, Parallel Processing Group. Rhodes University, 1994.
105
ndice alfabtico
gmino, 80 hirein, 91 unto, 80 ionl, 81 tio, 91 888, 15 rol, 87 a, 20 nteriorI, 15 nteriorP, 15 pln, 90 roosenoI, 39 roosenoP, 40 rosenoI, 39 rosenoP, 40 rterhehgito, 65 ominionesI, 101 ominionesP, 101 om, 9 ompuest, 34 ontI, 44 ontP, 44 ontQ, 44 on, 43 udrdoI, 11 udrdoP, 11 udrdoQ, 11 d, 36 dgitohegrter, 64 deinteroegdenI, 68 deinteroegdenP, 69 derivdfurd, 38 derivdpinheleno, 38 derivdpin, 38 derivduper, 38 derivd, 38 desdeI, 65 desdeP, 65 distnilorigen, 80 distni, 80 divisile, 34 divisoresI, 35 divisoresP, 35 divisores, 35 doleI, 21 doleP, 21 doleQ, 21 dosilevdoeI, 24 dosilevdoeP, 24 dosilevdoeQ, 24 ejrolI, 87 elemrol, 88 elemord, 90 esositivoI, 24 esositivoP, 25 esositivoQ, 25 esrieionl, 83 ftI, 8 ftP, 8 ftQ, 8 ftR, 8 ftS, 8 ftT, 8 ftorilesI, 31 ftorilesP, 32 ftorilesQ, 32
106
ndice alfabtico
107
ftorilesR, 32 ftorilesS, 32 ftoril, 9 fiI, 77 fiP, 78 fiQ, 78 finles, 96 flip, 34 igulvist, 43 igulonjuntoI, 57, 98 igulonjuntoP, 57, 99 igulonjuntoQ, 57, 99 imprI, 10 imprP, 10 imprQ, 10 imprR, 10 inminI, 79 iniiles, 95 insertrol, 89 insert, 58 invers, 40 inversoI, 23 inversoP, 23 inversoQ, 23 listrol, 89 listordendI, 56 listordendP, 56 listordend, 56 longitudminoI, 80 longitudminoP, 81 mezlI, 63 mezlP, 63 mezl, 63 mitdI, 22 mitdP, 22 mitdQ, 22 mueve, 91 nsI, 13 nsP, 14 nndI, 28
nndP, 28 nurry, 87 ndrophile, 50 ndrop, 49 nelemI, 53 nelemP, 53 nelemQ, 53 nelemR, 53 nelemS, 54 nelemT, 54 nfilterI, 26 nfilterP, 26 nfoldl, 30 nfoldr, 30 nfstQ, 76 nfst, 74 ngdI, 83 ngdP, 83 nhed, 45 nid, 17 ninitI, 47 ninitP, 47 ninitQ, 47 niterte, 68 nlstI, 45 nlstP, 46 nlstQ, 46 nlstR, 46 nlstS, 46 nlengthI, 52 nlengthP, 52 nlengthQ, 52 nlengthR, 52 nlookup, 84 nmpI, 25 nmpP, 25 nminimumI, 61 nminimumP, 61 nminimumQ, 61 nnotilemI, 55
108
ndice alfabtico
nnotilemP, 55 nnotilemQ, 55 nnotilemR, 55 nnotilemS, 55 nnotilemT, 55 nnotilemU, 54, 55 norI, 29 norP, 29 nprodutoI, 27 nprodutoP, 28 nrepetI, 66 nrepetP, 66 nrepetQ, 66 nrepliteI, 67 nrepliteP, 67 nrepliteQ, 67 nreverseI, 51 nreverseP, 51 nreverseQ, 51 nsnr, 31 nsignum, 14 nsndQ, 76 nsnd, 75 nsplitet, 77 nsumI, 27 nsumP, 27 ntil, 45 ntke, 48 nthdQ, 76 nunurry, 87 nuntil, 33 nzipith, 86 nzipI, 85 nzipP, 85 nth, 50 orden, 74 ordenporinserinI, 60 ordenporinserinP, 60 ordenporinserinQ, 60 ordenporm, 64
ordendporrol, 90 permutionesI, 100 permutionesP, 100 posiinI, 73 posiinP, 73 poteniI, 16 poteniP, 16 primosI, 36 primosporriI, 69 primosporriP, 70 primo, 35 puntogero, 39 qhiv, 82 qwul, 82 qes, 82 qum, 82 rgero, 92 rgurto, 92 rhiv, 92 rhos, 92 rwedio, 92 rwul, 92 res, 92 rum, 92 rerio, 92 rres, 92 rno, 92 rziI, 39 rziP, 40 rzudrdI, 39 rzudrdP, 40 riesI, 13 riesP, 13 rizgudrd, 39 reins, 102 segmentos, 97 siguienteI, 20 siguienteP, 20 simplifirtio, 91 simplifir, 82
ndice alfabtico
109
suonjuntoI, 98 suonjuntoP, 98 sulists, 97 sumdeudrdosI, 12 sumdeudrdosP, 12 sumdeudrdosQ, 12 sumdeudrdosR, 12 tmo, 88 todossmpresI, 71 todossmpresP, 72 todossmpresQ, 72 todosresI, 71 todosresP, 71 todosresQ, 71 tringulo, 72 vrile, 77