Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso CI3661 - Laboratorio de Lenguajes I Enero - Abril 2009 QUIZ (20 %) NOMBRE CARNET NOTA 1. Dado el tipo algebraico de los números naturales tipo N = Cero j Suc N y la función de plegado f oldN f oldN f e Cero = f oldN f e (Suc n) = : (a > a) > a e f (f oldN f e n) >N !a construya en Haskell las siguientes funciones, primero de forma recursiva y luego como una aplicación de f oldN : (Ayuda: para aplicar la función de plegado considere primero las funciones parciales en el primer argumento, y luego, en el caso de la multiplicación y la exponenciación, de…na f como una expresión lambda) a) La adición de los naturales mas :: N ! N ! N de…nida por (3 Ptos.) m+0 = m m + (n + 1) = (m + n) + 1 Solución: mas :: mas m Cero = mas m (Suc n) = N !N !N m Suc (mas m n) Obsérvese que mas m es un función de N en N; que a todo número natural le suma m, por lo cual puede ser de…nida como una aplicación de f oldN: mas m :: mas m = N !N f oldN Suc m de tal manera que mas :: mas = b) N !N !N f oldN Suc La multiplicación de los naturales por :: N ! N ! N de…nida por (3 Ptos.) m 0 = 0 m (n + 1) = m + (m n) Solución: por :: por m Cero = por m (Suc n) = N !N !N Cero mas m (por m n) Obsérvese que por m es un función de N en N; que a todo número natural lo multiplica por m, por lo cual puede ser de…nida como una aplicación de f oldN: por m :: por m = N !N f oldN (mas m) Cero de tal manera que por :: por = N !N !N f oldN (n m > mas m) Cero c) La exponenciación de los naturales exp :: N ! N ! N de…nida por m0 m n+1 (3 Ptos.) = 1 = m mn Solución: exp :: exp m Cero = exp m (Suc n) = N !N !N Suc Cero por m (exp m n) Obsérvese que exp m es un función de N en N que eleva m a la potencia de todo número natural, por lo cual puede ser de…nida como una aplicación de f oldN: exp m :: exp m = N !N f oldN (por m) (Suc Cero) de tal manera que exp :: exp = N !N !N f oldN (n m > por m) (Suc Cero) 2. Una permutación de una lista es una lista con los mismos elementos, pero posiblemente en otro orden. Se puede de…nir la lista de todas las permutaciones de una lista con la función recursiva perms :: [a] ! [[a]] Obsérvese, primero, que para una lista (e : es) de longitud n la lista de sus permutaciones tiene longitud n!: Luego, por cada uno de los elementos de es habrá n elementos uno para cada posición posible de e. El ejemplo siguiente ilustra este hecho para la lista [1; 2; 3] perms [2; 3] = [[2; 3]; [3; 2]] perms [1; 2; 3] = [[1; 2; 3]; [2; 1; 3]; [2; 3; 1]; [1; 3; 2]; [3; 1; 2]; [3; 2; 1]] a) Construya una función inter :: a ! [a] ! [[a]] b) que intercale un elemento en todas las posibles posiciones de una lista. Solución: inter :: a ! [a] ! [[a]] inter e [] = [[e]] inter e list@(x : xs) = (e : list) : map (x :) inter e xs (4 Ptos.) Use la función inter para construir la función perms. Solución: perms :: [a] ! [[a]] perms [] = [[]] perms (x : xs) = concat (map (inter x) (perms xs)) (4 Ptos.) 3. Dada la función prede…nida que invierte el orden de los elementos de una lista reverse : : [a] ! [a] reverse = f oldr (n x xs > xs + + [x]) [] ¿Qué función h cumple la siguiente regla? (map (+1)):reverse = f oldl h [] Ayuda: probar que la igualdad se cumple para la lista unitaria [n] da una idea de quien debe ser h.(3 Ptos.) a) Solución: por una parte (map (+1)):reverse [n] = (map (+1)) (reverse [n]) = (map (+1)) [n] = [n + 1] por la otra (f oldl h []) [n] = (f oldl h []) (n : []) = (f oldl h (h [] n)) [] = (h [] n) por lo tanto h [] n = [n + 1], lo cual sugiere que h = n ns n > n + 1 : ns o, si se quiere, h :: h ns n = N um a => [a] ! a ! [a] n + 1 : ns