% Examen de "Programación Declarativa" (11 de Junio de 2000) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 1: Definir la relación lista_numeros(Exp,L) que reciba como dato de % entrada una expresión aritmética Exp formada por números, constantes y los % símbolos "+", "-" y devuelva la lista ordenada y sin repeticiones de los % números que aparecen en la expresión. Por ejemplo, % ?- lista_numeros(a+3-b+1+c-2,L). % L = [1, 2, 3] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% lista_numeros(Exp,L) :- setof(X,ocurre(X,Exp),L). ocurre(X,X) :- number(X). ocurre(X,X1+_) :- ocurre(X,X1). ocurre(X,_+X2) :- ocurre(X,X2). ocurre(X,X1-_) :- ocurre(X,X1). ocurre(X,_-X2) :- ocurre(X,X2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 2: Definir la relación lista_vector(Term,N,L) de forma que dados % Term y N, donde Term es un término sin variables y N es un entero positivo, L % sea la lista [Term1,...,Term2]. Por ejemplo, % ?- lista_vector(k,10,L). % L = [k1, k2, k3, k4, k5, k6, k7, k8, k9, k10] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% lista_vector(Term,N,Lista):- name(Term,Codigo_term), aux_lista_vector(Codigo_term,N,[],Lista). aux_lista_vector(_,0,L,L):-!. aux_lista_vector(Codigo_term,N,Acum,L):- name(N,Codigo_numero), append(Codigo_term,Codigo_numero,Codigo_completo), name(Elto,Codigo_completo), N1 is N-1, aux_lista_vector(Codigo_term,N1,[Elto|Acum],L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 3: Definir la relación frecuencia(L1,L2,L3) que tome como entrada % una lista L1 de números enteros y la lista L2 formada por intervalos, y que % devuelva la lista L3 formada por las frecuencias de aparición de los valores % de L1 en los intervalos de L2. Cada intervalo se representará como una lista % de dos valores y se supone que todos los intervalos disjuntos. Por ejemplo, % ?- frecuencia([5,3,1,5,3,6,4,2,5,6,3,6,5,2,6,7,3],[[0,3],[4,5],[6,7]],L). % L = [7, 5, 5] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% frecuencia(L,[],[]). frecuencia(L,[I|R],[N|RN]) :- frecuencia_aux(L,I,N), frecuencia(L,R,RN). frecuencia_aux(L,[A,B],N) :- bagof(X,((member(X,L), A =< X, X =< B)),L1), length(L1,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 4: Definir la relación combinaciones(L1,N,L2) que tome como entrada % la lista L1 de valores distintos y un número entero no negativo N, y devuelva % la lista L2 formada por todas las combinaciones de elementos de L1 tomados de % N en N. Por ejemplo, % ?- combinaciones([1,3,2],2,L). % L = [[1, 2], [1, 3], [3, 2]] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% combinaciones(L1,N,L2) :- setof(X,((subsucesion(X,L1),length(X,N))),L2). % subsucesion(?L1,+L2) % se verifica si L1 es un subsucesion de L2. subsucesion([],[]). subsucesion([X|L1],[X|L2]) :- subsucesion(L1,L2). subsucesion(L1,[X|L2]) :- subsucesion(L1,L2).