2

私はプロローグの課題に取り組んでおり、現在、解決策に非常に近づいています。したがって、この問題は制約充足問題であり、特定の条件が真となるような一連の変数の値を見つける必要があります。具体的には、与えられた 3 つの単語 (W1、W2、W3) に、W1+W2=W3 となるように変数を割り当てます。この例は、SEND+MORE=MONEY、または IT+IS=ME です。

制約は次のとおりです。(1) 正しく合計する必要がある、(2) 開始文字を 0 にすることはできない、(3) すべての変数が異なる必要がある。そして、それは一般的な単語の問題で機能する必要があります。それらが正しく加算されることを確認しようとすると、私の問題が発生します (他の条件を満たし、問題を理解しています)。2番目の単語の問題に関しては、次のようにする必要があります。

 10*I + 1*T
+10*I + 1*S
___________
 10*M + 1*E

そこで、次のように、特定の長さで 10 のべき乗のリストを作成する関数を作成しました。

powlist(1,L) :-
    append([1.0],[],L). 
powlist(N,L) :-
    N1 is N-1,
    X is 10**N1,
    powlist(N1,L1),
    append([X],L1,L),
    !.

[I、T、I、S、M、E] などの文字の実際のリストもあります。次に、powlist から係数のリスト (その部分については後で説明します) を作成したので、[10,1,10,1,-10,-1] のようになります。これを行ったので、この係数のリストと文字のリストの間の内積を取り、それがゼロであれば、制約が満たされます。しかし、この内積理論を機能させることはできません。現在、次のような行があります。

   scalar_product(Coefficients, Letters, #=, 0)

しかし、これは私に次のエラーを与えています:

! is/2 の引数 2 でインスタンス化エラーが発生しました
! 目標: _102 は 0+10.0*_109 です

(原子だけでなく)変数で機能するように内積を定義する方法がわかりません。残りのコードはすべて完全に機能します (これは入門プロローグ コースで非常によくある質問であり、怠惰な人には答えたくないので、ここには載せたくありません)。あなたたちは何を提案しますか?

4

1 に答える 1

1

あなたの戦略は確かに健全であり、少なくとも組み込みの を使用する SWI-Prolog CLP(FD) では機能しscalar_product/4ます。私は SICStus でのこの述語の定義に慣れていませんが、インターフェースは SWI-Prolog と同じようです。

いくつか提案できます。まず、おそらく、あなたが書いたコードのいくつかの側面は、バックトラッキングで実行されたときに (たとえば、経由などの代替ソリューションを探すために)選択label/1ポイントを生成している可能性があります。そのような行を含む述語を書いたことがありますか? そうでない場合でも、コードを再確認して、 の定義など、不要な選択ポイントが生成されないようにすることをお勧めします。代わりに、次のことを試すことをお勧めします。_102 is 0+10.0*_109_109powlist/2

powlist(1, [1]) :- !.
powlist(N, [F|Fs]) :-
    N > 1,
    N1 is N - 1,
    F is 10 ** N1,
    powlist(N1, Fs).

このバージョンでは、Prolog インタープリターがバックトラックするための選択ポイントが残っていないため、問題が解決する可能性があります (ただし、さらにコードを見ないとわかりません)。

それ以外の場合、あなたが正しく、エラーが実際に の定義内から発生している場合scalar_product/4(私は驚いていますが)、スカラー積の制約項を生成して手動でストアに追加することができます。たとえば、次のことを考慮してください。

my_scalar_product([V|Vs], [C|Cs], Op, Value) :-
    construct_constraint(Vs, Cs, (V * C), Constr),
    Constraint =.. [Op, Constr, Value],
    Constraint.

construct_constraint([], [], Acc, Acc).
construct_constraint([V|Vs], [F|Fs], Acc, Res) :-
    construct_constraint(Vs, Fs, '+'(Acc, (V * F)), Res).

このバージョン ( my_scalar_product/4) は、組み込みの と同じインターフェイスを想定していますがscalar_product/4、 を使用して実行しようとする代わりに、制約をストアに追加しますis/2

于 2011-04-12T05:08:47.487 に答える