Examen de Septiembre 2003 - Departamento de Lenguajes y

Anuncio
Examen de P. DECLARATIVA
Septiembre de 2003
Ejercicio de Programación Lógica
UNIVERSIDAD DE MALAGA
DEPARTAMENTO DE LENGUAJES Y
CIENCIAS DE LA COMPUTACION
ALUMNO: ___________________________________________________
ESPECIALIDAD:___________________________________ GRUPO:___________
1. (2,5 puntos) Dado el conjunto de cláusulas
p(X,Y):- q(X,Y).
p(X,Y):- q(a,X).
q(a,a).
q(X,a):- r(Y),s(X,Y).
q(X,Y):- r(a),p(X,Y).
s(b,b).
s(b,X):- r(X).
r(b).
r(a).
Construir el árbol de búsqueda para el objetivo
?- p(X,b).
2. Dado el siguiente programa para calcular sublistas de una lista
%
sublista(Lista,Sublista).
sublista(Xs,[]).
sublista([X|Xs],Ys):- sublista(Xs,Ys).
sublista([X|Xs],[X|Ys]):-sublista(Xs,Ys).
se observa que tiene un comportamiento anómalo.
2.a (0,5 puntos) ¿Cuál es este comportamiento anómalo?. Probarlo con sublista([1,2],Zs).
2.b (1 punto) Introducir las mínimas modificaciones para que el programa funcione correctamente.
2.c (1 punto) ¿Cuál será el resultado de la llamada a sublista(Xs,[a,b,c]). en el programa
modificado?.
3. a) (0,5 puntos) Definir el predicado selecciona(Xs,X,Ys) de manera que Ys sea la lista que
resulta de eliminar una aparición de X de la lista Xs.
Queremos definir el predicado permuta(Xs,Ps) de manera que Ps sea una permutación de la lista
Xs, es decir, por reevaluación en Ps se obtendrán todas las permutaciones de Xs. Realizar dos
definiciones distintas del predicado siguiendo los patrones que se muestran.
b) (1 punto)
permuta([],[]).
permuta([X|Xs],Ps):-
c) (1 punto)
permuta([],[]).
permuta(Xs,[X|Ps]):-
4. (2,5 puntos) Definir un predicado arbol(Lsi,Lsp,Arb) tal que, a partir de los recorridos en
inorden (Lsi) y preorden (Lsp), construyan por reevaluación, todos los árboles binarios posibles que
tengan tales recorridos. El dominio de definición para el tipo árbol es
es_arbol(vac).
es_arbol(bin(Iz,R,Dr)):-es_arbol(Iz),es_arbol(Dr).
Examen de P. DECLARATIVA
Septiembre de 2003
Ejercicio de Programación Funcional
UNIVERSIDAD DE MALAGA
DEPARTAMENTO DE LENGUAJES Y
CIENCIAS DE LA COMPUTACION
1.a (0.75 puntos) Sea la siguiente función Haskell:
f h p xs ys = [ h x y | x <- xs, p x, y <- ys ]
¿Cuál es el resultado obtenido al evaluar la expresión f (+) even [1..4] [10..14]?
1.b (1 punto) Escribe otra definición equivalente de f que NO utilice la sintaxis de listas por comprensión.
Por ejemplo, con map, filter y concat.
1.c (0.75 puntos) Escribe una definición de concat utilizando exclusivamente una lista por
comprensión.
2. Dada la definición de tipo
data Htree a = H a | Htree a :^: Htree a
definir las siguientes funciones dando también su tipo:
2.a (1 punto) Función frontera (recursiva) que aplicada a un árbol Htree produzca una lista
con los valores de sus hojas recorridas de izquierda a derecha.
2.b (1 punto) Función aHtree que aplicada a una lista produzca un árbol Htree cuya frontera sea
la lista y que tenga la menor altura posible.
3. (2 puntos) Dada la definición de tipo
data Bolsa a = B [a]
con la que se pretende representar multiconjuntos o bolsas de elementos de un cierto tipo a,
declara este tipo como una instancia de la clase Eq de forma que dos bolsas sean iguales si
contienen los mismos elementos (con independencia del orden en el que aparezcan y teniendo en
cuenta las repeticiones )
4. Sea la siguiente función de orden superior, similar a foldr pero que permite arrastrar un
estado de derecha a izquierda al recorrer la lista:
pliega :: (a -> b -> c -> (b,c)) -> b -> c -> [a] -> (b,c)
pliega f z st []
= (z,st)
pliega f z st (x:xs) = f x z' st'
where
(z', st') = pliega f z st xs
x1
x2
...
xn-1
xn
z
f
st
f
...
z’
f
f
st’
4.a (0.5 puntos) Define de modo recursivo una función cuentaMax que dada una lista de números
naturales devuelva un par con el máximo elemento y el número de veces que aparece.
cuentaMax [1,3,2,3,2,1,1] => (2,3)
4.b (1.25 puntos) Define la función cuentaMax usando pliega.
4.c (0.5 puntos) Define de modo recursivo una función reempSuma que dada una lista de
números naturales devuelva un lista donde cada elemento de la original es sustituida por la
suma de dicho elementos y los que le suceden en la lista.
reempSuma [10,20,30]
=> [10+20+30, 20+30, 30] => [60,50,30]
4.d (1.25 puntos) Define la función reempSuma usando pliega.
Descargar