Источник: Григорьев А.В. Алгоритм выполнения теоретико-множественных операций над грамматиками в среде специализированной оболочки для создания интеллектуальных САПР / А.В. Григорьев .
// Наукові праці Донецького національного технічного університету. Серiя Проблеми моделювання та автоматизації проектування
(МАП-2002). — № 52. .
—
Донецьк : ДонНТУ. , 2002.
— С. 83–93.
— URL: http://ea.donntu.ru:8080/jspu...
.
Григорьев А.В.
Кафедра ПМиИ, ДонНТУ
Grigoriev A.V. Implementation algorithm of plural operations over grammars in wednesday of specialized envelope for creation intellectual CAD. In work is offered an implementation algorithm of plural operations over originative grammars. A Given algorithm clever to provide work with knowledges in wednesday of instrumental envelope for creation intellectual CAD.
Специфика предлагаемого подхода к представлению знаний в специализированной инструментальной оболочке для создания интеллектуальных САПР – мета-эвристической оболочке (МЭО) описана ранее в [1-6] и кратко может быть охарактеризована следующим образом. База знаний представляет собой И-ИЛИ-дерево с определенными отношениями (продукциями) над ИЛИ-синтермами. Цель вывода в базе знаний — обеспечение выбора требуемого прототипа по техническому заданию (ТЗ) как подмножеству значений ИЛИ-синтермов, т.е.:
При работе в открытой базы знаний в среде мета-эвристической оболочки возникают следующие задачи:
Как в том, так и ином случае основу аппарата составляют теоретико-множественные операции (ТМО) над И-ИЛИ-деревом, и, в частности, такие операции, как пересечение, объединение, разность и дополнение множеств прототипов, хранящихся в И-ИЛИ-деревьях.
Все прототипы как модели объектов имеют в МЭО следующую иерархию описаний:
Табличная форма записи прототипов есть преобразованная форма представления на языке внутреннего представления.
И-ИЛИ-дерево как форма обобщения прототипов имеет место на любом уровне представления моделей. Форма Бэкуса-Наура (БНФ) может выступать как форма представления И-ИЛИ-дерева, свойственная грамматическому характеру описаний моделей на уровнях 1 и 2. С другой стороны, БНФ всегда можно соотнести с И-ИЛИ-деревом в любой форме представления, в том числе и табличной, свойственной уровню 3. Т.о. средства выполнения ТМО над БНФ может рассматриваться как универсальный аппарат работы с И-ИЛИ-деревьми в любой форме представления — от уровня 1 до уровня 3.
Т.о. необходимо создать аппарат ТМО над БНФ. Для чего необходимо определить:
И-ИЛИ-деревья, представленные в виде БНФ, которые могут в зависимости от способа решения задачи обобщения и изобретения иметь две альтернативных формы представления:
В работе [8] сделан обзор существующих и возможных методов решения данной задачи, определен класс грамматик, представленных в форме БНФ, введены возможные ограничения на алгоритм, т.е. область его применения и возможности и доказана возможность построения необходимого алгоритма.
В предлагаемой статье решается задача выбора оптимального набора инструментальных средств его представления, определяемый спецификой задачи и выполняется собственно построение алгоритма для второй формы представления И-ИЛИ-деревьев, предполагающей контекстную независимость в грамматиках.
Для задания алгоритма возможно применение различных прогрессивных форм представления из среды CASE-технологий или объектно-ориентированного программирования.
Наиболее оптимальным путем есть применение идей и средств R-технологии автоматизации проектирования программ [9] по причине:
Пусть дано два множества текстов описания моделей, заданных БНФ. Необходимо сформировать алгоритм выполнения над ними теоретико-множественных операций (пересечение, объединение, разность, дополнение).
Предлагается следующий алгоритм сравнения двух множеств, порождающий на выходе результаты указанных теоретико-множественных операций (пересечение, объединение, разность, дополнение).
Определение 1.
Термом называется элементарный символ множества. Термы соединяются между собой только посредством операции И
(&).
Определение 2.
Синтермом называется имя множества, которое может раскладываться. Элементами разложения могут быть как термы, так и синтермы, соединенные посредством операции И
(&) или ИЛИ
(V). Синтермы всегда записываются только в угловых скобках < >
.
Определение 3.
Если два множества совпадают по имени, то это означает, что они эквивалентны и по структуре, т.е. одно и то же имя означает одно и тоже множество.
Определение 4.
Если два множества совпадают по структуре, то это значит, что имена у них разные, а подмножества и способ их объединения одинаковый, т.е. одна и та же структура может иметь много разных форм записей, но при полном разложении этих форм записи мы в результате получим одно и то же.
Соглашение 1.
Элементы каждого отдельного множества должны соединяться только по И
, или только по ИЛИ
. Совместное использование этих двух знаков операций при записи разложения отдельного множества не допустимо.
Соглашение 2.
Не существует двух разных путей, порождающих одну и ту же цепочку термов.
Соглашение 3.
Каждый элемент по ИЛИ
можно рассматривать как символ и как множество цепочек символов, начинающихся с этого символа. Если ИЛИ
выступает как символ, присущие ему признаки помещаются в графе символа СИМВ
, в противном случае — в графе множества МН
.
Соглашение 4.
Если при движении по некоторому пути выяснилось, что данный символ ИЛИ
представляет собой полностью просмотренное множество символов, то при движении по любому другому пути, приводящего к этому же символу, множество цепочек, начинающихся с этого символа, будет иметь тот же признак.
Соглашение 5.
Каждая строка вновь вводимого множества должна заканчиваться признаком конца %
. Знак %
в конце строки играет служебную роль и в конечный текст не входит.
Соглашение 6.
Признаком ЗНАК
(Z) помечаются все знаки множества как в основном и во вспомогательном стеках.
Соглашение 7.
Признаком НЕОТРАБОТАН
(NO) помечаются все не отработанные элементы множества, соединенные по ИЛИ
во вспомогательном стеке.
Соглашение 8.
Признаком РАСКЛАДЫВАЕТСЯ
(R) помечаются все синтермы во вспомогательном стеке, которые подверглись разложению.
Соглашение 9.
Признаком СОВПАДЕНИЕ
(S) помечаются все элементы множества (термы или синтермы) во вспомогательном стеке, которые совпали со сравниваемыми элементами другого множества.
Соглашение 10.
Признаком НЕСОВПАДЕНИЕ
(NS) помечаются все элементы множества (термы или синтермы) во вспомогательном стеке, которые не совпали со сравниваемыми элементами другого множества.
Соглашение 11.
При описании алгоритмов использованы сокращения:
ZAKON — регистр, куда вписывается правая часть множества S=операция
(a1,a2,a3),
TOPM — таблица определения идентификаторов множеств (синтермов), каждая строка по структуре имеет вид S=&(a1,a2,a3),
THNA — таблица счетчиков номеров амперсенодов;
STEK — основной стек, имеется два основных стека STEK1 и STEK2, предназначенных для левого и правого множества,
VSTEK — вспомогательный стек, имеется два вспомогательных стека VSTEK1 и VSTEK2, предназначенных для левого и правого множества, элементы — имена IM2 или IM2, имеющие:
NO— неотработан;
МН(множество), где возможны признаки —
NS, если оно не совпало и
S— если совпало;
СИМВпризнак
R— развернут, признак
S— свернут;
PRST — признак стека, для левого стека принимает значение L
, для правого — P
;
PRS — признак сворачивания или несворачивания стека, принимает значение 1
и 0
соответственно;
RSR — регистр, хранящий синтерм из VSTEK с признаком NS
в графе МН
, если он не совпал и S
— если совпал;
IM — регистр для хранения идентификатора множества, выбираемого из стека для сравнения, имеется IM1 и IM2 исходя из типа стека;
ТСН — текущее значение счетчика амперсендов
— промежуточных служебных множеств — синтермов, порождаемых алгоритмом; имеет начальное значение 1;
@четный номер
и @нечетный номер
— имена амперсендов
; тут четный номер
и нечетный номер
— значения ТСН; синтермы @четный и @нечетный позволяют объединять и пересекать множества, имеющие разные синтермы, но одни и те же базовые термы, т.е. собственно порождаемое описание.
Соглашение 12.
В одном выражении можно использовать совместно термы и синтермы.
Ограничение 1.
Запрещено определять синтермы через самих себя.
Ограничение 2.
Порядок просмотра термов и синтермов при последовательном разложении БНФ одинаков как в первом так и во втором множестве.
Вход: Правая часть множества, записанная в регистр ZAKON. Выход: STEK.
Метод: При записи правой части множества в стек каждый терм записывается в отдельную ячейку стека и совокупность термов накрывается знаком &
. Каждый синтерм записывается так же в отдельную ячейку стека. Знак операции, посредством которого соединены подмножества — в вершине стека.
Вход: Элемент множества. Выход: ТОРМ.
Метод: Поиск элемента множества в ТОРМ. Если нашли, то запись правой части в STEK в соответствии с алгоритмом записи в стек, затем дозапись STEK в STEK1 или STEK2, а синтерма, который разложился — в VSTEK1 или в VSTEK2 соответственно, с признаком R
.
Если не нашли, то выдача сообщения, что данное имя — терм.
Вход: STEK, TCH, TOPM, PRST, VSTEK.
Выход: STEK, THNA.
Метод:
1) Если PRST = L , то наращиваем TCH на 1 (получаем @нечетный номер), затем наращиваем TCH еще на 1 (получаем @четный номер). Таким образом, имеем два регистра: @четный номер и @нечетный номер. Смотрим в STEK:
а) знак &
— анализируем признаки группы идентификаторов до следующего знака:
S, то эта группа уничтожается, синтерм в RSR приобретает признак
Sв графе
МН, и помещается в STEK под первый знак, если он есть или в STEK, если его там нет;
NSв графе
МН, то группа идентификаторов уничтожается, синтерм в RSR приобретает признак
NSв графе
МНи помещается в STEK под первый знак или в STEK.
б) знак V
:
S, то засылаем их в @четный номер. Они должны соединяться посредством знака операции
V, и когда группа идентификаторов просмотрена, то цепочка этих идентификаторов должна заканчиваться признаком конца
%;
NS, то засылает их в @нечетный номер аналогично.
После того, как группа ИЛИ
в STEK1 иссякла, анализируем регистры с амперсендами:
ИЛИ, присваиваем синтерму из RSR признак
NSв графе
МНи засылаем в STEK1 под знак, или в вершину стека;
ИЛИ, присваиваем синтерму из RSR признак
Sв графе
МНи засылаем в STEK1 под первый знак, или в вершину стека, если знак отсутствует;
<имя синтерма> = @нечетный номер V @четный номер %,
где <имя синтерма> — синтерм, который разложился на совпадающие и несовпадающие ИЛИ
, попавшие в соответствующий амперсенд.
Затем эти амперсенды записываются в STEK1 со следующими признаками в графе МН
:
S;
NS.
Значение счетчиков записываются в таблицу хранения номеров амперсенда: сначала нечетный, а затем четный.
2) Если PRST = P, то выбираем первый элемент из вершины VSTEK.
Если это знак, то засылаем его в основной стек STEK и выбираем следующий элемент из VSTEK.
Если это не синтерм, или синтерм, который не раскладывался (т.е. не имеет признака R
), то:
R;
Rпереписываем в STEK.
Все идентификаторы в STEK переписываем с признаками, присущими им в VSTEK. Если производится сворачивание, признаки уничтожаются.
Если это синтерм с признаком R
, то:
а) идут подряд два знака: первый знак поднимаем, а начиная со второго уничтожаем все идентификаторы до следующего знака, а вместо них под поднятый знак помещаем элемент из VSTEK, который раскладывался;
б) стоит один знак: тогда уничтожаем все идентификаторы, начиная с этого знака до следующего. Следующий знак поднимаем и под него записываем синтерм; конец работы.
Вход: STEK1, STEK2, VSTEK1, VSTEK2, TOPM.
Выход: STEK1, STEK2, VSTEK1, VSTEK2.
Метод: Сравниваем имена множеств.
Если IM1 = IM2 , то множества совпали полностью.
К0:
Выбираем сообщения, что множество 1 совпало с множеством 2 и оканчиваем работу.
Если IM1 # IM2, то раскладываем IM2 и анализируем знак в вершине STEK2:
К1:
выбираем первый идентификатор из вершины STEK2, засылаем его в IM2 и сравниваем:
1) если IM1 = IM2, то на К0;
иначе раскладываем IM2 и анализируем знак в STEK2:
К2:
Ив соответствии с алгоритмом сворачивания и засылаем синтерм в VSTEK2, и на К1;
2) если IM2 — терм, то анализируем знак в STEK2:
NOи выбираем следующий идентификатор по
ИЛИ.
Если STEK2 опустел, а IM1 # IM2, то восстанавливаем STEK2, сворачивая VSTEK2, выбираем IM2 из STEK2 и раскладываем.
RIM1:
раскладываем IM1 и анализируем знаки в STEK1 и STEK2:
если & — & — на YMN4,
иначе на INACH.
YMN:
выбираем идентификаторы из STEK1 и STEK2 и запоминаем их соответственно в регистрах IM1 и IM2 и сравниваем:
если IM1 = IM2, то засылаем их с признаками S
в VSTEK1 и VSTEK2 соответственно и на YMN,
иначе
M3:
раскладываем IM2
1) знак & — идем до первого ИЛИ
, или пока STEK2 не станет пуст, выбрасывая все встретившиеся идентификаторы в VSTEK2 с признаком NS
, заслав туда предварительно IM2 с признаком NS
.
Если нашли ИЛИ
, выбираем первый идентификатор по ИЛИ
и на М0,
иначе
ZV:
восстанавливаем VSTEK2 до первого S
, или пока он не станет пуст (сворачивая). Затем выбираем идентификатор из ??TEK2, засылаем его в IM2, раскладываем IM1 и IM2 и на YMN.
2) знак V — засылаем этот идентификатор в VSTEK2 с признаком NS
и выбираем следующее ИЛИ
. При этом все встретившиеся И
засылаем в VSTEK2 с признаком NO
. Если ИЛИ
уже нет, то на ZV.
М0:
если IM1 = IM2, то
M1:
выбрасываем в VSTEK2 все не просмотренные ИЛИ
с признаком NO
до первого знака, или пока STEK2 не станет пуст, затем содержимое IM2 с признаком S
и все остальные ИЛИ
до первого И
.
Из STEK1 также выбрасываем в VSTEK1 все не просмотренные ИЛИ
с признаком NO
до первого знака, а остальные со своими признаками, затем содержимое IM1 с признаком S
и все остальные ИЛИ
до первого знака и на YMN.
Если IM1 # IM2, то на М3.
При выборе идентификаторов из стеков в поиске И
могут возникнуть ситуации:
И, а в STEK2 сворачиваем все до идентификатора с признаком
S(также работает алгоритм сворачивания);
М: засылаем несовпавший по И
идентификатор под знак в STEK1 и выбираем идентификатор из VSTEK1:
R, то работает алгоритм сворачивания;
знак & — засылаем его в STEK1;
знак V — первому идентификатору по ИЛИ
присваиваем признак NS
в графе МН
и засылаем его в STEK1, после чего начинает работать алгоритм обратного хода (идем на OBHOD).
При поиске этого первого ИЛИ
(оно имеет признак S
в графе СИМВ
), работает алгоритм сворачивания.
INACH: выбираем идентификаторы из STEK1 и STEK2, засылаем их в IM1 и IM2 соответственно и сравниваем:
иначе идем на М3.
Примечание: после того, как выбрали очередной идентификатор из под знака, нужно проверять : если следующий знак, то выбранный знак не засылаем снова в STEK, а засылаем в VSTEK после последнего выбранного из STEK идентификатора.
Вход: STEK1, STEK2, VSTEK1, VSTEK2, TOPM, THNA.
Выход: TOPM.
Метод:
OBHOD: Идем по VSTEK1 в поисках первого идентификатора с признаком NO
после первого встретившегося идентификатора с признаком S
.
Идентификаторы по И
с признаком S
в графе СИМВ
переписываем в STEK1 с признаком S
в МН
. При этом, отыскиваем такие же идентификаторы с признаком S
в VSTEK2, сохраняя признак, а все предшествующие ему идентификаторы в том порядке, в котором анализировались, восстанавливаем в STEK2. Если встречаем синтерм с признаком R
, сворачивающий цепочку по И
, то сворачиваем в соответствии с алгоритмом сворачивания.
Если встретили знак ИЛИ
, переписываем все идентификаторы по ИЛИ
из VSTEK1 до первого S
в STEK1. Причем, идентификаторы, имеющие признак S
в графе СИМВ
, приобретают S
в графе МН
, а имеющие NS
в графе СИМВ
, приобретают NS
в графе МН
. Такие же идентификаторы с признаками S
или NS
из VSTEK2 засылаются в STEK2, попутно перебрасывая встретившиеся на пути к ним идентификаторы в STEK2. Идентификаторы с признаком S
в СИМВ
приобретают такие же признаки в графе МН
.
Когда встретили первый идентификатор с признаком NO
после того, как первый встретившийся S
заслали в STEK1, записываем его и все остальные до первого знака или синтерма с признаком R
в STEK1, а в правом стеке переписываем все идентификаторы с сохранением присущих им признаков в STEK2 до первого идентификатора с признаком S
, или пока VSTEK2 не станет пуст. Если не нашли больше S
в VSTEK2, то идем на POISK.
Затем выбираем первый идентификатор с NO
из STEK1 и засылаем в IM1. Из STEK2 выбираем первый идентификатор с NO
для сравнения, а все остальные, которые предшествуют ему, восстанавливаем в VSTEK2.
1) Если IM1 = IM2, то в левом стеке переписываем все идентификаторы по ИЛИ
во вспомогательный стек из основного до первого знака, затем IM1 в VSTEK1 и IM2 в VSTEK2, а затем все остальные идентификаторы до первого И
, а в правом стеке = все идентификаторы до ИЛИ
с NO
, затем все NO
ил??ам IM2.
POISK: выбираем из STEK1 идентификатор с признаком NO
и начинаем сравнивать его со всеми идентификаторами STEK2, пока не дойдем до идентификатора, имеющего признак S
.
2) Если IM1 # IM2, то
S: восстанавливаем STEK2, пока VSTEK2 не станет пуст без сворачивания, раскладываем IM1, выбираем первое идентификатор из STEK1, засылаем его в IM1 и снова сравниваем со всеми идентификаторами STEK2 до идентификатора, имеющего признак S
.
Если IM1 не раскладывается, и не нашлось одинакового ему в STEK2, то смотрим, в каком контексте стоит этот терм:
И, то
K: сворачиваем эту цепочку по И
, а ближайшему ИЛИ
, т.е. синтерму, свернувшему эту цепочку, даем признак NS
в МН
и помещаем рядом с просмотренными ИЛИ
в STEK1 или в вершину стека и идем на POISK:
ИЛИ, то
L: даем ему признак NS
в МН
и помещаем рядом с просмотренными ИЛИ
в STEK1 или в вершину стека и на POISK.
Если IM1 = IM2, то смотрим, в каком контексте находятся IM1 и IM2:
&и в STEK2
&, то выбираем следующие идентификаторы из STEK1 и STEK2 и сравниваем, пока не исчерпаем всю цепочку
И. Если вся цепочка совпала, то сворачиваем в развернувший ее синтерм, даем ему признак
Sкак множество, т.е. в
МН, и помещаем рядом просмотренными
ИЛИв STEK1 и на POISK. Если хоть одно
ИЛИэтой цепочки не совпало, то на K.
Vи в STEK2
V, то засылаем в VSTEK1 все
ИЛИс
МО, затем все просмотренные, а потом этот IM1 с
С, в правом стеке аналогично и далее — на POISK.
&, а в STEK2
V, то на К. — если в STEK1
V, а в STEK2
&, то на L. Процесс прекращаем, когда вся цепочка идентификаторов по
ИЛИпросмотрена и на P.
Если при поиске первого NO
в VSTEK1 встречаем синтерм с признаком R
(при анализе ИЛИ
).
P: ищем в THNA текущее значение счетчика амперсендов и начинает работать алгоритм сворачивания.
После работы алгоритма сворачивания содержимое STEK переписывается в STEK1.
Процесс прекращается, когда в VSTEK1 уже нет идентификаторов с признаком NO
, т.е. VSTEK1 пуст. При этом все идентификаторы с присущими им, или приобретенными при анализе их признаками, попадают в STEK1.
После чего восстанавливаем VSTEK1 и начинаем анализ VSTEK1.
В очередной @четный записываем цепочку идентификаторов, имеющих признак S
в графе МН
, объединяя их между собой знаком &
. Цепочка должна оканчиваться признаком конца %
и помещаться в TOPM. Когда VSTEK1 опустел в результате поиска следующего S
в графе МН
, и все идентификаторы оказались в STEK1, переписываем содержимое STEK1 в VSTEK1.
Идем по VSTEK1 в поисках идентификатора, имеющего в графе МН
признак NS
, переписывая все встретившиеся идентификаторы в STEK1, а все с признаками S
в графе МН
в очередной @нечетный. После того, как нашли первый идентификатор с признаком NS
, записываем его в @нечетный, а в STEK1 не переписываем. Далее, в @нечетный дописываем все идентификаторы с признаком S
в графе МН
, а в STEK1 все идентификаторы со своими признаками.
Когда VSTEK опустел, переписываем STEK1 в VSTEK1 и начинаем поиски следующего NS
, действуя аналогично.
Процесс прекращаем, когда в VSTEK1 нет идентификаторов с признаком NS
. После чего выдается на печать вся таблица TOPM. В ней: последний @четный номер — результат пересечения множеств, а последовательность последних @нечетных номеров результат разности множеств. Объединение множеств — это все первое множество плюс разность.
В работе предложен алгоритм выполнения теоретико-множественных операций над контекстно-независимыми порождающими грамматиками. Данный алгоритм способен обеспечить работу со знаниями в среде инструментальной оболочки для создания интеллектуальных САПР, что показали реализации [6,3]. Следует отметить, что данный алгоритм имел в свое время полную, но автономную реализацию в среде Р-трана на УВК СМ-4.
В качестве перспективного направления работы следует указать построение алгоритма выполнения теоретико-множественных операций над контекстно-зависимыми порождающими грамматиками, где всякая альтернатива в ИЛИ-синтермах связана впрямую со списком идентификации ряда прототипов.
Проблемы моделирования и автоматизации проектирования динамических систем. — № 10. — Донецк : ДонГТУ , 1999. — С. 30–37.
Проблемы моделирования и автоматизации проектирования динамических систем. — № 29. — Севастополь :
Вебер, 2001. — С. 106–113.
Знание-Диалог-Решение(KDS-2001) . — СПб : издательство
Лань, 2001. — Том 1. — С. 169–177.