Домены
Домен в контексте библиотеки О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);
Подробнее механизмы ограничений описаны в данном разделе.