Абриаль 2.1 Назад Начало Выше Дальше16/08/03 А.И.Пацкин [packin.ru]
Разработка веб-интерфейса ] Abrial DDL ] Конструирование БД ] Ассоциации ] [ Правила. Продукционное программирование ] Схема ядра ]

Правила. Продукционное программирование

Язык определения правил ]


Правила в Абриале

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


Вот так задаются классы

Это класс работ. Есть еще предопределенные классы INT,STR...

Work:CLASS

А это объекты-представители класса работ...

W1:Work
W2:Work
W3:Work
W4:Work

А это отношения.

Каждая сторона отношения (аспект) имеет имя и свойства, главным свойством аспекта является класс - домен. Три отношения задают свойства работ - начало, окончание, длина:

Beg:LINK(Beg:&Work,B_of:[INT])
End:LINK(End:&Work,End-of:[INT])
Len:LINK(Len:&Work,Len-of:[INT])

И еще одно отношение, которое задает порядок следования работ.

After:LINK(Aft:{&Work},Bef:{&Work})

Порядок задается связями (фактами как в прологе).

After(W1,W2)
After(W1,W3)
After(W2,W4)
After(W3,W4)

А числовые параметры работы задаются связями (фактами):

Beg(W1,10)
End(W1,15)
Len(W1,6)

Это и есть база данных, пока очень похожая на прологовскую.


Как устроено правило

Правило состоит из образца и нескольких альтернатив.

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

Альтернатива состоит из последовательности действий, порядок действий важен.

Как условия, так и действия могут быть либо предопределенными операциями, или работающими с БД, т.е. для условий - условиями на связи, а для действий - генераторами связей или событий.

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


Вот пример правила с двумя условиями и одной альтернативой.

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

Rule1:RULE(
  Beg(W,B),Len(W,L)=>
  INT(E,-1),ADD(E,L),ADD(E,B),End(W,E)
)

А это - то же правило, но в несколько более привычной записи. Эта сокращенная форма будет использоваться и далее, хотя на самом деле правила выглядят как было выше - в первом примере.

Rule1:RULE(Beg(W,B),Len(W,L)=>End(W,L+B-1))

Это правило задает генерацию начала работы по концу и длине.

Rule2:RULE(End(W,E),Len(W,L)=>Beg(W,E-L+1))

А это правило при наличии всех трех величин у работы, приводит их в соответствие, генерируя событие IsLen

Rule3:RULE(Beg(W,B),Len(W,L),End(W,E)=>IsLen(L,B,E))

Это правило обрабатывает событие IsLen. У него две альтернативы, разделенные знаком "|". Если не удается изменить начало (B), то изменяется конец (переменная E).

Rule4:RULE(IsLen(L,B,E) =>B=E-L+1 | E=L+B-1)

Это правило генерирует событие DoLess, приводя в соответствие окончание и начало двух последующих работ.

Rule5:RULE(End(W1,E),Beg(W2,B),After(W1,W2)=>DoLess(E,B))

Это правило обрабатывает событие DoLess, т.е. "сделать менее". Первая величина делается меньше или равной второй.

Rule6:RULE(DoLess(E,B)=>LE(E,B)|E=B|B=E)

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

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

Rule0:RULE(Beg(W,B)=>GT(B,0))
Rule0l:RULE(Len(W,L)=>GT(L,0))

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

Как работает продукционный механизм.

Вычисление делится на транзакции.

Транзакция начинается либо

  1. с создания новой связи, либо
  2. с изменения/добавления значения, либо
  3. с внешнего события.

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

У новой связи берётся предикат, т.е. отношение/ассоциация, далее активизируются все условия всех образцов в правилах, использующие этот предикат. Остальные правила не затрагиваются. Но если подходящее условие встречается в образце дважды, то образец активизируется как два разных образца тоже дважды. Эти условия считаются стартовыми в образцах. Далее в образцах просматриваются смежные со стартовыми условия и потом - смежные со смежными и так до полного образца, но если нет паттернов данных соответствующих частям образцов, то процесс согласования обрывается раньше, т.е. до просмотра всех условий образца. Оптимальный порядок согласования условий, начиная от стартового, Абриаль строит на ходу.

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

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

Главная особенность этого механизма в том, что не затрагиваются нерелевантные условия, правила, объекты и связи. Эта особенность существенно опирается на модель данных Абриаля и решающим образом увеличивает эффективность продукционного механизма.


Резюме.

Эти правила проще и эффективнее классических правил, и в частности правил, работающих на объектной модели. Эффективность этого аппарата в Абриале не зависит от числа объектов, связей или правил в БД, и поэтому этот механизм может работать на необъятной базе так же быстро, как на крошечной.


Все права защищены. © 2000-2004 РосНИИ ИИ
http://artint.ru
Copyright. © 2000-2004 by RRIAI
Александр Иосифович Пацкин [mailto:aleksandr@tochka.ru].
16/08/03

К началу документа.