私はプロローグの課題に取り組んでおり、現在、解決策に非常に近づいています。したがって、この問題は制約充足問題であり、特定の条件が真となるような一連の変数の値を見つける必要があります。具体的には、与えられた 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 です
(原子だけでなく)変数で機能するように内積を定義する方法がわかりません。残りのコードはすべて完全に機能します (これは入門プロローグ コースで非常によくある質問であり、怠惰な人には答えたくないので、ここには載せたくありません)。あなたたちは何を提案しますか?