% PD-99: Práctica 3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 1: [Bratko-86, p.162] Definir el predicado simplifica(+E1,-E2)
% donde E2 es la expresión obtenida simplificando las sumas de los números que 
% aparecen en E1  (que es una suma de números y átomos). Por ejemplo,
%     ?- simplifica(1+a+2.5,X).
%     X = a+3.5
%     Yes
%     
%     ?- simplifica(1+a+4+2+b+c,X).
%     X = a+b+c+7 
%     Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 2: Definir un predicado 
%     n_derecha(+L,+N,?X)
% que se verifique si X es el elemento situado en la N-ésima posición,
% empezando a contar por la derecha, de la lista L. Por ejemplo, 
%     ?- n_derecha([a,b,c,d,e],4,X).
%     X = b ;
%     No
%     ?- n_derecha([a,b,c,d,e],15,X).
%     No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 3: Definir la relación
%     cubos
% de forma que pida un número entero (y un punto al acabar), devuelva su cubo y
% repita el proceso hasta que lea 'fin.'. Por ejemplo, 
%     ?- cubos.
%     Escribe un número: 3.
%     El cubo de 3 es 27
%     
%     Escribe un número: 5.
%     El cubo de 5 es 125
%     
%     Escribe un número: fin.
%     
%     Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 4: Definir un predicado
%     haz_tabla
% que cree un fichero 'tabla.pl' y que en ese fichero escriba un nuevo
% programa Prolog. Este nuevo programa constará de 100 hechos de la 
% forma
%     multiplica(X,Y,Z).
% donde X e Y recorren los valores del 1 al 10 y Z es X*Y.
% Carga luego el programa 'tabla.pl' y realiza preguntas sobre el
% predicado multiplica/3.
%
% Ejemplo de uso:
%     ?- haz_tabla.
%     Yes
%     ?- [tabla].
%     tabla compiled, 0.02 sec, 6,480 bytes.
%     Yes
%     ?- multiplica(3,X,15).
%     X = 5 ;
%     No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 5: Definir, sin usar cortes, la relación
%     elementos_pares_1(+L1,?L2)
% que se verifique si L2 es la lista de los elementos pares de la lista de
% números L1. Por ejemplo,
%     ?- elementos_pares([1,2,4,3,5],L).
%     L = [2,4];
%     No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 6: Definir la relación
%     elementos_pares_2(L1,L2)
% como en el ejercicio anterior, pero esta vez usando el corte en la
% definición.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 7: Definir la relación
%     aplana(+L1,?L2)
% que se verifique si L1 es una lista y L2 la lista formada mediante la
% siguiente definicion recursiva:
% - Si X es un elemento de L1 que no es lista, entonces lo ponemos en L2
% - Si X es un elemento de L1 que a su vez es una lista ponemos en su
%   lugar el resultado de aplanar X.
% Por ejemplo,
%     ?- aplana([a,[[1],[2,[3]]],b,[],[y,[[z]]]],L).
%     L = [a, 1, 2, 3, b, y, z] ;
%     No
%     ?- aplana([[],[]],L).
%     L = [] ;
%     No
%     ?- aplana([a,b,c,d,e],L).
%     L = [a, b, c, d, e] ;
%     No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 8: Definir la relación
%     mensaje_secreto.
% que lea el contenido del fichero mensaje.dat. En dicho fichero hay
% un mensaje secreto que debeis descifrar. Para descodificarla debeis
% sustituir cada carácter por el carácter cuyo código ASCII sea el
% del carácter leido aumentado en una unidad: Esto es:
%     Caracter => Su_codigo_ASCII => Su_codigo_ASCII + 1 => Nuevo_caracter
% Nota: El Código para end_of_file es -1.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

