如何在MiniZinc中使用谓词

时间:2015-07-09 10:54:27

标签: constraints minizinc

新的MiniZinc用户在这里......我在理解计数约束的语法时遇到了问题:

predicate exactly(int: n, array[int] of var int: x, int: v)

"在x中正好需要n个变量来取值v。"

我想确保10r x 30c数组中的每列至少有1,2和3中的每一列,其余7行等于零。

如果我将我的数组声明为

array[1..10,1..30] of var 0..3: s;

如何根据需要使用谓词来填充它?谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,“完全”约束在这里没有用,因为你想要至少出现一次1,2和3.最好使用例如count函数:

include "globals.mzn"; 
array[1..10,1..30] of var 0..3: s;
solve satisfy;
constraint
  forall(j in 1..30) (
     forall(c in 1..3) (
        count([s[i,j] | i in 1..10],c) >= 1
     )
  )
;

output [
  if j = 1 then "\n" else " " endif ++
    show(s[i,j])
  | i in 1..10, j in 1..30 
];

由于域为0..3并且所有非1,2或3的值必须为0,因此您无需执行任何操作。

另一个约束是“at_least”,请参阅https://www.minizinc.org/2.0/doc-lib/doc-globals-counting.html

如果您还没有阅读MiniZinc教程(https://www.minizinc.org/downloads/doc-latest/minizinc-tute.pdf),我强烈建议您这样做。本教程教你如何思考约束编程 - 当然 - MiniZinc