:- module laba.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int, list, string, solutions.

main(!IO) :-
io.format("rsrx + zvv = srxs\n", [], !IO),
( if 
solutions.solutions(find, Results),
list.length(Results, Count), Count > 0
then
io.format("found %d results:\n", [i(Count)], !IO),
write_list(Results, "", print_solution, !IO)
else
io.format("has no solutions\n", [], !IO)
).

:- pred print_solution({int,int,int}::in, io::di, io::uo) is det.
print_solution({RSRX, ZVV, SRXS}, !IO) :-
io.format("%d + %d = %d\n", [i(RSRX) , i(ZVV), i(SRXS)], !IO).

:- pred find({int, int, int}::out) is nondet.
find({RSRX, ZVV, SRXS}) :-
Ds0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], C0 = 0,
pick(Ds0, X, Ds1), S1 = X+V+C0, S = S1 mod 10, C1 = S1/10,
pick(Ds1, R, Ds2),
pick(Ds2, V, Ds3), S2 = R+V+C1, X = S2 mod 10, C2 = S2/10, R \= 0,
pick(Ds3, S, Ds4),
pick(Ds4, Z, _), S3 = S+Z+C2, R = S3 mod 10, C3 = S3/10, Z \= 0,
S4 = R + C3, S = S4 mod 10, C4 = S4/10,
C4 = 0,
RSRX = 1000 R + 100 S + 10 R + X,
ZVV = 100 Z + 10 V + V,
SRXS = 1000 S + 100 R + 10 X + S.

:- pred pick(list(int)::in, int::out, list(int)::out) is nondet.
pick([X | Xs], X, Xs).
pick([X | Xs], Y, [X | Zs]) :- pick(Xs, Y, Zs).