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.