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 目前不允许这样做有两个原因:
- 没有数组的赋值是一种特殊的初始化语法,只能用于标识符。此格式的左侧不允许数组访问。 (这样做的主要原因是编译器需要保证所有值都是已知的,当值在语句之间拆分时更难检查)
- 当前版本的 MiniZinc 不支持数组切片。这意味着
arr[1]
是对数组的无效访问。在编译器的开发分支上有数组切片,但它们被访问为 arr[1,..]
.
我提出的解决方案是以二维方式格式化二维数组,这应该会增加可读性。 MiniZinc 对二维数组文字有特殊格式:
arr = [|
0,0|
2,2|
3,3|
|];
更新:现在 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
不支持吗?还是我遗漏了什么?
(有一个有点相关的问题
MiniZinc 目前不允许这样做有两个原因:
- 没有数组的赋值是一种特殊的初始化语法,只能用于标识符。此格式的左侧不允许数组访问。 (这样做的主要原因是编译器需要保证所有值都是已知的,当值在语句之间拆分时更难检查)
- 当前版本的 MiniZinc 不支持数组切片。这意味着
arr[1]
是对数组的无效访问。在编译器的开发分支上有数组切片,但它们被访问为arr[1,..]
.
我提出的解决方案是以二维方式格式化二维数组,这应该会增加可读性。 MiniZinc 对二维数组文字有特殊格式:
arr = [|
0,0|
2,2|
3,3|
|];
更新:现在 MiniZinc 完全支持数组切片。但是,赋值项仍然只允许使用标识符。