Práctica 2

Transcripción

Práctica 2
Facultad de Ciencias Exactas, Ingenierı́a y Agrimensura
Escuela de Ciencias Exactas y Naturales
Departamento de Computación
Análisis de Lenguajes de Programación II
Práctica 2
1. Sin usar funciones de alto orden ni funciones definidas en el preludio, defina recursivamente
las siguientes funciones y determine su tipo más general:
a) suma, que suma todos los elementos de una lista de números
b) alguno, que devuelve True si algún elemento de una lista de valores booleanos es True, y
False en caso contrario
c) todos, que devuelve True si todos los elementos de una lista de valores booleanos son True,
y False en caso contrario
d) codes, que dada una lista de caracteres, devuelve la lista de sus ordinales
e) restos, que calcula la lista de los restos de la división de los elementos de una lista de
números dada por otro número dado
f ) cuadrados, que dada una lista de números, devuelva la lista de sus cuadrados
g) longitudes, que dada una lista de listas, devuelve la lista de sus longitudes
h) orden, que dada una lista de pares de números, devuelve la lista de aquellos pares en los
que la primera componente es menor que el triple de la segunda
i) pares, que dada una lista de enteros, devuelve la lista de los elementos pares
j) letras, que dada una lista de caracteres, devuelve la lista de aquellos que son letras
(minúsculas o mayúsculas)
k) masDe, que dada una lista de listas xss y un número n, devuelve la lista de aquellas listas
de xss con longitud mayor que n
2. Indicar bajo que suposiciones pueden evaluarse las siguientes ecuaciones. Para aquellas que
puedan evaluarse indicar si son verdaderas y en caso de no serlo modificar su lado derecho para
que resulten verdaderas:
a) [[]] ++ xs = xs
b) [[]] ++ xs = [xs]
c) [[]] ++ xs = [] : xs
d) [[]] ++ xs = [[],xs]
e) [[]] ++ [xs] = [[],xs]
f ) [[]] ++ [xs] = [xs]
g) [] ++ xs = [] : xs
h) [] ++ xs = xs
i) [xs] ++ [] = [xs]
j) [xs] ++ [xs] = [xs,xs]
k) [] : xs = xs
Práctica 2
2006
Página 1
Análisis de Lenguajes de Programación II
3. Demostrar la siguiente propiedad: sum xs ≤ length xs ∗ maxl xs, sabiendo que xs es una
lista de números naturales y que
maxl [] = 0
maxl (x:xs) = x ‘max‘ maxl xs
sum [] = 0
sum (x:xs) = x + sum xs
4. Defina una función all :: (c → Bool) → [a] → Bool tal que all p xs = True exclusivamente en el caso que todos los elementos de xs satisfagan el predicado p.
5. Defina las siguientes funciones:
a) isPrime :: Int → Bool, que decide si un número positivo es o no primo.
b) primes :: Int → [Int], tal que primes n es la lista de los números primos menores o
iguales que n para n > 0.
c) product :: [Int] →Int, tal que product xs es el producto de todos los elementos de xs.
N.B: Recuerde que un producto con ningún factor vale 1.
d) factors :: Int → [Int] tal que
• all isPrime (factors x) = True
• product · factors = id
para cada entero positivo x.
6. Demostrar las siguientes propiedades:
a) curry · uncurry = id
b) uncurry · curry = id
7. Se puede definir la sintaxis de un lenguaje sencillo en forma inductiva de la siguiente manera:
El conjunto de términos es el menor conjunto τ tal que:
1. {true, false, 0} ⊆ τ ;
2. if t1 ∈ τ , then {succ t1 , pred t1 , iszero t1 } ⊆ τ ;
3. if t1 ∈ τ , t2 ∈ τ , t3 ∈ τ , then if t1 then t2 else t3 ∈ τ .
Otra forma de definir el mismo conjunto de términos es un estilo mas ”‘concreto”’ que proporciona
una manera explı́cita de generar los elementos de τ :
Para cada natural i, se define un conjunto Si como sigue:
S0
= Si+1 = {true, f alse, 0}
∪ {succ t1 , pred t1 , iszero t1 | t1 ∈ Si }
∪ {if t1 then t2 else t3 | t1 , t2 , t3 ∈ Si }
S
Finalmente: S = i Si .
a) ¿Cuál es la cantidad de elementos de S3 ?.
b) Mostrar que los conjuntos Si son acumulativos, es decir, que para cada i tenemos Si ⊆ Si+1 .
Práctica 2
2006
Página 2
Análisis de Lenguajes de Programación II
c) Demostrar que τ = S.
d) ¿Es posible generalizar este último estilo de definición para cualquier definición inductiva?
8.
a) Sean xs = [1,2,3], ys = [4,5,6] y zs = [7,8,9], reduzca las siguientes expresiones
usando la definición recursiva de ++ :
• xs ++ (ys ++ zs);
• (xs ++ ys) ++ zs;
b) ¿Cuál de las dos expresiones se evalúa en menos pasos?
c) ¿El operador ++ deberı́a asociar a izquierda o a derecha?
d) ¿Qué asociatividad se declara para ++ en el preludio de Haskell?
Práctica 2
2006
Página 3

Documentos relacionados