% Cryptoaddition:
% Find the unique answer to:
%  SEND
% +MORE
% -----
% MONEY
% where each letter is a distinct digit.

:- main.

q :- statistics(runtime,_), send,
     statistics(runtime,[_,Y]), write('time : '),write(Y), nl,
     halt_or_else(0,true).


send :-
	digit(D), digit(E), D=\=E,
	sumdigit(0, D, E, Y, C1),
	digit(N), N=\=Y, N=\=E, N=\=D,
	digit(R), R=\=N, R=\=Y, R=\=E, R=\=D,
	sumdigit(C1,N, R, E, C2),
	digit(O), O=\=R, O=\=N, O=\=Y, O=\=E, O=\=D,
	sumdigit(C2,E, O, N, C3),
	leftdigit(S), S=\=O, S=\=R, S=\=N, S=\=Y, S=\=E, S=\=D,
	leftdigit(M), M=\=S, M=\=O, M=\=R, M=\=N, M=\=Y, M=\=E, M=\=D,
	sumdigit(C3,S, M, O, M),
	write(' '),write(S),write(E),write(N),write(D),nl,
	write('+'),write(M),write(O),write(R),write(E),nl,
	write('-----'),nl,
	write(M),write(O),write(N),write(E),write(Y),nl,nl,
	fail.
send.

sumdigit(C, A, B, S, D) :-
	X is (C+A+B),
	(X<10
	-> S=X,       D=0
	;  S is X-10, D=1
	).

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

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



:- q.



syntax highlighted by Code2HTML, v. 0.9.1