% Examen de "Programación Declarativa" (29 de Noviembre de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 1: Definir la relación cuenta_ocurrencias(+E,+N,?M) que se % verifique si M es el número de veces que ocurre el número N en la expresión % algebraica E (se supone que E está formada por una combinación de números y % símbolos de función binarios). Por ejemplo, % ?- cuenta_ocurrencias(5+2//3^2+2,2,M). % M = 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% cuenta_ocurrencias(E,N,M) :- E =.. [_,E1,E2], !, cuenta_ocurrencias(E1,N,M1), cuenta_ocurrencias(E2,N,M2), M is M1+M2. cuenta_ocurrencias(N,N,M) :- !, M = 1. cuenta_ocurrencias(_,_,0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 2: Definir la relación sustituye_máximo(+L1,?L2) que se verifique % si L1 es una lista no vacía de números y L2 es la lista obtenida a partir de % L1 sustituyendo todas las ocurrencias del máximo de L1 por el átomo % "max". Por ejemplo, % ?- sustituye_máximo([5,3,1,3,5,2,5],L). % L = [max, 3, 1, 3, max, 2, max] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sustituye_máximo(L1,L2) :- máximo(L1,Z), sustituye(L1,Z,L2). máximo([X],X). máximo([X,Y|Z],M) :- máximo([Y|Z],K), M is max(X,K). sustituye([],_,[]). sustituye([X|L1],X,[max|L2]) :- !, sustituye(L1,X,L2). sustituye([Z|L1],X,[Z|L2]) :- sustituye(L1,X,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 3: Encontrar el menor múltiplo de 17 mayor que 1000 capicúa. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % busca(+M,-N) % se verifica si N es el menor múltiplo de 17 mayor que M capicúa. Por % ejemplo, % ?- busca(1000,N). % N = 2992 ; % No busca(M,N) :- menor_múltiplo(M,X), busca_aux(X,N). % menor_múltiplo(+M,-X) % se verifica si X es el menor múltiplo de 17 mayor que M. Por ejemplo, % ?- menor_múltiplo(16,X). % X = 17 % ?- menor_múltiplo(17,X). % X = 17 % ?- menor_múltiplo(18,X). % X = 34 menor_múltiplo(M,M) :- M mod 17 =:= 0, !. menor_múltiplo(M,X) :- X is ((M//17)+1)*17. % busca_aux(+M,-N) % se verifica si N es el menor entero de que es una suma de M y un múltiplo % de 17 que es capicúa. Por ejemplo, % ?- busca_aux(1003,N). % N = 2992 ; % No busca_aux(X,X) :- es_capicúa(X), !. busca_aux(X,N) :- X1 is X+17, busca_aux(X1,N). % es_capicúa(+N) % se verifica si X es capicúa. Por ejemplo, % ?- es_capicúa(12321). % Yes % ?- es_capicúa(123421). % No es_capicúa(X) :- name(X,L), reverse(L,L). % ?- busca(0). % El número es: 2992