如何将域变量添加到global_cardinality?

时间:2013-05-06 13:27:05

标签: prolog constraint-programming clpfd sicstus-prolog

我正在尝试向我的程序添加约束global_cardinality,并在manual of SICStus Prolog中写道:

  

global_cardinality(+ Xs,+ Vals)

     

global_cardinality(+ XS,+瓦尔斯+选项)

     

其中Xs = [X1,...,Xd]是整数或域变量的列表,和   Vals = [K1-V1,...,Kn-Vn]是每个密钥Ki为a的对的列表   唯一整数和Vi是域变量或整数。如果是真的   Xs的每个元素都等于某个键,每对Ki-Vi,   Xs的确切Vi元素等于Ki。

现在我可以写:

global_cardinality([A,B,C], [1-2, 2-1]).

说数字1将被使用两次。数字2将仅使用一次。

但我想说将使用1号码:once, twice or three times

根据手册我需要一个域变量但是它的正确语法是什么?

2 个答案:

答案 0 :(得分:5)

?- X in 1..3, global_cardinality([A,B,C], [1-X, 2-1]).

答案 1 :(得分:1)

不确定这一点,但来自SWI-Prolog page我想你可以试试

...global_cardinality([A,B,C], [1-X, 2-1]), (X #= 1 #\/ X #= 2 #\/ X #= 2)...

?- global_cardinality([A,B,C], [1-X, 2-1]), X in 1..3, label([A,B,C]).
A = B, B = 1,
C = X, X = 2 ;
A = C, C = 1,
B = X, X = 2 ;
A = X, X = 2,
B = C, C = 1.