X
リスト内の値にならないように制約を使用しようとしています。
?X in_set +FDSet
ただし、リストを FDSet に変換する方法がわかりません。整数のリストがあり[2,3,8,9]
、変数のドメインをそのリストに含まれないように制限したいと考えてX
います。それ、どうやったら出来るの?ありがとう。
X
リスト内の値にならないように制約を使用しようとしています。
?X in_set +FDSet
ただし、リストを FDSet に変換する方法がわかりません。整数のリストがあり[2,3,8,9]
、変数のドメインをそのリストに含まれないように制限したいと考えてX
います。それ、どうやったら出来るの?ありがとう。
ドキュメントから判断すると、どうlist_to_fdset/2
ですか?に変換し、FDSet
その補数を作成してから投稿できin_set/2
ます。バージョンに が含まれていない場合はlist_to_fdset/2
、リストを通常のドメイン表現に簡単に変換してから、否定されたin/2
制約を送信できます。あなたの例では、次のように投稿します。
#\ X in {2}\/{3}\/{8}\/{9}
また、リストとシングルトンで構成されるドメイン式との関係を記述するだけで済みます。これは簡単です。
list_domain([I|Is], Dom) :-
foldl(integer_domain_, Is, {I}, Dom).
integer_domain_(I, D0, D0 \/ {I}).
クエリの例:
?- list_domain([1,2,3], Dom).
Dom = {1}\/{2}\/{3}.
?- list_domain([1,2,3], Dom), X in Dom.
Dom = {1}\/{2}\/{3},
X in 1..3.
私はここのようなものを実装しました..
/** Constraint domain to memebers of a list (of numbers only) **/
domain_list_constraint(_, []) :- !.
domain_list_constraint(DomainVar, List) :- member(E, List),
(atom(E)->atom_number(E, I),
DomainVar #= I;
DomainVar #= E).