Конкатенация столбцов, безусловно, создает больше проблем, чем использование строк. MiniZin c в настоящее время не содержит каких-либо приятных функций транспонирования или архивирования, которые обычно позволяли бы писать эту функцию с относительной легкостью. Вместо этого мы должны написать рекурсивную функцию, которая объединяет по одной строке за раз, а затем добавляет оставшиеся строки:
array[int, int] of int: A=[|1,2,3|4,5,6|];
array[int, int] of int: B=[|1|1|];
function array[int] of int: concat_row_elements(array[int, int] of int: X, array[int, int] of int: Y, int: start) =
if start in index_set_1of2(X) then
row(X, start) ++ row(Y, start) ++ concat_row_elements(X, Y, start+1)
else
[]
endif;
function array[int, int] of int: concat_rows(array[int, int] of int: X, array[int, int] of int: Y) =
let {
constraint assert(index_set_1of2(X) == index_set_1of2(Y), "Concatenation of rows can only occur if they have the same number of rows");
} in array2d(
index_set_1of2(X),
1..card(index_set_2of2(X)) + card(index_set_2of2(Y)),
concat_row_elements(X, Y, min(index_set_1of2(X)))
);
array[int, int] of int: C ::add_to_output = concat_rows(A, B);
Эта функция выдаст ожидаемый результат: C = array2d(1..2, 1..4, [1, 2, 3, 1, 4, 5, 6, 1]);