拼图中的下面每个字母唯一代表0,1,...,9中的10个数字之一。没有两个字母代表相同的数字。对于拼图中下面的每个单词,第一个字母不是0.
Ex:SHINE - THAN == KNIT
我所拥有的代码就是这个...
:- lib(ic).
exampleOne(List) :-
List = [S, H, I, N, E, T, A, K],
List :: 0..9,
diff_list(List),
(10000*S - 1000*H - 100*I - 10*N - E)
- (1000*T - 100*H - 10*A - N)
$= (1000*K - 100*N - 10*I - T),
S $\= 0, T $\= 0, K $\= 0,
shallow_backtrack(List).
shallow_backtrack(List) :-
( foreach(Var, List) do once(indomain(Var)) ).
diff_list(List) :-
( fromto(List, [X|Tail], Tail, []) do
( fromto(Y, Tail, param(X) do
X $\= Y
)
).
compareLists(List) :-
length(List, N),
( foreach(Input1, List), count(I, 1, N), param(N, List)
do
( foreach(Input2, List), count(J, 1, N), param(List, Input1, I, N)
do
( ( I $\= J, Input1 $\= Input2 )
-> true;
fail
)
)
).
我有点卡在这一部分上。所以当我运行没有compareLists(List)函数的代码时,结果给了我" No"。所以当我添加了compareLists(List)函数时,答案仍然给了我" No"。我想知道是否"否"是正确的答案还是我在代码中写错了?任何帮助表示赞赏。谢谢!
谢谢!
答案 0 :(得分:0)
模型中几乎所有的缺陷(除了一个)都必须加载。即使在#SHIN - THAN'中有一个减号,SHINE仍然是(10000 * S + 1000 * H + 100 * I + 10 * N + E) - 它只是简单的数学
也无需重新发明标准谓词alldifferent
(在您的代码中命名为diff_list
)
和labeling
(在您的代码中命名为shallow_backtrack
)。不仅你的程序有很多不需要的代码,而且标准谓词在许多情况下会更有效,也更灵活。
以下是使用标准ic库谓词的完整更正程序:
:- lib(ic).
exampleOne(List) :-
List = [S, H, I, N, E, T, A, K],
List :: 0..9,
alldifferent(List),
(10000*S + 1000*H + 100*I + 10*N + E)
- (1000*T + 100*H + 10*A + N)
$= (1000*K + 100*N + 10*I + T),
S $\= 0, T $\= 0, K $\= 0,
labeling(List).