% RA-99: practica-01-sol.pl
% Revisi\'on de Prolog 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 1: Para empezar a trabajar con Prolog vamos a realizar un
% primer ejemplo que describe la carta de un restaurante. Los objetos que
% interesan son los platos que se pueden consumir y una primera
% clasificaci\'on puede ser la siguiente:
% * Entradas: paella, gazpacho, consom\'e
% * Carne: filete de cerdo, pollo asado
% * Pescado: trucha, bacalao
% * Postre: flan, nueces con miel, naranja
%
% Escribe como programa Prolog la clasificaci\'on de comidas   
% del restaurante. El programa constara de 10 cl\'ausulas y los predicados  
% a usar son entrada/1, carne/1, pescado/1 y postre/1.                    
% Prueba despu\'es el programa con preguntas como                           
%    ?- carne(X).                                                         
%    ?- carne(X), postre(X).                                                
%     ... etc...                                                          
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 2: Definir la relaci\'on "plato_principal(X)" que indicara que 
% un plato principal es un plato de carne o de pescado.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 3: Definir la relaci\'on "comida(X,Y,Z)" que indicara que la 
% comida consta de tres platos, una entrada "X", un plato  principal "Y" y 
% un postre "Z". 
% 
% Pidi\'endole respuestas sucesivas a la pregunta ?- comida(X,Y,Z).
% podemos generar todas las posibles comidas del restaurante.  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 4: 
% (a) ¿C\'omo se pregunta por las comidas con pescado sin modificar el 
%     programa?
% (b) ¿C\'omo se pregunta por las comidas con naranja sin modificar el 
%     programa?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 5: Para completar un poco la informaci\'on que tenemos sobre las
% comidas del restaurante vamos a mirar la lista de las calor\'ias que aporta
% cada plato: 
% * Una raci\'on de paella aporta 200 calor\'ias           
% * Una raci\'on de gazpacho aporta 150 calor\'ias         
% * Una raci\'on de consom\'e aporta 300 calor\'ias          
% * Una raci\'on de filete de cerdo aporta 400 calor\'ias  
% * Una raci\'on de pollo asado aporta 280 calor\'ias      
% * Una raci\'on de trucha aporta 160 calor\'ias           
% * Una raci\'on de bacalao aporta 300 calor\'ias          
% * Una raci\'on de flan aporta 200 calor\'ias             
% * Una raci\'on de nueces con miel aporta 500 calor\'ias  
% * Una raci\'on de naranja aporta 50 calor\'ias           
%
% Definir la relacion "calorias(X,N)" que indicar\'a  que una raci\'on de "X" 
% tiene "N" calor\'ias.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 6: Definir la relacion "valor_calorico(X,Y,Z,V)"  que indicar\'a
% que la comida comida(X,Y,Z) suma en total "V" calor\'ias.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 7: Definir la relacion "comida_equilibrada(X,Y,Z)" que indicar\'a
% que la comida comida(X,Y,Z) no supera las 800 calor\'ias.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 8: Vamos a ver como se plantea Prolog los distintos objetivos a
% lo largo de una deducci\'on y como llega a la respuesta final. Esto lo
% hacemos con el predicado "trace". Una vez cargado el predicado
% obtendremos informaci\'on detallada de todos los pasos.
%
% Carga el predicado "trace". As\'i
%    ?- trace.
%    Yes
%
% A continuaci\'on puedes realizar preguntas sobre el programa "menu". Ver\'as
% c\'omo Prolog indica que objetivo est\'a intentando demostrar en cada paso.
% Para poder seguirlo mejor debes dibujar a mano el \'arbol de deducci\'on de 
% la pregunta e ir siguiendo sobre el \'arbol cada uno de los pasos que da
% Prolog. Empieza con preguntas sencillas como "? -entrada(X)." o
% "?- plato_principal(X)", hasta llegar a "?- comida_equilibrada(X,Y,Z)".
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 9 [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. Por ejemplo,
%  ?- 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 10 [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, 
%    ?- 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 11 [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. Por ejemplo,
%    ?- par_en_lista(L,[1,2,3,4]).
%    L = [1, 2] ;
%    L = [2, 3] ;
%    L = [3, 4] ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 12: 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,
%     ?- inversa([a,b,c],L).
%     L = [c, b, a] ;
%     No
%
% Nota: inversa/2 coincide con el predicado predefinido reverse/2  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 13: Definir recursivamente la relaci\'on borrado_1(L1,X,L2)
% de forma que L2 sea una lista obtenida eliminando una ocurrencia 
% del elemento X en la lista L1. Por ejemplo,
%    ?- 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: El predicado borrado_1/3 corresponde con el predicado predefinido
% select/3. Comp\'aralo con delete/3.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 14: 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. Ejemplos:
%    ?- insertado(a,[1,2],L).
%    L = [a, 1, 2] ;
%    L = [1, a, 2] ;
%    L = [1, 2, a] ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 15: 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 16: 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 17: Definir utilizando recursi\'on cruzada las relaciones
% longitud_par(L) y longitud_impar(L) de forma que se verifique si L sea
% una lista de longitud par o impar respectivamente. Ejemplos
%    ?- longitud_par([a,b]).
%    Yes
%    ?- longitud_par([a,b,c]).
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 18: 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 19: 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 relaci\'on auxiliar
%    nombre(0,cero).
%    nombre(1,uno).
%      ...
%    nombre(9,nueve).
% Ejemplos
%    ?- traduccion([1,3],L).
%    L = [uno, tres] 
%    Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 20: 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 21: Definir recursivamente la relaci\'on longitud(L,N) de forma
% que N sea la longitud de la lista L. Por ejemplo,
%    ?- longitud([a,b,c],N).
%    N = 3 
%    Yes.
%
% Nota: longitud/ 2 coincide con el predicado predefinido length/2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 22: Definir recursivamente la relaci\'on suma_lista(L,N) de forma
% que N sea la suma de los elementos de la lista L. Por ejemplo,
%    ?- suma_lista([1,3,5],X).
%    X = 9 
%    Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 23: Definir recursivamente la relaci\'on ordenada_creciente(L)
% de forma que se verifique si L es una lista num\'erica ordenada de manera
% creciente. Por ejemplo,
%    ?- ordenada_creciente([1,3,3,5]).
%    Yes
%    ?- ordenada_creciente([1,3,5,2]).
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 24: 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. Por ejemplo,
% 	  ?- suma_parcial([1,2,5,3,2],5,L).
% 	  L = [1, 2, 2] ;
% 	  L = [2, 3] ;
% 	  L = [5] ;
% 	  L = [3, 2] ;
% 	  No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 25: Definir la relaci\'on n_esimo(N,L,X) de forma que X sea el
% N-\'esimo elemento de la lista L. Por ejemplo,
%    ?- 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 26: Supongamos que una compa\~n\'ia a\'erea 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
%
% Adem\'as 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
%    ?- 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 27: Definir la relaci\'on suma_hasta_1(N,S) de forma que N sea un
% entero positivo y S sea la la suma 1+2+3+...+N. Prevenir las ramas
% infinitas al pedir la segunda respuesta SIN USAR EL CORTE. Ejemplo de
% uso: 
%    ?- suma_hasta_1(4,Y).
%    Y = 10 ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 28: Definir la relaci\'on suma_hasta_2(N,S) de forma que N sea un
% entero positivo y S sea la la suma 1+2+3+...+N. Prevenir las ramas
% infinitas al pedir la segunda respuesta USANDO EL CORTE. Ejemplo de uso:
%    ?- suma_hasta_2(10,Y).
%    Y = 55 ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 29: Definir la relaci\'on aplana(L1,L2) de forma que 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.
%  Ejemplo de uso:
%     ?- 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 30: Definir la relaci\'on escribe_estrellas(L) que escriba en
% l\'ineas sucesivas tantas estrellas como indican los elementos de la lista
% de n\'umeros L. Por ejemplo, 
%    ?- escribe_estrellas([4,2,3]).
%    ****
%    **
%    ***
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 31: Definir la relaci\'on cubos de forma que pida un n\'umero
% entero (y un punto al acabar), devuelva su cubo y repita el proceso hasta
% que lea 'fin.'. Por ejemplo, 
% 	  ?- cubos.
%	  Escribe un n\'umero: 3.
%	  El cubo de 3 es 27
%    
%	  Escribe un n\'umero: 5.
%	  El cubo de 5 es 125
%    
%	  Escribe un n\'umero: fin.
%    
%	  Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 32: 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\'a 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 33: Definir la relacion plural(Singular,Plural) que toma como
% entrada la palabra Singular y devuelve la palabra Plural. Ejemplo de uso:
%    ?- plural(hoja,Plural).
%    Plural = hojas ;
%    No
%    ?- plural(angel,Plural).
%    Plural = angeles ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 34: Definir la relaci\'on lista_vector(Term,N,L) de forma que
% dados Term y N, donde Term es un t\'ermino sin variables y N es un entero
% positivo, L sea la lista [Term1,...,Term2]. Ejemplo de uso:
%    ?- lista_vector(k,10,L).
%    L = [k1, k2, k3, k4, k5, k6, k7, k8, k9, k10] ;
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 35:
% (a) Definir la relaci\'on genera_fichero que pida al usuario un entero
%     positivo N, que verifique que realmente es un entero positivo, y que
%     cree el fichero enteros.dat en el que escriba los n\'umeros del 1 al N
%     seguidos de un punto, uno en cada l\'inea. Esto es:
%         1.
%         2.
%         3.
%         ...
%         N
% (b) Definir la relaci\'on fichero_de_cuadrados(F1,F2) de forma que si F1 es
%     un fichero de n\'umeros (con la estructura de enteros.dat) entonces F2
%     es un fichero con la frase "El cuadrado de N es M" para cada N de
%     F1. Tomar como entrada enteros.dat y escribir la salida en
%     cuadrados.dat. Por ejemplo, si F1 es el fichero enteros.dat cuyo
%     contenido es 
%	       1.
%	       2.
%	       3.
%	       4.
%         5.
%     entonces, al evaluar la pregunta
%	       ?- fichero_de_cuadrados('enteros.dat', 'cuadrados.dat').
%     se crea el fichero cuadrados.dat cuyo contenido es
%	       el cuadrado de 1 es 1
%	       el cuadrado de 2 es 4
%	       el cuadrado de 3 es 9
%	       el cuadrado de 4 es 16
%	       el cuadrado de 5 es 25
%     Ejemplo de uso:
%         ?- genera_fichero.
%         Hasta que numero?: 5.
%         Yes
%         ?- fichero_de_cuadrados('enteros.dat','cuadrados.dat').
%         Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 36: Vamos a representar un entero positivo como la lista de sus
% d\'igitos. De esta forma el n\'umero 2356 lo representaremos como [2,3,5,6].
% Con esta representaci\'on, definir la relaci\'on siguiente_permutacion(L1,L2)
% de forma que L1 sea un entero positivo dado y L2 sea el siguiente 
% entero positivo compuesto con los mismos d\'igitos que L1.
%   (a) Definir siguiente_permutacion_1(L1,L2) CON permutacion.
%   (b) Definir siguiente_permutacion_2(L1,L2) SIN permutacion.
%   (c) Comparar siguiente_permutacion_1 y siguiente_permutacion_2
%       con ayuda del predicado time.
% Ejemplo de uso:
%      ?-  siguiente_permutacion_1([9,8,7,6,5,4,3,1,2],L).
%      L = [9, 8, 7, 6, 5, 4, 3, 2, 1] 
%      Yes
%      ?- siguiente_permutacion_2([9,8,7,6,5,4,3,1,2],L).
%      L = [9, 8, 7, 6, 5, 4, 3, 2, 1] 
%      Yes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

