如何通过通用量词指定限制?

时间:2019-01-14 09:21:45

标签: clpfd

假设我有一个像这样的矩阵:

M([[150, _],
   [130, _],
   [160, _],
   [100, _],
   [100, _],
   [100, _]])

根据涉及第一列元素的某些规则,我想将第二列用作这些行的“顺序”。

例如,一个这样的规则是:第一列中没有两个相邻的行可以具有相同的值。

一种可能的解决方案是(行已按第二列排序):

M([[150, 1],
   [100, 2], 
   [130, 3],
   [100, 4],
   [160, 5],
   [100, 6]]).

我知道我可以使用insall_distinct来限制值,但是目前尚不清楚如何以简洁的方式实现上述限制。按照一阶逻辑,我会写类似:

forall(X,Y) c2(X) == c2(Y) + 1 => c1(X) != c1(Y).

XY跨行的情况下,c1是第一列的值,c2是第二列的值。

我想的一种方法就是简单地将所有单元格值与变量匹配,并写出所有可能的限制组合。如果我可以自动生成代码,这可能是可行的,但是也许有一种更简洁的方法,类似于上面的通用量化?

0 个答案:

没有答案