2015-11-10 82 views
0

我正在學習Prolog。我正在做一項任務。我已經制作了一些代碼,這部分代碼是部分工作的。但是,不知何故,它給出了多個重複的答案。如何防止此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次)。你能幫我理解我怎樣才能不用它!(因爲,如果有多個答案,!只會顯示第一個答案,這不是預期的。)

在此先感謝!

+0

爲什麼你在'solution1'的第一個參數中有'_'? –

+0

因爲我必須給字符S,E,N,D,M,O,R,Y分配0,1,... 9。所以,我必須把_,_放在那裏。否則,程序返回false。 –

+0

'permC/3'的定義是什麼樣的? – repeat

回答

4

您的代碼會嘗試每個10位數字的排列,並報告每個符合約束的條件。你只顯示8,但是還有2個,因此有2個不同的排列,最後8個數字相同。因此,例如,您可以添加要求,即您不關心的數字是按特定順序排列的,因此只能使用1個置換。