需要有关Prolog类似的More Money代码的帮助

时间:2014-05-18 05:59:15

标签: prolog cryptarithmetic-puzzle eclipse-clp

拼图中的下面每个字母唯一代表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"。我想知道是否"否"是正确的答案还是我在代码中写错了?任何帮助表示赞赏。谢谢!

谢谢!

1 个答案:

答案 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).