/*
  concatenar(A,B,R).

  Predicado que comprueba R es la concantenación de las listas A y B

  Argumentos
  + A:
    - Significado: lista de elementos
    - Tipo: entrada y salida
  + B:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  Variables locales
  + X:
    - Significado: elemento; cabeza de la lista A
 + L1:
    - Significado: lista de elementos; cola de la lista A.
 + L2:
    - Significado: lista de elementos; lista B.
  + L3:
    - Significado: lista de elementos; cola la lista R.
*/

concatenar([],L,L).

concatenar([X|L1],L2,[X|L3]):- concatenar(L1,L2,L3).


/* 
  elementos(L,R).

  Predicado que comprueba si R contiene todos los  todos los elementos de la lista con sublistas  L

  Nota: se utiliza el corte "!"

  Argumentos
  + L:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  Variables:
   + X: 
    - Significado: cabeza de una lista, que puede ser un átomo o una sublista

  + Cola:
    - Significado: lista de elementos

  + R1:
    - Significado: lista de elementos

  + R2:
    - Significado: lista de elementos

  Predicado relacionado
  concatenar
 */
elementos([],[]).

elementos([X|Cola],R):-
	elementos(X,R1),!,
	elementos(Cola,R2),
	concatenar(R1,R2,R).

elementos([X|Cola],R):-
	elementos(Cola,R1),
	concatenar([X],R1,R).
