0

SWI-Prolog で独自のバージョンの all_different を作成する必要があります。all_different と同じように、与えている入力に対して同じ true/false を返す述語を作成しましたが、この述語を実際に制約として適用する方法をオンラインで見つけるのに苦労しています.. all_different の私のバージョンは次のとおりです。 .

distinct([]).
distinct([X|Xs]) :-
  different(X,Xs),
  distinct(Xs).

different(_,[]).
different(X,[Y|Ys]) :-
  (nonvar(X), nonvar(Y) -> X \= Y
   ;
   true
  ),
  different(X,Ys).

整数と _ のリストに適用する必要があります。はい、数独プログラムのプロジェクトです。これがばかげた質問である場合は申し訳ありませんが、私はまだ Prolog に非常に慣れていないため、オンラインで十分なドキュメントを見つけるのが難しいと感じています。助けてください!

4

1 に答える 1

2

制約ではなく述語を記述しました。一言で言えば、述語は成功または失敗のいずれかですが、制約は可能な値に対する制限のみを表します。制約は、制約を単純化し、関連する変数の可能な値の範囲を示すためにいくつかの黒魔術を行う制約のソルバーによって記録されています。したがって、述語を制約として適用することはできません。

元の問題を再検討して制約が必要かどうかを確認するか、上記の実装を次のように変更することができます(私はSWI-Prologを使用しています)。

different(X,[Y|Ys]) :-
  X#\= Y,
  different(X,Ys).

#\=不等式が制約であることを示します。

http://www.swi-prolog.org/man/clpfd.html、特にとの違いall_different/1を確認することをお勧めしますall_distinct/1

于 2012-04-29T07:54:32.460 に答える