%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Practica 2 de PD 99--00                                               %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%******************************************************************************
% Ejercicio 1: Definici\'on recursiva de lista
%
% Definir un predicado "es_lista(X)" tal que tenga exito si "X" 
% es una lista y no lo tenga en caso contrario.
%
% Ejemplos                                                              
%
%  ?- es_lista(f(a,b)).
%  No
%  ?- es_lista([]).
%  Yes
%  ?- es_lista([a,b]).
%  Yes
%  ?- es_lista(.(a,b)).
%  No
%  ?- es_lista(.(a,[])).
%  Yes
%
% Nota: Estudia el comportamiento de los  predicados predefinidos is_list/1 y
% proper_list/1 y comp\'aralos con es_lista/1
%*****************************************************************************

%******************************************************************************
% Ejercicio 2: Concatenacion de listas
% Definir el predicado   conc(L1,L2,L3) de forma que si L1 y L2 son 
% listas, entonces L3 es la lista obtenida escribiendo los elementos 
% de L2 a continuaci\'on de los elementos de L1. Por ejemplo, 
% si L1 es [a,b] y L2 es [c,d], entonces L3 es [a,b,c,d].
%
% Ejemplos
%
% ?- conc([a,b],[c,d,e],L).
% L = [a, b, c, d, e] ;
% 
% ?- conc([a,b],L,[a,b,c,d]).
% L = [c, d] ;
% 
% ?- conc(L1,L2,[a,b]).
% L1 = []
% L2 = [a, b] ;
% L1 = [a]
% L2 = [b] ;
% L1 = [a, b]
% L2 = [] ;
% 
% ?- conc(L1,[b|L2],[a,b,c]).
% L1 = [a]
% L2 = [c] ;
% 
% ?- conc(_,[b|_],[a,b,c]).
% Yes
% 
% ?- conc(_,[b,c|_],[a,b,c,d]).
% Yes
% 
% ?- conc(_,[b,d|_],[a,b,c,d]).
% No
% 
% ?- conc(_,[X],[b,a,c,d]).
% X = d ;
% No
%
% Nota: conc/3 corresponde con el predicado predefinido append/3
%******************************************************************************

%******************************************************************************
% Ejercicio 3: Par consecutivo en una lista
% Definir el predicado "par_en_lista(L1,L2)" donde L1 es una lista de dos
% elementos que aparecen de forma consecutiva en la lista L2.
% Ejemplos
%
%  ?- par_en_lista(L,[1,2,3,4]).
%  L = [1, 2] ;
%  L = [2, 3] ;
%  L = [3, 4] ;
%  No
%*****************************************************************************

%*****************************************************************************
% Ejercicio 4: Definir el predicado 
%	                 inversa(L1,L2)
% de forma que si L1 es una lista, entonces L2 es la lista obtenida
% invirtiendo los elementos de L1. Por ejemplo, si L1 es [a,b,c]
% entonces L2 es [c,b,a].
%
% Ejemplos:
%
%  ?- inversa([a,b,c],L).
%    L = [c, b, a] ;
%    No
%
% Nota: inversa/2 coincide con el predicado predefinido reverse/2  
%******************************************************************************

%******************************************************************************
% Ejercicio 5: Definir recursivamente la relacion 
%	              borrado_1(L1,X,L2)
% de forma que L2 sea una lista obtenida eliminando una ocurrencia 
% del elemento X en la lista L1.  
%
% Ejemplos
%
% ?- borrado_1([a,b,a],a,L).
% L = [b, a] ;
% L = [a, b] ;
% No
% 
% ?- borrado_1(L,a,[1,2]).
% L = [a, 1, 2] ;
% L = [1, a, 2] ;
% L = [1, 2, a] ;
% No
% 
% ?- borrado_1([1,2,3],X,[1,3]).
% X = 2 ;
% No
%
% Nota: borrado_1/3 corresponde con el predicado predefinido select/3.
        Comp\'aralo con delete/3.
%******************************************************************************

%******************************************************************************
% Ejercicio 6: Definir la relaci\'on 
%	insertado(X,L1,L2)
% de forma que L2 sea una lista obtenida insertando el elemento X 
% en la lista L1. Usar la relaci\'on "borrado" ya definida.
%
% Sesi\'on 
%
% ?- insertado(a,[1,2],L).
% L = [a, 1, 2] ;
% L = [1, a, 2] ;
% L = [1, 2, a] ;
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 7: Definir recursivamente la relaci\'on 
%	permutacion_1(L1,L2)
% de forma que la lista L2 sea una permutaci\'on de los elementos de 
% la lista L1. Usar la relaci\'on "insertado" definida anteriormente. 
%
% Ejemplos
%
% ?- permutacion([a,b,c],L).
% L = [a, b, c] ;
% L = [b, a, c] ;
% L = [b, c, a] ;
% L = [a, c, b] ;
% L = [c, a, b] ;
% L = [c, b, a] ;
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 8: Definir recursivamente la relaci\'on 
%	permutacion_2(L1,L2)
% de forma que la lista L2 sea una permutaci\'on de los elementos de 
% la lista L1. Usar la relaci\'on "borrado_1" definida anteriormente. 
%
% Ejemplos
%
% ?- permutacion([a,b,c],L).
% L = [a, b, c] ;
% L = [a, c, b] ;
% L = [b, a, c] ;
% L = [b, c, a] ;
% L = [c, a, b] ;
% L = [c, b, a] ;
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 9: Definir utilizando recursion cruzada las relaciones 
% 	longitud_par(L) 
% y 
%	longitud_impar(L) 
% de forma que L sea una lista de longitud par o impar respectivamente.
%
% Ejemplos
%
% ?- longitud_par([a,b]).
% Yes
% 
% ?- longitud_par([a,b,c]).
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 10: Definir la relaci\'on 
%	rota(L1,L2) 
% de forma que la lista L2 sea la lista L1 en la que el primer elemento se ha
% situado en la \'ultima posici\'on. Usar la relaci\'on "conc" ya definida.
%
% Ejemplos
%
% ?- rota([a,b,c,d],L).
% L = [b, c, d, a] 
% Yes
% 
% ?- rota(L,[b,c,d,a]).
% L = [a, b, c, d] 
% Yes
%******************************************************************************

%******************************************************************************
% Ejercicio 11: Definir recursivamente la relaci\'on 
%	traduccion(L1,L2)
% de forma que la lista L2 sea la lista de nombres de los d\'igitos de la 
% lista L1. Usar la relacion auxiliar
%    	nombre(0,cero).
%    	nombre(1,uno).
%       ...
%    	nombre(9,nueve).
%
%
% Ejemplos
%
% ?- traduccion([1,3],L).
% L = [uno, tres] 
% Yes
%******************************************************************************

%******************************************************************************
% Ejercicio 12: Definir recursivamente la relaci\'on 
% 	subconjunto_ordenado(L1,L2)
% de forma que todos los elementos de la lista L1 sean tambi\'en 
% elementos de la lista L2 y est\'en en el mismo orden relativo.
%
% Ejemplos
%
% ?- subconjunto_ordenado([b,d],[a,b,c,d]).
% Yes
%
% ?- subconjunto_ordenado(L,[a,b,c]).
% L = [a, b, c] ;
% L = [a, b] ;
% L = [a, c] ;
% L = [a] ;
% L = [b, c] ;
% L = [b] ;
% L = [c] ;
% L = [] ;
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 13: Definir recursivamente la relaci\'on 
%	longitud(L,N)
% de forma que N sea la longitud de la lista L
%
% Sesi\'on 1.19
%
% ?- longitud([a,b,c],N).
% N = 3 
% Yes.
%
% Nota: longitud/ 2 coincide con el predicado predefinido length/2
%******************************************************************************

%******************************************************************************
% Ejercicio 14: Definir recursivamente la relaci\'on 
%	suma_lista(L,N)
% de forma que N sea la suma de los elementos de la lista L.
%
% Ejemplos
%
% ?- suma_lista([1,3,5],X).
% X = 9 
% Yes
%******************************************************************************

%******************************************************************************
% Ejercicio 15: Definir recursivamente la relaci\'on 
%	ordenada_creciente(L)
% de forma que verifique si L es una lista num\'erica ordenada de manera
% creciente. 
%
% Ejemplos
%
% ?- ordenada_creciente([1,3,3,5]).
% Yes
% 
% ?- ordenada_creciente([1,3,5,2]).
% No
%******************************************************************************

%******************************************************************************
% Ejercicio 16: Definir la relaci\'on 
%	suma_parcial(L1,X,L2) 
% de forma que la lista L2 sea un subconjunto de L1 tal que la suma de sus 
% elementos sea X. 
%
%  Ejemplos
%
% 	?- suma_parcial([1,2,5,3,2],5,L).
% 	L = [1, 2, 2] ;
% 	L = [2, 3] ;
% 	L = [5] ;
% 	L = [3, 2] ;
% 	No
%******************************************************************************

%******************************************************************************
% Ejercicio 17: Definir la relaci\'on 
%	n_esimo(N,L,X) 
% de forma que X sea el N-\'esimo elemento de la lista L.
%
% Ejemplos
%
% ?- n_esimo(2,[a,b,c,d],X).
% X = b
% Yes
%
% Nota: Estudia el comportamiento de los predefinidos nth0/3 y nth1/3
%       y comp\'aralos con n_esimo/3
%******************************************************************************

%******************************************************************************
%  Ejercicio 18: 
%  Supongamos que una compania aerea tiene la siguiente informacion sobre
%  vuelos entre distintas ciudades:
%
%  Hay vuelo directo:
%  * Desde Sevilla a Madrid
%  * Desde Madrid a Roma
%  * Desde Madrid a Barcelona
%  * Desde Barcelona a Milan
%  * Desde Milan a Paris
%  * Desde Paris a Roma
%
%  Ademas la ciudad "A" esta enlazada con "B" si hay un vuelo directo de "A" a
%  "C" y "C" esta enlazada con "B".
%  Definir los operadores "tiene_vuelo_a" y "esta_enlazada_con", de
%  manera que podamos realizar las siguientes cuestiones
%
%  Ejemplos                                                              
%
%  ?- barcelona esta_enlazada_con milan.
%     Yes
%  ?- sevilla esta_enlazada_con X.
%     X = madrid ;
%     X = roma ;
%     X = barcelona ;
%     X = milan ;
%     X = paris ;
%     X = roma ;
%     No
%  ?- X esta_enlazada_con milan.
%     X = barcelona ;
%     X = sevilla ;
%     X = madrid ;
%     No
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  



