2

Xリスト内の値にならないように制約を使用しようとしています。

SICStus Prolog マニュアルから:

?X in_set +FDSet 

ただし、リストを FDSet に変換する方法がわかりません。整数のリストがあり[2,3,8,9]、変数のドメインをそのリストに含まれないように制限したいと考えてXいます。それ、どうやったら出来るの?ありがとう。

4

2 に答える 2

4

ドキュメントから判断すると、どう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.
于 2012-04-12T11:32:03.157 に答える
0

私はここのようなものを実装しました..

/** 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).
于 2015-08-03T18:18:56.487 に答える