如何防止此Prolog代码提供多个重复的答案?

时间:2015-11-10 17:33:44

标签: prolog clpfd cryptarithmetic-puzzle

我正在学习Prolog。我正在完成一项任务。我已经制作了一些部分工作的代码。但是,不知怎的,它给出了多个重复的答案。

问题是:

% Every letter represents a Digit (0,...,9).
% Leading digits (S and M) can not be 0.
%    S E N D
%  + M O R E
%  ---------
%  M O N E Y
% Write a Prolog program that solves the quiz, i.e., that finds the
% appropriate values for S,E,N,D,M,O, ... such that the addition is correct.

我想出的解决方案是:

jobs1([0,1,2,3,4,5,6,7,8,9]).

solution1([_,_,S,E,N,D,M,O,R,Y],
     constraints([
        \+ S is 0,
        \+ M is 0,
        0 is (10000*M+1000*O+100*N+10*E+Y -  (1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E)) ])).

puzzle1(Erg) :- write("Puzzle1 "), nl, jobs1(S),
    solution1([_,_|Erg] ,
           constraints(Cs)),permC(S,[_,_|Erg],Cs) .

但是,当我运行此代码时,我会得到这样的答案:

7 ?- puzzle1(S).
Puzzle1 
S = [9, 5, 6, 7, 1, 0, 8, 2] ;
S = [9, 5, 6, 7, 1, 0, 8, 2] ;

我知道为什么会发生这种情况(因为,我忽略了前两个位置,并且由于它们的排列,结果显示了2次)。你可以帮忙了解如何在不使用的情况下删除它!(因为,如果有多个答案,!只会显示第一个答案,这是预期的。)

提前致谢!

1 个答案:

答案 0 :(得分:4)

您的代码会尝试10个数字的每个排列,并报告每个符合约束的数字。您只显示8,但还有2个,因此有2个不同的排列,后8位相同。因此,您可以添加一个要求,即您不关心的数字按特定顺序排列,因此只有1个排列可以接受。