Minizinc:用一维数组初始化二维数组的每一行

and*_*iba 2 multidimensional-array minizinc

我想将大型输入数组的初始化分成较小的块(只是为了可读性)。我试过这个:

array[1..3,1..2] of int: arr;

% This works:
% arr = array2d(1..3,1..2, [0,0,2,2,3,3]);

% But this not:
arr[1] = [0,0]; 
arr[2] = [2,2]; 
arr[3] = [3,3]; 

constraint true;
solve satisfy;
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,出现语法错误:

arr[1] = [0,0]; 
   ^
Error: syntax error, unexpected =, expecting ':'
Run Code Online (Sandbox Code Playgroud)

这是不支持的Minizinc还是我错过了其他东西?

(有一个有点相关的问题initialize-only-certain-elements-of-array-in-dzn-file,但没有回答我的具体问题。)

Dek*_*er1 5

MiniZinc 目前不允许这样做,原因有两个:

  1. 不带数组的赋值是特殊的初始化语法,只能用于标识符。此格式的左侧不允许进行数组访问。(这样做的主要原因是编译器需要保证所有值都是已知的,当值在语句之间拆分时更难以检查)
  2. 当前版本的 MiniZinc 不支持数组切片。这意味着这arr[1]是对数组的无效访问。在编译器的开发分支上有数组切片,但它们以arr[1,..].

我建议的解决方案是以二维方式格式化二维数组,这应该会增加可读性。MiniZinc 对二维数组文字有特殊的格式:

arr = [|
  0,0|
  2,2|
  3,3|
|];
Run Code Online (Sandbox Code Playgroud)

更新:MiniZinc 现在完全支持数组切片。然而,赋值项仍然只允许使用标识符。