{"id":1913,"date":"2012-02-22T17:40:16","date_gmt":"2012-02-22T17:40:16","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1913"},"modified":"2012-02-28T17:40:47","modified_gmt":"2012-02-28T17:40:47","slug":"lmf2012-revision-de-la-programacion-con-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/lmf2012-revision-de-la-programacion-con-haskell\/","title":{"rendered":"LMF2012: Revisi\u00f3n de la programaci\u00f3n con Haskell"},"content":{"rendered":"<p>En la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/lmf-11\">L\u00f3gica matem\u00e1tica y fundamentos<\/a> (de 3\u00ba de Grado en Matem\u00e1ticas) se ha realizado una revisi\u00f3n de la programaci\u00f3n funcional con Haskell, recordando los conceptos necesarios para la implementaci\u00f3n de los algoritmos l\u00f3gicos del curso.<\/p>\n<p>Como ejercicios se propuso la siguiente relaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Introducci\u00f3n                                                       --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- En esta relaci\u00f3n de ejercicios hacemos una introducci\u00f3n a Haskell, en\r\n-- la que se recuerdan:\r\n-- * las definiciones elementales de funciones,\r\n-- * las definiciones de funciones por comprensi\u00f3n,\r\n-- * las definiciones de funciones por recursi\u00f3n y\r\n-- * los tipos de datos.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas auxiliares                                  \r\n-- ---------------------------------------------------------------------\r\n \r\nimport Test.QuickCheck\r\nimport Data.Char\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n media3 tal que (media3 x y z) es\r\n-- la media aritm\u00e9tica de los n\u00fameros x, y y z. Por ejemplo, \r\n--    media3 1 3 8     ==  4.0\r\n--    media3 (-1) 0 7  ==  2.0\r\n--    media3 (-3) 0 3  ==  0.0\r\n-- ---------------------------------------------------------------------\r\n\r\nmedia3 x y z = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n volumenEsfera tal que \r\n-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,\r\n--    volumenEsfera 10  ==  4188.790204786391\r\n-- Indicaci\u00f3n: Usar la constante pi.\r\n-- ---------------------------------------------------------------------\r\n\r\nvolumenEsfera r = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n ultimaCifra tal que (ultimaCifra x)\r\n-- es la \u00faltima cifra del n\u00edmero x. Por ejemplo,\r\n--    ultimaCifra 325  ==  5\r\n-- ---------------------------------------------------------------------\r\n\r\nultimaCifra x = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n rota tal que (rota n xs) es la lista\r\n-- obtenida poniendo los n primeros elementos de xs al final de la\r\n-- lista. Por ejemplo, \r\n--    rota 1 [3,2,5,7]  ==  [2,5,7,3]\r\n--    rota 2 [3,2,5,7]  ==  [5,7,3,2]\r\n--    rota 3 [3,2,5,7]  ==  [7,3,2,5]\r\n-- ---------------------------------------------------------------------\r\n\r\nrota n xs = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n palindromo tal que (palindromo xs) se\r\n-- verifica si xs es un pal\u00edndromo; es decir, es lo mismo leer xs de\r\n-- izquierda a derecha que de derecha a izquierda. Por ejemplo,\r\n--    palindromo [3,2,5,2,3]    ==  True\r\n--    palindromo [3,2,5,6,2,3]  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\npalindromo xs = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.1. La disyunci\u00f3n excluyente xor de dos f\u00f3rmulas se\r\n-- verifica si una es verdadera y la otra es falsa.\r\n-- \r\n-- Definir la funci\u00f3n xor_1 que calcule la disyunci\u00f3n excluyente a\r\n-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada l\u00ednea\r\n-- de la tabla. \r\n-- ---------------------------------------------------------------------\r\n\r\nxor_1 = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.2. Definir la funci\u00f3n xor_2 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de la tabla de verdad y patrones. Usar 2\r\n-- ecuaciones, una por cada valor del primer argumento.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_2 = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.3. Definir la funci\u00f3n xor_3 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de la disyunci\u00f3n (||), conjunci\u00f3n (&&) y negaci\u00f3n\r\n-- (not). Usar 1 ecuaci\u00f3n.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_3 = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6.4. Definir la funci\u00f3n xor_4 que calcule la disyunci\u00f3n\r\n-- excluyente a partir de desigualdad (\/=). Usar 1 ecuaci\u00f3n.\r\n-- ---------------------------------------------------------------------\r\n\r\nxor_4 = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    sumaDeCuadrados :: Integer -> Integer\r\n-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los\r\n-- primeros n n\u00fameros; es decir, 1^2 + 2^2 + ... + 100^2. Por ejemplo,\r\n--    sumaDeCuadrados 3    ==  14\r\n--    sumaDeCuadrados 100  ==  338350\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaDeCuadrados = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Una terna (x,y,z) de enteros positivos es pitag\u00f3rica si \r\n-- x^2 + y^2 = z^2. Usando una lista por comprensi\u00f3n, definir la funci\u00f3n\r\n--    pitagoricas :: Int -> [(Int, Int, Int)]\r\n-- tal que (pitagoricas n) es la lista de todas las ternas pitag\u00f3ricas\r\n-- cuyas componentes est\u00e1n entre 1 y n. Por ejemplo, \r\n--    *Main> pitagoricas 10 \r\n--    [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]\r\n-- ---------------------------------------------------------------------\r\n \r\npitagoricas :: Int -> [(Int, Int, Int)]\r\npitagoricas n = undefined\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Un entero positivo es perfecto si es igual a la suma de\r\n-- sus factores, excluyendo el propio n\u00famero. Usando una lista por\r\n-- comprensi\u00f3n y la funci\u00f3n factores (del tema), definir la funci\u00f3n \r\n--    perfectos :: Int -> [Int]\r\n-- tal que (perfectos n) es la lista de todos los n\u00fameros perfectos\r\n-- menores que n. Por ejemplo: \r\n--    *Main> perfectos 500\r\n--    [6,28,496]\r\n-- ---------------------------------------------------------------------\r\n \r\n-- La funci\u00f3n factores del tema es\r\nfactores :: Int -> [Int]\r\nfactores n = undefined\r\n\r\n-- La definici\u00f3n es\r\nperfectos :: Int -> [Int]\r\nperfectos n = undefined\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.1. Un tri\u00e1ngulo aritm\u00e9tico se forma como sigue\r\n--     1\r\n--     2  3\r\n--     4  5  6\r\n--     7  8  9 10\r\n--    11 12 13 14 15\r\n--    16 16 18 19 20 21\r\n-- Definir la funci\u00f3n linea tal que (linea n) es la l\u00ednea n-\u00e9sima de los\r\n-- tri\u00e1ngulos aritm\u00e9ticos. Por ejemplo, \r\n--    linea 4  ==  [7,8,9,10]\r\n--    linea 5  ==  [11,12,13,14,15]\r\n-- ---------------------------------------------------------------------\r\n\r\nlinea n = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10.2. Definir la funci\u00f3n triangulo tal que (triangulo n) es\r\n-- el tri\u00e1ngulo aritm\u00e9tico de altura n. Por ejemplo,\r\n--    triangulo 3  ==  [[1],[2,3],[4,5,6]]\r\n--    triangulo 4  ==  [[1],[2,3],[4,5,6],[7,8,9,10]]\r\n-- ---------------------------------------------------------------------\r\n\r\ntriangulo n = undefined\r\n\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11.  La distancia de Hamming entre dos listas es el n\u00famero\r\n-- de posiciones en que los correspondientes elementos son\r\n-- distintos. Por ejemplo, la distancia de Hamming entre \"roma\" y \"loba\" \r\n-- es 2 (porque hay 2 posiciones en las que los elementos\r\n-- correspondientes son distintos: la 1\u00aa y la 3\u00aa). \r\n--    \r\n-- Definir la funci\u00f3n distancia tal que (distancia xs ys) es la \r\n-- distancia de Hamming entre xs e ys. Por ejemplo,\r\n--    distancia \"romano\" \"comino\"  ==  2\r\n--    distancia \"romano\" \"camino\"  ==  3\r\n--    distancia \"roma\"   \"comino\"  ==  2\r\n--    distancia \"roma\"   \"camino\"  ==  3\r\n--    distancia \"romano\" \"ron\"     ==  1\r\n--    distancia \"romano\" \"cama\"    ==  2\r\n--    distancia \"romano\" \"rama\"    ==  1\r\n-- ---------------------------------------------------------------------\r\n\r\ndistancia xs ys = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12.1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    cuadradosC :: [Integer] -> [Integer]\r\n-- tal que (cuadradosC xs) es la lista de los cuadrados de xs. Por\r\n-- ejemplo, \r\n--    cuadradosC [1,2,3]  ==  [1,4,9]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadradosC :: [Integer] -> [Integer]\r\ncuadradosC xs = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    cuadradosR :: [Integer] -> [Integer]\r\n-- tal que (cuadradosR xs) es la lista de los cuadrados de xs. Por\r\n-- ejemplo, \r\n--    cuadradosR [1,2,3]  ==  [1,4,9]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadradosR :: [Integer] -> [Integer]\r\ncuadradosR = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13.1. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    imparesC :: [Integer] -> [Integer]\r\n-- tal que (imparesC xs) es la lista de los n\u00fameros impares de xs. Por\r\n-- ejemplo, \r\n--    imparesC [1,2,3]  ==  [1,3]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesC :: [Integer] -> [Integer]\r\nimparesC xs = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13.2. Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    imparesR :: [Integer] -> [Integer]\r\n-- tal que (imparesR xs) es la lista de los n\u00fameros impares de xs. Por\r\n-- ejemplo, \r\n--    imparesR [1,2,3]  ==  [1,3]\r\n-- ---------------------------------------------------------------------\r\n\r\nimparesR :: [Integer] -> [Integer]\r\nimparesR = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. El doble factorial de un n\u00famero n se define por \r\n--    n!! = n*(n-2)* ... * 3 * 1, si n es impar\r\n--    n!! = n*(n-2)* ... * 4 * 2, si n es par\r\n--    1!! = 1\r\n--    0!! = 1    \r\n-- Por ejemplo,\r\n--    8!! = 8*6*4*2   = 384\r\n--    9!! = 9*7*5*3*1 = 945\r\n-- Definir, por recursi\u00f3n, la funci\u00f3n\r\n--    dobleFactorial :: Integer -> Integer\r\n-- tal que (dobleFactorial n) es el doble factorial de n. Por ejemplo,\r\n--    dobleFactorial 8  ==  384\r\n--    dobleFactorial 9  ==  945\r\n-- ---------------------------------------------------------------------\r\n\r\ndobleFactorial :: Integer -> Integer\r\ndobleFactorial = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 15. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    sumaConsecutivos :: [Int] -> [Int]\r\n-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos\r\n-- consecutivos de la lista xs. Por ejemplo,\r\n--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]\r\n--    sumaConsecutivos [3]        ==  []\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaConsecutivos :: [Int] -> [Int]\r\nsumaConsecutivos xs = undefined\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.0. En los siguientes ejercicios usar\u00e1n los \u00e1rboles\r\n-- binarios definidos como sigue \r\n--    data Arbol a = Hoja \r\n--                 | Nodo a (Arbol a) (Arbol a)\r\n--                 deriving (Show, Eq)\r\n-- Como ejemplo se usar\u00e1 el \u00e1rbol definido por\r\n--    arbol_1 = Nodo 9\r\n--                   (Nodo 3 \r\n--                         (Nodo 2 Hoja Hoja) \r\n--                         (Nodo 4 Hoja Hoja)) \r\n--                   (Nodo 7 Hoja Hoja)\r\n-- ---------------------------------------------------------------------\r\n \r\ndata Arbol a = Hoja \r\n             | Nodo a (Arbol a) (Arbol a)\r\n             deriving (Show, Eq)\r\n \r\narbol_1 = Nodo 9\r\n               (Nodo 3 \r\n                     (Nodo 2 Hoja Hoja) \r\n                     (Nodo 4 Hoja Hoja)) \r\n               (Nodo 7 Hoja Hoja)\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.1. Definir la funci\u00f3n\r\n--    espejo :: Arbol a -> Arbol a\r\n-- tal que (espejo x) es la imagen especular del \u00e1rbol x. Por ejemplo,\r\n--    *Main> espejo arbol_1\r\n--    Nodo 9 \r\n--         (Nodo 7 Hoja Hoja) \r\n--         (Nodo 3 \r\n--               (Nodo 4 Hoja Hoja) \r\n--               (Nodo 2 Hoja Hoja))\r\n-- ---------------------------------------------------------------------\r\n \r\nespejo :: Arbol a -> Arbol a\r\nespejo = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.2. Comprobar con QuickCheck que para todo \u00e1rbol x,\r\n--    espejo (espejo x) = x\r\n-- ---------------------------------------------------------------------\r\n \r\nprop_espejo :: Arbol Int -> Bool\r\nprop_espejo = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.3. Demostrar por inducci\u00f3n que para todo \u00e1rbol x,\r\n--    espejo (espejo x) = x\r\n-- ---------------------------------------------------------------------\r\n \r\n{-\r\n Demostraci\u00f3n por inducci\u00f3n en x\r\n \r\n Caso base: \r\n \r\n Paso de inducci\u00f3n: \r\n-}\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.4. Definir la funci\u00f3n\r\n--    preorden :: Arbol a -> [a]\r\n-- tal que (preorden x) es la lista correspondiente al recorrido\r\n-- preorden del \u00e1rbol x; es decir, primero visita la ra\u00edz del \u00e1rbol, a\r\n-- continuaci\u00f3n recorre el sub\u00e1rbol izquierdo y, finalmente, recorre el\r\n-- sub\u00e1rbol derecho. Por ejemplo,\r\n--    *Main> arbol_1\r\n--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)\r\n--    *Main> preorden arbol_1\r\n--    [9,3,2,4,7]\r\n-- ---------------------------------------------------------------------\r\n \r\npreorden :: Arbol a -> [a]\r\npreorden = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.5. Definir la funci\u00f3n\r\n--    postorden :: Arbol a -> [a]\r\n-- tal que (postorden x) es la lista correspondiente al recorrido\r\n-- postorden del \u00e1rbol x; es decir, primero recorre el sub\u00e1rbol\r\n-- izquierdo, a continuaci\u00f3n el sub\u00e1rbol derecho y, finalmente, la ra\u00edz\r\n-- del \u00e1rbol. Por ejemplo,\r\n--    *Main> arbol_1\r\n--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)\r\n--    *Main> postorden arbol_1\r\n--    [2,4,3,7,9]\r\n-- ---------------------------------------------------------------------\r\n \r\npostorden :: Arbol a -> [a]\r\npostorden = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.6. Comprobar con QuickCheck que para todo \u00e1rbol x,\r\n--    postorden (espejo x) = reverse (preorden x)\r\n-- ---------------------------------------------------------------------\r\n \r\n-- La propiedad es\r\nprop_recorrido :: Arbol Int -> Bool\r\nprop_recorrido = undefined \r\n \r\n-- La comprobaci\u00f3n es\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.7. Demstrar por inducci\u00f3n que para todo \u00e1rbol x,\r\n--    postorden (espejo x) = reverse (preorden x)\r\n-- ---------------------------------------------------------------------\r\n \r\n{-\r\n Demostraci\u00f3n por inducci\u00f3n en x.\r\n \r\n Caso base: \r\n \r\n Paso de inducci\u00f3n: \r\n\r\n-}\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.8. Comprobar con QuickCheck que para todo \u00e1rbol binario\r\n-- x, se tiene que\r\n--    reverse (preorden (espejo x)) = postorden x\r\n-- ---------------------------------------------------------------------\r\n \r\n-- La propiedad es\r\nprop_reverse_preorden_espejo :: Arbol Int -> Bool\r\nprop_reverse_preorden_espejo = undefined\r\n \r\n-- La comprobaci\u00f3n es\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.9. Demostrar que para todo \u00e1rbol binario x, se tiene que\r\n--    reverse (preorden (espejo x)) = preorden x\r\n-- ---------------------------------------------------------------------\r\n \r\n{-\r\n Demostraci\u00f3n:\r\n\r\n-}\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.10. Definir la funci\u00f3n\r\n--    nNodos :: Arbol a -> Int\r\n-- tal que (nNodos x) es el n\u00famero de nodos del \u00e1rbol x. Por ejemplo,\r\n--    *Main> arbol_1\r\n--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)\r\n--    *Main> nNodos arbol_1\r\n--    5\r\n-- ---------------------------------------------------------------------\r\n \r\nnNodos :: Arbol a -> Int\r\nnNodos = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.11. Comprobar con QuickCheck que el n\u00famero de nodos de la\r\n-- imagen especular de un \u00e1rbol es el mismo que el n\u00famero de nodos del\r\n-- \u00e1rbol. \r\n-- ---------------------------------------------------------------------\r\n \r\n-- La propiedad es\r\nprop_nNodos_espejo :: Arbol Int -> Bool\r\nprop_nNodos_espejo = undefined \r\n \r\n-- La comprobaci\u00f3n es\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.12. Demostrar por inducci\u00f3n que el n\u00famero de nodos de la\r\n-- imagen especular de un \u00e1rbol es el mismo que el n\u00famero de nodos del\r\n-- \u00e1rbol. \r\n-- ---------------------------------------------------------------------\r\n \r\n{-\r\n Demostraci\u00f3n: Hay que demostrar, por inducci\u00f3n en x, que \r\n    nNodos (espejo x) == nNodos x\r\n \r\n Caso base: \r\n \r\n Paso de inducci\u00f3n: \r\n-}\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.13. Comprobar con QuickCheck que la longitud de la lista\r\n-- obtenida recorriendo un \u00e1rbol en sentido preorden es igual al n\u00famero\r\n-- de nodos del \u00e1rbol.\r\n-- ---------------------------------------------------------------------\r\n \r\n-- La propiedad es\r\nprop_length_preorden :: Arbol Int -> Bool\r\nprop_length_preorden = undefined \r\n \r\n-- La comprobaci\u00f3n es\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.14. Demostrar por inducci\u00f3n que la longitud de la lista\r\n-- obtenida recorriendo un \u00e1rbol en sentido preorden es igual al n\u00famero\r\n-- de nodos del \u00e1rbol.\r\n-- ---------------------------------------------------------------------\r\n \r\n{-\r\n Demostraci\u00f3n: Por inducci\u00f3n en x, hay que demostrar que\r\n    length (preorden x) == nNodos x\r\n \r\n Caso base: \r\n \r\n Paso de inducci\u00f3n: \r\n\r\n-}\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.15. Definir la funci\u00f3n\r\n--    profundidad :: Arbol a -> Int\r\n-- tal que (profundidad x) es la profundidad del \u00e1rbol x. Por ejemplo,\r\n--    *Main> arbol_1\r\n--    Nodo 9 (Nodo 3 (Nodo 2 Hoja Hoja) (Nodo 4 Hoja Hoja)) (Nodo 7 Hoja Hoja)\r\n--    *Main> profundidad arbol_1\r\n--    3\r\n-- ---------------------------------------------------------------------\r\n \r\nprofundidad :: Arbol a -> Int\r\nprofundidad = undefined \r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 16.16. Comprobar con QuickCheck que para todo \u00e1rbol binario\r\n-- x, se tiene que\r\n--    nNodos x <= 2^(profundidad x) - 1\r\n-- ---------------------------------------------------------------------\r\n \r\n-- La propiedad es\r\nprop_nNodosProfundidad :: Arbol Int -> Bool\r\nprop_nNodosProfundidad = undefined \r\n \r\n-- La comprobaci\u00f3n es\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Nota. Para comprobar propiedades de \u00e1rboles con QuickCheck se\r\n-- utilizar\u00e1 el siguiente generador.\r\n-- ---------------------------------------------------------------------\r\n\r\nvacio:: Arbol a\r\nvacio = Hoja\r\n\r\ninserta :: (Show a, Ord a) => a -> Arbol a -> Arbol a\r\ninserta v' Hoja = Nodo v' Hoja Hoja\r\ninserta v' (Nodo v i d)\r\n    | v' == v   = Nodo v i d\r\n    | v' < v    = Nodo v (inserta v' i) d\r\n    | otherwise = Nodo v i (inserta v' d)\r\n\r\n\r\ngenArbol :: (Arbitrary a, Integral a) => Gen (Arbol a)\r\ngenArbol = do xs <- listOf arbitrary\r\n              return (foldr inserta vacio xs)\r\n\r\ninstance (Arbitrary a, Integral a) => Arbitrary (Arbol a) where\r\n    arbitrary = genArbol\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso de L\u00f3gica matem\u00e1tica y fundamentos (de 3\u00ba de Grado en Matem\u00e1ticas) se ha realizado una revisi\u00f3n de la programaci\u00f3n funcional con Haskell, recordando los conceptos necesarios para la implementaci\u00f3n de los algoritmos l\u00f3gicos del curso. Como ejercicios se propuso la siguiente relaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[1],"tags":[192],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1913"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=1913"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1913\/revisions"}],"predecessor-version":[{"id":1914,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1913\/revisions\/1914"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}