% Examen de "Programación Declarativa" (Febrero de 2000) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 1: [2 puntos] Definir la relación capicuas(N,L) que tome como dato % de entrada el número entero positivo N y devuelva la lista L formada por % todos los números enteros positivos capicúa menores que N. Por ejemplo, % ?- capicuas(100,L). % L = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99] % ?- capicuas(1000,L). % L = [1,2,3,4,5,6,7,8,9,11,22,33,44,55,...,979,989,999] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% capicuas(N,L) :- M is 10**N, setof(X,(between(1,M,X),es_capicua(X)),L). es_capicua(N) :- name(N,L), reverse(L,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 2: [2 puntos] Definir la relación intercambia(+E1,-E2) que reciba % como entrada una expresión algebraica E1 (formada por constantes, números y % los operadores + y -) y devuelva la expresión E2 obtenida de E1 intercambiado % los operadores + y -. Por ejemplo, % ?- intercambia(a-3+b+5-1,E). % E = a+3-b-5+1 ; % No %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% intercambia(X1+X2,Y1-Y2):- !, intercambia(X1,Y1), intercambia(X2,Y2). intercambia(X1-X2,Y1+Y2):- !, intercambia(X1,Y1), intercambia(X2,Y2). intercambia(X,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 3: [2 puntos] Definir la relación letras(F,N) que tome como dato de % entrada una frase (entre comillas simples) y devuelva el número N de letras % DISTINTAS que aparecen en F distinguiendo entre mayúsculas y minúsculas. Por % ejemplo, % ?- letras('Mi mama me mima', N). % N = 5 % ?- letras('esto lo apruebo seguro',N). % N = 11 % (Idea: Usar predefinidos). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% letras(F,N):- name(F,Codigo), delete(Codigo,32,Nuevo_codigo), sort(Nuevo_codigo,Nuevo_codigo_sin_duplicados), length(Nuevo_codigo_sin_duplicados,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 4: [2 puntos] Definir la relación segmento(L1,N,M,L2) que tome como % entrada la lista L1 y los enteros positivos N y M con N menor o igual a M y % devuelva la lista L2 formada por los elementos de L1 entre las posiciones N y % M, ambas inclusive. Por ejemplo, % ?- segmento([a,c,d,a,b],2,4,L). % L = [c, d, a] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% segmento([_|L1],N,M,L2) :- N > 1, N1 is N-1, M1 is M-1, segmento(L1,N1,M1,L2). segmento([X|L1],1,M,[X|L2]) :- M > 0, M1 is M-1, segmento(L1,1,M1,L2). segmento(_,1,0,[]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 5: [2 puntos] Definir la relación rota_todas(L1,L2) que reciba como % entrada una lista L1 y devuelva la lista L2 cuyos elementos son las listas % formadas por las sucesivas rotaciones de los elementos de la lista L1. Por % ejemplo, % ?- rota_todas([2,3,4,1],L). % L = [[1,2,3,4],[4,1,2,3],[3,4,1,2],[2,3,4,1]] % (Nota: No importa el orden de los elementos en L2.) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rota_todas(L1,L2):- aux_rota_2(L1,[L1],L2). aux_rota_2([_],L,L). aux_rota_2([_|L],[Z|Ac],Sal):- rota(Z,Z1), aux_rota_2(L,[Z1,Z|Ac],Sal). rota([X|Y],L):- append(Y,[X],L).