Разработка языка запросов в бинарной модели знаний и транслятора этого языка в язык SQL (бакалаврская работа) (544460), страница 7
Текст из файла (страница 7)
<предложение1>.
<предложение2>.
:
<предложениеN>.
END
Пример 3.4. Окружность на плоскости можно идентифицировать, указав координаты ее центра и ее радиус. Поэтому тип данных «Окружность» можно задать так:
Окружность = (Центр:Точка, Радиус:Real).
Точка = (Абсцисса:Real, Ордината:Real).
Предположим, что мы хотим задать предикат, выясняющий соприкасаются или нет два круга. Тогда можно дать следующее определение.
FUN расст:(Точка,Точка) -> Real
расст(X,Y):= sqrt((X.Абсцисса-Y.Абсцисса)**2+ X.Абсцисса-Y.Абсцисса)**2)
END
FUN соприкас:(Окружность, Окружность)-> Boolean
cоприкас(X,Y) := true IFF расст(X.Центр, Y.Центр)= X.Радиус + Y.Радиус
END
Спецификацию типов данных мы можем оформлять в виде модуля, включая в него те типы и функции, которые родственны или определяются друг через друга.
Пример 2.5. Следующий модуль специфицирует типы данных «Точка», «Вектор», «Окружность» и функции, дающие:
▪ расстояние между точками, длину вектора и площадь окружности; а также предикаты, выясняющие:
▪ коллинеарность двух векторов;
▪ является ли две окружности соприкасающимися;
▪ является ли последовательность векторов цепью (в том смысле, что конец одного вектора совпадает с началом следующего вектора).
TYPES Точка = (Абсцисса:Real, Ордината:Real).
Вектор = (Начало:Точка, Конец:Точка).
Окружность = (Центр:Точка, Радиус:Real).
FUN: расст(X,Y):= sqrt((X.Абсцисса-Y.Абсцисса)**2+.Абсцисса-Y.Абсцисса)**2)
END
FUN: длина: Вектор -> Real
длина(X):= расст(X.Начало,Y.Конец)
END
FUN цепь: LLIST(Вектор)-> Boolean
цепь(Х):= true IF X IN Вектор,
цепь(X::Y):= X.Конец = CAR(Y).Начало; цепь(Y)
END
FUN: коллин: (Вектор, Вектор) -> Boolean
коллин(X,Y):= (длина(X)=длина(Y));
(расст(X.Начало,Y.Начало) = расст(X.Начало,Y.Начало)).
END
FUN: площадь: Окружность -> Real
площадь(Х):= 3.141592*(Х.Радиус)**2
END
FUN: соприкас: (Окружность, Окружность) -> Boolean
cоприкас(X,Y):= true IFF
расст(X.Центр, Y.Центр)= X.Радиус + Y.Радиус
END
2.2.4. Спецификация структуры объектов
В БМЗ понятия делятся на классы и (бинарные) связи. Простейшими структурными предложениями в БМЗ являются:
C [A1: T1, A2: T2,…, An: Tn], (2.1)
(C L D), (2.2)
(C L D) [A1: T1, A2: T2,…, An: Tn] . (2.3)
Здесь С, D – имена классов, Aj – имена атрибутов и Tj – спецификации типов данных (1
j
n). Эти предложения определяют соответственно следующие универсумы понятий:
UC = String0
Surr
SurrC
{[A1 : x1, A2: x2,…, An: xn] | xj
“Tn” (1
j
n) },
UL = String0
Surr
(Surr,Surr)
SurrL
{ [C: x, D: y] | x
SurrC, y
SurrD },
UL = String0
Surr
(Surr,Surr)
SurrL
[C: x, D: y, A1: x1, A2: x2,…, An: xn] | x
SurrC, y
SurrD, xj
“Tn” (1
j
n) }.
Замечание. Порядок компонент в кортежах не имеет значения. В частности, [C: x, D: y] = [ D: y, C: x]. Но тогда, если L – бинарная связь, заданная на одном классе С и специфицируемая структурным предложением (C L C), то не ясен результат применения операции «точка» к кортежу [C: x, C: y] : либо [C: x, С: y].С = x, либо [C: x, D: y].С = у. Чтобы избежать эту неопределенность, будем использовать роли 1-С и 2-D, считая, что с предложением (C L C) неявно ассоциировано предложение: (1-C: С L 2-С: C).
В структурные предложения можно включать роли. В сущности, роль – это атрибут, значениями которого служат не элементы типа данных, а суррогаты, обозначающие объекты – возможные примеры класса. Например, включив роли R и S в предложение (3.2), получим следующее структурное предложение, специфицирующее бинарную связь L :
(R:C L S:D). (2.4)
Предложение (3.3) следующим образом определяет универсум связи L:
UL = String0
Surr
(Surr,Surr)
SurrL
{[R: x, S: y] | x
SurrC, y
SurrD } (2.5)
Мы видим, что элементами универсума, определяемого предложением (2.4), являются суррогаты и кортежи вида е = [R: x, S: y], тогда как определяемый предложением (2.5) универсум состоит из тех же суррогатов и кортежей вида e’ = [C: x, D: y]. В первом случае мы можем применять операцию «точка» с атрибутами R и S, во втором случае – с атрибутами C и D :
e.R = x, e.S = y, e’.R = x, e’.R = y.
Замечание. Очевидно, что предложения (C L D) и (С: C L D: D) эквивалентны в том смысле, что оба эти предложения определяют один и тот же универсум. Таким образом, во втором из этих предложений имя С используется двояко – как имя атрибута для класса и как имя этого класса.
Роли могут также входить в часть структурного предложения, заключенную в квадратных скобках. Рассмотрим, например, предложение
(R:C L D)[P:E, A: String0, B: Integer].
Оно определяет универсум
UL = String0
Surr
(Surr,Surr)
SurrL
{ [R: x, D: y, P: z, A: u, B: v] | x
SurrC, y
SurrD, z SurrE, u
String0, v
Integer }.
Таким образом, к каждому элементу e =[R: x, D: y, P: z, A: u, B: v] универсума для L применимы (через операцию «точка») роли (объектные атрибуты) R, D, P и атрибуты A, B, принимающие значения в примитивных типах данных String, Integer:
e.R
SurrC, e.D
SurrD, e.P
SurrE, e.A
String, e.B .
В общем случае атрибут, являющийся ролью, принимает значение во множестве суррогатов, которые могут обозначать примеры произвольного понятия. Но понятие может быть не только простым, но и составным. Для образования составных понятий мы будем использовать три конструктора, подобные конструкторам типов.
Конструктор (*).
Составное понятие С(*) имеет следующий универсум:
UC(*) = Surr
String0
{{x1, x2,…, xp} | xj
SurrC (1
j
p) }.
Экстенсионал ExtC(*) понятия С(*) имеет в качестве множества экземпляров (примеров) некоторое подмножество ЕC(*)
UC(*) , но такое, что
{x1, x2,…, xp}
ЕC(*) ó xj
EC для всех 1
j
n.
Конструктор |.
Понятие (C1 | С2 | …| Сn) имеет следующий универсум:
U(C1 | C2 |…|Cn) = String0
Surr
SurrC1
SurrC2
…
SurrCn.
Экстенсионал понятия (C1 | С2 | …| Сn) имеет в качестве множества экземпляров некоторое подмножество Е(C1 | C2 |…|Cn)
U(C1 | C2 |…|Cn) , но такое, что для всякого
x
Е(C1 | C2 |…|Cn) ó x
ECj для некоторого 1
j
n.
Конструктор ( , ,…, ).
Понятие (K1, K2,…,Kn) имеет следующий универсум:
U(K1, K2,…, Kn) = String0
Surr
{(z1, z2,…, zn) | zj = Aj: xj , если Kj= Aj : Cj , и
zj = xj , если Kj= Cj (xj
SurrCj ,1
j
n) }.
Здесь Aj – имя атрибута, а Cj – имя понятия. Экстенсионал понятия (K1, K2,…, Kn) имеет в качестве множества экземпляров некоторое подмножество Е(K1, K2, …, Kn)
U(K1, K2,…, Kn) , но такое, что
(z1, z2,…, zn)
Е(K1, K2,|…, Kn) ó zj
EKj для всех 1
j
n.
Пример 2.6. Составное понятие (A : C, D, E) имеет универсум
Surr
String0
{(A : x, y, z) | x
SurrC, y
SurrD, z
SurrE }.
2.2.5. Синтаксис языка структурной спецификации
Здесь мы опишем записанный в метаязыке БНФ синтаксис языка структурной спецификации. При этом мы рассмотрим только некоторое («ядерное») подмножество языка структурной спецификации.
<структурное предложение для класса>::==
<имя класса>[хвост] ||
<имя класса> ISA <имя кдасса>
<структурное предложение для бинарной связи> ::==
(<имя класса> <имя бинарной связи>
<имя класса>)[<хвост>] ||
<имя бинарной связи> ISA<имя бинарной связи>
<хвост> ::== <указатель> < ; <указатель>>*
<указатель> ::== <атрибут> : <спецификация типа данных> ||
<концептуальный атрибут> : <имя класса>
2.2.6. Атрибутные условия и интервальные ограничения
Пусть класс С имеет атрибуты A1, A2,…, An, принимающие значения в типах T1,T2,…,Tn (соответственно). Пусть p – какой-либо предикат, заданный на этих типах, p: (T1,T2,…,Tn) -> Boolean. Тогда выражение p(A1, A2,…, An) называется атрибутным условием для класса С. Аналогично определяются атрибутные условия для бинарной связи L.
Атрибутное условие p(A1, A2,…, An) (обозначим его α) интерпретируется как ограничение на возможные экстенсионалы класса. Точнее, α выделяет из множества суррогатов EsurrC (примеров понятия С) подмножество тех суррогатов, которые удовлетворяют условию α. Это подмножество считается множеством всех суррогатов – примеров понятия, обозначаемого С(α):
EsurrС(α) = {X
EsurrC | p(X.A1, X.A2,…, X.An) = true}.
Простейшими атрибутными условиями являются выражения вида A = B, A=/=B, A = a и А=/=а , где A, B – атрибуты, а а – значение атрибута А. Такие атрибутные условия будем называть элементарными. Если C – понятие, имеющее атрибуты A и B, то для понятий C(А = В), C(A=/=B), С(А = а) и С(А=/=а) имеем
EsurrC(A=B) = {X
EsurrC | X.A = X.B},















