/*
 **********************************************************************
 *
 *      CLP(R) Version 2.0	(Example Programs Release)
 *	(C) Copyright, March 1986, Monash University
 *
 **********************************************************************
 */

%
% Crypto-arithmetic puzzle: 
% Need to assign integers from 0 to 9 to the letters S, E, N, D, M, O, R, Y
% without duplicates such that the equation
%
%        S E N D
%      + M O R E
%      ---------
%      M O N E Y
%
% is satisfied.
%

p(S, E, N, D, M, O, R, Y) :-
        S >  0, E >= 0, N >= 0, D >= 0, M > 0, O >= 0, R >= 0, Y >= 0,
        S <= 9, E <= 9, N <= 9, D <= 9, M <= 9, O <= 9, R <= 9, Y <= 9,
        D + E = Y + 10*C1,
        C1 + N + R = E + 10*C2,
        C2 + E + O = N + 10*C3,
        C3 + S + M = O + 10*M,
        carry(C1, C2, C3),
        dig(S), dig(E), dig(N), dig(D), dig(M), dig(O), dig(R), dig(Y),
        printf("S = %d, E = %d, N = %d, D = %d, M = %d, O = %d, R = %d, Y = %d \n",[S, E, N, D, M, O, R, Y]),
        difflist([S, E, N, D, M, O, R, Y]).

carry(1, 1, 1).
carry(1, 1, 0).
carry(1, 0, 1).
carry(1, 0, 0).
carry(0, 1, 1).
carry(0, 1, 0).
carry(0, 0, 1).
carry(0, 0, 0).

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

difflist([X | T]) :- notmem(X, T), difflist(T).
difflist([]).

notmem(X, [Y | Z]) :- X < Y, notmem(X, Z).
notmem(X, [Y | Z]) :- X > Y, notmem(X, Z).
notmem(X, []).

/**************************************************************/
/*** S = 9, E = 5, N = 6, D = 7, M = 1, O = 0, R = 8, Y = 2 ***/
/**************************************************************/

go:-
        p(S, E, N, D, M, O, R, Y),
	printf("\nAns:\n",[]),
        printf("S = %d, E = %d, N = %d, D = %d, M = %d, O = %d, R = %d, Y = %d \n",[S, E, N, D, M, O, R, Y]).

% Output:
%  S = 9, E = 8, N = 9, D = 9, M = 1, O = 0, R = 8, Y = 7 
%  S = 9, E = 8, N = 9, D = 8, M = 1, O = 0, R = 8, Y = 6 
%  S = 9, E = 8, N = 9, D = 7, M = 1, O = 0, R = 8, Y = 5 
%  S = 9, E = 8, N = 9, D = 6, M = 1, O = 0, R = 8, Y = 4 
%  S = 9, E = 8, N = 9, D = 5, M = 1, O = 0, R = 8, Y = 3 
%  S = 9, E = 8, N = 9, D = 4, M = 1, O = 0, R = 8, Y = 2 
%  S = 9, E = 8, N = 9, D = 3, M = 1, O = 0, R = 8, Y = 1 
%  S = 9, E = 8, N = 9, D = 2, M = 1, O = 0, R = 8, Y = 0 
%  S = 9, E = 7, N = 8, D = 9, M = 1, O = 0, R = 8, Y = 6 
%  S = 9, E = 7, N = 8, D = 8, M = 1, O = 0, R = 8, Y = 5 
%  S = 9, E = 7, N = 8, D = 7, M = 1, O = 0, R = 8, Y = 4 
%  S = 9, E = 7, N = 8, D = 6, M = 1, O = 0, R = 8, Y = 3 
%  S = 9, E = 7, N = 8, D = 5, M = 1, O = 0, R = 8, Y = 2 
%  S = 9, E = 7, N = 8, D = 4, M = 1, O = 0, R = 8, Y = 1 
%  S = 9, E = 7, N = 8, D = 3, M = 1, O = 0, R = 8, Y = 0 
%  S = 9, E = 6, N = 7, D = 9, M = 1, O = 0, R = 8, Y = 5 
%  S = 9, E = 6, N = 7, D = 8, M = 1, O = 0, R = 8, Y = 4 
%  S = 9, E = 6, N = 7, D = 7, M = 1, O = 0, R = 8, Y = 3 
%  S = 9, E = 6, N = 7, D = 6, M = 1, O = 0, R = 8, Y = 2 
%  S = 9, E = 6, N = 7, D = 5, M = 1, O = 0, R = 8, Y = 1 
%  S = 9, E = 6, N = 7, D = 4, M = 1, O = 0, R = 8, Y = 0 
%  S = 9, E = 5, N = 6, D = 9, M = 1, O = 0, R = 8, Y = 4 
%  S = 9, E = 5, N = 6, D = 8, M = 1, O = 0, R = 8, Y = 3 
%  S = 9, E = 5, N = 6, D = 7, M = 1, O = 0, R = 8, Y = 2 
%  
%  Ans:
%  S = 9, E = 5, N = 6, D = 7, M = 1, O = 0, R = 8, Y = 2 

?- printf("\n>>> Sample goal: go/0\n", []).