solve(I) :-
  repl(I,J,K),
  fd_domain(K,1,1000),
  fd_all_different(K),
  constr(J),
  fd_labeling(K).

repl([],[],[]).
repl([x|L],[A|M],[A|N]) :- !, repl(L,M,N).
repl([O|L],[O|M],N) :- repl(L,M,N).

constr([]).
constr([X|L]) :- number(X), !, getvars(L,M), write(M), write(X), sum(X,M,0), constr(L).
constr([X|L]) :- constr(L).

getvars([],[]).
getvars([X|L],[]) :- number(X), !.
getvars([X|L],[X|M]) :- getvars(L,M).

sum(X,[],N) :- X #= N.
sum(X,[Y|L],N) :- sum(X,L,N+Y).
