【问题标题】:Need assistance with similar More Money code for Prolog需要 Prolog 的类似 More Money 代码的帮助
【发布时间】:2014-05-18 05:59:14
【问题描述】:

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

例如: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) 函数的情况下运行代码时,结果给我“否”。所以当我添加 compareLists(List) 函数时,答案仍然给我“否”。我想知道“否”是正确答案还是我在代码中写错了什么?任何帮助表示赞赏。谢谢!

谢谢!

【问题讨论】:

    标签: prolog cryptarithmetic-puzzle eclipse-clp


    【解决方案1】:

    你的模型中几乎所有的缺点(除了一个)都必须是优点。即使 'SHINE - 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).
    

    【讨论】:

    • 那么真正的答案仍然是“否”吗?还有,两个不同的字母不能代表同一个数字的部分呢?这是否也包含在代码中?
    • @user3390252 为什么?我的程序找到了 15 个不同的答案。第一个答案是 [1, 0, 3, 2, 8, 6, 9, 4]。
    • 这里alldifferent(List)的意思是“两个不同的字母不能代表同一个数字”。
    • 哦,我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2011-02-16
    • 2016-11-24
    • 2021-07-29
    相关资源
    最近更新 更多