instances digit 0..9. index s,e,n,d,m,o,r,y. static v : index -> digit. c : {0,1,2,3} -> {0,1} = 0. vars I,J : index. rules v(I) in digit. % generate digits :- I!=J, v(I)=v(J). % all different, one each other :- v(s)=0. :- v(m)=0. % compute the carries c(3)=1 :- v(s) + v(m) > 9. c(2)=1 :- v(e) + v(o) > 9. c(1)=1 :- v(n) + v(r) > 9. c(0)=1 :- v(d) + v(e) > 9. :- c(3) != v(m). :- ( v(s) + v(m) + c(2) ) mod 10 != v(o). :- ( v(e) + v(o) + c(1) ) mod 10 != v(n). :- ( v(n) + v(r) + c(0) ) mod 10 != v(e). :- ( v(d) + v(e) ) mod 10 != v(y). % s e n d % m o r e % m o n e y % 9 5 6 7 % 1 0 8 5 % 1 0 6 5 2