ОПРЕДЕЛЕНИЕ-МАССИВА ::=
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА |
АГРЕГАТ-МАССИВ |
ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ
ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ::=
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА
Результатом вычисления ОПРЕДЕЛЕНИЯ-МАССИВА является значение массива. Вычисление реализуется итерацией по всевозможным значениям набора индексов массива. Для каждого набора индексов вычисляется соответствующий элемент массива. Вычисление значений разных элементов может проводиться параллельно.
ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА ::= ВЫРАЖЕНИЕ
ВЫРАЖЕНИЕ для элемента массива зависит от индексов, указанных в ОПРЕДЕЛЕНИИ-ИНДЕКСОВ.
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ::= for ( ЗАДАНИЕ-ИНДЕКСОВ )
ЗАДАНИЕ-ИНДЕКСОВ ::= ОПРЕДЕЛЕНИЕ-ИНДЕКСА [ , ЗАДАНИЕ-ИНДЕКСОВ]
ОПРЕДЕЛЕНИЕ-ИНДЕКСА ::= [ИЗОБРАЖЕНИЕ-ТИПА-ПЕРЕМЕННОЙ] ИНДЕКС
ИНДЕКС ::= ИДЕНТИФИКАТОР
Переменные, обозначающие индексы, локальны в ОПРЕДЕЛЕНИИ-МАССИВА. При определении индекса обычно используется описатель var (см. разд. 6.4). Указание типа индекса требуется в редких случаях, когда тип масива (в том числе и типы индексов массива) трудно определить из позиции, в которой находится ОПРЕДЕЛЕНИЕ-МАССИВА. Отметим, что в ОПРЕДЕЛЕНИИ-ИНДЕКСА тип индекса, если он задан явно, должен точно покрывать множество значений индекса; обычно это диапазон типа int.
type ar1_5 = array (int, 1..5);
ar1_5 squ;
squ = for (var i) i*i;
ar1_5 r = for (var i) 100 - i;
Пример 15.Конструкторы массивов
ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА ::=
{ (ОПРЕДЕЛЕНИЕ-ЧАСТИ-МАССИВА)+
[default : ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА ]
}
ОПРЕДЕЛЕНИЕ-ЧАСТИ-МАССИВА ::=
case ИНДЕКСЫ-ЧАСТИ : ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА
ИНДЕКСЫ-ЧАСТИ ::= ЭЛЕМЕНТ-НАБОРА-ИНДЕКСОВ |
( НАБОР-ИНДЕКСОВ ) |
( ЭЛЕМЕНТ-НАБОРА-ИНДЕКСОВ [, ИНДЕКСЫ-ЧАСТИ] ) |
( ( НАБОР-ИНДЕКСОВ ) [, ИНДЕКСЫ-ЧАСТИ] )
ИНДЕКСЫ-ЧАСТИ определяют некоторое подмножество на произведении типов индексов. Эти подмножества не должны пересекаться для разных ОПРЕДЕЛЕНИЙ-ЧАСТИ-МАССИВА. Определение элементов массива для наборов индексов, не принадлежащих ни одной из указанных частей массива, реализуется частью default. При отсутствии части default объединение подмножеств наборов индексов для разных частей должно совпадать с полным множеством наборов индексов. Вычисление элементов массива по каждой из частей массива проводится независимо, возможно параллельно.
Если ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА используется в операции модификации массива (см. разд. 6.6), то часть default отсутствует.
type Ar(nat k) = array (real, 1..k);
F (nat n, Ar(n) x: Ar(n+1) x')
{ x' = for (var j) { case 1..n : x[j] + 1 case n + 1 : 0 } }
Пример 16.Определение массива по частям
type MATR(nat k) = array(real, 1..k, 1..k);
perm_lines(nat n, MATR(n) a, nat k, m : MATR(n) a' )
pre 1 <= k < m <= n
{ a' = a with for (var i, j) {
case (k, 1..n): a[m, j]
case (m, 1..n): a[k, j]
}
}
Пример 17.Перестановка двух строк матрицы
В матрице a переставляются местами строки с номерами k и m. Перестановка реализуется применением операции модификации (см. разд. 6.6) двух строк в массиве a; остальные строки остаются неизменными. Задание нового значения двух строк матрицы реализуется конструкцией ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА.