Регистры правил. Общие принципы

Материал из КинтВики
Перейти к: навигация, поиск

Дмитрий Малюгин, Корпоративные информационные технологии, 2003

С позиций сегодняшнего дня (2007) данная статья имеет прежде всего исторический интерес (слегка отредактирована в части терминологии). Это первая работа, посвященная регистрам правил,- она дает представление об основных идеях концепции. С современной точки зрения регистры правил являются частным случаем общей концепции функциональных регистров. В структуре таких регистров выделены детерминант (атрибуты-измерения) и корень (атрибуты-ресурсы).


Корень Детерминант
Дуэли запрещены в субботу, воскресенье и в остальные дни недели.

Регистр является универсальной структурой информационных систем. В работе приведено определение регистра правил, указан алгоритм выборки непротиворечивых ответов, продемонстрированы некоторые свойства регистров и особенности их использования.

Введение

Мы живем в мире правил. Нас окружают законы физического мира, государственные законы, нормы поведения и т.д. и т.п. Любая компьютерная программа или алгоритм, как известно, – это набор определенных правил для выполнения каких-либо действий. Любая информационная система – это сложная, часто запутанная, местами противоречивая, но, тем не менее, тоже система неких правил, реализованных ее разработчиками. Невозможно проектировать и создавать сложные и надежные программные комплексы, не имея четкой и ясной концепции системы правил.

Начальные определения и термины

Что такое система правил? В самом общем виде под системой правил мы понимаем некий преобразователь входной информации в выходную непротиворечивым образом. Общепринятой является формулировка правил в виде условного оператора "Если Входная ситуация, Тогда Выходные данные". Данный оператор обладает достаточной гибкостью и вполне пригоден для реализации простых правил. Его недостаток – в последовательном (алгоритмическом) подходе. При увеличении разнообразия входных ситуаций большое количество условных операторов приводит к их взаимовлиянию и запутыванию правил. Для создания системы правил в сложных информационных системах необходим иной подход.

Для того, чтобы входную информацию (ситуацию) можно было распознать (отличить), используют понятие атрибутов (категорий). Любая входящая информация (ситуация, входной контекст) определяется значениями ее атрибутов. Набор атрибутов ситуации мы будем называть детерминантом ситуации. Значения атрибутов детерминанта будут определять входную ситуацию. Сам преобразователь входных ситуаций в выходные данные мы назовем регистром правил. Данный регистр ставит в соответствие определенному множеству значений входных значений детерминанта некий набор выходных данных (правил). Такие данные мы назовем корнем регистра. Корень регистра также может обладать определенной структурой, - набором атрибутов.

Итак, регистр правил состоит из детерминанта (определяющая, левая часть регистра) и корня (зависящая, правая часть регистра). Таким образом, структура регистра выражает функциональную зависимость {Детерминант -> Корень}. Как детерминант, так и корень могут обладать структурой (иметь атрибуты). Атрибуты детерминанта называют также измерениями регистра, атрибуты корня – ресурсами. Значение корня – это значения его ресурсов. Ресурс может являться набором значений (множеством элементов), а также ссылкой на детерминант следующего уровня системы правил.

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

Важное свойство регистра правил – это свойство редукции входных ситуаций. Именно данное свойство регистра позволяет справиться с разнообразием входных ситуаций, сводя их к нескольким заранее определенным. Это означает, что в регистре правил могут содержаться не все возможные значения детерминанта ситуации, а только некоторые обобщающие. Такое обобщение достигается тем, что некоторые значения измерений детерминанта правил являются универсумами (все значения). Универсум измерения означает, что данное правило применимо для всех (любых) значений данного измерения. Соответственно, детерминант регистра правил фактически покрывает диапазон возможных значений детерминантов ситуации. При определении (извлечении) корня из регистра правил выбираются лишь те детерминанты, в диапазон значений которых попадает детерминант входящей ситуации.

Для измерений регистра правил в качестве универсума может быть использовано значение NULL. Если подходить более строго, то интерпретация NULL-значения зависит от категории измерения. Для измерений-владельцев NULL-значение означает именно отсутствие значения (пустое множество). Для измерений, принадлежащих контексту, данное значение удобно интерпретировать как "Все значения".

Правила извлечения корня

Следствием того, что детерминанты регистра правил являются обобщающими, становится возможной ситуация, когда одна и та же входная ситуация (входное значение детерминанта) будет удовлетворять нескольким значениям детерминанта регистра. Соответственно, нужен способ, позволяющий упорядочить выборку детерминантов регистра по степени их уместности (применимости). Такое упорядочивание может быть производено по значениям измерений детерминанта. Таблица кортежей с релевантными (уместными) значениями детерминантов (колонки таблицы – это измерения детерминанта) сортируется по убыванию значений (пустое значение колонки самое нижнее) по всем колонкам таблицы, начиная с левых. Верхняя строка отсортированной таблицы и будет искомым детерминантом. При таком способе выборки релевантных правил порядок измерений детерминанта имеет значение, - степень важности (приоритетности) измерений детерминанта убывает слева направо.

Поясним вышесказанное примерами.

Определение типа прайс-листа

Рассмотрим типичную задачу из области автоматизации операций покупки/продажи. Предположим, что некая торговая компания, имеющая обособленные подразделения, использует для некоторых своих клиентов особые типы прайсов. Тип прайса определяется категорией цен (покупка или продажа), подразделением компании и контрагентом. Структура регистра правил (вместе с набором примерных значений детерминанта и корня) будет иметь следующий вид:


Детерминант Корень
Категория цен (*) Контрагент Подразделение Тип прайса
Продажи А
Продажи П1 Б
Продажи К1 П1 В
Продажи К1 Г
Продажи К2 А


Здесь "Категория цен", "Контрагент", "Подразделение" - измерения регистра (атрибуты детерминанта), "Тип прайса" - ресурс (атрибут корня). Мы пометили измерение "Категория цен" знаком (*) потому, что хотим подчеркнуть, что значение данного атрибута является обязательным к заполнению при вводе значений детерминанта регистра (владельцем регистра). Другими словами, не существует правила для абстрактной (неопределенной) категории цен - при обращении к регистру правил мы должны четко знать, продаем мы или покупаем.

Предположим, что нам требуется определить тип прайса для продажи товаров контрагенту К2 от подразделения П1. Детерминант входной ситуации имеет следующее значение:

Категория цен Контрагент Подразделение
Продажи К2 П1

Существует три детерминанта регистра (три записи), соответствующие входному детерминанту. Выбор одной из них определяется порядком колонок в детерминанте. Чем левее колонка, тем больше ее приоритет.

В общем случае для получения выборки ответов из регистра правил запрос строится следующим образом. Для полей, в которых обязательно заполнение, добавляем строгое условие на равенство ("Категория цен = Продажи"). Для остальных полей условие нестрогое, - включаем пустые значения (Подразделение = П1) ИЛИ (Подразделение = Универсум). При отсутствии строк в выборке – набор значений детерминанта не является полным (невозможно дать однозначный ответ на входящий запрос). Такое может быть, если не все возможные значения полей, обязательных к заполнению присутствуют в выборке (Например, ситуация "Категория цен = Покупки" отсутствует в регистре правил).

Для нашего условия запроса к регистру правил имеют следующий вид:

 (Категория цен = Продажи) И
 ((Подразделение = П1) ИЛИ (Подразделение = Универсум)) И
 ((Контрагент = К2) ИЛИ (Контрагент = Универсум)).

Полученная выборка:

Категория цен Контрагент Подразделение Тип прайса
Продажи А
Продажи П1 Б
Продажи К2 А


После сортировки:

Категория цен Контрагент Подразделение Тип прайса
Продажи К2 А
Продажи П1 Б
Продажи А


Ответом на запрос является тип прайса "А". В данном примере тот факт, что тип прайса подбирается для контрагента К2, оказывается более значимым того, что продажа товаров осуществляется подразделением П1. Измерение "Контрагент" имеет более высокий приоритет, чем "Подразделение".

Следует подчеркнуть, что использование регистров правил облегчает модификацию бизнес-логики приложений. Предположим, что с некоторыми контрагентами существует несколько разных договоров, по которым компания осуществляет продажу/покупку товаров. Каждый из договоров может иметь свои ценовые особенности, свой тип прайса. Для учета данных особенностей бизнеса детерминант регистра правил следует расширить измерением "Договор". Данное расширение никак не скажется на существующей логике регистра, поскольку при добавлении нового измерения в детерминант значения данного измерения будут пустыми (то есть эквивалентны универсуму).

Определение комбинаций в игре "Ямб"

Для незнакомых с правилами игры небольшие пояснения. Ямб является одной из разновидностей игр в кости. Игрок бросает 5 шестигранных кубиков, стороны каждого из которых пронумерованы от 1 до 6. Некоторым наборам значений (достоинств) выпавших кубиков присвоены комбинации. Существует всего 4 типа комбинаций:

  • Ямб – все 5 кубиков одного достоинства;
  • Каре – 4 кубика одного достоинства;
  • Фуль – 3+2 (три кубика одного достоинства, два другого);
  • Стрит – достоинства кубиков последовательно возрастают от 1 до 5, либо от 2 до 6.

Задача регистра правил – по набору входящих значений выпавших кубиков определить тип комбинации.

Для начала нам надо определиться с атрибутами входящей ситуации. Перейдем в пространство достоинств. Для этого введем одномерную матрицу N[1..6], содержащую количество кубиков с достоинством, соответствующим индексу. Таким образом, равенство N[5]=3 означает, что из выпавших кубиков три имеют значение 5. Для определения типа выпавшей комбинации достаточно трех атрибутов матрицы достоинств: количество нулевых элементов в матрице (QNT0), максимальное значение элемента матрицы (MAX) и индекс нулевого элемента (IND0). Мы не утверждаем, что комбинации определяются только данными параметрами, - вполне возможно существование другого набора характеристик (атрибутов) для определения типа комбинаций. Задача определения минимального набора характеристик для распознавания входной ситуации относится к творческому классу задач. Наш регистр правил имеет вид:


Детерминант Корень
QNT0 MAX IND0 Тип комбинации
5 Ямб
5 Ямб
4 4 Каре
4 3 Фуль
1 1 Стрит
1 6 Стрит


Здесь принято, что отсутствие допустимых значений детерминанта означает отсутствие какой-либо комбинации.

Нормализация регистра правил

Анализируя детерминант данного регистра, мы видим, что его измерения не являются независимыми. Так, при значении атрибута QNT0 равном 5 атрибут MAX также равен 5. Атрибут IND0 (индекс нулевого элемента) имеет смысл только при условии, что нулевой элемент один (QNT0=1), в остальных случаях говорить об индексе нулевого элемента бессмысленно.

Очевидно, что данный регистр можно нормализовать. При нормализации мы разделяем общий регистр правил на несколько (основной и подчиненные). Каждый из подчиненных подробнее описывает ту или иную ситуацию. При этом основной регистр грубо определяет входную ситуацию и в зависимости от нее вызывает соответствующий ей регистр правил более низкого (подробного) уровня. В нашем примере для основного регистра можно использовать значения измерения QNT0.

Отметим, что каждый подчиненный регистр имеет свой отличный набор измерений, но корень для всех регистров одинаков (в подчиненных таблицах состав атрибутов одинаков для всех таблиц).

Данный пример демонстрирует, что входная ситуация (далее мы будем использовать также термин входной контекст) не всегда выражена в атрибутах детерминанта регистра. Состав и структура регистра правил – это его внутреннее дело, и на внешнем уровне знать об этой кухне необязательно. Для распознавания ситуации (разложения входного контекста по измерениям) регистр должен содержать функции извлечения значений измерений детерминанта из входного контекста. Существование набора таких функций означает, что данный контекст может быть обработан (опознан) регистром правил. Для нашего примера входным контекстом может являться матрица достоинств N[1..6], а функциями измерений – QNT0(N[]), MAX(N[]), IND0(N[]). Разделение понятий входного контекста и структуры детерминанта регистра правил является реализацией известного принципа инкапсуляции.

Диапазоны значений атрибутов детерминанта

Некоторые правила формулируются для диапазона значений какой-либо переменной. Например, «Если (А>5) И (А<10), Тогда …». При определении состава детерминанта для таких условий нас поджидает ловушка. Появляется искушение добавить в детерминант атрибут «А», а значениям данного атрибута придать операторный вид: «>5», «<10» и т.д. Однако такие «операторные атрибуты» будут противоречить условию уникальности значений детерминанта и, как следствие, непротиворечивости регистра правил. В самом деле, если среди допустимых значений атрибута детерминанта присутствуют условия «<5» и «<3», а входное значение атрибута равно 2, то какой из двух детерминантов применять?

Правильным является вынесение условий на диапазоны значений в отдельные атрибуты детерминанта. Тип значений данных атрибутов – булевый. Каждый диапазон – в отдельный атрибут. Например, для вышеприведенного примера следует ввести два условных атрибута: атрибут «А>5» и атрибут «А<10». Проблема противоречивости диапазонов значений атрибутов будет решаться описанным выше способом через упорядочивание атрибутов детерминанта по важности.

Числовые диапазоны значений

Приведем пример использования диапазонов значений. Рассмотрим правила склонения фамилий в русском языке. Они составлены на основе программного модуля, текст которого состоит из огромного количества «Если» и «ИначеЕсли». Возможно, сами правила неточны и неполны, но нам важно уяснить суть обращения с диапазонами:

Детерминант Корень Комментарии, примеры
Длина Окончание Тип последней
буквы
Пол Родительный
падеж
Дательный
падеж
Ф Ф По умолчанию - не склоняем
Согласная М Ф+А Ф+У Мужская фамилия
А Ж Ф1+ОЙ Ф1+ОЙ Женская фамилия
Ь М Ф1+Я Ф1+Ю Таль, Лебедь
А М Ф1+Ы Ф1+Е Ганжа, Соткилава
ИХ, ЫХ Ф Ф Сибирские фамилии (Черных, Сухих)
> 3 ИЙ, ОЙ М Ф2+ОГО Ф2+ОМУ Высоцкий
= 3 Й М Ф1+Я Ф1+Ю Цой
> 3 АЯ Ж Ф2+ОЙ Ф2+ОЙ Бережная


Здесь Ф - фамилия в именительном падеже, Ф1 – фамилия без последней буквы, Ф2 – фамилия без двух последних букв. Буквы Й,Ь,Ъ к согласным не относятся.

В детерминанте данного регистра мы видим два атрибута, значениями которых являются диапазоны (множества) значений. Это "Окончание" и "Длина". Атрибут "Окончание" можно разложить на составляющие, то есть добавить значение детерминанта для каждого значения из множества значений атрибута. Таким образом, вместо одной строки с множеством "ИХ,ЫХ" появятся две – отдельно для "ИХ" и отдельно для "ЫХ".

Обращаем внимание на то, что для мужской фамилии "Черных" подходят три значения детерминанта: действующее по умолчанию, по окончанию "ЫХ" и по типу последней буквы "Согласная". Выбор ответа производится на основе большей значимости атрибута "Окончание".

Заключение

Область применения регистров правил приведенными в статье примерами не ограничивается. Обобщая, мы можем утверждать, что любая информация, имеющая какую-либо ценность, имеет структуру регистра, то есть имеет и детерминант, и корень. Наличие детерминанта обеспечивает доступ к информации, а корень и есть сама информация. Структура регистра объединяет семантические понятия «Объект» и «Отношения объектов» в единой форме, поскольку с точки зрения регистро-ориентированного проектирования объект является частным случаем регистра, детерминант которого состоит из одного измерения (идентификатора объекта).

Концепция регистров правил является универсальной и фундаментальной. Именно поэтому ее использование при проектировании информационных систем является обязательным условием для обеспечения их гибкости и надежности.

См. далее