/* SEND+MORE = MONEY */

/* tous_diff(Liste) <=> tous les elements de la Liste sont differents
deux a deux */

tous_diff([]).
tous_diff([A|S]) :- not(member(A, S)), tous_diff(S).

/* Arithmetique */

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

col(Reste_p, Ch1, Ch2, Chr, Reste_n) :- chiffre(Ch1), chiffre(Ch2), 
		Somme is Reste_p+Ch1+Ch2, 
		Reste_n is Somme//10, Chr is Somme mod 10.

/* L'enonce : Generate & Test  */

sol([S,E,N,D,M,O,R,Y]) :-		
	col( 0, D, E, Y, R1),
	col(R1, N, R, E, R2),		
	col(R2, E, O, N, R3),
	col(R3, S, M, O, R4),
	col(R4, 0, 0, M, 0),
	not(M=0),
	tous_diff([S,E,N,D,M,O,R,Y]).
        
/* La jolie impression */

joli([S,E,N,D,M,O,R,Y]) :- nl, 
		tab(10), write(S), write(E), write(N), write(D), nl,
   tab(7), write(' + '), write(M), write(O), write(R), write(E), nl,
   tab(8), write('------'), nl,
  	    tab(9), write(M), write(O), write(N), write(E), write(Y),
		nl.

/* Le predicat d'appel */

ca :- sol([S,E,N,D,M,O,R,Y]), joli([S,E,N,D,M,O,R,Y]), fail.
