1

以下のプログラムを短くしたいと思います。だけでなく、数十の変数があることをイメージするだけXですY。問題は、各変数のドメインを個別に定義する必要があることです。プログラムが長くなり、透明性が低下するため、好きではありません。

入力:

?- Dom1 in 0..2, Dom2 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom2]), labeling([],[X,Y]).

結果:

X = 0,
Y = 0,
Dom1 = 2,
Dom2 = 0 ? ;
X = 0,
Y = 1,
Dom1 = 1,
Dom2 = 1 ? ;
X = 1,
Y = 0,
Dom1 = 1,
Dom2 = 1 ? ;
X = 1,
Y = 1,
Dom1 = 0,
Dom2 = 2 ? ;
no

最初は、次のように書くだけで解決できると思いました。

?- Dom1 in 0..2, global_cardinality([X,Y], [0-Dom1,1-Dom1]), labeling([],[X,Y]).  

しかし、Dom1 が 1 つの値で統一されているため (これは clpfd で何が起こるかを表す適切な用語ですか?)、結果は次のようになるため、機能しません。

X = 0,      
Y = 1,
Dom1 = 1 ? ;
X = 1,
Y = 0,
Dom1 = 1 ? ;
no

ありがとう!

4

2 に答える 2

3

L = [X1,...,Xn] で、すべての変数を 1..10 にしたいとします。

代替案 1、間隔でのみ機能します。

?- domain(L, 1, 10).

代替 2 は、間隔ではないドメインでも機能します。

?- (foreach(X,L) do X in 1..10).
于 2013-05-12T20:55:16.973 に答える
2

私はあなたのユースケースを理解できません。あなたが求めている結果は同じようです

?- [X,Y] ins 0..1, labeling([], [X,Y]).
X = Y, Y = 0 ;
X = 0,
Y = 1 ;
X = 1,
Y = 0 ;
X = Y, Y = 1.

あなたの説明

Dom1 は (...) を 1 つの値に統一するため、機能しません。

私には明らかなようです。Dom1 はキーの「出現回数」を意味し、2 つの可能な値 (「キー」0、1) を持つ 2 つの変数があるため、Dom1 は 1 でなければなりません。

于 2013-05-12T19:12:52.537 に答える