我正在尝试向我的程序添加约束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
根据手册我需要一个域变量但是它的正确语法是什么?
答案 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.