我想缩短以下程序。只是成像有几十个变量,而不是只是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 将(这是 clpfd 中发生的事情的正确术语吗?)统一为一个值,因此唯一的结果是:
X = 0,
Y = 1,
Dom1 = 1 ? ;
X = 1,
Y = 0,
Dom1 = 1 ? ;
no
谢谢!