これは、プロローグ制約解決メカニズムを使用した、古典的な SENDMORY crypt-arithmetic problem solutiong のスニペットです。
:- lib(ic).
sendmore(Digits) :-
Digits = [S,E,N,D,M,O,R,Y],
Digits :: [0..9],
alldifferent(Digits),
S #\= 0,
M #\= 0,
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
#= 10000*M + 1000*O + 100*N + 10*E + Y,
labeling(Digits).
これを実行するには、次のような目標/クエリを送信します。
?- sendmore(Digits).
そして、それは私に数字の可能な解決策を返します.
ここで、私の質問は、このように変数 (S、E、N など) を「ハードコーディング」したくないということですが、目標/クエリは変数の数を示します。たとえば、渡すクエリが次のような場合:
?- sendmore(S,E,N,D,M).
次に、SENDM の値のみを計算し、他の変数は適用できないと想定する必要があるため、それらの変数に 0 を割り当ててから計算を続行します。次にクエリを実行するときは、クエリで異なる数の変数を渡す場合があります..例のように:
?- sendmore(S,N,D,M,O,Y).
プログラムは同様に計算する必要があります。
私が達成しようとしているのは、上記のシナリオのより一般化された問題ソルバーです。これに関する指示は本当に感謝しています。私はプロローグが初めてで、ECLIPSE 制約ソルバーを使用しています。ありがとうございました。