Minizinc:使用1d数组初始化每行2d数组

时间:2018-06-18 09:43:08

标签: 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;

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

arr[1] = [0,0]; 
   ^
Error: syntax error, unexpected =, expecting ':'

这是Minizinc不支持还是我错过了其他内容?

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

1 个答案:

答案 0 :(得分:4)

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

  1. 没有数组的赋值是特殊的初始化语法,只能用于标识符。此格式左侧不允许进行数组访问。 (主要原因是编译器需要保证所有值都已知,这在语句之间拆分时更难检查)
  2. 当前版本的MiniZinc不支持阵列切片。这意味着arr[1]是对数组的无效访问。在编译器的开发分支上有数组切片,但它们被访问为arr[1,..]
  3. 我提出的解决方案是以2d格式化2d阵列,这样可以提高可读性。 MiniZinc具有二维数组文字的特殊格式:

    arr = [|
      0,0|
      2,2|
      3,3|
    |];