所以我设法为Prolog写了SEND + MORE = MONEY程序,我在标记结果时遇到了麻烦。有关如何做到这一点的任何想法?我一直在使用标签功能,但它仍然无法正常工作。我迷失在这里。
:- lib(ic).
puzzle(List) :-
List = [S, E, N, D, M, O, R, Y],
List :: 0..9,
diff_list(List),
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
$= 10000*M + 1000*O + 100*N + 10*E + Y,
S $\= 0, M $\= 0,
shallow_backtrack(List).
shallow_backtrack(List) :-
( foreach(Var, List) do once(indomain(Var)) ).
diff_list(List) :-
( fromto(List, [X|Tail], Tail, []) do
( foreach(Y, Tail), param(X) do
X $\= Y
)
).
结果:
?- puzzle(X).
X = [9, 5, 6, 7, 1, 0, 8, 2]
Yes (0.00s cpu)
任何帮助将不胜感激!谢谢!
答案 0 :(得分:2)
以下是使用labeling
的程序变体:
:- lib(ic).
puzzle(List) :-
List = [S, E, N, D, M, O, R, Y],
List :: 0..9,
alldifferent(List),
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
$= 10000*M + 1000*O + 100*N + 10*E + Y,
S $\= 0, M $\= 0,
labeling(List).