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

Minizinc: Initialize each row of 2d array with 1d array

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

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 不支持吗?还是我遗漏了什么?

(有一个有点相关的问题 ,但没有针对我的具体问题的答案。)

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

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

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

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

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