Размер (Арность) набора
Размер (Арность) набора - либо постоянное положительное целое число n, либо размер, определенный элементом sexpr, либо 1 по умолчанию. Фраза within sexpr требует, чтобы набор был объявлен подмножеством sexpr. Конструкция "=" используется для определения элементов набора. Задавая элементы набора в режиме model, путем использования конструкции "=" означает, что далее набору не будет присваиваться значение в разделе данных, или командой: let. Фраза default определяет значение по умолчанию для набора, которое будет использоваться, если в разделе данных не указано иное значение. Фразы "=" и default исключают друг друга. Если ни одна из фраз "=" или default не указана, и набор не определен оператором данных data, тогда ссылка на набор во время генерации модели вызовет сообщение об ошибке.
Например:
attributes | Пример |
name | set PROD; |
dimen n | set PROD {TYPE} dimen 2; |
within sexpr | set PROD within PROD2; or set PROD within {1,2,3,4}; or set PROD within PROD2 union PROD3; |
= sexpr or default sexpr |
set PROD = PROD2; or set PROD = {1,2,3,4}; or set PROD = PROD2 union PROD3;
or |
По историческим причинам ":=" в настоящее время является синонимом "=" в объявлениях наборов и параметров, но такое использование ":=" не рекомендуется. Sexpr в "=" или фразе default может быть {}, пустым набором, который затем может изменить свой размер, при определении данных в режиме data или с использованием оператора let. Рекурсивные определения индексированных наборов разрешены, если присвоенные значения могут быть вычислены в последовательности, которая ссылается только на ранее вычисленные значения.
Например,
set nodes ={1,2,3,4}; # Список узлов set arcs = nodes cross nodes; # Список дуг param max_iter = card(nodes)-1; # card(s) = количество элементов в nodes set step {s in 1..max_iter} dimen 2 = if s == 1 then arcs else step[s-1] union setof {k in nodes, (i,k) in step[s-1], (k,j) in step[s-1]} (i,j); set reach = step[max_iter]; display step;