/*
  pertenece(X,L) 

  Predicado que comprueba comprueba si X pertenece a L

   Argumentos
  + X:
    - Significado: elemento
    - Tipo: entrada y salida
 
  + L:
    - Significado: lista de elementos
    - Tipo: entrada y salida
 */
pertenece(X,[X|_]).
pertenece(X,[_|L]):-pertenece(X,L).



/*
  comunes(L1,L2,R) 

   Predicado que comprueba si R es una lista que contiene los elementos comunes a L1 y L2

   Nota: se utiliza la negación not

   Argumentos
  + L1:
    - Significado: lista de elementos
    - Tipo: entrada y salida
  + L2:
    - Significado: lista de elementos
    - Tipo: entrada 
  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  Variable local
   + X:
     - Significado: elemento 

  Predicado relacionado
  pertenece
 */
comunes([],_,[]).

comunes([X|L1],L2,[X|R]):- 
			pertenece(X,L2), 
			comunes(L1,L2,R).

comunes([X|L1],L2,R):- 
			not(pertenece(X,L2)), 
			comunes(L1,L2,R).


/*
  comunes_bis(L1,L2,R) 

   Predicado que comprueba si R es una lista que contiene los elementos comunes a L1 y L2

   Nota: se utiliza el corte "!"

   Argumentos
  + L1:
    - Significado: lista de elementos
    - Tipo: entrada y salida
  + L2:
    - Significado: lista de elementos
    - Tipo: entrada 
  + R:
    - Significado: lista de elementos
    - Tipo: entrada y salida

  Variable local
   + X:
     - Significado: elemento 

  Predicado relacionado
  pertenece
 */
comunes_bis([],_,[]).

comunes_bis([X|L1],L2,[X|R]):- 
			pertenece(X,L2), 
			!, 
			comunes_bis(L1,L2,R).

comunes_bis([_|L1],L2,R):- 
			comunes_bis(L1,L2,R).
