假设我有一个像这样的矩阵:
M([[150, _],
[130, _],
[160, _],
[100, _],
[100, _],
[100, _]])
根据涉及第一列元素的某些规则,我想将第二列用作这些行的“顺序”。
例如,一个这样的规则是:第一列中没有两个相邻的行可以具有相同的值。
一种可能的解决方案是(行已按第二列排序):
M([[150, 1],
[100, 2],
[130, 3],
[100, 4],
[160, 5],
[100, 6]]).
我知道我可以使用ins
和all_distinct
来限制值,但是目前尚不清楚如何以简洁的方式实现上述限制。按照一阶逻辑,我会写类似:
forall(X,Y) c2(X) == c2(Y) + 1 => c1(X) != c1(Y).
在X
和Y
跨行的情况下,c1
是第一列的值,c2
是第二列的值。
我想的一种方法就是简单地将所有单元格值与变量匹配,并写出所有可能的限制组合。如果我可以自动生成代码,这可能是可行的,但是也许有一种更简洁的方法,类似于上面的通用量化?