Перейти к основному содержимому

Домены

Домен в контексте библиотеки О2 - это подмножество целых чисел, ограниченных диапазоном значений типа Int64, то есть [-264, 264). Для формирования доменов предусмотрен менеджер доменов, доступный через объект модели.

В данном разделе в примерах ниже Модель = О2.СоздатьМодель();.

МенеджерДоменов = Модель.Домены();

Формирование доменов

Ниже описаны методы менеджера доменов, позволяющие формировать домены различной структуры.

Диапазон

Данный метод формирует домен, содержащий последовательность целых чисел от левой границы до правой включительно.

Домен = Модель.Домены().Диапазон(15, 25);

СписокДиапазонов

Данный метод формирует домен, содержащий несколько диапазонов.

Диапазон1 = Модель.Домены().Диапазон(0, 5);
Диапазон2 = Модель.Домены().Диапазон(10, 17);
Диапазон3 = Модель.Домены().Диапазон(28, 34);

Диапазоны = О2.Утилиты().Массив(Диапазон1, Диапазон2, Диапазон3);

Домен = Модель.Домены().СписокДиапазонов(Диапазоны);

СписокЗначений

Данный метод формирует домен, содержащий несколько конкретных значений.

Значения = О2.Утилиты().Массив(3, 7, 12, 34);

Домен = Модель.Домены().СписокЗначений(Значения);

ОдноЗначение

Данный метод формирует домен, содержащий только одно значение.

Домен = Модель.Домены().ОдноЗначение(45);

Объединение

Данный метод формирует домен, содержащий значения из нескольких произвольных доменов. D3 = D1 ∪ D2.

Домен1 = Модель.Домены().ОдноЗначение(35);
Домен2 = Модель.Домены().СписокЗначений(О2.Утилиты().Массив(47, 49, 51));
Домен3 = Модель.Домены().Диапазон(55, 65);

Домены = О2.Утилиты().Массив(Домен1, Домен2, Домен3);

Домен = Модель.Домены().Объединение(Домены);

Пересечение

Данный метод формирует домен, содержащий пересечение нескольких доменов, т.е. те значения которые присуствуют во всех указанных множествах. D3 = D1 ∩ D2.

Домен1 = Модель.Домены().Диапазон(0, 10);
Домен2 = Модель.Домены().Диапазон(5, 15);

Домены = О2.Утилиты().Массив(Домен1, Домен2);

Домен = Модель.Домены().Пересечение(Домены);

Сложение

Данный метод формирует домен, каждое значение в котором является суммой значений указанных в аргуменнте доменов.

Домен1 = Модель.Домены().Диапазон(10, 15);
Домен2 = Модель.Домены().Диапазон(25, 35);

Домены = О2.Утилиты().Массив(Домен1, Домен2);

Домен = Модель.Домены().Сложение(Домены); // -> [35, 50]

Дополнение

Данный метод формирует домен, состоящий из значений, отсутсвующих в другом домене.

Домен = Модель.Домены().Диапазон(10, 15);

ОбратныйДомен = Модель.Домены().Дополнение(Домен); // --> [-2^64, 9] ∪ [16, 2^64)

Отрицание

Данный метод формирует домен, состоящий из значений другого домена, взятых с обратным знаком. То есть метод отражает домен зеркально относительно нуля.

Домен = Модель.Домены().Диапазон(10, 15);

ОтраженныйДомен = Модель.Домены().Отрицание(Домен); // -> [-15, -10]

Пустой

Данный метод формирует домен, не содержащий значений.

ПустойДомен = Модель.Домены().Пустой();

ВсеЗначения

Данный метод формирует домен, содержащий полный диапазон значений [-264, 264).

ПолныйДомен = Модель.Домены().ВсеЗначения();

Применение доменов

Домены позволяют ограничить множество допустимых значений переменных:

ДопустимыеЗначения = О2.Утилиты().Массив(5, 7, 13, 32);

Домен = Модель.Домены().СписокЗначений(ДопустимыеЗначения);

Переменная = Модель.ПеременнаяДомена(Домен);

Также могут быть ограничены значения линейных выражений:

ДопустимыеЗначения = О2.Утилиты().Массив(5, 7, 13, 32);

Домен = Модель.Домены().СписокЗначений(ДопустимыеЗначения);

Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");

Модель.Ограничения().ЗначениеВДомене("2*x + 7*y - 5", Домен);

Комбинирование доменов и ограничений модели

В некоторых случаях сформированного домена не достаточно, чтобы описать требуемые ограничения. Нопример, нас интересуют только четные целые числа в диапазоне от 50 до 100. На стороне сервиса решателя домены представляются в виде последовательности несмежных диапазонов. Представить множество четных чисел таким образом не представляется возможным, однако данную задачу можно решить наложеием ограничения модели:

// создаем переменную в требуемом диапазоне
Домен = Модель.Домены().Диапазон(50, 100);

Переменная = Модель.ПеременнаяДомена(Домен);

// добавляем ограничение на осттаток от деления: Переменная % 2 = 0
Модель.Ограничения().ОстатокДеленияРавен(Переменная, 2, 0);

Подробнее механизмы ограничений описаны в данном разделе.