Prolog 如何将域变量添加到全局_基数?

Prolog 如何将域变量添加到全局_基数?,prolog,constraint-programming,clpfd,sicstus-prolog,Prolog,Constraint Programming,Clpfd,Sicstus Prolog,我正在尝试向我的程序中添加一个约束全局基数,并在中写入: 全局基数(+Xs,+Vals) 全局基数(+Xs,+Vals,+Options) 其中Xs=[X1,…,Xd]是整数或域变量的列表,并且 VAL=[K1-V1,…,Kn Vn]是一个成对的列表,其中每个键Ki是一个 唯一整数,Vi是域变量或整数。如果正确 Xs的每个元素都等于某个键,对于每一对Ki Vi, Xs的Vi元素正好等于Ki 现在我可以写: global_cardinality([A,B,C], [1-2, 2-1]). 表示数

我正在尝试向我的程序中添加一个约束
全局基数
,并在中写入:

全局基数(+Xs,+Vals)

全局基数(+Xs,+Vals,+Options)

其中Xs=[X1,…,Xd]是整数或域变量的列表,并且 VAL=[K1-V1,…,Kn Vn]是一个成对的列表,其中每个键Ki是一个 唯一整数,Vi是域变量或整数。如果正确 Xs的每个元素都等于某个键,对于每一对Ki Vi, Xs的Vi元素正好等于Ki

现在我可以写:

global_cardinality([A,B,C], [1-2, 2-1]).
表示数字
1
将使用两次。编号
2
将只使用一次

但我想说的是,将使用数字
1
:一次、两次或三次


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

对此不确定,但从SWI Prolog我想你可以试试

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


谢谢它的工作原理是一样的。我用谷歌搜索SICStus Prolog答案的能力太差了,类似的虚拟问题会随之而来:(有对Prolog感兴趣的人的聊天室吗?我在Freenode上尝试了IRC频道###Prolog,但它不太活跃。对不起,我不知道。但是Prolog有点过时,或者更好,它在很多年前就很热了。然后我想你不可能找到关于它的聊天室。是的,Prolog很旧,但约束编程远没有用。)据我所知,om已经死了……你是对的。但我认为SemanticWeb基础设施将占据主导地位。我希望(更好,我对此持积极态度)它将改变一些兴趣。
?- 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.
?- X in 1..3, global_cardinality([A,B,C], [1-X, 2-1]).