/*
  rotar(L,R)

  Predicado que comprueba si R es una rotación de la lista L, es decir, la cabeza de L es el último elemento de R.

  Argumentos
  + L:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

 Variables locales
 + X:
    - Significado: elemento; cabeza de L
 + Cola:
    - Significado: lista de elementos; cola de L

  Predicado relacionado
   incluir_al_final
*/

rotar([],[]).

rotar([X|Cola],R):- incluir_al_final(X,Cola,R). 




/*
  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).



/*
  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.

 Predicado auxiliar
  concatenar

*/

concatenar([],L,L).

concatenar([X|L1],L2,[X|L3]):- concatenar(L1,L2,L3).





