Инкрементальная верификация объектно-ориентированных данных на основе спецификации ограничений1
В.А. Семенов, С.В. Морозов, О.А. Тарлапан
Аннотация. Рассматриваются задачи полной и инкрементальной верификации объектно-ориентированных данных. На основе теории графов строится формальный аппарат, а также описываются разработанные методы инкрементальной верификации, использующие статический анализ спецификации ограничений и позволяющие локализовать область потенциальных нарушений при изменении данных. Методы предоставляют весомую альтернативу полной верификации прикладных данных при локальных изменениях, преобладающих в многопользовательских графических приложениях. Постановка задачи и методы описываются применительно к языку EXPRESS, предоставляющему универсальную нотацию для спецификации объектно-ориентированных моделей данных и ограничений на них.
1. Введение
Обеспечение целостности является одним из фундаментальных ACID (atomicity, consistency, isolation, durability) принципов мультидоступа к данным на основе транзакций [1]. Для реализации данного принципа современные информационные системы должны предусматривать механизмы, которые бы гарантировали удовлетворение ограничений целостности сразу после завершения транзакции (integrity constraint enforcement). Наиболее распространенными являются подходы, связанные с проверкой ограничений (integrity constraint checking) и поддержкой целостности (integrity constraint maintenance). Первый консервативный подход предполагает проверку целостности всякий раз перед завершением транзакции и - в случае выявленных нарушений -отмену всех изменений, принятых в ее ходе. В рамках второго альтернативного подхода при изменениях, влекущих нарушение условий целостности, предпринимается попытка дополнительной модификации данных с тем, чтобы их окончательное состояние полностью им соответствовало. Оба подхода имеют известные преимущества и недостатки. Этим вопросам, применительно, прежде всего, к дедуктивной и реляционной метамоделям, посвящены обширные исследования. Достаточно упомянуть исчерпывающие обзоры работ [2-4].
1 Работа поддержана грантами РФФИ (04-01-00527) и Фонда содействия отечественной науке (http://www.science-support.ru).
В существенно меньшей мере внимание уделяется проблемам обеспечения целостности прикладных объектно-ориентированных данных, модели которых специфицированы, в частности, на популярных универсальных языках объектно-ориентированного моделирования EXPRESS [5] и UML/OCL [6]. Подобные модели предоставляют дополнительные возможности для статического и динамического анализа зависимостей между данными и учета локальности инкрементальных изменений, преобладающих в многопользовательских графических приложениях [7].
В разделе 2 вводится формальная объектно-ориентированная метамодель. Раздел 3 иллюстрирует ее на примере языка моделирования EXPRESS, предоставляющего нейтральную к реализации универсальную нотацию для спецификации объектно-ориентированных данных и ограничений на них. Особое внимание уделяется возможным видам ограничений, допускаемых конструкциями языка. В разделе 4 рассматривается общая постановка задачи верификации прикладных данных на основе спецификации ограничений. Вспомогательные понятия с привлечением аппарата теории графов вводятся в разделе 5. Здесь же приводятся конструктивные утверждения относительно зависимостей между данными и возможностей локализации нарушений целостности. Данные утверждения легли в основу разработанных методов инкрементальной верификации, которые детально описываются в разделе 6. В заключении даются общие рекомендации по их практическому применению и обозначаются направления для дальнейших исследований.
2. Объектно-ориентированная метамодель
Рассмотрим сначала наиболее общие понятия, представляющие информационную объектно-ориентированную метамодель, подходящую для специфицирования произвольной предметной области. Используемая здесь формализация следует методу, применяемому в семантическом анализе языков [8, 9].
Определим объектно-ориентированную метамодель как информационную схему S = (T,n,Rule) со следующим значением:
• Т = TdYT—YC — множество типов данных информационной схемы, состоящее из основных типов TD, отображаемых в основную область семантики D, сложных типов Т-^, отображаемых в многозначную
область семантики D , а также объектных типов (классов) С;
• л — частичный порядок на Т, отражающий отношения обобщения/специализации меяеду типами данных и используемый в качестве основы для встраиваемого механизма полиморфизма;
• Rule = RuleT Y Rules — множество правил, налагающих ограничения целостности данных. Правила подразделяются на локальные RuleT,
определяемые на отдельных типах данных, и глобальные Rules, определяемые на некоторой совокупности типов информационной схемы. Важные свойства или характеристики объектов представляются их атрибутами. Имя атрибута определяет роль, играемую связанным с ним значением, в контексте того объекта, в котором оно появляется. Тип данных атрибута определяет область его возможных значений. Обозначим Attrc множество атрибутов информационной схемы или, точнее, множество сигнатур операций ас :С а Т, ас : С хТ а С для функций доступа к значениям атрибутов. Объявление атрибута ас е Attrc в объекте типа С устанавливает отношение между типом данных объекта и типом данных
атрибута Т: С.а —> Т , где 0 < да < п ограничивают количество элементов в прямом отношении от С к Г, а 0 < р < q — в обратном отношении от Г к С. Данную запись следует интерпретировать так: для каждого объекта типа С роль а играется не менее чем да и не более чем п экземплярами типа Т. для каждого экземпляра типа Т существует от р до q объектов типа С, в которых Т играет роль а. Если в качестве типа атрибута выступает другой объектный тип, то данный атрибут представляет связь (ассоциацию) между двумя объектными типами.
Состояние объектов определяется значениями их атрибутов. Поведение отдельных объектов характеризуется множеством локальных правил Rulec, которые могут определять количество, тип и организацию атрибутов, а также налагать ограничения на их значения. Формально, данные правила являются множеством сигнатур операций rulec : С a logical. Ограничения на множество объектов (возможно, разных типов Сj ,К , Сп) налагают глобальные правила Rules, представляющие собой сигнатуры операций rules : Cj,K Сп a logical.
Способом, аналогичным алгебраической спецификации, предоставим сигнатуру = (TD YT^YC,n,Q.D YQjj Y Attrc YRuleT YRules), где QD ,
(}jj являются множествами операций, определенных над основными и
сложными типами. Сигнатура, сформированная подобным способом, описывает типы и символы операций, принадлежащие к объектно-ориентированной метамодели S, а также содержит исходное множество синтаксических элементов, над которыми могут быть определены выражения Expr ({varT }T£tdyt-yc ) с переменными, индексируемыми данными типами.
3. Язык моделирования EXPRESS
EXPRESS — это формальный язык информационного моделирования [5]. Он основан на определении объектов, представляющих формализованные
описания моделируемых объектов реального мира. При создании языка EXPRESS ставилась задача избежать, насколько это возможно, влияния особенностей реализации. Таким образом, EXPRESS является декларативным объектно-ориентированным языком. В настоящее время он широко используется в качестве стандартного средства спецификации моделей данных для различных отраслей науки и промышленности.
Рассмотрим вкратце семантику языка EXPRESS, используя описанную в предыдущем разделе метамодель.
3.1. Типы данных и операции над ними
Язык EXPRESS определяет основные типы {Real, Integer, Number, Boolean, Logical, String, Binary} с TD, соответствующие простым типам данных с общепринятой семантикой. Сложные типы {Aggregate, Bag, Set, List, Array, Enumeration, Select, Defined} с 7 — соответствуют различным типам множеств,
перечисляемым типам, выборкам и переопределенным типам, которые допускают определение производных и вложенных структур данных. Типы данных объектов С в языке EXPRESS определяются декларацией Entity.
На Рис. 1 представлена общая классификация имеющихся в языке EXPRESS типов. Типы, отмеченные жирным курсивом, соответствуют его исходным типам. Стрелки показывают отношения наследования между ними. Виртуальные типы, отмеченные обычным шрифтом, используются только для того, чтобы единообразно классифицировать конструкции языка и представить типы, определяемые пользователем.
GENERIC
________1________
SIMPLE
-------1-------
CONSTRUCTED
-----1----
NAMED
------1
AGGREGATE
ENUMERATION SELECT DEFINED
ENTITY
----------1-------------1---
LOGICAL NUMBER STRING
BINARY
I t
BOOLEAN REAL
BAG OF GENERIC
SET OF GENERIC
BAG
USTOF
GENERIC
t
LIST
ARRAY OF GENERIC
t
ARRAY
INTEGER
SET
Рис. 1. Классификация исходных типов языка EXPRESS.
Простыми типами данных являются Boolean, Logical, Number (включая конкретные подтипы Real и Integer), String и Binary. Интерпретация простых типов является обычной, но каяедое множество расширяется специальной вели-
чиной ?, обозначающей неопределенное значение. Тип 7: е Т), отображается в область семантики D функцией I : Т </, D следующим образом: / (Boolean) = {true, false} Y{?} , / (Logical) = {true, false, unknown} Y{?}, / (.Real) = R Y{?},
I {Integer) = Z Y{?}, I {String) = A* Y{?}, где A — конечный алфавит, A* — множество всех последовательностей над алфавитом А, и I {Binary) = {0,1}* Y {?}. Длины строк и двоичных последовательностей могут быть неограниченными, ограниченными сверху или фиксированными.
Над простыми типами определено множество операций. Существует несколько групп операторов:
{+, *, /, **: Number X Number —> Number; +, -, abs: Number —> Number} Y
{div, mod: Integer —> Integer; odd: Integer —> Logical} Y
{sin, cos; tan, asin, acos, atan, exp, log, log2, log 10, sqrt: Number —> Real} Y
{format: Number X String —> String; value: String —> Number} Y
{and, or, xor: Logical X Logical —> Logical; not: Logical —> Logical} Y
{+: String X String —> String, like: String X String —> Logical; length: String
—> Integer; []: String X Integer —> A, [:]: String X Integer X Integer —>
String} Y
{+: Binary X Binary —> Binary; blength: Binary —> Integer; []: Binary X Integer —> 0\1, [:]: Binary X Integer X Integer —> Binary} Y {=, <>, <=, >=, <, >: Number X Number —> Logical, Logical X Logical —> Logical, String X String —> Logical, Binary X Binary —> Logical}.
Семантику данных операций легко истолковать. В частности, это арифметические операции над числовыми операндами типов Number, Real, Integer и стандартные математические функции; преобразование чисел в строковое представление и обратно; логические операции над логическими операндами типов Logical или Boolean', конкатенация, сопоставление с образцом, индексация, выделение подмножества над операндами типов String и Binary, а также операции сравнения, определенные для всех простых типов. Некоторые операции имеют тот же самый перегруженный символ в качестве имени и могут различаться только по типам своих аргументов.
Созданные типы, которыми могут являться перечисление либо выборка, расширяют множество основных типов. Область определения перечисляемого типа Enumeration задается упорядоченным множеством значений, представленных уникальными именами /{Enumeration^,/ = 1,К , и)) = {аг■ е А , i = 1,К , и} Y{?} . На литералы перечисляемого типа ссылаются как на элементы перечисления. Порядок элементов перечисления предопределяется их относительными позициями. Данное упорядочение дает в результате операции сравнения, определенные между значениями, относящимися к одному и тому же перечисляемому типу:
{=, <>, <=, >=, <, >: Enumeration X Enumeration —> Logical}.
Выбираемый тип данных Select определяет производный тип, представляемый списком других исходных типов. Экземпляр выбираемого типа данных является экземпляром одного из типов, заданных в списке выбора. Допускается, что экземпляр данных принадлежит одному из нескольких возможных типов. Другими словами, область определения значений для подобного типа является объединением областей определения типов в его списке I(Select{Ti,i = 1,К ,п)) = I(Ji) YK YI(Tn) Y{?}. Выбираемый тип является обобщением каждого из типов данных, перечисленных в его списке.
К поименованным относятся типы данных, определяемые пользователем в конкретных информационных схемах. Так, определенный (Defined) тип данных является пользовательским расширением стандартных типов (простых, созданных или агрегатных), при этом он дает возможность определить дополнительные семантические ограничения, налагаемые на специфицируемые данные I(Defined(T)) = I(T)Y{?}. Определенный тип является конкретизацией исходного типа данных, который используется при его объявлении. Объектные типы определяются пользователем с помощью конструкции ENTITY. При специфицировании объектного типа указываются его явные (EXPLICIT) атрибуты (в том числе ассоциативные связи с другими объектными типами), обратные ассоциации (INVERSE), а также производные вычисляемые свойства (DERIVED), определяемые типами и выражениями, которые могут включать в себя значения явных атрибутов, константы, исполняемые операторы, включая вызов функций и процедур, как стандартных, так и пользовательских. Язык EXPRESS предусматривает разнообразные модели простого и множественного наследования объектных типов. Объект производного типа наследует все атрибуты, определяемые в его родительских типах. При этом допускается переопределение отдельных атрибутов с целью специализации их типов, постановки более жестких ограничений на них или задания другого выражения для вычисляемых свойств. Кроме того, явные атрибуты базовых типов могут быть переопределены как вычисляемые в типах-наследниках.
Над объектными типами определены следующие операции:
{=, <>, :<>: : Сх С —> Logical} Y
{rolesof: С —> Set(String), usedin: С X String —> Bag(C)}.
Операторы сравнения = и <> реализуют глубокий алгоритм сравнения объектов. В отличие от них, операторы .=: и .<>: проверяют лишь эквивалентность экземпляров (или совпадение идентификаторов объектов). Функция rolesof возвращает набор строк, содержащих имена ролей (ассоциативных атрибутов), играемых заданным объектом. Функция usedin возвращает множество объектов, которые используют указанный объект в заданной роли (под С здесь понимается некий обобщенный объектный тип). Вследствие наличия данной функции все связи между объектами в языке EXPRESS являются двунаправленными. Инверсные атрибуты используются лишь для именования ряда обратных связей, а также постановки ограничений
использования объектов в связях с другими, о чем будет упомянуто в следующем разделе.
Многозначные выражения в языке EXPRESS описываются агрегатными типами. Агрегации используются для представления упорядоченных и неупорядоченных коллекций данных каких-либо основных, предопределенных сложных и объектных типов. Они конструируются путем указания типа для их элементов. Эти коллекции могут иметь фиксированные или переменные размеры, хранить уникальные или дублированные представления элементов, а также могут допускать неопределенные элементы, что дает в результате разреженные структуры данных. Как и любой другой тип данных языка EXPRESS, сами агрегации могут иметь неопределенное значение (это состояние следует отличать от пустой коллекции, не содержащей ни одного элемента).
Так, тип данных Array (массив) представляет собой структуру с фиксированным размером, где существенной является индексация элементов. Опционально массивы могут допускать, что не все их элементы имеют значение. Свойство уникальности массивов означает, что каждый элемент отличается от любого другого в одном и том же экземпляре массива. Тип данных List (список) представляет упорядоченную коллекцию идентичных элементов. Список может хранить любое количество элементов, допуская или, опционально, не допуская их дублирование. Тип данных Bag (мультимножество) является коллекцией элементов, в которой порядок не является важным и допускается дублирование. И, наконец, Set (набор) является коллекцией элементов, в которой порядок не является важным и дублирование элементов не допускается. Количество элементов в списках, мультимножествах, наборах может изменяться в зависимости от определения их границ. Важно, что агрегатные типы могут быть вложенными, таким образом давая в результате многомерные структуры данных.
Над агрегатными типами в языке EXPRESS определены следующие группы операций:
{+, *: Aggregate^) X Aggregate(T2) —> Aggregate(T)} Y
{=, <>, <=, >=, :<>: : Aggregate(7j) X Aggregate(T2) —> Logical} Y
{in, valuein: T X Aggregate(T) —> Logical, valueunique: Aggregate(T) —>
Logical, query: Aggregate(T)X Logical Expression —> Aggregate(T)} Y
{[]: Aggregate(T) X Integer —> T} Y
{sizeof, hiindex, loindex, hibound, lobound: Aggregate(T) —> Integer} Y {insert: List(T) X T X Integer —> List(T), remove: List(T) X Integer —> List(T)}. Операторы над множествами +, -, * определяются для объединения, вычитания И пересечения коллекций совместимых ТИПОВ Тх , 7 2 (т.е. одинаковых типов или типов, один из которых является подтипом или конкретизацией другого). Операторы сравнения, включая операторы подмножества и надмножества <=, > =, предназначены для установления отношений равенства и общности между
совместимыми по типу коллекциями. Операторы сравнения экземпляров
отличаются от операторов сравнения значений =, <> лишь для коллекций объектов, используя соответствующие вышеупомянутые операции, определенные над объектными типами. Для коллекций остальных типов данных операторы сравнения экземпляров эквивалентны соответствующим операторам сравнения значений. Операторы принадлежности in и valuein проверяют наличие в коллекции некоторого элемента, используя, соответственно, операции эквивалентности экземпляров и равенства значений. Функция valueunique проверяет уникальность по значению всех элементов коллекции. Выражение запроса query вычисляет логическое условие отдельно для каждого элемента коллекции и возвращает коллекцию, содержащую те элементы, для которых логическое выражение истинно. Оператор индексирования [] извлекает из коллекции отдельный элемент. Операции sizeof hiindex, loindex, hibound, lobound возвращают, соответственно, количество элементов в агрегации, верхний и нижний индексы элементов массива, верхнюю и нижнюю границы списков, мультимножеств и наборов. Операции insert и remove определяются дополнительно, чтобы упростить манипулирование специфическими коллекциями — списками.
Агрегации, выборки и определенные типы могут быть вложенными, поэтому в языке EXPRESS допустимо составление более сложных типов. В нетривиальных прикладных моделях данных невозможно избежать подобных сложных структур.
Возможная дополнительная классификация типов не противоречит описанной в предыдущем разделе объектно-ориентированной метамодели. В частности, в языке EXPRESS в отдельную группу выделяются обобщенные типы данных Generic, Aggregate, Bag Of Generic, Set Of Generic, List Of Generic, Array Of Generic, которые используются для установления обобщения других типов данных и могут применяться в очень специфических контекстах (для представления формальных параметров, локальных переменных и результатов функций). Следующие операции, определенные над обобщенными типами, применимы к любому типу данных языка EXPRESS:
{exists: Generic —> Boolean; nvl: T X T —> T; type of: Generic —> Set(String)}. Это функция проверки существования значения (возвращает true в случае фактического значения ее параметра или false в случае неопределенного значения), функция возврата альтернативного значения, если исходный параметр находится в неопределенном состоянии, а также функция, определяющая тип данных входного параметра (возвращает имена всех типов, членом которых является ее входной параметр).
3.2. Ограничения в языке EXPRESS
Помимо декларативной части, содержащей описания типов данных, язык EXPRESS имеет и исполняемые операторы, связанные с проверкой правил и вычислением значений производных атрибутов. Правила налагают
ограничения на область определения значений специфицируемых типов данных. Помимо правил в языке EXPRESS существуют и другие виды ограничений, связанные со способом организации и типом атрибутов отдельных объектов. Ограничения являются критериями целостности данных, специфицируемых на языке EXPRESS.
Можно выделить три группы ограничений в зависимости от места их определения (утверждения). К первой группе относятся ограничения, налагаемые на отдельные типы данных (и атрибуты соответствующих типов), а именно:
• ограничение длины в строковом типе данных:
length(String) <n,neZ,n>0 для строк переменной длины или length(String) = n,neZ,n>0 для строк фиксированной длины (если п не указано в спецификации типа, ограничение отсутствует);
• ограничение длины в двоичном типе данных:
blength(Binary) < п, п е Z, п > О для двоичных последовательностей переменной длины или blength(Binary) = n,neZ,n>0 для двоичных
последовательностей фиксированной длины (если п не указано в спецификации типа, ограничение отсутствует);
• ограничение количества элементов в агрегатном типе данных:
т < sizeof (Aggregate(T)) <n,meZ,neZ,0<m<n для списков,
мультимножеств и наборов (для данных разновидностей агрегатов ограничение отсутствует, если т=0 and п=7), sizeof (Array(T)) = п - т +1, т е Z,п е Z, т < п для массивов (в данном случае т, п указывают диапазон изменения индекса элементов);
• запрет на наличие повторяющихся элементов в агрегатном типе данных: elem j ж. elem ■, / = 1,К , sizeof (Aggregate (Т)) - 1, j = i + 1, К ,
sizeof (Aggregate (T)) для списков и наборов (для наборов ограничение устанавливается по умолчанию, для списков — если в спецификации типа указано ключевое слово UNIQUE), elem t ж elem ,i= m, К ,
n -1, j = i + 1,K ,n для массивов (в данном случае ограничение
установлено, если в спецификации типа указано ключевое слово UNIQUE)', заметим, что здесь используется операция эквивалентности экземпляров, а не равенства значений;
• запрет на наличие необязательных элементов в массиве: exists(elemi) = True, i = m,К , n (ограничение может быть снято указанием ключевого слова OPTIONAL в спецификации типа массива);
• ограничения области определения значений в определенном типе данных: f (self): Defined(T) a Logical (f (self) — опционально указываемые в спецификации определенного типа логические выражения, в которых переменной self присваивается текущее значение атрибута определенного
типа при проверке соответствующего правила; область значений определенного типа данных Defined(T) состоит из всех значений области определения значений исходного типа Т, не нарушающих ни одно из данных правил);
• требование совместимости типов атрибута и присваиваемого ему значения: Tvalue п Тапг — типы должны совпадать или тип присваиваемого значения должен быть специализацией типа, приписанного атрибуту (наиболее часто проверяют совместимость типа ассоциированного объекта с типом ассоциации).
Во вторую группу входят локальные ограничения, которые устанавливаются в объектных типах данных и действуют для каждого объекта соответствующего типа. Локальные ограничения, определенные в базовом типе объекта, наследуются всеми его производными типами, как и атрибуты. К данной группе относятся:
• запрет на неопределенные значения для явных атрибутов объекта: exists(attrj) = True,i = 1,К ,к, где к — количество явных обязательных атрибутов (ограничение может быть снято указанием ключевого слова OPTIONAL в спецификации атрибута);
• ограничения использования объекта в ассоциативных связях с другими
объектами, устанавливаемые через его инверсные атрибуты:
Q .а —> С2.inv _а,р < sizeof (inv _а)< q, р е Z ,q е Z ,0 < p<q , если инверсный атрибут имеет тип мультимножества или набора объектов Сj, причем в последнем случае дополнительно устанавливается ограничение уникальности инверсного отношения: inv_at ж.inv_а -,
/ = 1,К , sizeof (inv _ а) -1, j = i + 1,К , sizeof (inv _ а) (т.е. объект типа С2 не может играть роль а более одного раза в одном и том же объекте типа С]), sizeof (inv _ а) = 1. если инверсный атрибут имеет тип объекта С];
• ограничения уникальности экземпляров отдельного атрибута:
ог .а ж. о ..а, Т(ог) % С, Т(о ■) л С — никакие два объекта совместимых
типов не должны использовать тот же самый экземпляр для атрибута, имя которого указано в простом правиле уникальности;
• ограничения уникальности комбинации экземпляров атрибутов:
oi,аг Ж. Oj,аг andoi,а2 :ф: о; ,а2 К andoi,ак Ж о; ,ак,T(ot) % C,T(Oj)n С
— никакие два объекта совместимых типов не должны использовать ту же самую комбинацию экземпляров атрибутов, список имен которых указан в совместном правиле уникальности;
• ограничения области значений в типе данных объекта:
f (Attrc): С a Logical (f (Attrc) — опционально указываемые в
спецификации объектного типа логические выражения над атрибутами самого объекта (собственными и унаследованными от его супертипов) и,
возможно, объектов, ассоциированных с ним; объект попадает в область значений, если он не нарушает ни одно из данных правил).
Наконец, к третьей группе относятся глобальные ограничения, налагаемые на все объекты одного или нескольких типов:
/(Set(Cx),К ,Set(Ck)): Cj ,К ,Сп a Logical.
Другими словами, глобальное ограничение является логической функцией над наборами объектов тех типов, на которых оно установлено. Наборы объектов, не нарушающие глобальные ограничения, считаются верными. Заметим, что любое ограничение является логической функцией. Ограничение считается нарушенным, если только соответствующая функция возвращает false. Ограничение считается выполненным, если функция возвращает true. Если функция возвращает unknown, ограничение ни выполнено, ни нарушено (такое возможно, если в выражениях участвуют необязательные явные атрибуты объектов с вероятными неопределенными значениями).
Рассмотрим пример использования ограничений в языке EXPRESS на фрагменте спецификации геометрической модели (см. рис. 2). Во-первых, ограниченной является область определения значений ряда атрибутов в специфицируемых типах объектов. Так, в качестве значений атрибута Identifier в объектном типе GeometryObject должны использоваться строки фиксированной длины в 16 символов, диапазон значений размерности (Dim) точек (Point), кривых (Curve) и их сегментов (CurveSegmenf) ограничен целыми числами в интервале от 1 до 3, что определяется правилом WR1 в типе Dimension, а также недопустимыми являются неопределенные значения для явных атрибутов всех типов объектов, за исключением атрибута TextCommentary в типе GeometryObject. Используемые агрегатные типы данных налагают ограничения на количество элементов в коллекциях Coordinates, определяемых в типе Point, и Segments, определяемых в типе CompositeCurve, причем в последней ограничено только минимальное количество элементов.
Дополнительные ограничения на отдельные объекты налагают правила и инверсные атрибуты, определенные в соответствующих объектных типах. Так, правило UR1 устанавливает уникальность значений атрибута Identifier в объектах типа GeometryObject. Правило DimCoincide в объектном типе CompositeCurve определяет требование совпадения размерностей ассоциированных объектов типа CurveSegment. Правило CheckTransition в объектном типе CompositeCurve устанавливает, что сопряжение сегментов составной кривой должно быть непрерывным, за исключением последнего сегмента незамкнутой кривой. Заметим, что в данных правилах используются не только локальные атрибуты, но и атрибуты ассоциированного объектного типа CurveSegment. Также, на объекты типа CurveSegment посредством инверсного атрибута UsingCurves налагается следующее ограничение: сегмент должен быть ассоциирован по крайней мере с одной составной кривой, причем с одной и той же кривой он не может быть ассоциирован многократно.
Наконец, глобальное правило CurveDimensionsCoincide устанавливает следующее ограничение: в правильном наборе данных должны совпадать размерности всех кривых.
SCHEMA. Geometry;
TYPE Dimension = INTEGER;
"WHERE
WR1: { 0 < SELF <=3 };
END_TYPE;
ENTITY GeametryObject ABSTRACT SUPERTYPE OF (ONEOF(Point, Curve, Surface)); Identifier: STRING(16) FIXED;
TextCommentary: OPTIONAL STRING;
UNIQUE UR1: Identifier;
END_ENTITY;
ENTITY Point SUBTYPE OF(GeametryObject);
Coordinates: LIST [2:3] OF REAL;
DERIVE
Dim: Dimension := HIINDEX(Coordinates);
END_ENTITY;
ENTITY Curve
ABSTRACT SUPERTYPE OF (ONBOF(CompositeCurve, Conic, Line, OffsetCurve, Polyline, TrittmedCurve))
SUBTYPE OF(GecmetryObj ect);
DERIVE
Dim: Dimension := CalculateCurveDimension(SELF);
END_ENTITY;
ENTITY CurveSegment;
ContinuousTransition: LOGICAL;
ParentCurve: Curve;
DERIVE
Dim: Dimension := ParentCurve.Dim;
INVERSE
UsingCurves: SET [1:?] OF CompositeCurve FOR Segments;
END_ENTITY;
ENTITY CompositeCurve SUBTYPE OF(Curve);
Segments: LIST [1:?] OF CurveSegment;
SelfIntersect: LOGICAL;
DERIVE
NSegments: INTEGER := SIZBOF(Segments);
ClosedCurve: LOGICAL := Segments[NSegments].ContinuousTransition; SEIiF\Curve.Dim: Dimension := Segments[1] .Dim; l/fflERE
CheckTransition: ((NOT ClosedCurve) AND (SIZBOF(QUERY(Temp <* Segments | NOT Temp.ContinuousTransition)) = 1)) OR ((ClosedCurve) AND (SIZBOF(QUERY(Temp <* Segments | NOT Temp.ContinuousTransition)) = 0)); DittCoincide: SIZBOF (QUERY ( Temp <* Segments | Temp.Dim <>
Segments[1].Dim)) = 0;
END_ENTITY;
RULE CurveDimensionsCoincide TOR (Curve);
"WHERE
WR1: SIZBOF( QUERY( Temp <* Curve | Temp.Dim <> Curve[l].Dim)) = 0; EMD_RULE;
FUNCTION CalculateCurveDimension (c : Curve) : Dimension;
LOCAL
result : Dimension := 3;
ENDJjXAL;
IF (' GEOMETRY.LINE' IN TYPEOF(c))
THEM result :=
ELSE
IF ('GEOMETRY.CONIC' INTYPEOF(c))
THEM result :=
ELSE
IF (' GEOMETRY. POLYLINE' IN TYPEOF (c))
THEM result :=
ELSE
IF ('GEOMETRY.COMPOSITECURVE' IN TYPEOF(c))
THEN result := c.Dim;
ELSE
END_IF;
END_IF;
END_IF;
END_IF;
RETURN (result);
END_FUNCTION;
END_SCHEMA;
Puc. 2. Фрагмент спецификации геометрической модели на языке EXPRESS.
4. Задача верификации модели
Определение 1 (Прикладная модель). Прикладной моделью Мs назовем множество ассоциативно связанных между собой объектов, типы которых определяются некоторой информационной схемой S.
По существу, прикладная модель задает множество объектов, семантически объединенных единой информационной схемой и связанных единым контекстом использования. Предполагается, что все ассоциативные связи модели являются внутренними, поскольку в противном случае возможная навигация по ним нарушала бы целостность контекста использования. Определение 2 (Объектная популяция). Поименованное подмножество объектов р одного типа назовем объектной популяцией прикладной модели
Ms. Пусть 0(p) — множество объектов популяции, а Т(р) — ее тип, тогда верно следующее: 0(р) с Мs , Т(р) е S.
Определением допускается, что разные популяции р] и р2 одной прикладной модели могут иметь ОДИН И ТОТ же ТИП Т(рг)=Т (р2) , (К Р\ ) с М s, 0(р2) с Мs , р\ Ф р2, а один и тот же объект о может одновременно принадлежать нескольким популяциям модели оеО(р,)с М s,
о 6 0(p2)cMs.
Определение 3 (Экстент типа). Подмножество всех объектов прикладной модели Мs, принадлежащих типу Т е S, назовем экстентом типа модели
Ext(Ms,T) .
Очевидно, что если объектный тип 7j е S является подтипом Т2 е S. 7j п Т2. то порождаемый им экстент является подмножеством экстента супертипа Ext(Ms. 7j) с Ext(Ms. T2). Кроме того, любая популяция модели р подтипа Т принадлежит соответствующему экстенту модели, порождаемому этим типом, т.е. если Т(р) 7i Т, то О(р) с Ext(Ms,T).
Приведем постановку задачи верификации прикладной модели. Пусть Мs — некоторая прикладная модель информационной схемы S, и схема S определяет множества типов данных Т (в т.ч. объектных), а также правил Rule, ставящих логические условия целостности данных. Будем считать, что во множество Rule входят как локальные ограничения local rule, определяемые на отдельных типах данных и действующие для каждого экземпляра соответствующего типа, так и глобальные правила globalrule, определяемые на некоторой совокупности типов и действующие для экстентов данных типов. Требуется найти подмножество объектов модели О с Мs, таких что:
3 local _ rule e Rule : local _ rule(o) = false, о eO ,
3global_rulee Rule: global_rule(Ext(Ms,7j,К,Tn)) = false,Ext(Ms,7j,K,Tn) с О
Другими словами, целостность данных прикладной модели нарушена, если нарушено хотя бы одно локальное ограничение для любого из ее объектов или глобальное ограничение для соответствующих экстентов.
Алгоритм верификации модели приведен ниже. Верификатор записывает в журнал (log), какие именно ограничения и для каких объектов в ней были нарушены. В отдельных циклах проверяются локальные ограничения для каждого из объектов модели и глобальные правила, определяемые в информационной схеме. Отметим, что для сокращения записи алгоритма не приводятся варианты выбора ограничений на отдельном атрибуте в зависимости от его типа и контекста использования в классе объектов (явный, инверсный). Подразумевается, что выбор конкретных ограничений и их
последующая проверка осуществляется здесь: Check AttributeConst-
raints(Object, Attribute), for each Object in Model for each Attribute in Object
check AttributeConstraints(Object, Attribute), log if violated for each DatHihRule in T(Object)
check DatHihRule (Object), log if violated for each UniquenessRule in T(Object)
for each 0bject2 in Model after Object if T(0bject2) is subtype of T (Object) for each Attribute in UniguenessRule
compare Attribute in 0bject2 with Attribute in Object log if the comparison is true for each Attribute for each GlobalRule in Schema check GlobalRule, log if violated
5. Применение графов для анализа объектно-ориентированных моделей
Определение 4 (Ассоциативный граф — RG). Пусть Мs — прикладная модель, определяемая информационной схемой S, Р — некоторое множество популяций модели, R = Rs Y Ra — множество переходов между ними, каждый из которых представляется либо отношением принадлежности одной популяции другой, либо ассоциативным отношением, определяемым схемой S для соответствующих объектных типов популяций. Тогда ассоциативным графом RG(P,R} для модели Ms назовем ориентированный граф, вершины
которого Р соответствуют всем популяциям модели, а направленные ребра R, инцидентные парам вершин, — простым и ассоциативным переходам между популяциями (Rs и Ra соответственно).
Сделаем важные замечания относительно используемого понятия перехода. Под простым переходом г е Rs, г : pt —> р . (/ Ф j) понимается отношение
принадлежности популяции pt родственной популяции р ., т.е.
Т(Рг )nT(Pj) и 0(рг) с 0(р}) .
Под ассоциативным переходом г е Ra, г : pt —> р ■ (возможно, / = j)
понимается соответствующее ассоциативное отношение role, определенное информационной схемой для соответствующих объектных типов T(pt) и Т(р-) явным или неявным образом. В частности, если схема определяет ассоциацию role между объектными типами Тх и Т2, то на основе этой ассоциация могут строиться переходы между популяциями модели pt и р . соответствующих ПОДТИПОВ Т (Pi ) п 7| и Т (р .) п Т2.
Способы задания ассоциативных переходов, как и способы определения самих ассоциативных отношений информационной схемы, могут быть довольно разнообразными. В частности, в языке EXPRESS простые ассоциации между типами Тх и Т2 задаются путем определения в 7j атрибутов объектного типа Т2, а множественные ассоциации — путем определения в 7j атрибутов, являющихся простыми или вложенными агрегатами элементов объектного типа Т2. Кроме того, в EXPRESS ассоциативные отношения могут задаваться как некоторые альтернативные состояния атрибутов селективного типа, основанные на простых и множественных ассоциациях всех упомянутых видов. Поскольку селективные конструкции могут содержать в себе ассоциации разных, иногда не родственных объектных типов, то при задании ассоциативного графа необходимо указать, какое именно состояние селективного атрибута порождает соответствующий переход. Один и тот же селективный атрибут, определенный для некоторого объектного типа, может порождать в ассоциативном графе набор переходов из одной и той же вершины, приписанной популяции этого типа. В дальнейшем под ассоциативными будем понимать все объектные типы информационной схемы, а также основанные на них агрегатные и селективные типы.
В основе ассоциативного перехода могут лежать и обратные ассоциативные отношения, которые в EXPRESS реализуются либо явно посредством определения атрибутов INVERSE в ассоциируемом типе, либо неявно путем использования функции USED IN для любых ассоциируемых объектов, которая по роли прямой ассоциации возвращает множество всех объектов, принимающих в ней участие. Аналогичные возможности предусматриваются и другими языками объектно-ориентированного моделирования. Тем самым, применение введенных понятий в рамках проводимого общего подхода к анализу прикладных объектно-ориентированных данных вполне мотивировано.
С каждым переходом г е R, г: р{ pj или, более точно с каждым отношением, порождающим переход от р: к р ., свяжем правило определения нового состояния популяции O'(pj) по заданным текущим состояниям популяций 0(pt) и O(pj).
Правило простого перехода г е Rs, г : pt —> р . задается функцией O'(Pj) = 0(pj) Yo e O(pj) | T(o) rc T(pj). Функция определяет O'ip -) как результат объединения текущего состояния популяции р ■ и всех объектов популяции pt, принадлежащих типу популяции Т(р ,). Применение правила при Т ipt) 7i Т ipj) обеспечивает выполнение условия принадлежности популяции pt популяции Pj .
Правило ассоциативного перехода r&Ra,r.pi^pj задается функцией 0'(pj) = 0(pj) Yо е AdjXpj,role) \ Т(о)%Т(р}), которая определяет новое состояние O'(pj) как результат объединения текущего состояния р . и всех объектов, связанных с объектами популяции pt по роли ассоциации перехода
role. Правила переходов задают некоторые способы формирования и обновления популяций модели.
Хотя отношения принадлежности и ассоциативные отношения сами по себе являются однонаправленными, будем считать, что они могут определять соответствующие переходы в прямом и обратном направлении. Смена направления перехода происходит в результате применения соответствующей операции инвертирования, приписывающей переходу г е R, г : pt —>■ р .
соответствующий статус г е R, г : р ■ —>■ pi. Повторное инвертирование
возвращает переход в его начальное состояние. Применение операции инвертирования к множеству переходов R означает ее применение ко всем
переходам этого множества. Результат операции будем обозначать R .
Для переходов в инвертированном состоянии также определены функциональные правила. Правило простого обратного перехода г е Rs, г : р} —> р: задается функцией:
0'(р,) = 0(pt) Y о е 0(р} )\Т(о)пТ (рг).
Правило ассоциативного обратного перехода г е Ra, г : pj —> pi задается функцией:
0'(р,) = 0(pt) Yo е Adj(p} ,role) | T(o) n T(pt),
в которой под role понимается обратное ассоциативное отношение. Правило определяет новое состояние О'(р^) как результат объединения текущего состояния pt и всех объектов модели типа Т (Pi), связанных с объектами популяции pj обратным ассоциативным отношением role. Как было замечено
ранее, прямой переход может основываться и на обратном ассоциативном отношении, определяемом информационной схемой для соответствующих объектных типов. Для этих случаев role означает применение соответствующего прямого ассоциативного отношения.
В силу определения ассоциативного графа каяедой его вершине могут быть инцидентны ребра переходов разных видов, причем как входящих в нее, так и выходящих из нее независимо от направленности порождающих их отношений принадлежности и ассоциативных отношений. Поэтому допускается, что ассоциативные графы могут содержать циклы, в том числе и ориентированные.
Для задач композиции ассоциативных графов, рассматриваемых ниже, важно обеспечить некоторый единый механизм связывания отдельных структур подграфов. Для удобства будем считать, что простыми переходами могут быть соединены популяции, принадлежащие разным графам А01 и А02 одной и
той же прикладной модели М5. С этой целью переходы содержат ссылки не только на инцидентные им популяции, но и на содержащие их графы. Определение 5 (Атрибутивный граф — АН). Атрибутивным графом АО(Р,Я,А} для модели М5 будем называть соответствующий ассоциативный
граф КС(Р,Щ, всем вершинам которого реР дополнительно приписаны
некоторые подмножества атрибутов А(р), определенных информационной схемой Л' для соответствующих объектных типов Т(р).
В дальнейшем атрибутные графы используются при анализе зависимостей правил целостности от свойств отдельных объектов. При упрощенном анализе на основе ассоциативных графов отдельные атрибуты игнорируются и определяются зависимости от состояния объектов. Упрощенный анализ приводит к результатам, эквивалентным результатам детального анализа для случаев, когда атрибутные множества включают в себя полные наборы атрибутов, определенные информационной схемой для соответствующих типов популяций. В этом смысле ассоциативные графы КО(Р,В^ могут
рассматриваться как частные случаи атрибутивных графов АО(Р,К,А^, в которых вершинам приписаны полные наборы атрибутов.
Как и в случае ассоциативных графов, использование селективных атрибутов имеет свои особенности. Если состояния селективного атрибута составляют только ассоциативные типы, то атрибут может порождать ребра переходов в атрибутивном графе. Если всеми состояниями селективного атрибута являются неассоциативные типы данных, то атрибут может быть приписан соответствующим вершинам графа. Наконец, если состояния селективного атрибута составляют как ассоциативные, так и неассоциативные типы данных, то он может одновременно определять ребра переходов в графе и быть приписан некоторым его вершинам.
Определение 6 (Граф навигации — N(1). Пусть М5 — прикладная модель информационной схемы Б,Р — множество популяций модели, К = У Яа — множество простых и ассоциативных переходов между ними, А — приписанные вершинам атрибутные множества, и с Р — популяции инициации, начальные состояния которых ()(и,) с М5, иг е ( ' задаются, и V с Р — целевые популяции, состояния которых <3(Уг) с М5. Г( 6 V представляют интерес. Тогда графом навигации ЫО(Р,К,А,1/,У} для модели
М назовем ориентированный граф, вершины которого соответствуют популяциям модели Р и приписанным им атрибутным множествам А; ребра,
инцидентные парам вершин — переходам между популяциями И; ребра, входящие в вершины — начальным состояниям популяций инициации II; ребра, выходящие из вершин — конечным состояниям целевых популяций V.
В случаях, когда какая-либо составляющая графа навигации не существенна, будем использовать сокращенное обозначение. В частности, если при рассмотрении не важны атрибутивные множества, то будем использовать соответствующую запись ЫО(Р,Я,А,и.
Граф навигации задает способ обхода групп объектов прикладной модели по их отношениям и может интерпретироваться как некоторый параметризуемый объектный запрос. Параметрами запроса являются множества инициации, а результатом — объекты целевых популяций.
Утверждение 1 (Навигационный запрос). Граф навигации 1ЧО(Р,Я,идля прикладной модели М5 определяет некоторый объектный запрос в ней. Результатом исполнения запроса является множество объектов целевых популяций модели О (V) с М5 , полученных в результате задания множеств инициации 0(11) с М5 и множественного применения правил переходов
графа К. Параметризуемый запрос, определенный на основе графа навигации, будем в дальнейшем называть навигационным.
Множественность означает многократное (итерационное) сериализованное (последовательное по ребрам переходов) выполнение всех правил до тех пор, пока их применение приводит к изменению состояния хотя бы одной популяции.
Подобная интерпретация навигационного запроса, задаваемого декларативными правилами переходов, нуждается в дополнительных комментариях. Во-первых, введенное определение корректно с точки зрения детерминизма результата запроса, поскольку результат не зависит от конкретного способа маршрутизации графа и сериализации выполнения правил переходов. Во-вторых, определение корректно с позиций конструктивности процедуры исполнения запроса, поскольку множество объектов прикладной модели конечно и процедура всегда завершается за конечное число циклов. В самом деле, каждый новый цикл выполнения правил перехода неминуемо приводит к добавлению по крайней мере одного объекта в одну из популяций модели, в противном случае процедура исчерпывает себя. С другой стороны, процедура завершится, если каждая популяция будет включать в себя все объекты модели. Это означает, что процедура всегда завершится за конечное число итераций независимо от возможного наличия циклов в графе навигации.
Для графов навигации, являющихся деревьями, всегда (независимо от вершин инициации и целевых вершин) существует способ сериализации, соответствующий однократному обходу вершин графа и последовательному применению правил, ассоциируемых с ними. Для графов, содержащих циклы, может потребоваться многократное итерационное выполнение одних и тех же
правил. В любом случае, всегда существует способ сериализации правил, гарантированно приводящий к получению окончательного результата навигационного запроса. Тривиальный способ состоит в циклическом применении всего набора правил (независимо от их предварительного упорядочивания) вплоть до установления фиксированных множеств объектов во всех популяциях. Для дальнейшего обсуждения возможные способы исполнения навигационных запросов не столь существенны.
Для графов навигации можно конструктивно определить операции инверсии, редукции и слияния следующим образом.
Определение 7 (Инверсия графа навигации). Пусть ЫО(Р,К,А,и— граф навигации для модели М5, тогда инвертированным к нему назовем навигационный граф ЫС(Р, К,А,и у) = ж[р, К,А,У,иу
Согласно определению направления всех переходов в инвертированном графе меняются на противоположные, а популяции инициации и целевые популяции меняются местами. В графической нотации инвертирование графа соответствует замене ориентации всех ребер на противоположную (см. рис. 3). На рисунке проиллюстрирована также возможность композиции отдельных подграфов на основе простых переходов, соединяющих их вершины.
Рис. 3. Пример композиции и инверсии графов навигации.
Определение 8 (Маршрут и достижимость вершин в графе навигации).
Маршрутом в графе навигации NG(P,R,U,V} назовем упорядоченное подмножество ребер переходов гг е R, гг : ps (гг) —>■ pt (гг), / = 1,К п и инцидентных им вершин популяций ps (гг) е Р, pt (гг) е Р таких, что ps (гг+1 ) = pt (гг) для всех /' = 1,...,и-1. Началом маршрута будем называть р>; (г,). а концом маршрута — Pt(rn) ■ Вершину ptaigeteP в графе NG(P,R,U,V) будем называть достижимой из psource е Р, если существует маршрут в нем с началом в psource и концом в рш%е1.
Определение 9 (Редукция графа навигации). Пусть NG(P,R,U,V} — граф навигации для модели Мs. Тогда под редукцией будем понимать граф
навигации Ж?' = ЫО(Р',К',иу}, в котором каждая вершина популяции р' є Р' с Р и каждое ребро перехода г' є Я' сі? принадлежат хотя бы одному маршруту в исходном графе ЫС(Р,Я,иу}, ведущему из вершины инициации
и є 17 в целевую вершину V є V . Редуцированным по отношению к типу Т є £ будем называть граф, к которому применена операция редукции после удаления всех вершин инициации и, не принадлежащих типу Т.
В графической нотации редукция графа навигации выглядит как удаление из него всех вершин и ребер, через которые не проходит ни один маршрут, ведущий из какой-либо вершины инициации в какую-либо целевую вершину. Реализация операции может быть основана на предварительном анализе одновременной достижимости вершины графа из множества инициации и целевого множества из вершины. Ниже на Рис. 4 приведен пример графа навигации и его редуцированного графа.
Рис. 4. Пример графа навигации и его редукции.
Определение 10 (Слияние графов навигации). Пусть ЫО(Р,К,А,иу},
ЫО'(Р',Я',А',и'У'} — графы навигации для модели М3. Две вершины р е Р и р' е Р' подобны друг другу, если они имеют тождественный тип Т(р) = Т(р'); два ребра назовем подобными друг другу, если они инцидентны парам соответствующих подобных вершинам и имеют идентичные имена и типы переходов. Два маршрута эквивалентны, если они составлены из эквивалентных последовательностей подобных вершин и ребер. Две вершины р е Р
и р' е Р' назовем эквивалентными относительно пары подобных вершин и е II, и' е и', если они достижимы из них по эквивалентным наборам маршрутов. Ребра эквивалентны, если они инцидентны парам эквивалентных вершин. Тогда под операцией слияния графов относительно пары подобных вершин и е II, и' е V' будем понимать преобразование графов к представлению ЫО”(Р”,К”,А",и"У”'} такому, что каждой паре эквивалентных элементов, а также каждому неэквивалентному элементу в графах \(г. N0’ соответствует
единственный подобный элемент графа М3" р" е Р". г" е Н”. и" е £/", у" е V”, а приписанные вершинам атрибутные множества А" формируются путем объединения множеств^, . Г соответствующих вершин графов \'(1. N0'.
Определение операции слияния для графов навигации конструктивно и допускает ряд алгоритмических реализаций. Одна из них состоит в предварительном поиске пар потенциально эквивалентных вершин и ребер путем одновременного согласованного обхода графов по подобным направленным ребрам переходов от вершин инициации. Затем составленный список пар вершин последовательно просматривается с целью обнаружения каких-либо ребер, входящих в вершины списка и одновременно инцидентных вершинам, не включенным в список. Такие пары вершин из списка удаляются, а процедура поиска повторяется вплоть до исчерпывания удаляемых пар. Оставшиеся в списке пары вершин, а также инцидентные им пары ребер являются эквивалентными и поэтому при слиянии графов отображаются в соответствующие подобные элементы результирующего графа. Все вершины, не вошедшие в список, и инцидентные им ребра добавляются в результирующий граф.
Ниже на Рис. 5 приведены графы навигации \'(1. М3' и граф \'(г". полученный в результате их слияния относительно подобных вершин и и и'.
Операция слияния графов навигации имеет прозрачную интерпретацию в терминах навигационных запросов. Результат исполнения запроса на основе результирующего графа слияния включает в себя результаты отдельных запросов, основанных на графах-операндах. В самом деле, введенное понятие эквивалентности в графах навигации предполагает, что множество объектных популяций, полученное в результате исполнения запроса, эквивалентно множествам, полученным в результате навигации по эквивалентным маршрутам из подобных вершин инициации с эквивалентными начальными состояниями.
Рис. 5. Пример преобразования графов навигации на основе операции слияния.
Г раф навигации и перечисленные операции достаточно естественно применяются к задачам инкрементальной верификации формально специфицированных объектно-ориентированных данных и ограничений на них. Рассмотрим некоторые приложения.
Определение 11 (Граф зависимости — DG). Пусть Procedure^, х2 ,К , х„)
— некоторая процедура, специфицированная на языке EXPRESS. Ее графом зависимости назовем граф навигации DG(P,R,A,U,V}, построенный на основе следующего набора правил:
• Все формальные параметры и локальные переменные ассоциативного типа (объектные типы, а также основанные на них агрегатные и селективные конструкции), представляются в графе вершинами Р. Каждый формальный параметр и локальная переменная ассоциативного селективного типа порождает множество вершин Р, соответствующих всем его ассоциативным состояниям. Вершины, соответствующие формальным параметрам процедуры, включаются также во множество вершин инициации U, если процедура реализует некоторое правило целостности;
• Все регулярные выражения путей с использованием атрибутов ассоциативного типа представляются в графе направленными ребрами ассоциативных переходов Ra и инцидентными им вершинами популяций Р соответствующего объектного типа. Каждому сегменту пути соответствует одно ребро и одна вершина. Если выражение пути реализуется на основе ассоциативного селективного атрибута, то каждому его ассоциативному состоянию соответствует одно ребро и одна вершина. Ребра направлены от вершин популяций объектов, содержащих ассоциативную связь, к вершинам популяций ассоциируемых объектов. При использовании в выражениях обратных ассоциативных отношений переходу приписывается соответствующий статус инвертирования;
• Все операции явного и неявного приведения типа для объектов, являющихся формальными параметрами процедуры или локальными переменными, представляются в графе направленными ребрами простых переходов Rs и инцидентными им вершинами популяций Р соответствующего приведенного объектного типа. Под неявным приведением типа понимается соответствующее использование объектных ссылок в телах управляющих операторов с условием на принадлежность подтипу;
• Теоретико-множественные операции над операндами агрегатного ассоциативного типа представляются ребрами простых переходов Rs от вершин популяций, соответствующих операндам операции, к новой построенной вершине, являющейся результатом операции. Объектный тип, приписываемый вершине, является супертипом всех объектных типов, связанных с вершинами операндов. При объединении множеств ребра конструируются для каждого операнда, при вычитании — только
для первого операнда, при пересечении — для любого из них;
• Все операции использования значений атрибутов неассоциативного типа в правой части оператора присваивания порождают атрибутивные множества А, приписываемые соответствующим вершинам популяций объектов Р, для которых эти операции были использованы;
• Все операции использования значений атрибутов ассоциативных типов в правой части оператора присваивания представляются в графе направленными ребрами простых переходов Rs от вершин популяций объектов, атрибуты которых присваиваются, к вершинам популяций объектов, которым эти значения присваиваются. При присваивании значений ассоциативного селективного атрибута строится множество ребер простых переходов Rs, каждому из которых соответствует свое ассоциативное состояние атрибута;
• Все вызовы процедур с параметрами ассоциативных типов представляются в графе ребрами простых переходов Rs . Ребра соединяют вершины популяций, являющиеся фактическими параметрами процедуры с вершинами популяций, соответствующих формальным параметрам вызываемой процедуры в ее подграфе зависимости. Таким образом, построение графа зависимости для процедуры включает в себя построение и композицию подграфов для всех используемых в ней внешних процедур;
• Все построенные вершины Р также включаются во множество целевых вершин V;
• Все остальные операторы и операции языка EXPRESS игнорируются.
На основе перечисленных правил граф зависимости может быть непосредственно построен не только для процедур, но и для функций, производных атрибутов, локальных и глобальных правил, специфицированных на языке EXPRESS. Сигнатуры глобальных правил точно соответствуют обобщенной структуре задания параметров в процедурах EXPRESS. Фактическими параметрами процедур глобальных правил являются экстенты типов прикладной модели, подлежащей верификации. Производные атрибуты и локальные правила могут интерпретироваться как соответствующие процедуры, единственным входным параметром которых является сам типизированный объект, для которого эти атрибуты и правила определены. Фактическим параметром локальных правил является объект, подлежащий верификации. Любая используемая при верификации функция также может быть представлена в виде соответствующей процедуры, одним из параметров которой является возвращаемое значение функции, а все остальные — ее входные параметры. Таким образом, определение графа зависимости имеет общий характер для анализа спецификаций ограничений.
Утверждение 2 (Локализация объектов, используемых правилом). Пусть Мs — прикладная модель и rule е S — некоторое правило целостности
данных, специфицированное для информационной схемы S, DG(P,R,A,U,V}
— его граф зависимости. Тогда при задании фактических параметров правила в качестве множества инициации 0(U) с Мs результат исполнения навигационного запроса, основанного на графе зависимости, включает в себя все объекты прикладной модели Мs, используемые при верификации данного правила.
В самом деле, опуская условные операторы и операции индексирования агрегатов, участвующие в определении правила целостности, граф зависимости учитывает лишь статические отношения между группами объектов (ассоциативные отношения и отношения принадлежности множеств) и по построению приводит к расширительному запросу объектов, участвующих в верификации правила. При этом в атрибутные множества попадают также все атрибуты объектов, потенциально используемые при верификации правила независимо от фактических, определяемых в процессе исполнения значений предикатов для управляющих операторов языка EXPRESS. Таким образом, утверждение 2 может конструктивно применяться для локализации групп объектов, участвующих в верификации правил целостности.
Определение 12 (Граф влияния — IG). Пусть Мs — прикладная модель и
rule е S — некоторое правило целостности данных, специфицированное для информационной схемы S, DG — его граф зависимости. Графом влияния популяций объектного типа Т е S для правила rule назовем соответствующий ему граф навигации IG(P,R,A,U,V}, полученный в результате инвертирования графа зависимости и его редукции относительно заданного типа Т. Утверждение 3 (Локализация правил с участием объекта). Пусть Мs — прикладная модель и rule е S — некоторое правило целостности данных, специфицированное для информационной схемы S, о е Мs — некоторый
объект прикладной модели типа Т(о) = 7 и IG(P,R,A,U,V} — граф влияния популяций типа Т для правила rule. Тогда при задании объекта о в качестве начального состояния популяций инициаций U (ui ell, 0(ui) = о) результат исполнения навигационного запроса, основанного на графе влияния, включает в себя все объекты модели Мs, которые в качестве фактических параметров правила участвуют в его верификации вместе с заданным объектом о. Поскольку при построении графа влияния каждый переход в графе зависимости инвертируется, то соответствующий объектный запрос реализует обратную навигацию по прикладной модели от заданного объекта ко всем объектам, участвующим в верификации правила в качестве фактических параметров. Поскольку при построении графа зависимости были игнорированы условные операторы и операции индексирования агрегатов, прохождение каждого перехода в обратном направлении лишь расширяет множество объектов, из которых заданный объект мог быть достижим по маршрутам
графа зависимости в результате прямой навигации. Это означает, что результаты запроса будут включать все объекты, для которых выполнение правила целостности может быть связано с состоянием анализируемого объекта. При этом на выполнение правила могут влиять лишь те свойства объекта, которые представлены в графе влияния соответствующими атрибутными множествами вершин инициации и инцидентными им ребрами ассоциативных переходов.
Проиллюстрируем построение графов зависимости и влияния для глобального правила информационной схемы, приведенной на Рис. 2.
На Рис. 6 приведен построенный для глобального правила CurveDimen-sionsCoincide граф зависимости. Участвующие в определении правила производные атрибуты Curve: :Dim, Curve Segment: :Dim, CompositeCurve: :Dim и функция CalculateCurveDimension представлены собственными подграфами, связь с которыми в композиционном представлении графа реализуется посредством простых переходов, соответствующих передаче фактических параметров ассоциативного типа в функции. Простые переходы в подграфе функции CalculateCurveDimension соответствуют используемым операциям неявного приведения типа. В данном примере абстрактный тип геометрической кривой Curve приводится к соответствующим подтипам линий Line, конических кривых Conic, ломанных Polyline, композитных кривых CompositeCurve. Построенный граф правила содержит также два ассоциативных перехода, связанных с использованием соответствующих ассоциативных отношений CompositeCurve::Segments и CurveSegment: :Parent-Curve между объектами внутри функций. Цикличность построенного графа зависимости является следствием рекурсивного использования функций в определении глобального правила.
G1: CurveDimensionsCoincide
G2: Curve::Dim
p1: Curve 1
G3: CalculateCurveDimension
p2:Curve
p3:Line
►Ot-tH
p10:Curve
p5:Polyline
p9: Curve Segment
и-о*
G5: CurveSegment::Dim
Parent
Curve
p7:Composite Curve
О—И
Segments
p8: Curve ^ [ Segment
G4: CompositeCurve::Dim
Dim
Рис. 6. Пример графа зависимости для глобального правила.
На рисунке 7 представлен соответствующий граф влияния популяций типа Conic для глобального правила CurveDimensionsCoincide. Граф построен в результате применения описанных выше операций инвертирования и редукции относительно заданного типа. В результате инвертирования все ребра в нем поменяли направления, а в результате редукции были удалены популяции рЗ: Line, р5.'Polyline и инцидентные им переходы. Популяция рб: CompositeCurve и связанный с нею циклический маршрут Curve->CompositeCurve->CurveSegment-> Curve в графе влияния сохранился. Связанно это с тем, что объект типа Conic может являться сегментом кривой типа CompositeCurve и влиять на вычисление правила через объекты, входящие в указанный циклический маршрут.
Рис. 7. Пример графа влияния популяций для глобального правила.
6. Инкрементальная верификация модели
Прикладная модель не находится постоянно в одном и том же состоянии и изменяется на протяжении своего жизненного цикла, т.е. переходит из одного состояния в другое. Подобные смены состояний модели осуществляются при выполнении трех основных операций жизненного цикла: вставке в нее новых объектов (INSERT), модификации (UPDATE) или удалении (DELETE) существующих объектов. Естественно, что подобные изменения могут привести к нарушению целостности данных модели. Поскольку реальные модели промышленных данных состоят из нескольких сотен тысяч и даже миллионов объектов, полная верификация модели по приведенному выше алгоритму требует больших затрат вычислительных ресурсов. Поэтому возникает естественное желание попытаться сузить (локализовать) область проверки условий целостности данных.
Отсюда вытекает задача инкрементальной верификации, заключающаяся в выделении подмножества объектов прикладной модели, которые потенциально могут нарушить поставленные ограничения в результате ее перехода в новое состояние при условии, что в предыдущем состоянии модель была валидна. Решение задачи основано на анализе спецификаций ограничений, ставящих условия целостности данных. В рамках настоящего исследования ограничимся только статическим анализом спецификаций, поскольку более тонкий динамический анализ приводит к существенным увеличениям вычислительных затрат, иногда сопоставимых с затратами на полную верификацию. Это замечание в равной степени распространяется и на статический анализ, однако в силу экономичности его применение может оказаться оправданным в задачах верификации масштабных объектно-ориентированных моделей.
Утверждения 1-3 предоставляют конструктивную основу для построения семейства алгоритмов инкрементальной верификации объектно-ориентированных данных. В их основе лежит идея представления множественных изменений в прикладной модели последовательностью элементарных изменений и объединением локализованных на каяедом шаге групп объектов модели и соответствующих правил целостности, которые могли бы быть нарушены вследствие принятых изменений. Под элементарным понимается изменение, затрагивающее только один объект модели. Элементарными являются модификация, удаление одного из существующих объектов модели или создание одного нового объекта модели. На каяедом шаге алгоритмов множества объектов и правил, подлежащих дальнейшей верификации, расширяются с учетом последовательного принятия всех изменений модели.
В зависимости от степени локализации области проверки ограничений можно выделить два варианта постановки задачи инкрементальной верификации:
1) определить подмножество объектов модели, которые потенциально могут нарушить конкретные ограничения в ней в результате проведенного элементарного изменения, при этом проверке подлежат только те правила, которые являются зависимыми от состояния измененного объекта;
2) определить подмножество объектов модели, которые потенциально могут нарушить произвольные ограничения в ней в результате проведенного элементарного изменения, при этом проверке подлежат все без исключения правила для выделенного подмножества объектов.
Решение задачи в первой постановке требует больших затрат вычислительных ресурсов, но позволяет лучше локализовать область проверки и минимизировать количество проверяемых правил.
Рассмотрим алгоритмы решения задачи инкрементальной верификации в каждом из вариантов постановок. Все алгоритмы используют результаты предварительного статического анализа спецификаций информационной схемы, в ходе которого для всех локальных и глобальных правил целостности строятся соответствующие графы зависимости и влияния. Последние строятся относительно всех объектных типов информационной схемы и организуются в
виде специального репозитория. По заданному типу объекта средствами репозитория определяется набор правил, в верификации которых конкретный объект мог принимать участие, и конструируются соответствующие им графы влияния, на основе которых могут быть локализованы объекты, являющиеся фактическими параметрами анализируемых правил целостности. Для локальных правил репозиторий хранит также слитое представление графов влияния по отношению к вершинам инициации соответствующего объектного типа. Подобное представление используется в ходе решения задачи инкрементальной верификации во второй постановке.
Итак, рассмотрим алгоритм решения задачи в первой постановке. В примененной алгоритмической нотации Obj означает изменившийся, удалившийся или добавленный объект, Obj' — старое состояние объекта (до выполнения операции UPDATE), operation — операция, примененная к объекту Obj\ INSERT, DELETE или UPDATE. Результат работы алгоритма формируется как множество правил, подлежащих проверке. Для локальных правил дополнительно указывается объект, служащий его фактическим параметром. Ограничения уникальности атрибутов, устанавливаемые в отдельных объектных типах, будем относить к глобальным правилам, поскольку они также проверяются на экстентах соответствующих типов.
Особенностью данного метода является локализация правил с учетом изменения состояний отдельных атрибутов объекта. Чтобы исключить лишний анализ глобального правила в тех случаях, когда оно уже попало в результат при анализе предыдущих элементарных изменений, выполняется дополнительная проверка. Выполнять аналогичную проверку для локальных правил нет необходимости, поскольку в результате анализа различных элементарных изменений будут получаться разные (возможно, пересекающиеся) множества пар «объект - локальное правило», if operation is DELETE for each object inversly adjacent to Obj for each attribute in object
if attribute is explicit and association type of attribute is subtype of T(Obj)
add check AttributeConstraints(object, attribute) to result for each object adjacent to Obj for each attribute in object
if attribute is inverse and association type of attribute is subtype of T(Obj)
add check AttributeConstraints(object, attribute) to result
else
for each changed attribute
add check AttributeConstraints(Obj, attribute) to result if there is inverse attribute for attribute
for each object adjacent to Obj by attribute
add check AttributeConstraints(object, inverse attribute) to
result
if operation is UPDATE
for each object adjacent to Obj' by attribute
add check AttributeConstraints(object, inverse attribute) to
result
for each LocalRule represented by IG-graph with respect to T(Obj) if at least one changed attribute of Obj is in attribute set of initiation node
execute navigation guery based on IG-graph and initial state Obj for each found object
add check LocalRule(object) to result if operation is UPDATE
execute navigation guery based on IG-graph and initial state Obj' for each found object
add check LocalRule(object) to result for each GlobalRule represented by IG-graph with respect to T(Obj) if not (GlobalRule in result or (operation is DELETE and GlobalRule is UniguenessRule))
if at least one changed attribute of Obj is in attribute set of initiation node
execute navigation guery based on IG-graph and initial state Obj if there is at least one found object add check GlobalRule to result else if operation is UPDATE
execute navigation guery based on IG-graph and initial state Obj' if there is at least one found object add check GlocalRule to result Рассмотрим алгоритм решения задачи во второй постановке. В отличие от предыдущего алгоритма результат работы данного формируется как множество объектов, все локальные правила которых подлежат проверке, а также множество глобальных правил. Особенностью данного метода является использование для анализа локальных правил слитого представления графов влияния по отношению к вершинам инициации типа объекта Obj. if operation is DELETE for each object inversly adjacent to Obj add object to result
else
add Obj to result for each object adjacent to Obj add object to result if operation is UPDATE for each object adjacent to Obj' add object to result get merged IG-graph with respect to T(obj)
execute navigation guery based on IG-graph and initial state Obj for each found object add object to result if operation is UPDATE execute navigation guery based on IG-graph and initial state Obj' for each found object
add object to result
for each GlobalRule represented by IG-graph with respect to T(Obj) if not (GlobalRule in result or (operation is DELETE and GlobalRule is
UniquenessRule))
execute navigation guery based on IG-graph and initial state Obj if there is at least one found object add check GlobalRule to result else if operation is UPDATE
execute navigation guery based on IG-graph and initial state Obj' if there is at least one found object add check GlocalRule to result
7. Заключение
Таким образом, рассмотрены задачи верификации объектно-ориентированных данных. Для задачи инкрементальной верификации на основе теории графов предложен формальный аппарат, а также разработаны методы, позволяющие локализовать область потенциальных нарушений на основе статического анализа спецификации ограничений. Методы предоставляют весомую альтернативу полной верификации прикладных данных в тех случаях, когда их изменения не затрагивают глобальные ограничения, заданные на обширных популяциях тесно связанных между собой объектов. По-видимому, количественные критерии оптимальности применения методов инкрементальной верификации должны учитывать особенности информационной схемы, а их выработка представляет собой интересную научную задачу. Важным также представляется обобщение разработанных методов верификации на случай одновременных множественных изменений.
Литература
1. К. Ramamritham, P. Chrysanthis. Executive Briefing: Advances in Concurrency Control and Transaction Processing. IEEE Computer Society Press, 1997.
2. E. Mayol, E. Teniente. A Survey of Current Methods for Integrity Constraint Maintenance and View Updating. // Advances in Conceptual Modeling: ER '99 Workshops on Evolution and Change in Data Management, Reverse Engineering in Information Systems, and the World Wide Web and Conceptual Modeling, Paris, France, November 15-18, 1999, pp. 62-73.
3. M. A. Pacheco. Dynamic integrity constraints definition and enforcement in databases: a classification framework. // Proceedings of the IFIP TC-11 Working Group 11.5 First Working Conference on Integrity and Internal Control in Information Systems, Zurich, Switzerland, December 1997, pp. 65-87.
4. P. Fratemali, S. Paraboschi. A Review of Repairing Techniques for Integrity Maintenance. // Proceedings of the First International Workshop on Rules in Database Systems (RIDS'93), Edinburg, 1993, pp. 333-346.
5. ISO 10303-11: 1994, Industrial automation systems and integration — Product data representation and exchange — Part 11: Description methods: The EXPRESS language reference manual.
6. Unified Modeling Language (UML), Version 1.5, 2003, http://www.omg.org/cgi-bin/doc?formal/03-03-01.
7. J. Faria. Data-driven Rules for the Maintenance of Derived Data and Integrity Constraints in User Interfaces to Databases. INESC Technical Report RI 1/99. Porto, Portugal, May 1999.
8. R. Breu, U. Hinkel, C. Hofman, C. Klein, B. Paech, B. Rumpe, V. Thumer. Towards a Formalization of the Unified Modeling Language. // Proceedings of ECOOP’97 — 11th European Conference on Object-Oriented Programming, ed. M. Aksit and S. Matsuoka, LNCS 1241, Springer-Verlag, 1997, pp. 344-366.
9. M. Richters, M. Gogolla. On Formalizing the UML Object Constraint Language OCL. // Proceedings of ER’98 — 17th International Conference on Conceptual Modeling, ed. Tok-Wang Ling, LNCS 1507, Springer-Verlag, 1998, pp. 449^164.