0

これは、プロローグ制約解決メカニズムを使用した、古典的な 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 制約ソルバーを使用しています。ありがとうございました。

4

2 に答える 2

1

通常、ゴール内の変数と節頭内の変数は、名前ではなく位置によって一致します。したがって、呼び出しは次の?- sendmore0([S,E,N,D,M]).ように実装する必要があります。

sendmore0([S,E,N,D,M]) :- sendmore([S,E,N,D,M,_,_,_]).

ただし、これは、考えられるすべての組み合わせに対してこれを実装する必要があることを意味します。

説明した内容を本当に実装したい場合は、変数に安定した名前を付ける必要があります。ECLiPSe では、ライブラリでこれを行うことができますvar_name。かなりハックですが…

:- lib(var_name).

sendmore0(L) :-
   build_arg(["S","E","N","D","M',"O","R","Y"], L, A),
   sendmore(A).

build_arg([], _, []) :- !.
build_arg([H|T], L, [HA|HT]) :-
   match_arg(L, H, HA),
   build_arg(T, L, HT).

match_arg([], _, _). % or use 0 as last argument if you want
match_arg([H|T], Base, A) :-
   (
      get_var_name(H, S),
      split_string(S,"#","",[Base,_])
   ->
      A = H
   ;
      match_arg(T, Base, A)
   ).

sendmore0/1次に、変数の短いリストで呼び出すことができます。変数名を設定することを忘れないでください!

?- set_var_name(S, "S"), set_var_name(E, "E"), sendmore0([S, E]).
S = 9
E = 5
Yes (0.00s cpu, solution 1, maybe more)

免責事項: これは安定した名前の目的ではありません。これらはデバッグ目的で使用されます。ヨアヒムがこれを見たら、私の耳にクリップで留めてくれるだろう...

于 2012-02-10T16:14:50.360 に答える
1

ここに2つのアイデアがあります:

  1. sendmore() をさまざまな数のパラメーターで定義できます。これにより、不足しているパラメーターが埋められた「実際の」バージョンが呼び出されます。位置別のパラメーター)。
  2. リスト形式を拡張/複雑にして、渡すパラメーターを指定できるようにすることができます。[(s,S),(e,E),(n,N),(d,D),(m,M)]真ん中の例の何かの行。少し面倒ですが、必要な柔軟性が得られます。
于 2012-02-10T14:41:47.303 に答える