Бесконечные деревья в алгоритме проверки условия эквивалентности итераций конечных языков. Часть II
Б. Ф. Мельников, А. А. Мельникова
Аннотация—В настоящей статье мы возвращаемся к тематике, связанной с одним важным бинарным отношением на множестве формальных языков (рассматриваемом в первую очередь на множестве итераций непустых конечных языков) - отношению эквивалентности в бесконечности. Прежде всего мы рассматриваем примеры применения этого отношения (как примеры необходимости его выполнения, так и примеры использования) в различных областях теории формальных языков, дискретной математики и абстрактной алгебры. Для упрощения рассмотрения эквивалентности в бесконечности мы формулируем более простое бинарное отношение на множестве языков -отношение покрытия, двойное применение которого равносильно применению отношения эквивалентности в бесконечности. Далее мы рассматриваем алгоритм проверки выполнения отношения покрытия, после чего определяем вспомогательные объекты, используемые как для доказательства корректности этого алгоритма, так и для других задач теории формальных языков. В качестве одного из комментариев к алгоритму мы приводим соответствующую ему компьютерную программу, рассматриваем примеры её работы для конкретных входных языков, после чего формулируем определения связанных с ней объектов - в частности, определение бесконечных деревьев отношения покрытия. С их помощью мы доказываем корректность алгоритма проверки выполнения отношения покрытия, а также оцениваем сложность этого алгоритма.
Ключевые слова—формальные языки, итерации языков, бинарные отношения, бесконечные деревья, алгоритмы.
В настоящей части II мы используем новую нумерацию ссылок на литературу и сносок, а остальная нумерация (разделов, рисунков и др.) продолжается.
VII. ДЕРЕВО ОТНОШЕНИЯ ПОКРЫТИЯ И НОВЫЕ КОММЕНТАРИИ К АЛГОРИТМУ
В этом разделе мы рассматриваем «развитие» дерева морфизма - другое специальное бесконечное дерево; оно, как мы уже сказали, не является рассмотренным ранее деревом морфизма - а является более сложным объектом1. Мы будем называть его деревом отношения покрытия (либо бесконечным итерационным деревом) -и оба названия отражают смысл такой конструкции2. Однако строгих определений приводить не будем:
Статья получена 11 февраля 2021 г.
Борис Феликсович Мельников, Университет МГУ-ППИ в Шэнь-чжэне ([email protected]).
Александра Александровна Мельникова, Димитровградский инженерно-технологический институт - филиал Национального исследовательского ядерного университета «МИФИ» ([email protected]).
1 По-видимому не будет ошибкой сказать «классом-наследником».
2 И понятно, что первое название «привязано» к конкретной задаче, рассматриваемой нами сейчас, - в то время как второе является его обобщением.
• во-первых, основным предметом статьи мы считаем сам алгоритм, а деревья нужны, в первую очередь, для комментариев к нему;
• и во-вторых, на основе приведённых «нестрогих» определений несложно сформулировать необходимые «строгие».
Однако в следующих публикациях мы действительно предполагаем рассмотреть подробные определения итерационных деревьев и соответствующие возникающие задачи.
В разделе мы также приводим новые комментарии к основному алгоритму, рассматриваемом в статье. Комментарии начнём с уже рассмотренного нами в части I дерева морфизма; для удобства изложения мы повторяем рис. 4 части I - это рис. 13 ниже. При этом, как мы многократно отмечали в части I, нам необходимо рассматривать ситуации, когда у разных слов над алфавитом Д совпадают их значения функции р. Таким образом, мы можем считать, что все вершины принадлежат нескольким классам эквивалентности (согласно значениям функции р) - причём таких классов конечное число3.
Мы также уже отмечали в части I [1], что дерево морфизма в чём-то аналогично дереву конечного автомата, рассматривавшемуся в [2, стр. 177]. Однако есть и отличия - и основное заключается в том, что нам при постановке задачи автомат не задан4, поэтому о полной аналогии говорить бессмысленно. Кроме того, в [2] сразу рассматривается конечное дерево.
Определяемое нами бесконечное дерево будет, как следует из предыдущего изложения, обладать следующими свойствами:
• каждая вершина дерева имеет сразу две пометки: во-первых, некоторое слово над алфавитом Д, и, во-вторых, некоторое множество слов над алфавитом Я (оно является значением функции р для первой пометки);
• каждая вершина принадлежит некоторому классу; при этом вторые пометки вершин, принадлежащих одному классу, обязательно совпадают, а вторые пометки вершин, принадлежащих разным классам, обязательно различны.
3 Это очевидно. А при необходимости «строго доказать» этот факт можно в качестве вспомогательного применить приведённое ниже утверждение 2.
4 Мы собираемся построить его (соответствующий недерминирован-ный конечный автомат) в одной из последующих публикаций. «Входными параметрами» строимого автомата будут являться два языка -обозначаемые в этой статье А и В.
Рис. 13. Абстрактное бесконечное дерево морфизма для алфавита X.
Рис. 14. Пример бесконечного итерационного дерева морфизма для алфавита Д = {0,1} (показаны уровни от 0-го до 5-го).
bool operator<={Languages lAf Languages IB}; bool operator=={Languages lAf Languages IB};
Рис. 15. Заголовки дополнительных операторов для класса Language (их не было в части I).
Рис. 16. Используемые классы в компьютерной программе на Си++ (подробные комментарии - в тексте статьи).
Также на основе приведённого алгоритма можно сформулировать следующее свойство дерева:
• поддеревья, соответствующие вершинам, принадлежащим одному и тому же классу, равны.
И дополнительно (что также можно вывести из описания алгоритма5):
• поддеревья, соответствующие вершинам, принадлежащим двум разным классам, не равны.
Возможный пример бесконечного итерационного дерева приведён на рис. 14; на нём: показаны уровни от 0-го до 5-го, алфавит Д = {0,1} (алфавит Е и морфизм hA не конкретнизированы), разные классы эквивалентности вершин показаны разными цветами6.
VIII. ОПИСАНИЕ СООТВЕТСТВУЮЩЕЙ КОМПЬЮТЕРНОЙ ПРОГРАММЫ (ПРОДОЛЖЕНИЕ)
Отметим ещё раз: основная цель того, что мы приводим текст программы, - в том, чтобы привести дополнительные комментарии к алгоритму, помочь его осознать; мы его нескольку упростили по сравнению с [3] - но, по-видимому, даже приведённая в [1] версия сложна для быстрого восприятия. Также отметим, что все действия, описываемые в настоящей части II, могут быть несложно произведены «вручную» многократным вызовом функций, описанных в части I, - однако для языков большего размера это, конечно, очень неудобно; кроме того, мы предполагаем применить описываемые классы и в программах для будущих публикаций.
Описание программы продолжим небольшими дополнительными комментариями к тому тексту, который мы уже рассмотрели в части I - и некоторым добавкам к нему, приведённым здесь.
• Укажем, почему работа с языками выделена в специальный класс: мы много раз используем его свойства и методы в классах-наследниках.
• И вообще, применение объектно-ориентированного программирования, с нашей точки зрения, очень упрощает не только «обычные» области его применения - но и алгоритмизацию сложных задач (а может быть, в первую очередь именно её)7.
А следующие три замечания связаны с модификацией классов (Language и др.), рассмотрение которых было начато в части I.
• В части II выдачу множества «множеств хвостов» TailsArr мы завершаем символом #.
• В связи с применяющемся в настоящей части II множественным наследованием, мы для всех классов заменили операторы вывода в поток (бывшие в части I) на функции Print(); по-видимому, так удобнее.
• Мы добавили операторы сравнения языков (рис. 15): первый означает включение языка 1A в язык 1B, а второй - равенство этих языков.
5 Комментариев о возможности такого вывода приводить не будем. По-видимому, это не столь очевидно - однако для предмета статьи вряд ли представляет интерес.
6 Также отметим, забегая вперёд, что и приведённую в конце статьи структуру, соответствующую результатам выполнения программы для конкретного примера пары языкав A и B, также можно назвать бесконечным итерационным деревом.
7 «... летать быстро легче, чем летать медленно!» - Акка Кнебекайзе
и Сельма Лагерлёф.
Теперь перейдём к принципиальным добавлениям. На рис. 16 приведена схема используемых нами классов на Си++8; смысл нескольких из них уже был нами прокомментирован в части I. На этом рисунке:
• «жирная сплошная» стрелка означает обычное (в том числе множественное) наследование;
• «прямая тонкая» стрелка означает применение класса, от которого исходит стрелка, во втором классе в качестве типа поля;
• «кривая тонкая» стрелка означает применение класса, от которого исходит стрелка, во втором классе в качестве типа параметра метода;
• «жирная пустая» стрелка означает применение класса, от которого исходит стрелка, во втором классе в качестве типа элемента массива (при этом второй класс фактически предназначен именно для описания этого массива).
Немного изменённый (по сравнению с частью I) класс TailsArr показан на рис. 17. По-видимому, всё связанное с новыми методами этого класса понятно по названиям методов и тексту их реализации - см. также рис. 18.
На рис. 19 приведён класс Simple - для пары слов над алфавитом Д. В объекты этого класса мы заносим такие пары слов, для которых уже доказали равенство значений функции P. При этом первый элемент пары обязан иметь соответствующий элемент в классе TailsArr (т. е. элемент с равным значением ключевого поля этого класса), а второй элемент пары, наоборот, обязан в классе TailsArr не иметь соответствующего элемента. Текст методов класса опущен (он очевиден).
Как и для «множества хвостов», из объектов класс Simple формируется массив (класс SimpleArr, рис. 20): он содержит уже обработанные нами слова множества Д*, причём, как следует из изложенного здесь, значения функции P для всех этих слов встречаются уже не первый раз. Текст методов класса также опущен.
Итак, до своего рассмотрения каждое слово над алфавитом Д:
• либо не имело аналога ранее (т. е. ранее не было слова с таким же значением функции P) - в таком случае это слово включается в массив, описываемый классом TailsArr;
• либо имело такой аналог - в таком случае оно включается в массив, описываемый классом SimpleArr.
Простейшее множественное наследование объединяет их в один класс, см. рис. 21. Как следует из изложенного, этот класс может быть назван классом для окончательного варианта итерационного дерева морфизма - в то время как класс TailsArrMod (первая, упрощённая его версия была рассмотрена в части I) можно в такой терминологии назвать классом для промежуточного варианта итерационного дерева морфизма.
Приведём небольшие комментарии к описанию новой версии класса TailsArrMod (рис. 16 и 22). В части I для упрощения мы каждый раз передавали два постоянно рассматриваемых языка (A и B в формулах, lA и lB в программе) как параметры - поэтому в соответствующем
8 Вряд ли её стоит называть «иерархией классов».
□class TailsArr 1 protected:
int nTails;
Tails tSets[maxTails]; public:
TailsArr() { nTails = ; }
void InitSimple() { nTails = 1; tSets[0].AddWord(""); } bool Empty{} { return nTails<= ; } string Exists{Tails ST); void AddTail{Tails ST) ;
void Del{int N) ; void Print{};
};
Рис. 17. Дополненное описание класса для множества «множеств хвостов».
Hstring TailsArr::Exists{Tails ST} {
for {int i= ; i<nTails; i++} if {tSets[i]==T} return tSets[i].GetDelta{} return "Iff";
Rvoid TailsArr::AddTail{Tails ST} { if {Exists{T)!="###"} return; tSets [nTails++] = T;
}
Рис. 18. Описание новых методов класса для множества «множеств хвостов».
□class Simple { private:
// оба поля - слова над алфавитом Delta={0,1,...N-1}, по количеству слов в коде string sDelta; // рассматриваемое слово, к которому применён морфизм string sDeltaFirst; // ранее рассмотренное эквивалентное ему слово public:
void Init{string sDelta, string sDeltaFirst); void Print {};
Рис. 19. Класс для пары слов над алфавитом А.
□class SimpleArr { private:
int nSimple;
Simple siSets[maxSimple];
public:
SimpleArr{} { nSimple = ; }
void AddSimple{string sDelta, string sDeltaFirst} { siSets[nSimple++].Init{sDelta,sDeltaFirst);
}
void Print{);
Рис. 20. Класс - массив объектов предыдущего класса.
Sclass Herevo: public TailsArr, public SimpleArr { public:
Herevo{) : TailsArrO , SimpleArr {} {}
void Print{) { TailsArr::Print{); cout « endl; SimpleArr::Print{); cant « endl; }
Рис. 21. Класс для окончательного варианта итерационного дерева морфизма.
Bclass TailsArrMod : public TailsArr 1 private:
Language 1A; Language IB; public:
TailsArrMod(Languages 1A, Languages IB); void ConcatSimple(Herevos hotv); void Run(Herevos hotv);
Рис. 22. Класс для промежуточного варианта итерационного дерева морфизма.
Ej3TailsArrMod: : TailsArrMod(Languages 1A, Languages IB) this->lA = 1A; this->lB = IB;
TailsArr: :InitSimple <};
Ï
: TailsArr{} (
gvoid TailsArrMod::ConcatSimple(Herevos hotv) { if (nTails<=:j} return; Tails tExtract = tSets [0] ;
for (int i= ; i<=nTails- ; i++} tSets[i] = tSets[i+L]; int nTailsOld = —nTails; hotv.AddTail(tExtract); if (tExtract. KolKords ()<=;>) return;
S
e
for
Î
for for
(int i= ; i<lA.KolWords(); i++) { tSets[nTails] = tExtract; tSets[nTails].ConcatLetterBylnt(i); tSets[nTails].ConcatWord(lA[i]}; tSets[nTails].EraseSleva(IB); nTails++;
(int i=nTails01d; i<nTails; i++) tSets[i].DeleteDaleko(IB);
(int i=nTails- ; i>= ; i—} {
string s = hotv.Exists(tSets[i]};
if (s==r###") continue;
hotv.Addsimple(tSets[i].GetDelta<),s);
Del(i) ;
}
^void TailsArrMod:: Run(Herevos hotv) { for <;;> {
ConcatSimple(hotv); if (Empty(}} return;
Ï
I
Рис. 23. Методы класса, описанного на предыдущем рисунке.
ааа|aabba|abba|bb аааа|abb|abba|bbb
: I* 0 : ааа |* 1:* 2:а||* 3 : bb | =+= 00 : аа 20 : ааа | | =+= 23 : abb |bb I I* 33 :b |=+= 000 : a 200: aaa|aa|* 233:bb|b|* 0003 : abb|2000 :аа|a2333:b||* 23333:bb | # 22:2 21:1 03:1 02:1 01:2 32:1 31:1 30:1 003:1 002:1 001:1 203:3 202:2 201:2 232: 2 231:2 333: 332:1 331:1 330:1 0002:1 0001:1 0000: 2003:1 2002:1 2001:2 230:200 2332:1 2331:1 2330:1 00033:3 00032:2 00031:2 00030:200 20003:0003 20002:1 20001: 1 20000:2 23332:2 23331:1 23330:0 233333:233 233332:2 233331:1 233330:0 #
Рис. 24. Результаты работы программы:
• строки 1-2 — исходные языки: А и В в формулах, 1Д и ^ в программе;
• строки 3-4 (в выдаче одна строка) — различные «множества хвостов»; формат выдачи совпадает с применявшимся в части I (при этом множество множеств заканчивается символом #);
• строки 5-8 (в выдаче одна строка) — множества пар слов над алфавитом Д с равными в каждой паре значениями функции Р.
классе не было необходимости, мы вместо него ещё раз употребляли класс TailsArr. В связи с этим класс содержал две группы методов, фактически предназначенных для совершенно разных целей - что, по-видимому, не совсем красиво; в новой версии мы включили эти языки в поля класса.
Текст реализации методов этого класса (рис. 23) -либо несложен, либо уже рассматривался в части I. Единственное исключение - последний цикл метода ConcatSimple(): он включает в ответ (параметр hOtv) информацию об уже встречавшемся в процессе работы «множестве хвостов» - т. е. фактически в его поле класса SimpleArr.
Результаты работы программы показаны на рис. 24; как и в части I, в подписи к рисунку приведены подробные комментарии. Исходные языки A и B - те же самые. В отличие от части I, построение итерационного дерева осуществляется не «вручную» (т. е. путём многократных вызовов требуемых функций в main()) - а программой, методом Run(). А «вручную» результаты можно проверить (причём вообще без компьютера) - это займёт около 15-20 минут; однако, конечно, при больших количествах слов в языках A и B время проверки будет существенно увеличиваться.
Те же самые результаты «в формате дерева» приведены в конце статьи на рис. 25. Как и на рис. 4, приведённом в части I:
• каждая вершина имеет две пометки: слово над алфавитом Д (чёрным цветом) и соответствующее ему «множество хвостов» (значение функции P, синим цветом);
• вершины, в которых алгоритм (в его простейшей интерпретации) может закончить работу, показаны без пометок: каждой из них может соответствовать «синее» множество 0; мы рисуем эти вершины только на уровнях с 1-го по 3-й, и, конечно, каждая из них является листом.
Кроме того:
• красным цветом показаны слова, эквивалентные рассматриваемым (т. е. имеющие такое же значание функции P), но уже рассмоторенные ранее.
IX. О КОРРЕКТНОСТИ АЛГОРИТМА, ВСПОМОГАТЕЛЬНЫЕ УТВЕРЖДЕНИЯ
Перед доказательством теоремы о корректности алгоритма 1 приведём несколько вспомогательных утверждений. Простые утверждения приводим без доказательств (либо только со схемами доказательств). Также заранее отметим, что все приведённые в этом разделе утверждения можно проиллюстрировать рисунками 2 и 3 части I.
Утверждение 1: При каждом выполнении шага 1 выбор требуемого п& осуществим, причём любое выбираемое слово отлично от всех выбиравшихся ранее. □
Утверждение 2: Во время работы и в момент окончания алгоритма 1 переменная-функция p всегда является сюръекцией, причём при выполнении подшага 2.2 значение p-1(C) всегда существует. □
Последние два утверждения, справедливость которых следует из указанных шагом 1 требований к пл и способа
построения р, показывают, что требуемые алгоритмом действия всегда возможны.
Утверждение 3: Для любых двух конечных языков А, В с Я* алгоритм 1 конечен.
Доказательство. Допустим, что выполнение подшага 2.3 никогда не приводит к выходу из алгоритма. Тогда для
м = ии-1
обозначим
С = У Яг. По определению функции Г,
(УС с я*) (Г(с') с с),
поэтому после каждого выполнения подшага 2.1 имеем
Рг С С, следовательно, по построению
н с р(с).
В связи с тем, что Р(С) - конечное множество, в какой-то момент работы алгоритма возникнет такая ситуация:
(Ус'' с с) (зс' е н) (с' с с'').
С этого момента для всех обрабатываемых шагом 2 слов п& для каждой буквы d е Д подшаг 2.2 выполняет присваивание (добавление элемента в множество)
Ь :+ { п&d } .
Поэтому после конечного числа таких увеличений количества элементов множества Ь и выполнения шага 6 получим Ь э е, после чего на шаге 5 осуществим выход из алгоритма. □
Утверждение 4: Г (А • В) = Г (Г (А) • В). □
Утверждение 5: Если алгоритм 1 закончил работу с ответом 1, то при любом е Д* определены значения
Б(ул) и Р(у&), причём Р(у&) = 0. □
Справедливость последних двух утверждений непосредственно следует из определений функций Г, £ и Р.
Утверждение 6: Если значение р(ш&) определено, то
) = Г(Нл(ь>А)) . (1)
Доказательство проведём индукцией по |. По определению, ( )
р(е) = Г(НА(е)) ,
поэтому база индукции выполняется; покажем выполнение шага.
Пусть равенство (1) выполняется для некоторого (известного) слова
е Д* ,
и для некоторой (произвольной) буквы d е Д имеем
уЛ = тлd (т.е. 1 = 1~шл 1 + 1);
пусть, кроме того, уже определено р(о&). Достаточно показать, что доказываемое утверждение выполнено для
данного V. - поскольку, по определению функции р, если существует р(о&), то при любом
и& € pгef )
определено и значение р(п&).
Применяя выражение из описания подшага 2.1 9, а также предположение индукции (1) и утверждение 4, получаем следующую цепочку равенств:
Р(^Д) = Р(р(™л ) • ьл(с)) =
Г(Г(Нл(т&)) • ьл(с)) =
Г(кл(т&) • ьл(с)) = Г(нл(у&)),
т.е. для указанного слова условие, аналогичное (1) 10, выполняется. □
Утверждение 7: Если алгоритм 1 закончил работу с ответом 1, то для произвольного т& € А* выполнено условие
Р(тд) С Г(кл(т&)) . (2)
Доказательство также проведём индукцией по |тд |. Имеем
Р(е) = Р(Нл(в)) ,
т.е. для т& = е условие (2) выполнено, база индукции доказана. Докажем шаг индукции.
Пусть условие (2) выполняется для некоторого (известного) слова т& € А*, а для некоторой (произвольной) буквы С € А имеем
w&d (т.е. К | = W \ + 1 ).
Тогда:
P К )= d))= p(s(S (тд )d)).
ство:
PК) С F(F(ha(s(тд))) • ha(d)) .
что, учитывая (3) и утверждение 6, совпадает с (4). Итак, в обоих возможных случаях выполнено (4). Снова применим утверждение 6.
Г(Нл(Я(т&))) = р(Б(т&)) = Р(т&),
поэтому (4) можно переписать в таком виде:
Р(у&) С Г(Р(т&) • Ьл(СС)) .
Учитывая предположение индукции (2) и утверждение 4, получаем из последнего утверждения следующее:
Р(у&) С Г(Г(Нл(т&) • Ьл(сС)) = Г(Нл(у&)) ,
что для рассматриваемого слова ул и требовалось доказать.
А в силу произвольности выбора т& и С можно утверждать, что условие (2) выполнено для любого слова
т& € А*. □
X. ДОКАЗАТЕЛЬСТВО КОРРЕКТНОСТИ, ОСНОВНЫЕ РЕЗУЛЬТАТЫ Применяемая ниже терминология, связанная с ш -словами и ш-языками, согласована с [4], [5].
Теорема 1: Следующие три утверждения равносильны:
(5)
Лш С Бш ;
Л* à Б*
(6)
(3)
Возможны следующие два случая.
• в(8(т& )С) = S(тл )С, тогда согласно выполняемому в подшаге 2.1 алгоритма, выполнено такое равен-
алгоритм 1 заканчивает работу с ответом 1. (7)
Доказательство. 1. Пусть выполнено условие (7). Возьмём любое а € Аш, пусть
а = т^,
¿еМ
где все w¿ € А. Для каждого п € N обозначим
-1/
рк) = р(я(т&)с) = г(р(5\т&) • нл(с))) .
Применив утверждение 4 и заменив равенство на несобственное включение, получим следующее:
ил,и = п ■
Вследствие утверждений 5 и 7 имеем:
(Уп € N (Г(Нл(пь,и)) = 0), из чего по определениям Г и Ьл следует:
(Уп € N (Зщ € В*, щ € орМ(В))
( П w¿ = ищ) ■
Поэтому существует некоторая функция
1а : N ^ В*,
такая что
(Уп € N ( ( П ш € Pгef( П w¿))
(4)
• в(8(т& )С) = гл = 5\т& )С, тогда, учитывая вытекающие из описания подшага 2.2 алгоритма включение С С p¿ и равенство
в(и&¿¿) = р-1(С),
получим при
и& = з(тл) и С\ = С
следующее:
р(в(Б(тл)С)) С Г(р(Б(тл)) • Ьл(сС)) ,
9 С одновременной заменой:
• на р(ь&);
• п& на ;
• щ на
Возможность такой замены следует из смысла введённых в настоящем утверждении обозначений.
10 Полученное из (1) заменой на .
1<г<п
& ( П т G Pref ( П fa (i))) ) . (8)
mi с pref ( ^ Ja (
Рассмотрим w-слово
ß ^ fa(i) .
ieN
По построению, в е Вш. Предположим, что в = а, тогда для некоторого п е N имеем
рМп(а) = рМп(в),
откуда выводится противоречие с (8).
Таким образом, построенное нами ^-слово в совпадает с выбранным ранее а. Поскольку выбиралось любое а е Аш, заключаем, что Аш С Вш, таким образом, из (7) следует (5).
2. (6) выводится из (5) согласно доказанному в [5].
3. Теперь докажем, что из (6) следует (7). Предположим противное: (6) выполнено, а (7) - нет. Тогда в силу утверждения 3 алгоритм 1 заканчивает работу с ответом 0. Для зафиксированного при выходе из алгоритма элемента (пусть это - ) выполнено условие р(у&) = 0 (это следует из описания алгоритма 1. Кроме того, согласно утверждению 6,
Г(на(уа)) = 0 . По определению функции Г,
(Уи е В*)(на(ул) е р^(и)), а это противоречит условию (6). □
Понятно, что применяя дважды алгоритм 1, мы получаем алгоритм проверки выполнения отношения ос.
Замечание. В случае бесконечных языков А и В доказательство эквивалентности условий (5) и (6) может быть построено по приведённому выше для конечного случая, связанные результаты были нами рассмотрены в [6]. При этом важно отметить, что рассмотрение бесконечных итерируемых языков нужны «не только для теории»: их применение на практике, для описания грамматических конструкций языков программирования, было нами показано, например, в [7].
XI. О СЛОЖНОСТИ АЛГОРИТМА ПРОВЕРКИ
ВЫПОЛНЕНИЯ ПОКРЫТИЯ В БЕСКОНЕЧНОСТИ И СВЯЗАННЫХ ПРОБЛЕМАХ
Для рассмотренного нами алгоритма несложно получить верхнюю оценку сложности. Однако мы не будем делать это строго - ограничившись общими соображениями - причём можно указать сразу несколько (причём совершенно разных) причин того, что строгие оценки и соответствующие доказательства нас сейчас не интересуют.
• Во-первых, строгие оценки не являются предметом настоящей статьи.
• Во-вторых, по мнению авторов (неоднократно высказывавшемуся в наших предыдущих публикациях), для труднорешаемых задач (к которым относится и рассматриваемая нами) описание эвристических алгоритмов их решения существенно важнее построения точных оценок. Последние, по-видимому, в подавляющем большинстве подобных задач нужны лишь с теоретической точки зрения.
• При том получить такие оценки довольно сложно -как «вообще», так и в нашей конкретной задаче. По поводу неё сразу отметим следующее (некоторые подробности далее). «Сложность получения сложности» возникает из-за того, что необходимо получить
оценки, зависящие от размеров задачи (упрощая ситуацию - от суммы длин всех слов языков A и B), а мы в алгоритме обычно знаем не это число, а общее количество слов рассматриваемых языков.
• По-видимому, можно получить и достижимую оценку сложности алгоритма (подробности также см. ниже) - поэтому верхняя оценка вряд ли интересна.
• Самая важная причина: для рассматриваемой нами задачи могут существовать и другие алгоритмы - и подходы к реализации одного из них мы предполагаем рассмотреть в последующих публикациях.
Однако, конечно, мы приведём краткую схему получения верхней оценки сложности рассмотренного алгоритма. Пусть исходный язык L состоит из n слов; в этом случае «минимальное» множество слов A, итерация которого находится в отношении оо с итерацией L, может содержать любое подмножество, состоящее из этих n слов. Поэтому верхней оценкой является 2n (т. е. алгоритм экспоненциальный) - и такую же оценку мы получим при «входных данных, измеряемых в общей длине задачи» (т. е. суммарной длине рассматриваемых слов языак L). И косвенным подтверждением достижимости нужной нам оценки является рассмотренный нами пример (см. рис. 24 и комментарии к нему, а также рис. 25): на рисунке имеются 15 множеств (мы не считаем 0, т. е. фактически на этом рисунке считаем неповторяющиеся «синие» множества) - что, кстати, совпадает с количеством непустых подмножеств множества из 4 элементов.
В качестве иллюстрации, а именно - примера для существенно более простой задачи, но при этом задачи, связанной с рассматриваемой нами, рассмотрим извлечение корня из языка; мы этим занимались, например, в [8], и приведённый здесь пример является обобщением примера, рассмотренного в той статье11. Конкретно, пусть
A = { a, aba, ababa, abababa } U { babab, bababab, bababab } ,
и при этом L = A2. Тогда множество потенциальных корней можно видеть на основе приведённого в следующей
11 Аналогий между этими двумя задачами несколько - приведём такую. В процитированной статье, среди прочего, рассматриваются множества потенциальных корней n-й степени, обычно обозначаемые нами _
Па ;
именно из этого множества в обеих задачах - причём в разных их постановках - формируются языки-ответы.
Один из возможных алгоритмов для рассматриваемой нами задачи
(общей задачи - т.е. проверки выполнения условия A* оо Б*) также состоит в построении множества потенциальных корней; причём степень n в этом случае - не заданная заранее, а произвольная. Мы собираемся вернуться к этой задаче в одной из следующих публикаций.
При этом разные постановки обеих задач состоят в том, что надо найти:
• либо одно любое решение;
• либо всё множество решений (множество множеств слов);
• либо решение, минимальное по некоторой «естественной» норме (или любое из таких решений, или все такие решения);
• и др.
Очевидно, что в обеих ситуациях имеется тривиальный (но малоинтересный с практической точки зрения) алгоритм решения - переборный ("brute force method"), откуда и возникает экспоненциальная сложность.
таблице:
Таб. 1. Потенциальные корни в примере к задаче извлечения корня 2-й степени из заданного языка.
babab bababab bababab ab
а — (ab) Л2 -
aba (ato) "2 - (ab)"3
ababa - (ab) А3 -
abababa (ab)*3 - (ab)-4
а aba ababa abababa
babab - (ba> л2 - (ba) A3
bababab (ba) л2 - (ba)A3 -
bababab ab - (Ьа>л3 - (ba>-4
В обеих частях таблицы по строкам - первый элемент конкатенации для получения A2, по столбцам - второй элемент, а в клетках таблицы - квадратные корни из слов-конкатенаций. Несложно убедиться, что в дополнение ко всем элементам языка A это множество включает ещё и такие слова:
(ab)2, (ab)3, (ab)4, (ba)2, (ba)3, (ba)4.
Отметим также, что заменяя минимальную и максимальную степени в фактически применяемых здесь выражениях a(ba)k и b(ab)1 (в нашем примере к изменяется от 0 до 3, а l - от 2 до 4), мы получаем новые примеры.
Итак, в задаче на входе - только язык L (а также
требуемая степень 2). В нашем примере общая длина тех
12
корней, которые войдут в ответ , равна
1 + 3 + 5 + 7 + 5 + 7 + 9 = 37;
при этом общая длина всех «плохих» корней (которые не войдут в ответ) равна
4 + 6 + 8 + 4 + 6 + 8 = 36,
т. е. примерно равна предыдущему значению. Несложно убедиться, что при больших максимальных значениях к и l будет аналогичная ситуация, т. е. отношение общей длины «хороших» корней к общей длины «плохих» примерно равно 1 - что не свидетельствует о практической целесообразности применения рассмотренного нами алгоритма в задачах больших размерностей.
Из изложенного в этом разделе следует также верхняя оценка числа классов эквивалентности (числа неповторяющихся множеств, включаемых в объект класса TailsArr) - мы о таких классах говорили выше; для данных общей длиной n возможно порядка yjn различных слов (подсчёт коэффициентов опускаем) - и, следовательно, порядка 2n/2 таких классов. И, конечно же, при генерации всех классов рассмотренным нами алгоритмом зацикливания не будет13 - поскольку все возможные «множества хвостов» заведомо образуют конечное множество.
12 Точнее - в ответ на любую из задач извлечения корня, сформулированных в предыдущей сноске. Мы не будем доказывать (неочевидный) факт, что в приведённом примере все эти задачи эквивалентны: этот факт очень далёк от вопросов, рассматривающихся в настоящей статье.
13 Это особенно важно для приведённой выше программы на Си++,
поскольку, как было отмечено выше, она несколько отличается от рассматриваемого алгоритма 1.
XII. ЗАКЛЮЧЕНИЕ Кратко перечислим полученные результаты и сформулируем направления дальнейшей работы, связанные с рассмотренными в настоящей статье.
Мы рассмотрели алгоритм проверки выполнения отношения эквивалентности в бесконечности двух конечных языков; этот алгоритм вряд ли необходим для практического применения - однако:
• во-первых, он показывает принципиальную возможность алгоритмизации проверки выполнения этого отношения (ранее рассмотренные нами алгоритмы -см. [5], [9], [10] и др. - были неконструктивными);
• во-вторых, на его основе мы рассмотрели бесконечные итерационные деревья, которые предполагаем применять и в других задачах теории формальных языков;
• и в-третьих, при его рассмотрении возникают различные связанные проблемы - как «вспомогательные», так и являющиеся, по-видимому, довольно важными.
Одной из подобных проблем является сведéние бесконечных итерационных деревьев к недетерминированным конечным автоматам: такое сведéние несложно получается путём отождествления всех вершин дерева, принадлежащих одному классу эквивалентности (т. е. вершин с одинаковыми значениями функции P). Понятно, что каждой паре языков при этом соответствует некоторый недетерминированный конечный автомат над рассматриваемым нами алфавитом14; понятно, что возникает вопрос про решению «обратной задачи»: всякому ли недетерминированному конечному автомату соответствует некоторая пара языков, определяющее, во-первых, бесконечное итерационное дерево, и, во-вторых, автомат, строящийся по этому дереву и совпадающий с заданным?
Список литературы
[1] Мельников Б., Мельникова А. Бесконечные деревья в алгоритме проверки условия эквивалентности итераций конечных языков. Часть I // International Journal of Open Information Technologies.
- 2021. - Vol. 9. No. 4. - P. 1-11.
[2] Лаллеман Ж. Полугруппы и комбинаторные приложения. - М., Мир. - 1985. - 440 с.
[3] Мельников Б. Алгоритм проверки равенства бесконечных итераций конечных языков // Вестник Московского университета, серия 15 («Вычислительная математика и кибернетика»). - 1996. - № 4.
- С. 49-54.
[4] Саломаа А. Жемчужины теории формальных языков. - М., Мир. -1986. - 159 с.
[5] Melnikov B. The equality condition for infinite catenations of two sets of finite words // International Journal of Foundation of Computer Science.
- 1993. - Vol. 4. No. 3. - P. 267-274.
[6] Brosalina A., Melnikov B. Commutation in global supermonoid of free monoids // Informatica (Lithuanian Academy of Sciences). - 2000. -Vol. 11. No. 4. - P. 353-370.
[7] Дубасова О., Мельников Б. Об одном расширении класса контекстно-свободных языков // Программирование (РАН). - 1995.
- № 6. - С. 46-58.
[8] Melnikov B., Korabelshchikova S., Dolgov V. On the task of extracting the root from the language // International Journal of Open Information Technologies. - 2019. - Vol. 7. No. 3. - P. 1-6.
[9] Мельников Б. Описание специальных подмоноидов глобального над-моноида свободного моноида // Известия высших учебных заведений. Математика. - 2004. - № 3. - С. 46-56.
[10] Алексеева А., Мельников Б. Итерации конечных и бесконечных языков и недетерминированные конечные автоматы // Вектор науки Тольяттинского государственного университета. - 2011. -№ 3(17). - С. 30-33.
14 В наших обозначениях - над А; заметим при этом, что сами языки A и B задаются над алфавитом Е.
Рис. 25. Итерационное дерево морфизма для примера из статьи (без повторения вершин с одинаковыми значениями р).
Борис Феликсович МЕЛЬНИКОВ,
профессор Университета МГУ-ППИ в Шэньчжэне (http://szmsubit.ru/),
email: [email protected],
mathnet.ru: personid=2 7 9 67,
elibrary.ru: authorid=15715,
scopus.com: authorId=55954040300,
ORCID: orcidID=00 0 0-0 0 02-67 65-68 0 0.
Александра Александровна МЕЛЬНИКОВА,
доцент Димитровградского инженерно-технологического института -
филиала Национального исследовательского ядерного университета «МИФИ» (https://diti-mephi.ru/),
email: [email protected],
mathnet.ru: personid=148963,
elibrary.ru: authorid=143351,
scopus.com: authorId=6603567251,
ORCID: orcidID=00 0 0-0 0 02-165 8-68 57.
Infinite trees in the algorithm for checking the equivalence condition of iterations of finite languages. Part II
Boris Melnikov, Aleksandra Melnikova
Abstract—In this paper, we return to the topic related to one important binary relation on the set of formal languages (considered primarily on the set of iterations of nonempty finite languages), i.e. the equivalence relation at infinity. First of all, we consider examples of the application of this relation (both examples of the need for its implementation, and examples of its use) in various fields of the theory of formal languages, discrete mathematics, and abstract algebra. To simplify the consideration of equivalence at infinity we formulate a simpler binary relation over the set of languages, i.e. the covering relation, the double application of which is equivalent to the application of the equivalence relation at infinity. Next, we consider an algorithm for verifying the fulfillment of the coverage relation, and then we define auxiliary objects used both for proving the correctness of this algorithm and for other problems in the theory of formal languages. As one of the comments on the algorithm, we give the corresponding computer program, consider examples of its operation for specific input languages, after that, we formulate the definitions of the objects associated with them, in particular, the definition of infinite trees of the coverage relation. With their help we prove the correctness of the algorithm for checking the fulfillment of the coverage relation, and also estimate the complexity of this algorithm.
Keywords—formal languages, iterations of languages, binary relations, infinite trees, algorithms.
Boris MELNIKOV,
Professor of Shenzhen MSU-BIT University, China
(http://szmsubit.ru/), email: [email protected], mathnet.ru: personid=2 7 9 67, elibrary.ru: authorid=15715, scopus.com: authorId=55954040300, ORCID: orcidID=00 0 0-0 0 02-67 65-68 0 0.
Aleksandra MELNIKOVA, Associated Professor of
Dimitrovgrad Engineering and Technology Institute -Branch of National Research Nuclear University "MEPhI"
(https://diti-mephi.ru/), email: [email protected], mathnet.ru: personid=148963, elibrary.ru: authorid=143351, scopus.com: authorId=6603567251, ORCID: orcidID=00 0 0-0 0 02-165 8-68 57.
References
[1] Melnikov B., Melnikova A. Infinite trees in the algorithm for checking the equivalence condition of iterations of finite languages. Part I // International Journal of Open Information Technologies. - 2021. -Vol. 9. 2021. - Vol. 9. No. 4. - P. 1-11 (in Russian).
[2] Lallement G. Semigroups and Combinatorial Applications. - NJ, Wiley & Sons, Inc. - 1979. - 376 p.
[3] Melnikov B. Algorithm for checking the equality of infinite iterations of finite languages // Bulletin of the Moscow University, Series 15 ("Computational Mathematics and Cybernetics"). - 1996. - No. 4. -P. 49-54 (in Russian).
[4] Salomaa A. Jewels of Formal Language Theory. - Rockville, Maryland, Computer Science Press. - 1981. - 144 p.
[5] Melnikov B. The equality condition for infinite catenations of two sets of finite words // International Journal of Foundation of Computer Science. - 1993. - Vol. 4. No. 3. - P. 267-274.
[6] Brosalina A., Melnikov B. Commutation in global supermonoid offree monoids // Informatica (Lithuanian Academy of Sciences). - 2000. -Vol. 11. No. 4. - P. 353-370.
[7] Dubasova O., Melnikov B. On an extension of the context-free language class // Programming (Russian Academy of Sciences). -1995. - No. 6. - P. 46-58 (in Russian).
[8] Melnikov B., Korabelshchikova S., Dolgov V. On the task of extracting the root from the language // International Journal of Open Information Technologies. - 2019. - Vol. 7. No. 3. - P. 1-6.
[9] Melnikov B. The description of special submonoids of the global supermonoid of the free monoid // News of Higher Educational Institutions. Mathematics. - 2004. - No. 3. - P. 46-56 (in Russian).
[10] Alekseeva A., Melnikov B. Iterations of finite and infinite languages and nondeterministic finite automata // Vector of Science of Togliatti State University. - 2011. - No. 3 (17). - P. 30-33 (in Russian).