module Control2 where -- ----------------------------------------------------------------------------------- -- -------------- SOLUCIONES CONTROL 2 PROGR. FUNCIONAL (24.5.2001) ------------------ -- ----------------------------------------------------------------------------------- -- 1 Dado el programa Haskell: data Conex a = Sucesores a [a] type Grafo a = [ Conex a ] g :: Int -> (Int -> Int) -> Int g n h = (h n) * (h (n-1)) h :: Int -> Int -> Int h x y = 2*x - y -- (a) Indicar el tipo de f en la siguiente expresión. Justificar brevemente la respuesta. -- -- (f (g 5) ) ++ "fin" -- -- (b) Indicar a qué se reduce la siguiente expresión. Justificar brevemente la respuesta. -- -- (c) Implementar una función Haskell que renombra los nodos de un grafo, dando el grafo -- según el tipo anterior. Por ejemplo, dado el grafo -- -- [Sucesores 1 [2, 3], Sucesores 2 [3], Sucesores 3 [3,4], Sucesores 4 [] ] -- -- y la función (\x -> x + 1) , quedaría el grafo -- -- [Sucesores 0 [1, 2], Sucesores 1 [2], Sucesores 2 [2,3], Sucesores 3 [] ]. -- -- La función debe servir para cualquier grafo y cualquier función de renombramiento. -- 2 Un grupo de n espías, numerados del 1 al n, han recogido un trozo de mensaje (un -- string). Para descifrar el mensaje, se usa un algoritmo (una función) que obtiene -- un string a partir de otro, y su manual de instrucciones dice: Si mi es el mensaje -- del espía nº i: -- -- . Descifra el mensaje mn y produce dn, -- . Une mi a di+1 (midi+1) y produce con el resultado di, para 1 £ i £ n-1, -- . El mensaje descifrado será d1. -- -- a) Hacer un programa Haskell que descifre mensajes. Deberá servir para distintos -- mensajes y distintos descifradores cuyo uso se ajuste a las instrucciones dadas. -- -- b) Poner un ejemplo de llamada para el descifrar con el agoritmo "quita primer -- carácter e invierte". Es decir, con los strings "tai" , "er" y "psu" saldría -- "rusia". -- -- c) ¿Cómo se puede conseguir el mismo efecto de la función pedida con una llamada a -- la función foldr?. -- --Opcional: puede hacer en lugar del ejercicio 1(c): -- Implementar en Lisp (Common Lisp) la función inversa de una lista