需要为Prolog提供类似的更多金钱代码的帮助吗

需要为Prolog提供类似的更多金钱代码的帮助吗,prolog,cryptarithmetic-puzzle,eclipse-clp,Prolog,Cryptarithmetic Puzzle,Eclipse Clp,拼图中下面的每个字母唯一地代表0、1、…、9中的10个数字中的一个。没有两个字母代表同一个数字。对于拼图中下面的每个单词,第一个字母不是0 例如:光泽比=针织 我所有的密码都是这个 :- 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) - (1

拼图中下面的每个字母唯一地代表0、1、…、9中的10个数字中的一个。没有两个字母代表同一个数字。对于拼图中下面的每个单词,第一个字母不是0

例如:光泽比=针织

我所有的密码都是这个

:- 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
                      )
             )
     ).
我有点被这部分卡住了。因此,当我在没有CompareListList函数的情况下运行代码时,结果是否定的。因此,当我添加CompareListList函数时,答案仍然是否定的。我想知道否定是正确的答案,还是我在代码中写错了什么?感谢您的帮助。谢谢


谢谢

除了一个必须是正数之外,您的模型中几乎所有的负数都是正数。即使“SHINE-THAN”中有一个减号,SHINE仍然是10000*S+1000*H+100*I+10*N+E——这只是简单的数学

也不需要在代码中重新创建标准谓词AllDiffer命名的diff_列表 并在代码中标记名为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).

那么,真正的答案仍然是否定的吗?还有,那两个不同字母不能代表同一个数字的部分呢?这也包括在代码中吗?@user3390252为什么?我在我的程序中找到了15个不同的答案。第一个答案是[1,0,3,2,8,6,9,4]。这里alldifferentList的意思是“两个不同的字母不能代表同一个数字”。哦,我明白了。非常感谢。