1

我想缩短以下程序。只是成像有几十个变量,而不是只是XY。问题是我需要分别为每个变量定义域。我不喜欢它,因为它使我的程序更长且更不透明。

输入:

?- 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

谢谢!

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 将 (...) 统一为一个值

对我来说似乎很清楚。由于 Dom1 表示键的“出现次数”并且有 2 个具有 2 个可能值的变量(“键”0、1),因此 Dom1 必须为 1。

于 2013-05-12T19:12:52.537 回答