
- •Национальный исследовательский
- •Университет
- •В ы п у с к н а я р а б о т а
- •Введение
- •Глава 1 общие сведения об онтологиях и языках для спецификации онтологий
- •1.1. Содержание онтологии
- •1.2 Цели создания онтологий
- •1.3. Области применения онтологий
- •1.4. Формальная концептуализация и формальные онтологии
- •1.5. Формальная модель понятия и концептуальные языки
- •Глава 2 бинарная модель знаний
- •2.1. Синтаксис имен, используемых в бмз
- •2.2. Бинарная Модель Данных
- •2.2.1. Спецификация типов данных
- •2.2.2. Конструкторы типов данных
- •2.2.3. Спецификация функций
- •2.2.4. Спецификация структуры объектов
- •2.2.5. Синтаксис языка структурной спецификации
- •2.2.6. Атрибутные условия и интервальные ограничения
- •2.2.7. Структурные схемы
- •2.2.8. Представление данных в бмд
- •2.2.9. Логические предложения.
- •Глава 3 язык запросов для бинарной модели данных
- •3.1. Примеры запросов
- •3.2. Описание запросов
- •3.3. Описание алгоритма трансляции.
- •3.4. Примеры работы транслятора.
- •Глава 4 описание и использование программы, реализуюшей транслятор
- •4.1. Описание интерфейса программы.
- •4.2. Задание схемы
- •4.3. Использование транслятора в программном коде.
- •4.4. Программа с подключенной базой данных.
- •Приложение
- •Код программы Файл Onthology.Cs
- •Файл Translator.Cs
- •Заключение
- •Литература
- •Содержание
2.2. Бинарная Модель Данных
В системе БМЗ имеется подсистема «Бинарная Модель Данных» (БМД). В БМД используются следующие языки:
▪ язык описания данных – ЯОД. Используется для спецификации универсумов понятий, т.е. фактически для определения структуры объектов – примеров и контрпримеров понятий. Поэтому предложения ЯОД называются структурными. Таким образом, ЯОД является языком структурной спецификации систем понятий;
▪ язык для спецификации типов данных (значений) – ЯТД. Этот язык можно рассматривать как подъязык ЯОД;
▪ язык запросов к базе данных – ЯЗД;
▪ язык атрибутных условий – ЯАУ. Эти условия являются компонентами запросов.
▪ языки для спецификации логических отношений между понятиями. Предложения этих языков называются логическими. Заметим, что язык атрибутных условий ЯАУ можно рассматривать как логический (условие является булевой комбинацией бинарных отношений между селекторами, которые являются атрибутами или итерациями атрибутов);
▪ языки для спецификации модальных отношений (включая темпоральные отношения);
▪ язык продукций – ЯП.
2.2.1. Спецификация типов данных
В БМЗ используются два вида имен для типов данных – простые (примитивные, предопределенные) имена и составные имена. Простыми именами для типов данных являются:
▪ Boolean = {true, false} . На этом типе данных действуют логические операции NOT x, x AND y, x OR y, x IMP y (x IMPy = false тогда и только тогда, когда x =false и y =true);
▪ Number = {0,1,2,…} (в ASCII представлении). На этом типе данных действуют стандартные бинарные операции (Number,Number)à Number: сложение x+y ; умножение x*y ; усеченная разность x-y (x-y=0, если х меньше y ; возведение в степень x**y; действуют также операции сравнения (Number,Number)àBoolean: , x<y ( x<y =true тогда и только тогда, когда x меньше y), x =<y, x>y, x>=y, x=/y (x не равно y);
▪ Integer = {0,1,-1,2,-2,…} и Real – вещественные числа (в ASCII представлении). На этих типах данных действуют те же операции, что и на типе Number (но вычитание не усеченное);
▪ Char – тип знаков, т.е. букв и символов клавиатуры в ASCII представлении:
A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Y y Z z А а Б б В в Г г Д д Е е Ж ж З з И и Й й К к Л л М м Н н О о П п Р р С с Т т У у Ф ф Х х Ц ц Ч ч Ш ш Щ щ Ъ ъ Ь ь Ы ы Э э Ю ю Я я ~ ` @ # $ % & * / \ ^ _ - " # ; : < > ? . , | + ( ) '
▪ String – строчки символов клавиатуры (в ASCII представлении). На этом типе действует операция конкатенации x^y (к строчке x приписывается без пробела строчка y) и операция LNG: String à Nat(LNG(x) – длина сточки x . (Например, если x = ‘100$ abc’ и y = ‘De’, то LNG(x) = 10 и x^y = ‘100$ abc’’De’ .)
Составные имена для типов данных специфицируют производные типы данных, которые получаются из примитивных типов путем применения конструкторов типов.
2.2.2. Конструкторы типов данных
Пусть Alpha - какая-либо спецификация некоторого типа данных. Через "Alpha" обозначим этот тип значений (точнее, множество всех элементов типа значений, специфицированного выражением Alpha).
Замечание. Вообще, двойные кавычки, заключающие произвольное выражение exp, обозначают смысл (значение) этого выражения. Например, если переменная X приняла значение true, а переменная Y приняла значение false, т.е. “X” = true и “Y” = false, то “X ANDY” = false.
n-Местный конструктор F по спецификацям типов Alpha1, Alpha2,…, Alphan (синтаксически) дает спецификацию F(Alpha1,Alpha2,...,Alphan). Семантически, этот конструктор есть n-местная функция, которая для данных типов значений "Alphaj" определяет новый тип значений
"F(Alpha1,Alpha2,...,Alphan)".
Любую спецификацию типа значений Alpha можно рассматривать как имя того типа "Alpha", который определяется этой спецификацией. Поэтому, следуя обычной практике, мы будем, говоря о типе значений "Alpha", часто использовать его имя Alpha.
Замечание.
На
любом типе данных
Alpha
действуют два оператора сравнения =,
/= : (Alpha,Alpha)
à
Boolean:
“x=y”
“x”
= “y”
и “x/=
y”
“x”
“y”.
Выражение x/=y
эквивалентно
выражению NOT
x=y
: “NOT
x=y”
совпадает
с “x/=y”.
Конструктор (*).
Alpha à Alpha(*),
“Alpha(*)”
= {{x1,x2,...,xp}
| xj
"Alpha"
(1
j
p),
p
= 0,1,2,...}.
Другими
словами, элементами типа Alpha(*)
являются выражения, представляющие
произвольные конечные множества,
которые составлены из элементов типа
Alpha.
Точнее, элементами типа Alpha(*)
являются выражения вида {e1,e2,...,ep},
которые можно рассматривать как
(составные) имена для соответствующих
конечных множеств, состоящих из имен –
элементов типа Alpha.
Поэтому, если элементы ej
“Alpha”
в {e1,e2,...,ep}
записать в другом порядке, то получим
выражение, обозначающее то же самое
множество, т.е. имеем кореферентные
имена: {e1,e2,...,ep}
~ {ei1,ei2,...,eip},
где i1,
i2,…,
ip
– числа от 1 до p,
записанные в произвольном порядке.
(Например, {a,
b,
c,
d}
~ {d,
a,
c,
b}.)
Конструктор объединения
Этот конструктор образует объединение типов:
Alpha, Beta --> Alpha | Beta,
“Alpha
| Beta”
= {x
|
x“Alpha”
или x
Beta}.
Конструктор {}.
Если Alpha – произвольный тип значений и e1, e2,...,en – какие-либо элементы этого типа, то {e1,e2,...,en} есть спецификация конечного типа, состоящего из этих элентов, т.е. “{e1,e2,...,en}” – множество из элементов e1, e2,...,en .
Конструктор декартова произведения ( , ,…)
Этот конструктор дает декартово произведение типов:
Alpha1, Alpha2,..., Alphan à (Alpha1,Alpha2,...,Alphan),
“(Alpha1,Alpha2,...,Alphan)”
= {(x1,x2,...,xn)
| xj
“Alphaj
”
(1
j
n)}.
Таким образом, элементами декартова произведения служат выражения – упорядоченные n-наборы, составленные из элементов типов Alphaj .
С
конструктором декартова произведения
ассоциированы операция "точка", с
помощью которой можно находить компоненты
элементов декартова произведения: если
e
= (e1,e2,...,en)
и 1j
n,
то e.j
= ej
; если же j
> n,
то значение e.j
не определено.
Конструктор «метка».
Пусть
L
String1
– "метка", рассматриваемая как
атрибут.
Alpha, L à L: Alpha,
“L:
Alpha” = { L: x | x“Alpha”}.
Таким образом, элементами “Alpha” являются выражения вида L: e , где е – произвольный элемент типа Alpha.
На этом типе значений действует операция применения атрибута L : если переменная X приняла значение L: е, то X.L = e. Если конструктор «метка» используется в комбинации с декартовым произведением, то получается так называемое помеченное декартово произведение:
Alpha1, L1, Alpha2, L2,..., AlphaN, Ln à
(L1: Alpha1, L2: Alpha2,..., Ln: Alphan),
“(L1: Alpha1, L2: Alpha2,..., Ln: AlphaN)” =
{(L1:
x1,
L2
:x2,...,
Ln:xn)
| xj
Alphaj
(1
j
n)}.
Метка, примененная как атрибут к элементу е = (L1: e1, L2 : e2,..., Ln: en) помеченного декартова произведения, позволяет получать ту компоненту, которая помечена этой меткой:
(L1: e1, L2 : e2,..., Ln: en).Lj = ej .
Вариантом конструктора L: является конструктор /L: /. Различие между этими конструкторами лишь в том, что когда /L: / входит в помеченное декартово произведение, компонента L: может быть пропущена. Рассмотрим, например, следующую спецификацию составного типа:
(/L: Alpha/, M: Beta, /N: Gamma/).
Эта спецификация дает тип данных
“(/L: Alpha/, M: Beta, /N: Gamma/)” =
{(L:
x, M: y, N: z) | xAlpha,
y
Beta,
z
Gamma}
{(L:
x, M: y) | xAlpha,
y
Beta}
{(M:
y, N: z) | yBeta,
z
Gamma}
{
M: y | y
Beta}.
Конструктор списков LIST.
Этот конструктор по данному типу значений строит новый тип, элементами которого служат всевозможные списки, составленные из элементов исходного типа. Мы выбираем синтаксис списков такой, как в Прологе. Например, выражения [], [0,1,2], [[],[0,1,2],1,0], [[[0]]] и т.п. являются элементами типа значений LIST(Nat).
Alpha à LIST(Alpha),
“LIST(Alpha)” – множество всех списков, использующих элементы типа Alpha в качестве атомов.
С конструктором списков ассоциированы стандартные операции Лиспа:
сar: LIST(Alpha) à Alpha | {nil},
cdr: LIST(Alpha) à LIST(Alpha),
cons: (Alpha | LIST(Alpha), LIST(Alpha)) à LIST(Alpha).
Например, если переменные X, Y и Z приняли соответственно значения 2, [0,[1]], [[1,2],[0,0],3], то будем иметь:
car(Y) = 0, car(Z) = [1,2], car(X) и cdr(X) не определены,
cdr(Y) = [[1]], cdr(Z) = [[0,0],3], cons(X,Y) = [2,[0,1]],
cons(Y,Z) = [[0,[1]],[1,2],[0,0],3].
Операцию cons можно также обозначать :: и использовать в инфиксной нотации, считая, что выражения cons(X,Y) и X::Y эквивалентны, т.е. “cons(X,Y)” = “X::Y”. Таким образом, X::Y обозначает список, получаемый из списка “Y” путем вставки “X” на первое место (т.е. перед первым элементом списка “Y”).
Введем также операцию соединения двух списков, которую обозначим :-: и будем использовать ее в инфиксной нотации. (Эта операция соответствует функции append Лиспа.) Если, например, переменные X и Y прияли соответственно значения [2,[0,1],3] и [[],1,2,[3,0]], то “X:-:Y” = [2,[0,1],3,[],1,2,[3,0]].
Конструктор линейного списка LLIST.
Этот конструктор строит тип данных, элементами которого служат линейные (т.е. неразветвленные) списки, составленные из элементов данного типа данных:
Alpha à LLIST(Alpha),
“LLIST(Alpha)”
= {[x1,x2,...,xp]
| xj
“Alpha”
(1
j
p)}.
Тип значений LLIST(Alpha) есть подтип (подмножество) типа значений LIST(Alpha). Поэтому на типе LLIST(Alpha) действуют также операции car, cdr, :: и
:-: . Но так как результатом операции :: может оказаться нелинейный список, нужно область определения этой операции сократить, считая (Alpha,LIST(Alpha)) спецификацией типа – области определения.
Кроме того, элементы линейного списка можно находить при помощи операции «точка». Например, если переменная Х приняла значение [5,5,0,1,3,6], то Х.1=5, Х.3=0, Х.6=6, Х.7 не определено.
Пусть Т – какая-либо спецификация типа данных и А – простое имя, выбранное для обозначения этого типа данных. Тогда предложение TYPE A = T декларирует тип данных, определяемый спецификацией Т.
Примеры 2.2:
1) TYPE Адресат = (ФИО: String, Адрес: (Индекс: Nat,
Город: String, Улица: String, Дом: String,
/Корпус: String/, Квартира: Nat))
Элементом типа Адресат служит, например, кортеж
е =(ФИО:'А.П.Иванов', Адрес:(Индекс:100010,Город:Москва,
Улица:Мясницкая, Дом:13,
Корпус:А, Квартира:17)).
Тогда имеем:
e.ФИО ='А.П.Иванов',
e.Адрес =(Индекс:100021, Город:Москва,
Улица:Мясницкая,Дом:10А, Квартира:17),
е.Адрес.Город = Москва,
e.Адрес.Улица = Мясницкая,
e.Адрес.Дом = 10А,
e.Адрес.Квартира = 17,
e.Адрес.(Город, Улица) = (Москва, Мясницкая).
Замечание. В последнем выражении был использован составной атрибут (Город, Улица).
Если нужно сохранить имена атрибутов, то можно воспользоваться двойной кавычкой:
e."ФИО = ФИО: 'А.П.Иванов',
e."Адрес = Адрес:(Индекс:100000, Город:Москва,
Улица:Мясницкая, Дом:13, Корпус:А,
Квартира:17),
e.Адрес."Город = Город:Москва,
e."Адрес.Город = Адрес:Москва,
e."Адрес."Город = Адрес:Город:Москва,
e.Адрес.("Город,"Улица) = (Город:Москва,Улица:Мяницкая).
2) Предположим, что нам нужно определить тип данных БинДерево (бинарное дерево), элементами которого служат уравновешенные бинарные деревья, концевым вершинам которых приписаны натуральные числа. (Уравновешенное бинарное дерево – это такое корневое дерево, у которого из каждой неконцевой вершины исходят ровно два ребра в направлении от корня). На рис.3.1 даны примеры элементов типа БинДерево.
(а) (б) (в)
0◦ ◦ ◦
/ \ / \
0◦ ◦1 ◦ ◦0
/ \
◦ ◦2
/ \
1◦ ◦ 1
Рис.1.1
Злесь
(а) тривиальное одновершинное дерево.
Такие деревья можно отождествить с
натуральными числами jNat.
Если дерево e
не является тривиальным, то оно имеет
левое поддерево e.Лев
и правое поддерево e.Прав.
Например, пусть е1,
е2
и е3
обозначают соответственно деревья
(а), (б) и (в), показанные на рис.1.1. Тогда
имеем:
е1 = 0, е2.Лев = 0, е2.Прав = 1, е2 = (Лев:0,Прав:1),
е3.Лев.Лев.Лев = 1, е3.Лев.Лев.Прав = 1, 3.Лев.Прав = 2,
е3.Лев.Лев = (Лев:1,Прав:1), е3.Прав = 0,
е3.Лев =((Лев:1,Прав:1),Прав:2),
е3 = (((Лев:1,Прав:1),Прав:2),Прав:0).
Произвольное бинарное дерево представляется вложенным кортежем с атрибутами Лев и Прав. Ясно, что тип данных БинДерево можно специфицировать с помощью следующего предложения:
TYPE БинДерево = Nat|(Лев:БинДерево,Прав:БинДерево).
Мы могли бы не вводить метки Лев и Прав и определить тип БинДерево с помощью следующего предложения:
TYPE БинДерево = Nat | (БинДерево, инДерево).
Ясно тогда, что дерево e3 будет теперь представлено следующим кортежем: е3 = (((1,1),2),0).
Применяя операцию "точка", мы можем получать составляющие поддеревья. Например, имеем:
е3 .1 = ((1,1),2),0), е3 .1.1 =(1,1), е3 .1.1.2 = 1 .
3) Предположим, что нам нужно задать тип значений, элементами которого служат уравновешенные бинарные деревья с натуральными метками на всех вершинах, а не только на концевых. Тогда следует ввести атрибут Центр.
TYPE БинДерево1 = Nat|(Лев: БинДерево1, Центр:Nat, Прав: БинДерево1).
4) Предположим, что нам нужно задать тип значений, элементами которого служат произвольные (а не только бинарные) деревья, вершины которых помечены натуральными числами. Тогда можно воспользоваться коструктором LLIST.
TYPE Дерево = (Nat) | (Nat, LLIST(Дерево)).
Например, бинарное дерево, изображенное на рис.2.2., представляется выражением e=(Лев:(Лев:1,Центр:2,Прав:(Лев:0,Центр:4,Прав:1), Центр:5, Прав:9)
5
/ \
2 9
/ \
1 4
/ \
0 1
Рис.3.2