:- use_module(library(clpfd)).

% Exercice 1
sudoku(Grille):-
    % solution Lucas
    %Grille = [[_,_,_,_..],[....] ..
    
    % solution Quentin
    %L1 =[_,_,_,_,_,_..],
    %L2 = ....
    %Grille = [L1,L2, ...]
    
    length(Grille,9),
    maplist(my_length(9),Grille),
    flatten(Grille,Liste),
    Liste ins 1..9,
    maplist(all_distinct,Grille),
    transpose(Grille,Transpose),
    maplist(all_distinct,Transpose),
    blocs(Grille),
    label(Liste).

blocs([]).
blocs([L1,L2,L3|Grille]):-
    bloc(L1,L2,L3),
    blocs(Grille).

bloc([],[],[]).
bloc([X1,X2,X3|L1],[Y1,Y2,Y3|L2],[Z1,Z2,Z3|L3]):-
    all_distinct([X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]),
    bloc(L1,L2,L3).

my_length(N,Liste):-length(Liste,N).

% Exercice 2
% L = [D1,D2, ....,D10]
pandigital(L) :-
    L = [_D1,D2,D3,D4,D5,D6,D7,D8,D9,D10],
    L ins 0..9, % Louis
    all_distinct(L), % Jordan
    (D2*100 + D3*10 + D4) mod 2 #= 0,  % Gauthier
    (D3*100 + D4*10 + D5) mod 3 #= 0,
    (D4*100 + D5*10 + D6) mod 5 #= 0,
    (D5*100 + D6*10 + D7) mod 7 #= 0,
    (D6*100 + D7*10 + D8) mod 11 #= 0,
    (D7*100 + D8*10 + D9) mod 13 #= 0,
    (D8*100 + D9*10 + D10) mod 17 #= 0,
    label(L).


niemePremier_aux(N,0,N).
niemePremier_aux(P,I,N):-
    is_prime(P),!,
    P1 #=P+1,
    I1 #=I-1,
    niemePremier_aux(P1,I1,N).
niemePremier_aux(P,I,N):-
	P1 #=P+1,	
    niemePremier_aux(P1,I,N).

niemePremier(N,I):-
    niemePremier_aux(2,I,N).

pproduit(N):-
    niemePremier(N,I),
    produit(N,I).

produit(N,N):- N<10,!.
produit(N,R):-
    M #= N mod 10,
    NewN #= N div 10,
    produit(NewN,NewR),
    R #= NewR*M.
    














