% -----------------------------------------------
%                    Exercice 2
%           Florian Lepot & Maxime Fabre
% -----------------------------------------------

% Titre : Cryptarithmétique
% Prédicat : cryptarithmetique/3
% Usage : size(?Liste, ?Liste, ?Liste)

cryptarithmetique([L,O,G,I,C], [L,O,G,I,C], [P,R,O,L,O,G]) :-
                                non_zero_values(L),
                                values(O),
                                values(G),
                                values(I),
                                values(C),
                                values(R),

                                R \= L,
                                O \= L, O \= R,
                                G \= O, G \= L, G \= R,
                                I \= G, I \= O, I \= L, I \= R,
                                C \= I, C \= G, C \= O, C \= L, C \= R,

                                retenue(R1),
                                retenue(R2),
                                retenue(R3),
                                retenue(R4),

                                P = 1,
                                L + L + R4 =:= R + 10*P,
                                O + O + R3 =:= O + (R4*10),
                                G + G + R2 =:= L + (R3*10),
                                I + I + R1 =:= O + (R2*10),
                                C + C =:= G + (R1*10).

non_zero_values(1).
non_zero_values(2).
non_zero_values(3).
non_zero_values(4).
non_zero_values(5).
non_zero_values(6).
non_zero_values(7).
non_zero_values(8).
non_zero_values(9).

values(0).
values(1).
values(2).
values(3).
values(4).
values(5).
values(6).
values(7).
values(8).
values(9).

retenue(0).
retenue(1).