以下のプログラムを短くしたいと思います。だけでなく、数十の変数があることをイメージするだけ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
ありがとう!