Universidad Simón Bolívar Departamento de Computación y

Anuncio
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
Descargar