


tete([T|Q],T).

queue([T|Q],Q).

element1(E,[E|L]).
element1(E,[_|L]):- element1(E,L).

element2(E,L):- conc(L1,[E|L2],L).


hors_de(X,L):-
	nonvar(X),
	hors(X,L).
hors(X,[]).
hors(X,[Y|L]):-
	X \== Y,               /* ne marche que si X est connu: c'est pour  */
	hors_de(X,L).          /* cela que ce predicat n'est pas inversible */

conc([],L,L).
conc([T|L1],L2,[T|L3]):- conc(L1,L2,L3).

appartient(Sous_liste,Sur_liste):-
	conc(L2,L3,Sur_liste),
	conc(L1,Sous_liste,L2).

retrait_elt1(E,Ldepart,Lresultat):-
	conc(L1,[E|L2],Ldepart),
	conc(L1,L2,Lresultat).

retrait_elt2(J,[J|L],L).
retrait_elt2(J,[K|L],[K|M]):- retrait_elt2(J,L,M).


retrait_tous_les_elts(J,[J|L],LR):-
	 retrait_les_elts1(J,L,LR).
retrait_tous_les_elts(J,[K|L],[K|M]):- 
	 K \== J,
	retrait_tous_les_elts(J,L,M).
retrait_les_elts1(_,[],[]).
retrait_les_elts1(J,[J|L],LR):-
	 retrait_les_elts1(J,L,LR).
retrait_les_elts1(J,[K|L],[K|LR]):- 
	 K \== J,
	 retrait_les_elts1(J,L,LR).

retrait_liste(Sous_liste,ListeInitiale,ListeResultat):-
	conc(L2,L3,ListeInitiale),
	conc(L1,Sous_liste,L2),
	conc(L1,L3,ListeResultat).

permuter([],[]).
permuter(L,[T|Q]):-
	retrait_elt2(T,L,L2),
	permuter(L2,Q).


renverser_1([],[]).
renverser_1([A|L],Z):-
	renverser_1(L,L1),
	conc(L1,[A],Z).


renverser_2(L1,L2):- renverser_3(L1,[],L2).

renverser_3([],L,L).
renverser_3([T|Q],L_aux,L):-
	renverser_3(Q,[T|L_aux],L).


