/*
  concatenar(A,A,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).


/*

  incluir_al_principio(X,L,R).

  Predicado que comprueba si R es una lista cuya cabeza es X y su cola L

  Argumentos
  + X:
    - Significado: elemento
    - Tipo: entrada y salida
  + L:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida
*/
incluir_al_principio(X,L,[X|L]).


/*
  incluir_al_final(X,L,R).

  Predicado que comprueba si R es una lista compuesta por una lista L y un último elemento que es X.

  Argumentos
  + X:
    - Significado: elemento
    - Tipo: entrada y salida
  + L:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  Predicado relacionado
   concatenar
*/

incluir_al_final(X,L,R):- concatenar(L,[X],R).
