:- use_module(library(clpfd)).

%exo1
%q1
divisible(X,Y):-X >=Y,mod(X,Y)=:=0.

listenombre(0,[]):-!.
listenombre(X,[X|R]):-X1 is X-1, listenombre(X1,R). 

estpremier(Y) :- findall(X,(listenombre(Y,NL),member(X,NL),divisible(Y,X)),L), length(L,O),O =:= 2.



%q2
listeNombrePremier(B,L) :- setof(X,(listenombre(B,NL),member(X,NL), estpremier(X)),L).

comparaisonListe([],[]):-!.
comparaisonListe([T|R],[Y|U]) :- T =:= Y , comparaisonListe(R,U).

entiers_premiers(B,L) :-listeNombrePremier(B,NL), comparaisonListe(NL, L).

%exo2 - 3  
listeDiviseur(Y,L) :- findall(X,(listenombre(Y,NL),member(X,NL),X\==Y,0 =:= mod(Y,X)),L).

sommeListe([],0):-!.
sommeListe([T|R],RES):- sommeListe(R,RES1), RES is T + RES1. 

parfait(N) :- listeDiviseur(N,L), sommeListe(L,RES), RES =:= N.
amicaux(N1,N2):- listeDiviseur(N1,L1), listeDiviseur(N2,L2), sommeListe(L1,RES1), sommeListe(L2,RES2), RES1 =:= N2, RES2 =:= N1.

%exo4
triRapideAcc(L,T):-
triRap(L,[],T).

triRap([],L,L).
triRap([P|L],Acc,T):-
partage(P,L,L1,L2),
 triRap(L2,Acc,T1),
 triRap(L1,[P|T1],T).

partage(_,[],[],[]). 
partage(P,[X|T],[X|U1],U2):-
P>X,
partage(P,T,U1,U2).
partage(P,[X|T],U1,[X|U2]):-
P=<X,
partage(P,T,U1,U2).

%exo5


carremagiqueContraintes :- Vars=[
								 A1,A2,A3,
								 B1,B2,B3,			
								 C1,C2,C3
								 ], Vars ins 1..9,all_different(Vars),label(Vars),sommeListe([A1,A2,A3],RES1), sommeListe([B1,B2,B3],RES2),
								 sommeListe([C1,C2,C3],RES3),sommeListe([A1,B1,C1],RES4) ,sommeListe([A2,B2,C2],RES5),  
								 sommeListe([A3,B3,C3],RES6), sommeListe([A1,B2,C3],RES7), sommeListe([A3,B2,C1],RES8),
								RES1 #= RES2, RES2 #= RES3, RES3 #= RES4, RES4 #= RES5, RES5 #= RES6, RES6#=RES7, RES7 #= RES8,
								write(A1),write(' '),write(A2),write(' '), write(A3), write('\n'),
								write(B1), write(' ') , write(B2),write(' '), write(B3), write('\n') ,
								write(C1),write(' '),write(C2),write(' '), write(C3),!.	


%exo6

etoiles(0) :-!. 
etoiles(N) :- write('*'),write(' '), N1 is N -1 , etoiles(N1).	



triangle(N) :- triangleDessin(N,1). 

triangleDessin(0,_):-!.
triangleDessin(N,ACC) :- tab(N), etoiles(ACC), N1 is N-1, ACC1 is ACC +1,  write('\n'), triangleDessin(N1,ACC1).

sousEns([],_).
sousEns([T|Q],L) :-
	member(T,L),
	sousEns(Q,L).