% PD 2007-08: Examen 2 (Grupos 2C y 2D) (21 de enero de 2008)
% ====================================================================== 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Se dice que la palabra P1 es semejante por dislexia a la palabra P2
% si P2 se obtiene permutando dos letras consecutivas de P1. Por
% ejemplo, "ohla" es semejante por dislexia a "hola".
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 1: Definir en Prolog la relación semejantePorDislexia(A1,A2)
% que se verifique si el átomo A1 es semejante por dislexia al átomo
% A2. Por ejemplo,
%    ?- semejantePorDislexia(hola,hloa).
%    Yes
%    ?- semejantePorDislexia(hola,X).
%    X = ohla ;
%    X = hloa ;
%    X = hoal ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

semejantePorDislexia(A1,A2) :-
   name(A1,L1),
   semejantePorDislexiaAux(L1,L2),
   name(A2,L2).

semejantePorDislexiaAux(L1,L2) :-
   append(A,[X,Y|B],L1),
   append(A,[Y,X|B],L2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dado un número entero positivo, consideraremos que la reducción del
% mismo es el resultado de sumar sus dígitos. Esta suma se aplicará
% recursivamente sobre cada resultado parcial hasta que se obtenga un
% valor con un único dígito. Por ejemplo, dado el número 4821, la suma
% de sus dígitos da como resultado 15, que a su vez, al sumarse, da
% 6. Por tanto, la reducción de 4821 será 6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejericio 3: Definir en Prolog la relación reduce(+N,-R) que se
% verifique si N es la reducción de N. Por ejemplo,
%    ?- reduce(4821,N).
%    N = 6 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

reduce(X,X) :-
   X < 10, !.
reduce(X,Y) :-
   cifras(X,L),
   suma(L,X1),
   reduce(X1,Y).

% cifras(+N,-L) se verifica si L es la lista de las cifras de N. Por ejemplo,
%    ?- cifras(4821,L).
%    L = [4, 8, 2, 1]
cifras(X,L) :-
   name(X,L1),
   name(0,[N0]),
   findall(D,(member(Y,L1),D is Y-N0),L).


