2012-04-12 14 views
2

制約Xをリスト内の値にしないようにしようとしています。 SICStus Prolog manualからin_set/2制約を使用する

?X in_set +FDSet 

でも、私はFDSetにリストを変換する方法を見つけ出すことはできません。 私は整数のリスト[2,3,8,9]を持っていて、変数Xのドメインをそのリストに入れないようにしたいと思います。それ、どうやったら出来るの?ありがとう。

答えて

4

documentationから判断すると、約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. 
+0

について: 'X in \({2} \/{3} \/{8} \/{9})' – false

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). 
+2

これは* generate-and-test *であり、制約の威力を失います。 'in/2'のポイントは、変数のドメインを確定的に述べることです。 ( 'member/2'を使って)バックトラッキングする代わりに、リストをドメイン表現に確定的に変換し、CLP(FD)制約を完全に享受する単一のin/2制約を投稿する必要があります。 – mat

+0

うん,,いいね!私はその方法を実装できるかどうかを確認します。アドバイスをいただきありがとうございます。 –

関連する問題