% Programación declarativa (Septiembre 2000)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 1: [2.5 puntos]
% Define separa(Cons,Letras,Numeros) que reciba como entrada una Constante
% en la cual aparecen letras y números (p.e.: ab1c2) y devuelva los átomos
% Letras y Numeros, formados, respectivamente por las letras y los
% números que aparecen en Constante.
%
%  ?- separa(ab1c23d,Letras,Numeros).
%     Letras = abcd
%     Numeros = 123 ;
%     No
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 2: [2.5 puntos]
% Se dice que [X,Y,Z] es una terna pitagórica si X,Y,Z verifican:
%  (1) 0<X, X=<Y, Y=<Z
%  (2) X^2+Y^2=Z^2
%
% De entre todas las ternas pitagóricas proporcionales, p.e. [3,4,5],
% [6,8,10], [9,12,15],... siempre podemos encontrar una terna "minima" (en
% este caso [3,4,5]).
% Definir un procedimiento ternas_np(+N,?L) que se verifique si L es la lista
% de ternas pitagóricas minimales formadas por números enteros menores o
% iguales que el número N. Por ejemplo:
%
%  ?- terna_np(100,L).
%      L = [[3, 4, 5],    [5, 12, 13],  [7, 24, 25],  [8, 15, 17], 
%           [9, 40, 41],  [11, 60, 61], [12, 35, 37], [13, 84, 85], 
%           [16, 63, 65], [20, 21, 29], [28, 45, 53], [33, 56, 65], 
%           [36, 77, 85], [39, 80, 89], [48, 55, 73], [65, 72, 97]] ;
%      No
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 3: [2.5 puntos] 
% Diremos que una sucesión tiene la propiedad "p" si cada
% número ha sido generado a partir del anterior sumando 3 o restando 2, por
% ejemplo, las sucesiones siguientes tienen la propiedad "p":
%       0, 3, 6, 4, 7, 5, 3, ...
%       8, 11, 9, 7, 10, 13, 11, ...
% Definir el predicado listaprop(+L) que se verifique si L es una lista
% formada por los números del 1 al 10 tal que:
%   * Formen una sucesión con la propiedad "p"
%   * El número 6 aparezca en séptima posición
%
%  Ejemplo de uso:
%
%   ?- listaprop(L).
%      L = [3, 1, 4, 2, 5, 8, 6, 9, 7, 10] 
%      Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 4: [2.5 puntos]
% Dadas dos "palabras" A1 y A2 (representados por átomos). Diremos que la
% palabra A3 es una combinación de A1 y A2 si existe un
% sufijo propio de A1 que coincide con un prefijo propio de A2 y A3 se obtiene
% de A1 y A2 superponiendo la parte común. (Un prefijo o sufijo es propio si
% no es el vacío ni el total). Por ejemplo de "casa" y "sala" obtenemos
% "casala". Este proceso se puede volver a repetir, de forma que de
% "casala" y "aladino" formamos "casaladino".
%  Se pide definir el el predicado combina(L,P,N) que reciba como entrada
%  una lista de palabras L y devuelva P y N. P es una palabra formada por
%  el máximo número de palabras posibles de L y N es este número máximo.
% Por ejemplo:
%
%  ?- combina([angel,asno,casa,sala],L,N).
%     L = casalangel 
%     N = 3 ;
%
%     L = casalasno
%     N = 3 ;
%
%     No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

