% Exercice 1. Boucle "fail-driven". Attention : une boucle par
% "tail-recursion" ne peut pas être infinie, car il y a empilement de
% contexte à chaque appel.

lit_car :-
    repeat,
      get0(C),
      traiter(C),
    fail.

traiter(97) :- !.
traiter(X) :- put(X).

% Exercice 2. Ne pas oublier la condition de réussite du prédicat !
diff(X,Y) :-
	X == Y,
	!,
	fail.
diff(X,Y).

% Exercice 3.

sous_ens([],_).
sous_ens([T|Q],L) :-
	member(T,L),
	sous_ens(Q,L).

member(X,[X|_]) :- !.
member(X,[_|Q]) :-
	member(X,Q).

% Exercice 4. Il est nécessaire de traiter différemment la recherche
% d'une correspondance, et le traitement de deux listes qui doivent
% être en parallèle.
sous_liste([],_).
sous_liste([X|Q1],[X|Q2]) :-
	suite(Q1,Q2).
sous_liste(X,[T2|Q2]) :-
	sous_liste(X,Q2).

suite([],_).
suite([X|Q1],[X|Q2]) :-
	suite(Q1,Q2).

% Variante de l'exercice 4 inspirée par vos copies :
% Principe de génération-test : on extrait une sous-liste, et on
% la compare avec la sous-liste candidate.
sous_liste([T1|Q1],L) :-
	extraction(T1,L,L1),
	verification([T1|Q1],L1).

extraction(X,[X|Q],[X|Q]).
extraction(X,[Y|Q],Q1) :-
	extraction(X,Q,Q1).

verification([],_) :- !.
verification([T1|Q1],[T2|Q2]) :-
	T1 == T2,
	verification(Q1,Q2).

