如何在 MiniZinc 中准确使用谓词

How to use predicate exactly in MiniZinc

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

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

"Requires exactly n variables in x to take the value v."

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

如果我将数组声明为

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

我怎样才能准确地使用 predicate 来根据需要填充它?谢谢!

嗯,"exactly" 约束在这里不是很有用,因为您希望 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 做任何事情,因为定义域是 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.