0

プロローグを学んでいます。私は課題に取り組んでいます。私はすでにいくつかのコードを作成しましたが、これは部分的に機能しています。しかし、どういうわけか、複数の重複した回答が返されています。

質問は:

% 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つの位置を無視していて、それらの順列のために結果が2回表示されているためです)。! を使用せずに削除する方法を理解するのを手伝ってもらえますか? (複数の回答がある場合、 ! は最初の回答のみを表示するため、予期されていません。)

前もって感謝します!

4

1 に答える 1

4

コードは 10 桁のすべての順列を試行し、制約を満たすそれぞれについて報告します。8 つしか表示されていませんが、さらに 2 つあるため、最後の 8 桁が同じ 2 つの異なる順列があります。したがって、たとえば、気にしない数字が特定の順序になっているという要件を追加して、1 つの順列のみが許容されるようにすることができます。

于 2015-11-10T18:55:48.253 に答える