ГЛАВА 4
Свойства регулярных языков
В этой главе рассматриваются свойства регулярных языков. В разделе 4.1 предлагается инструмент для доказательства нерегулярности некоторых языков — теорема, которая называется «леммой о накачке» («pumping lemma»).
Одними из важнейших свойств регулярных языков являются «свойства замкнутости». Эти свойства позволяют создавать распознаватели для одних языков, построенных из других с помощью определенных операций. Например, пересечение двух регулярных языков также является регулярным. Таким образом, при наличии автоматов для двух различных регулярных языков можно (механически) построить автомат, который распознает их пересечение. Поскольку автомат для пересечения языков может содержать намного больше состояний, чем любой из двух данных автоматов, то «свойство замкнутости» может оказаться полезным инструментом для построения сложных автоматов. Конструкция для пересечения уже использовалась в разделе 2.1.
Еще одну важную группу свойств регулярных языков образуют «свойства разрешимости». Изучение этих свойств позволяет ответить на важнейшие вопросы, связанные с автоматами. Так, можно выяснить, определяют ли два различных автомата один и тот же язык. Разрешимость этой задачи позволяет «минимизировать» автоматы, т.е. по данному автомату найти эквивалентный ему с наименьшим возможным количеством состояний. Задача минимизации уже в течение десятилетий имеет большое значение при проектировании переключательных схем, поскольку стоимость схемы (площади чипа, занимаемого схемой) снижается при уменьшении количества состояний автомата, реализованного схемой.
4.1. Доказательство нерегулярности языков
В предыдущих разделах было установлено, что класс языков, известных как регулярные, имеет не менее четырех различных способов описания. Это языки, допускаемые ДКА, НКА и £-НКА; их можно также определять с помощью регулярных выражений.
Не каждый язык является регулярным. В этом разделе предлагается мощная техника доказательства нерегулярности некоторых языков, известная как «лемма о накачке». Ниже приводится несколько примеров нерегулярных языков. В разделе 4.2 лемма о накачке используется вместе со свойствами замкнутости регулярных языков для доказательства нерегулярности других языков.
4.1.1. Лемма о накачке для регулярных языков
Рассмотрим язык Ln, = {0″Г | п > 1}. Этот язык состоит из всех цепочек вида 01, 0011, 000111 и так далее, содержащих один или несколько нулей, за которыми следует такое же количество единиц. Утверждается, что язык L0, нерегулярен. Неформально, если бы L(,i был регулярным языком, то допускался бы некоторым ДКА А, имеющим какое-то число состояний к. Предположим, что на вход автомата поступает к нулей. Он находится в некотором состоянии после чтения каждого из к + 1 префиксов входной цепочки, т.е. е,
- 00, …, 0к. Поскольку есть только к различных состояний, то согласно «принципу голубятни», прочитав два различных префикса, например, О1 и О1, автомат должен находится в одном и том же состоянии, скажем, q.
Допустим, что, прочитав / или j нулей, автомат А получает на вход 1. По прочтении / единиц он должен допустить вход, если ранее получил / нулей, и отвергнуть его, получив j нулей. Но в момент поступления 1 автомат А находится в состоянии q и не способен «вспомнить», какое число нулей, i или /, было принято. Следовательно, его можно «обманывать» и заставлять работать неправильно, т.е. допускать, когда он не должен этого делать, или наоборот.
Приведенное неформальное доказательство можно сделать точным. Однако к заключению о нерегулярности языка L0i приводит следующий общий результат.
Теорема 4.1 (лемма о накачке для регулярных языков). Пусть L — регулярный язык. Существует константа п (зависящая от L), для которой каждую цепочку w из языка L, удовлетворяющую неравенству \w\ > п, можно разбить на три цепочки w = xyz так, что выполняются следующие условия.
- уф е.
- \ху\ < п.
- Для любого к > 0 цепочка xykz также принадлежит L.
Это значит, что всегда можно найти такую цепочку у недалеко от начала цепочки w, которую можно «накачать». Таким образом, если цепочку у повторить любое число раз или удалить (при к = 0), то результирующая цепочка все равно будет принадлежать языку L.
Доказательство. Пусть L — регулярный язык. Тогда L = L(A) для некоторого ДКА А. Пусть А имеет п состояний. Рассмотрим произвольную цепочку w длиной не менее п, скажем, w = а,а2…ат, где т>п и каждый а, есть входной символ. Для /= 0, 1, 2, …,« определим состояние р, как 8 (с/,,. а/От…а,), где 8— функция переходов автомата А, а qo — его начальное состояние. Заметим, что р0 = qo.
Рассмотрим п + 1 состояний pt при i = О, 1,2, …, п. Поскольку автомат А имеет п различных состояний, то по «принципу голубятни» найдутся два разных целых числа / и j (0<i<j< п), при которых р, = рг Теперь разобьем цепочку w на xyz.
- х = а^.-.а,.
- у = al+ia,.2—cij.
- z = а)Ча^2—ат—
Таким образом, х приводит в состояние р„ у — из р, обратно в р, (так как р, = pj), а z — это остаток цепочки w. Взаимосвязи между цепочками и состояниями показаны на рис. 4.1. Заметим, что цепочка х может быть пустой при / = 0, a z — при j = п = т. Однако цепочка у не может быть пустой, поскольку / строго меньше j.
У = а!+, … о,
X = ‘». 2 =
Начало ^-ч -Ч/^V V — /^S
-М^)…………………………………………………. *\J
Рис. 4.1. Каждая цепочка, длина которой больше числа состояний автомата, приводит к повторению некоторого состояния
Теперь посмотрим, что происходит, когда на вход автомата А поступает цепочка xykz для любого к > 0. При к = 0 автомат переходит из начального состояния q0 (которое есть также р0) в р„ прочитав х. Поскольку р, =pJt то z переводит А из р, в допускающее состояние (см. рис. 4.1).
Если к > 0, то по х автомат А переходит из q0 в р„ затем, читая у\ к раз циклически проходит через р^ и, наконец, по z переходит в допускающее состояние. Таким образом, для любого к > 0 цепочка xykz также допускается автоматом А, т.е. принадлежит языку L. □
4.1.2. Применение леммы о накачке
Рассмотрим несколько примеров использования леммы о накачке. В каждом примере эта лемма применяется для доказательства нерегулярности некоторого предлагаемого языка.
Лемма о накачке как игра двух противников
В разделе 1.2.3 говорилось о том, что любую теорему, утверждение которой содержит несколько чередующихся кванторов «для всех» («для любого») и «существует», можно представить в виде игры двух противников. Лемма о накачке служит важным примером теорем такого типа, так как содержит четыре разных квантора: «для любого регулярного языка L существует п, при котором для всех w из L, удовлетворяющих неравенству Н > п, существует цепочка xyz, равная w, удовлетворяющая …». Применение леммы о накачке можно представить в виде игры со следующими правилами.
- Игрок 1 выбирает язык L, нерегулярность которого нужно доказать.
- Игрок 2 выбирает п, но не открывает его игроку 1; первый игрок должен построить игру для всех возможных значений п.
- Игрок 1 выбирает цепочку w, которая может зависеть от п, причем ее длина должна быть не меньше п.
- Ифок 2 разбивает цепочку w на х, у и z, соблюдая условия леммы о накачке, т.е. у Ф г и \ху\ < п. Опять-таки, он не обязан говорить первому игроку, чему равны х, у и z, хотя они должны удовлетворять условиям леммы.
- Первый игрок «выигрывает», если выбирает к, которое может быть функцией от п, х, у и z и для которого цепочка xykz не принадлежит L.
Пример 4.2. Покажем, что язык Leq, состоящий из всех цепочек с одинаковым числом нулей и единиц (расположенных в произвольном порядке), нерегулярен. В терминах игры, описанной во врезке «Лемма о накачке как игра двух противников», мы являемся игроком 1 и должны иметь дело с любыми допустимыми ходами игрока 2. Предположим, что п — это та константа, которая согласно лемме о накачке должна существовать, если язык Leq регулярен, т.е. «игрок 2» выбирает п. Мы выбираем цепочку w = Onr, которая наверняка принадлежит Leq.
Теперь «игрок 2» разбивает цепочку w на xyz. Нам известно лишь, что у Ф е и \ху\ < п. Но эта информация очень полезна, и мы-«выигрываем» следующим образом. Поскольку \ху\ < п, и цепочка ху расположена в начале цепочки w, то она состоит только из нулей. Если язык Leq регулярен, то по лемме о накачке цепочка хг принадлежит Leq (при к = 0 в лемме)2. Цепочка xz содержит п единиц, так как все единицы цепочки w попадают в z. Но в xz нулей меньше п, так как потеряны все нули из у. Поскольку у Ф е, то вместе х и z содержат не более п — 1 нулей. Таким образом, предположив, что язык Leq регулярен, приходим к ошибочному выводу, что цепочка xz принадлежит Leq. Следовательно, методом от противного доказано, что язык Leq нерегулярен. □
Пример 4.3. Докажем нерегулярность языка Lpr, образованного всеми цепочками из единиц, длины которых — простые числа. Предположим, что язык Lpr регулярен. Тогда должна существовать константа п, удовлетворяющая условиям леммы о накачке. Рассмотрим некоторое простое число р>п + 2. Такое р должно существовать, поскольку множество простых чисел бесконечно. Пусть w = 1р.
Согласно лемме о накачке можно разбить цепочку w = xyz так, что у Ф е и |ху| < п. Пусть [>.’) = т. Тогда |xz| = р- т. Рассмотрим цепочку ху? mz, которая по лемме о накачке должна принадлежать языку Lpr, если он действительно регулярен. Однако
|хУ^тг| = |xz| + (р — т)\у\ = р-т + (р- т)т = (т + 1 )(р — т).
2 или любом другом значении к, кроме k = 1. ГЛАВА 4. СВОЙСТВА РЕГУЛЯРНЫХ ЯЗЫКОВ
, Похоже, что число |х>’р тг| не простое, так как имеет два множителя т + 1 и р-т. Однако нужно еще убедиться, что ни один из этих множителей не равен 1, потому что тогда яисло (т+ \)(р-т) будет простым. Из неравенства у фе следует т > 1 и т + 1 > 1. Кроме того, т = [у| < \ху\ < п, а р > п + 2, поэтому р-т >2.
Мы начали с предположения, что предлагаемый язык регулярен, и пришли к противоречию, доказав, что существует некоторая цепочка, которая не принадлежит этому языку, тогда как по лемме о накачке она должна ему принадлежать. Таким образом, язык ^нерегулярен. □
4.1.3. Упражнения к разделу 4.1
- Докажите нерегулярность следующих языков:
а) {0ПГ|«> 1}. Это язык L0h который рассматривался в начале раздела. Ему принадлежат все цепочки, состоящие из нулей, за которыми следует такое же количество единиц. Здесь для доказательства примените лемму о накачке;
б) множество цепочек, состоящих из «сбалансированных» скобок «(» и «)», которые встречаются в правильно построенном арифметическом выражении;
в) (*) {0П10П | л > 1};
г) {0″lm2n [пит — произвольные целые числа};
д) {0″Г| п<т}\
е) {0″12п|«>1}.
- (!) Докажите нерегулярность следующих языков:
а) (*) {0″ | л? — полный квадрат};
б) {0″ | « — полный куб};
в) {0″ | п — степень числа 2};
г) множество цепочек из нулей и единиц, длины которых — полные квадраты;
д) множество цепочек из нулей и единиц вида ww, где некоторая цепочка w повторяется дважды;
е) множество цепочек из нулей и единиц вида mvR, где за цепочкой следует цепочка, обратная к ней (формальное определение цепочки, обратной к данной, см. в разделе 4.2.2);
ж) множество цепочек из нулей и единиц вида w w , где цепочка w образована из w путем замены всех нулей единицами и наоборот. Например, 011 = 100, так что цепочка 011100 принадлежит данному языку;
з) множество цепочек из нулей и единиц вида w 1″, где w— цепочка из нулей и единиц длиной п.
- (!!) Докажите нерегулярность следующих языков:
а) множество всех цепочек из нулей и единиц, которые начинаются с единицы и удовлетворяют следующему условию: если интерпретировать такую цепочку как целое число, то это число простое;[2]
б) множество цепочек вида 0’lj, для которых наибольший общий делитель чисел / и j равен 1.
- (!) При попытке применения леммы о накачке к регулярным языкам «противник выигрывает», и закончить доказательство не удается. Определите, что именно происходит не так, как нужно, если в качестве L выбрать следующий язык:
а) (*) пустое множество;
б) (*) {00, 11};
в) (*) (00 + 11)*;
г) 01*0*1.
4.2. Свойства замкнутости регулярных языков
В этом разделе доказано несколько теорем вида «если определенные языки регулярны, а язык L построен из них с помощью определенных операций (например, L есть объединение двух регулярных языков), то язык L также регулярен». Эти теоремы часто называют свойствами замкнутости регулярных языков, так как в них утверждается, что класс регулярных языков замкнут относительно определенных операций. Свойства замкнутости выражают идею того, что если один или несколько языков регулярны, то языки, определенным образом связанные с ним (с ними), также регулярны. Кроме того, данные свойства служат интересной иллюстрацией того, как эквивалентные представления регулярных языков (автоматы и регулярные выражения) подкрепляют друг друга в нашем понимании этого класса языков, так как часто один способ представления намного лучше других подходит для доказательства некоторого свойства замкнутости.
Основные свойства замкнутости регулярных языков выражаются в том, что эти языки замкнуты относительно следующих операций.
- Объединение.
- Пересечение.
- Дополнение.
- Разность.
- Обращение.
- Итерация (звездочка).
- Конкатенация.
- Гомоморфизм (подстановка цепочек вместо символов языка).
- Обратный гомоморфизм.
4.2.1. Замкнутость регулярных языков относительно булевых операций
Сначала рассмотрим замкнутость для трех булевых операций: объединение, пересечение и дополнение.
- Пусть L и М— языки в алфавите Тогда язык L U М содержит все цепочки, которые принадлежат хотя бы одному из языков L или М.
- Пусть L и М— языки в алфавите Z. Тогда язык Lf] М содержит все цепочки, принадлежащие обоим языкам L и М.
- Пусть L — некоторый язык в алфавите Тогда язык L , дополнение L, — это множество тех цепочек в алфавите Z*, которые не принадлежат L.
Что делать, если языки имеют разные алфавиты?
При объединении или пересечении двух языков LnM может оказаться, что они определены в разных алфавитах. Например, возможен случай, когда Lt с {a, b}, a L2Q {Ь, с, d}. Однако, если язык L состоит из цепочек символов алфавита то L можно также рассматривать как язык в любом конечном алфавите, включающем Z (надмножестве Z). Например, можно представить указанные выше языки L] и L2 как языки в алфавите {а, Ь, с, d}. То, что ни одна цепочка языка L/ не содержит символов с или d, несущественно, как и то, что ни одна цепочка языка Ь2 не содержит а. Аналогично, рассматривая дополнение языка L, который является подмножеством множества Z,* для некоторого алфавита Z;, можно взять дополнение относительно некоторого алфавита включающего (надмножества ЕД В этом случае дополнением L будет Z/ — L, т.е. дополнение языка L относительно алфавита Z? включает (среди прочих) все цепочки из Z/, которые содержат хотя бы один символ алфавита 12, не принадлежащий Z,. Если взять дополнение L относительно Z,, то ни одна цепочка, содержащая символы из Z, — Z/, не попадет в L . Таким образом, чтобы избежать неточностей, нужно указывать алфавит, относительно которого берется дополнение. Часто, однако, бывает очевидно, какой алфавит подразумевается в конкретном случае. Например, если язык L определен некоторым автоматом, то в описании этого автомата указывается и алфавит. Итак, во многих ситуациях можно говорить о «дополнении», не указывая алфавит.
Оказывается, что класс регулярных языков замкнут относительно всех трех булевых операций, хотя, как будет видно, в доказательствах используются совершенно разные подходы.
Замкнутость относительно объединения
Теорема 4.4. Если L и М— регулярные языки, то L U М также регулярен.
Доказательство. Поскольку языки L и М регулярны, им соответствуют некоторые регулярные выражения. Пусть L = L{R) и М = L(S). Тогда L U М = L(R + S) согласно определению операции + для регулярных выражений. □
Замкнутость относительно регулярных операций
Доказательство замкнутости регулярных выражений относительно объединения было исключительно легким, поскольку объединение является одной из трех операций, определяющих регулярные выражения. Идея доказательства теоремы 4.4 применима также к конкатенации и итерации. Таким образом,
- если L и М— регулярные языки, то язык LM регулярен;
- если L — регулярный язык, то L* также регулярен.
Замкнутость относительно дополнения
Теорема для объединения языков легко доказывается с помощью регулярных выражений. Теперь рассмотрим дополнение. Знаете ли вы, как преобразовать регулярное выражение, чтобы оно определяло дополнение языка? Мы тоже не знаем. Однако это выполнимо, так как согласно теореме 4.5 можноч начать с ДКА и построить ДКА, допускающий дополнение. Таким образом, начав с регулярного выражения для языка, можно найти выражение для его дополнения следующим образом.
- Преобразовать регулярное выражение в е-НКА.
- Преобразовать е-НКА в ДКА с помощью конструкции подмножеств.
- Дополнить допускающие состояния этого ДКА.
- Преобразовать полученный ДКА для дополнения обратно в регулярное выражение, используя методы из разделов 3.2.1 или 3.2.2.
Теорема 4.5. Если L — регулярный язык в алфавите Z, то язык L = £* — L также регулярен.
Доказательство. Пусть L = ЦА) для некоторого ДКА А = (Q, Е, <5, q0, F). Тогда L = ЦВ), где В — это ДКА (Q, X, 5, q0, Q — F), т.е. автоматы А и В одинаковы, за исключением того, что допускающие состояния автомата А стали не допускающими в В, и наоборот. Тогда w принадлежит ЦВ), если, и только если, <5 (q0, vv) принадлежит Q — F, т.е. w не принадлежит ЦА). □
Заметим, что для приведенного выше доказательства важно, чтобы 5 (q0, w) всегда было некоторым состоянием. Это значит, что в автомате А все переходы определены. Если бы некоторые переходы отсутствовали, то определенные цепочки не вели бы ни в допускающее, ни в недопускающее состояния автомата А, т.е. отсутствовали бы как в L(A), так и ЦБ). К счастью, ДКА определен так, что в любом состоянии у него есть переход по каждому символу алфавита 2, так что каждая цепочка приводит в состояние либо из F, либо из Q-F.
Пример 4.6. Пусть А— автомат, изображенный на рис. 2.14. Напомним, что этот ДКА допускает те и только те цепочки символов 0 и 1, которые заканчиваются на 01. В терминах регулярных выражений L(A) = (0 + 1)*01. Таким образом, дополнение к L(A) содержит все те цепочки из нулей и единиц, которые не заканчиваются на 01. На рис. 4.2 представлен автомат для {0, 1 }* -L(A). Он совпадает с автоматом на рис. 2.14, за исключением того, что допускающие состояния стали недопускающими, а два недопускающих состояния стали допускающими. □
Пример 4.7. Используем теорему 4.5 для доказательства нерегулярности определенного языка. В примере 4.2 была доказана нерегулярность языка Leq, состоящего из цепочек с равными количествами символов 0 и 1. Это доказательство было непосредственным применением леммы о накачке. Теперь рассмотрим язык М, состоящий из цепочек с неравными количествами нулей и единиц.
1 о
Рис. 4.2. ДКА, допускающий дополнение языка (0 + 1) 01 |
В данном случае для доказательства нерегулярности языка М лемму о накачке применить трудно. Интуиция подсказывает, что если начать с некоторой цепочки w из А/, разбить ее на w = xyz и «накачать» у, то может оказаться, что у — это цепочка вроде 01, в которой поровну символов 0 и 1. В этом случае не существует такого к, для которого цепочка ху z имела бы поровну нулей и единиц, поскольку xyz содержит неравные количества нулей и единиц, а при «накачивании» у эти количества изменяются одинаково. Следовательно, мы не можем использовать лемму о накачке для того, чтобы прийти к противоречию с предположением, что язык М регулярен.
Но все-таки язык М нерегулярен. Объясняется это тем, что М= Leq. Поскольку дополнение к дополнению некоторого множества равно этому же множеству, то Leq = М .
Если М регулярен, то по теореме 4.5 язык Ьщ также регулярен. Но мы знаем, что Leq не регулярен, и полученное противоречие доказывает нерегулярность языка М. □
Замкнутость относительно пересечения
Рассмотрим пересечение двух регулярных языков. Здесь почти нечего делать, поскольку операции объединения, дополнения и пересечения не являются независимыми. Пересечение языков L и М выражается через объединение и дополнение следующим тождеством.
1пМ=1ил7 (4.1)
Вообще, пересечение двух множеств — это множество элементов, не принадлежащих дополнениям каждого из них. Это замечание, записанное в виде равенства (4.1), представляет один из законов Де Моргана. Другой закон имеет аналогичный вид, только объединение и пересечение меняются местами, т.e.LuM = L пМ .
Вместе с тем, для пересечения двух регулярных языков можно построить ДКА непосредственно. Такая конструкция, в которой, по существу, параллельно работают два ДКА, весьма полезна сама по себе. Например, она использовалась для построения автомата (см. рис. 2.3), представляющего «произведение» действий двух участников— банка и магазина. Конструкция произведения формально представлена в следующей теореме.
Теорема 4.8. Если L и М— регулярные языки, то язык L П М также регулярен.
Доказательство. Пусть L и М— языки автоматов AL = (QL, Z, 8Ь q,. F,) и Ам = (QM, X, SM, qM, FM). Заметим, что алфавиты автоматов считаются одинаковыми, т.е. X есть объединение алфавитов языков L и М, если эти алфавиты различаются. В действительности конструкция произведения работает для НКА точно так же, как и для ДКА, но для максимального упрощения предположим, что AL и Ам— ДКА.
Для L П М построим автомат А, моделирующий автоматы А, и Ам одновременно. Состояниями автомата А будут пары состояний, первое из которых принадлежит А, , а второе — Ам. Чтобы построить переходы автомата А, предположим, что он находится в состоянии (р, q), где р— состояние автомата А,_, a q— состояние Ам— Нам известно, как ведет себя автомат А/,, получая на входе символ а. Пусть он переходит в состояние .у. Также допустим, что автомат Ам по входному символу а совершает переход в состояние t. Тогда следующим состоянием автомата А будет (.s, t). Таким образом, автомат А моделирует работу автоматов AL и Ам. Эта идея в общих чертах представлена на рис. 4.3.
Остальные детали доказательства очень просты. Начальным состоянием автомата А будет пара начальных состояний автоматов AL и Ам. Поскольку автомат А допускает тогда и только тогда, когда допускают оба автомата А, и Ам, в качестве допускающих состояний автомата А выбираем все пары (р, q), где р — допускающее состояние автомата Al, a q —Ам. Формально автомат А определяется как
А = {Qi X QM, Z, S, (qL, qM), (F, x FM), где 8{{p, q), a) = (Sr(p, a), Sx1(q, a)).
А,»
Начало |
Рис. 4.3. Автомат, имитирующий два других автомата и допускающий тогда и только тогда,
когда допускают оба автомата
Чтобы увидеть, почему L(A) = L(Al) f| L(Am), сначала заметим, что индукцией по \w\ легко доказать равенство S ((qL, q^), w) = (5 /{qL, w), 8 лХ^лл w)). Но А допускает w тогда и только тогда, когда <5 {{qL, qM), w) является парой допускающих состояний, т.е.
Л Л
8 L(qL, w) должно принадлежать FL, a S м(Ям, w) — FM. Иными словами, цепочка w допускается автоматом А тогда и только тогда, когда ее допускают оба автомата А/ и Ам. Итак, А допускает пересечение языков L и М. □
Пример 4.9. На рис. 4.4 представлены два ДКА. Автомат на рис. 4.4, а допускает все цепочки, имеющие 0, а автомат на рис. 4.4, б — все цепочки, имеющие 1. На рис. 4.4, в представлен автомат— произведение двух данных автоматов. Его состояния помечены как пары состояний исходных автоматов.
Легко доказать, что этот автомат допускает пересечение первых двух языков, т.е. те цепочки, которые содержат как 0, так и 1. Состояние рг представляет начальное условие, когда на вход автомата пока не поступили ни 0, ни 1. Состояние qr означает, что поступили только нули, а состояние ps — только единицы. Допускающее состояние qs представляет условие того, что на вход автомата поступили и нули, и единицы. □ Замкнутость относительно разности
Вход а |
Существует еще одна, четвертая, операция, часто применяемая к множествам и связанная с булевыми операциями, а именно, разность множеств. В терминах языков разностью L-M языков L и М называют множество цепочек, которые принадлежат L и не принадлежат М. Регулярные языки замкнуты относительно этой операции. Доказательство замкнутости относительно разности следует из доказанных выше теорем.
Начало |
а) |
0,1 |
О
Начало |
0,1 |
Начало
0
0 |
О, 1 |
п
в)
Рис. 4.4. Конструкция произведения
Теорема 4.10. Если LnM— регулярные языки, то язык L — М также регулярен. Доказательство. Заметим, что L — М = Lf] Л/ . По теореме 4.5 регулярен язык М , а по теореме 4.8 — L f| М . Следовательно, язык L — Мрегулярен. □
4.2.2. Обращение
Обращением цепочки а/аг…а„ называется цепочка, записанная в обратном порядке, т.е. a„a„-i…ai. Обращение w обозначается wR. Таким образом, 00L0R есть 0100, е.
Обращение языка L, обозначаемое Z,R, состоит из всех цепочек, обратных цепочкам языка L. Например, если! ={001, 10, 111}, тоLK= {100, 01, 111}.
Обращение является еще одной операцией, сохраняющей регулярность языков, т.е. если язык L регулярен, то LR также регулярен. Это легко доказать двумя способами, первый из которых основан на автоматах, а второй — на регулярных выражениях. Доказательство, основанное на автоматах, приводится неформально, так что читатель при желании может восполнить детали. Затем приводится формальное доказательство, использующее регулярные выражения.
Если задан язык L, который есть L(A) для некоторого конечного автомата А, вероятно, с недетерминизмом и £-переходами, то можно построить автомат для LK следующим образом.
- Обратить все дуги на диаграмме переходов автомата А.
- Сделать начальное состояние автомата А единственным допускающим состоянием нового автомата.
- Создать новое начальное состояние р0 с £-переходами во все допускающие состояния автомата А.
В результате получим автомат, имитирующий автомат А «в обратном порядке» и, следовательно, допускающий цепочку w тогда и только тогда, кода А допускает wR. Теперь докажем теорему для обращения формально. Теорема 4.11. Если язык L регулярен, то язык LR также регулярен. Доказательство. Предположим, что язык L определяется регулярным выражением Е. Доказательство проводится структурной индукцией по длине выражения Е. Покажем, что существует еще одно регулярное выражение Ек, для которого L(ER) = (ЦЕ))К, т.е. язык выражения Ек является обращением языка выражения Е.
Базис. Если Е равно £, 0 или а, где а — некоторый символ, то Ек совпадает с Е, т.е.
{£}R={£},0R=0H{«}R={«}.
Индукция. В зависимости от вида выражения Е возможны три варианта.
- Е = Е/ + Е2. Тогда ER = £;R + E2R. Доказательство состоит в том, что обращение объединения двух языков получается, если сначала вычислить, а затем объединить обращения этих языков.
- Е= Е]Е2. Тогда £R = E2RE,R. Заметим, что необходимо обратить не только сами языки, но и их порядок. Например, если L(Et) = {01,111}, a ЦЕ2) = {00,10}, то ЦЕ,Е2)= {0100, 0110, 11100, 11110}. Обращение этого языка есть {0010, 0110, 00111,01111}.
Если соединить обращения языков ЦЕ2) и ЦЕ,) в таком порядке, как они здесь записаны, то получим язык
{00, 01} {10, 111} = {0010, 00111,0110,01111}, который равен языку (L(E,E2yf~. В общем случае, если цепочка w из ЦЕ) является конкатенацией цепочек w, из ЦЕ,) и w2 из ЦЕ2), то wR = w2Rw;R.
- Е = Е*. Тогда £R = (£;R)*. Доказательство состоит в том, что любая цепочка w из L{E) может быть записана как w,w2…wm где каждая vv, принадлежит ЦЕ). Но
r _ r r r W =W„ W„_i …Wi .
Каждая w,R принадлежит L(£R), т.е. wR принадлежит (£/R)*. И наоборот, любая цепочка из Z((£;r)*) имеет вид w,w2…wm где каждая цепочка vv, является обращением некоторой цепочки из L(Ei). Следовательно, обращение данной цепочки w„Rw„ A..w/R принадлежит языку ЦЕ*), который равен ЦЕ). Таким образом, доказано, что цепочка принадлежит ЦЕ) тогда и только тогда, когда ее обращение принадлежит Ц(Е,К)*). □
Пример 4.12. Пусть язык L определяется регулярным выражением (0 + 1)0*. Тогда согласно правилу для конкатенации LK— это язык выражения (0*)R(0 + 1)R. Если применить правила для итерации и объединения к двум частям этого выражения, а потом использовать базисное правило, которое говорит, что обратными к 0 и 1 будут эти же выражения, то получим, что язык LK определяется регулярным выражением 0 (0 + 1). □
4.2.3. Гомоморфизмы
Гомоморфизм цепочек — это такая функция на множестве цепочек, которая подставляет определенную цепочку вместо каждого символа данной цепочки.
Пример 4.13. Функция h, определенная как /;(0) = ab и h(l) = e, является гомоморфизмом. В любой цепочке из символов 0 и 1 h заменяет все нули цепочкой ab, а все единицы — пустой цепочкой. Например, применяя h к цепочке 0011, получим abab. О
Формально, если h есть некоторый гомоморфизм на алфавите Z, a w = а\а2…а„— цепочка символов в X, то h(w) = h(ai)h(a2)…h(an). Таким образом, сначала h применяется к каждому символу цепочки w, а потом полученные цепочки символов соединяются в соответствующем порядке. Например, рассмотрим гомоморфизм h из примера 4.13 и цепочку w = 0011: h(w) = h(0)h(0)h(l)h(l) = (ab)(ab)(e)(e) = abab, что и утверждается в этом примере.
Гомоморфизм языка определяется с помощью его применения к каждой цепочке языка, т.е. если L — язык в алфавите Z, a h — гомоморфизм на Z, то h(L) = {h(w) | w принадлежит L}. Рассмотрим язык L регулярного выражения 10 1, т.е. все цепочки, которые начинаются и заканчиваются единицей, а между ними содержат произвольное число нулей. Пусть h — гомоморфизм из примера 4.13. Тогда h(L) — это язык выражения (ab)*. Объясняется это тем, что h исключает все единицы, заменяя их е, а вместо каждого нуля подставляет цепочку ab. Идея применения гомоморфизма непосредственно к регулярному выражению используется для доказательства замкнутости регулярных языков относительно гомоморфизма.
Теорема 4.14. Если L — регулярный язык в алфавите а /г — гомоморфизм на X, то язык /г(£) также регулярен.
Доказательство. Пусть L = Z(/?) для некоторого регулярного выражения Л. Вообще, если £ есть регулярное выражение с символами из алфавита Z, то пусть h(E) — выражение, полученное в результате замены каждого символа я в выражении £ цепочкой й(я). Утверждается, что выражение /г(К) определяет язык /;(£).
Это легко доказать с помощью структурной индукции. Если применить гомоморфизм /г к любому подвыражению Е выражения Л, то язык выражения /г(£) совпадет с языком, полученным в результате применения этого гомоморфизма к языку L{E). Формально, ШЕ)) = Й(Ц£)).
Базис. Если Е есть £ или 0, то /г(£) совпадает с Е, поскольку Л не влияет на цепочку е или язык 0. Следовательно, L(h(E)) = L{E). В то же время, если Е равно 0 или е, то L(E) либо не содержит ни одной цепочки, либо состоит из цепочки без символов. Таким образом, в обоих случаях h(L(E)) = L(£). Из этого следует, что L(h(E)) = L(E) = h(L(E)).
Возможен еще один базисный вариант, когда Е= а для некоторого символа а из 2. В этом случае L{E) = {а}, и И(ЦЕ)) = {/г(а)}. Выражение /г(£) представляет собой цепочку символов h(a). Таким образом, язык L(h(E)) также совпадает с {h(a)}, и, следовательно,
ЩЕ)) = №Е))-
Индукция. В зависимости от операции в регулярном выражении возможны три ситуации. Все они просты, поэтому обоснуем индукцию только для объединения, Е = F + G. Способ применения гомоморфизмов к регулярным выражениям гарантирует, что h(E) = h(F + G) = h(F) + h(G). Нам также известно, что L(E) = L(F) U L(G) и
L(h(E)) = L(h(F) + h(G)) = l(h(Fj) U L(h(G j) (4.2)
по определению операции + для регулярных выражений. Наконец,
h(L(E)) = h(L{F) U L(G)) = h{L(Fj) U h(L(G)), (4.3)
поскольку h применяется к языку путем применения его к каждой цепочке этого языка по отдельности. По индуктивной гипотезе L(h(F)) = h(L(F)) и L(h(G)) = h(L(G)). Таким образом, правые части выражений (4.2) и (4.3) эквивалентны, и, следовательно, L{h{E)) = h{L{E)).
Для случаев, когда выражение Е является конкатенацией или итерацией, доказательства не приводятся, поскольку они аналогичны доказательству, представленному выше. Итак, можно сделать вывод, что L(h(R)) действительно равняется h(L(R)), т.е. применение гомоморфизма к регулярному выражению языка L дает регулярное выражение, определяющее язык h(L). □
4.2.4. Обратный гомоморфизм
Гомоморфизм можно применять «назад», и это также сохраняет регулярность языков. Предположим, что h—- гомоморфизм из алфавита £ в цепочки, заданные в другом (возможно, том же) алфавите Т[3]. Пусть L — язык в алфавите Т. Тогда h~l(L), читаемое как »обратное h от L», — это множество цепочек w из для которых h(w) принадлежит L. На рис. 4.5, а представлено применение гомоморфизма к языку L, а на рис. 4.5, б — использование обратного гомоморфизма.
Пример 4.15. Пусть L — язык регулярного выражения (00 + 1) , т.е. все цепочки из символов 0 и 1, в которых нули встречаются парами. Таким образом, цепочки 0010011 и 10000111 принадлежат L, а 000 и 10100 — нет.
Пусть h— такой гомоморфизм: h(a) = 01, h(b) = 10. Утверждается, что h~\L)— это язык регулярного выражения (Ьа)*, т.е. все цепочки, в которых повторяются пары Ьа. Докажем, что h(w) принадлежитL тогда и только тогда, когда цепочка w имеет вид baba…Ьа.
Достаточность. Предположим, что цепочка w состоит из п повторений Ьа для некоторого п > 0. Заметим, что h{ba) = 1001, т.е. h(w) — это п повторений цепочки 1001. Поскольку цепочка 1001 построена из двух единиц и пары нулей, то она принадлежит языку L. Следовательно, цепочка, состоящая из любого числа повторений 1001, также образована единицами и парами нулей и принадлежит L. Таким образом, h(w) принадлежит L.
Необходимость. Теперь предположим, что h(yv) принадлежит L, и покажем, что цепочка w имеет вид baba…ba. Существует четыре условия, при которых цепочка имеет другой вид. Покажем, что при выполнении любого из них h(w) не принадлежит L, т.е. докажем утверждение, противоположное тому, что нам нужно доказать.
- Если w начинается символом а, то h(w) начинается с 01. Следовательно, она содержит отдельный 0 и поэтому не принадлежит L.
- Если w заканчивается символом Ь, то в конце h(w) стоит 10, и опять-таки в цепочке h(w) есть изолированный 0.
- Если в цепочке w дважды подряд встречается а, то h(w) содержит подцепочку 0101. Снова в w есть изолированный нуль.
- Аналогично, если в w есть два символа b подряд, то h(w) содержит подцепочку 1010 с изолированным 0.
Таким образом, при выполнении хотя бы одного из вышеперечисленных условий цепочка h(w) не принадлежит L. Но если ни одно из условий 1-4 не выполняется, то цепочка w имеет вид baba…ba. Чтобы понять, почему это происходит, предположим, что ни одно из этих условий не выполняется. Тогда невыполнение условия 1 означает, что w должна начинаться символом Ь, а невыполнение 2 — что она должна заканчиваться символом а. Невыполнение условий 3 и 4 говорит, что символы а и b должны чередоваться. Следовательно, логическое ИЛИ условий 1-4 эквивалентно утверждению «цепочка w имеет вид, отличный от baba…bcC\ Но выше было доказано, что из логического ИЛИ условий 1-4 следует, что h(w) не принадлежит L. Это утверждение противоположно тому, что нужно доказать, а именно, что «если h(w) принадлежит L, то цепочка w имеет вид babu…ba\ □
Далее докажем, что обратный гомоморфизм регулярного языка также регулярен, и покажем, как эту теорему можно использовать.
Теорема 4.16. Если h— гомоморфизм из алфавита X в алфавит Т, L— регулярный язык над Т, то язык h~l(L) также регулярен.
Доказательство. Начнем с ДКА А для языка L. По А и h строится ДКА для h’l(L) с помощью схемы, представленной на рис. 4.6. Этот ДКА использует состояния автомата А, но переводит входной символ в соответствии с h перед тем, как решить, в какое состояние перейти.
Вход о
Рис. 4.6. ДКА для h ‘(L) применяет гомоморфизм h ко входным символам, а потом имитирует ДКА для L |
Формально, пусть L — это ЦА), где ДКА А = (Q, Т, 8, q0, F). Определим ДКА
л
функция переходов /которого строится по правилу y(q, а)= 8 (q, h(a)). Таким образом, переход автомата В по входному символу а является результатом последовательности переходов, совершаемых автоматом А при получении цепочки символов h{a). Напомним, что, хотя h(a) может равняться е, состоять из одного или нескольких символов, функция <5 определена так, чтобы справиться со всеми этими случаями.
С помощью индукции по |vv| легко показать, что у (q„, vv) = 8(q0,h(w)). Поскольку допускающие состояния автоматов А и В совпадают, то В допускает цепочку w тогда и только тогда, когда А допускает цепочку h{w). Иными словами, В допускает только те цепочки, которые принадлежат языку h’l(L). □
Пример 4.17. В этом примере обратный гомоморфизм и некоторые другие свойства замкнутости регулярных множеств используются для доказательства одного необычного свойства конечных автоматов. Предположим, что, допуская входную цепочку, некоторый автомат должен побывать в каждом состоянии хотя бы по одному разу. Точнее, допустим, что А = (Q, Z, 8, q0, F) — ДКА, и нас интересует язык L, состоящий из всех цепочек w в алфавите Z*, для которых 8 (q,h vv) принадлежит F, и для каждого состояния q из Q существует некоторый префикс хч цепочки vv, для которого 8 (q0, хч) = q. Будет ли язык L регулярным? Докажем, что такой язык регулярен, хотя доказательство довольно сложное.
Начнем с языка M-L(A), т.е. множества цепочек, допускаемых автоматом А обычным путем, независимо от того, в какие состояния он переходит, обрабатывая входную цепочку. Заметим, что LqM, так как определение языка L накладывает дополнительные ограничения на цепочки из ЦА). Доказательство регулярности языка L начинается с использования обратного гомоморфизма для вставки состояний автомата А во входные символы. Точнее, определим новый алфавит Т как состоящий из символов, которые можно представить в виде троек \paq], где pwq — состояния из Q, а — символ из Z, и 8(р, а) = q.
Таким образом, символы алфавита Г представляют переходы автомата А. Важно понимать, что запись [paq] представляет собой единый символ, а не конкатенацию трех символов. Можно обозначить этот символ одной буквой, но при этом трудно описать его связь cp,qna.
Теперь определим гомоморфизм h([paq]) = а для всех р, а и q. Это значит, что гомоморфизм h удаляет из каждого символа алфавита Т компоненты, представляющие состояния, и оставляет только символ из Z. Первый шаг доказательства регулярности языка L состоит в построении языка L, = h~l(M). Поскольку язык М регулярен, то согласно теореме 4.16 язык Li также регулярен. Цепочками языка Li будут цепочки из М, к каждому символу которых присоединяется пара состояний, представляющая некоторый переход автомата.
В качестве простого примера рассмотрим автомат с двумя состояниями, представленный на рис. 4.4, а. Алфавит Х= {0, 1}, а алфавит Т состоит из четырех символов [pQq], [q$q], [pip] и [q\q]. Например, поскольку по символу 0 есть переход из р в q, то \pOq] — один из символов алфавита Т. Так как цепочка 101 допускается этим автоматом, применив к ней обратный гомоморфизм /Г1, получим 23 = 8 цепочек, две из которых, например, равны [p\p]\pQq][q\q] и [q\q][q0q]\p\p].
Теперь по языку построим язык L с помощью ряда операций, сохраняющих регулярность языков. Наша первая цель — исключить все те цепочки языка Lh в которых состояния указаны неправильно. Поскольку каждый символ вида \paq\ означает, что автомат был в состоянии р, прочитал а и затем перешел в состояние q, последовательность таких символов, представляющая допускающее вычисление в автомате А, должна удовлетворять следующим трем условиям.
- Первым состоянием в первом символе должно быть q0 — начальное состояние А.
- Каждый переход автомата должен начинаться там, где закончился предыдущий, т.е. первое состояние в символе должно равняться второму состоянию в предыдущем символе.
- Второе состояние в последнем символе должно принадлежать F. Если выполняются первые два условия, то и это условие будет выполнено, поскольку каждая цепочка языка L, образована из цепочки, допускаемой автоматом А.
и | Язык автомата А | |
Обратный гомоморфизм | ||
L | 1 | Цепочки языка М, в которые вставлены компоненты состояний |
i | ‘ | Пересечение с регулярным языком |
L | 2 | Добавить условие, что первым является начальное состояние |
‘ | Разница с регулярным языком | |
1 | 3 | Добавить условие, что смежные состояния должны совпадать |
Разница с регулярными языками | ||
‘4 | Добавить условие, что на пути встречаются все состояния | |
Гомоморфизм | ||
L | Удалить компоненты состояний, оставляя только символы |
Рис. 4.7. Построение языка L по языку М с помощью операций, сохраняющих регулярность языков |
План построения языка L представлен на рис. 4.7.
Условие 1 обеспечивается пересечением языка Li со множеством цепочек, которые начинаются символом вида [qoaq] для некоторого символа а и состояния q. Пусть Ei — выражение [qnQ^h] + [qoOiCji] + …, где a,q, — все пары из X X Q, для которых S(qfl, а,) = q,. Пусть L2 = L] П L{E;T). Регулярное выражение Е,Т обозначает все цепочки из Т*, которые начинаются стартовым состоянием (здесь Т можно рассматривать как сумму всех его символов). Поэтому язык /,2 состоит из всех цепочек, полученных в результате применения обратного гомоморфизма /Г1 к языку М, у которых первым компонентом в первом символе является начальное состояние, т.е. язык L2 удовлетворяет условию 1.
Чтобы обеспечить выполнение условия 2, проще всего вычесть из L2 (используя операцию разности множеств) все цепочки, нарушающие это условие. Пусть Е2 — регулярное выражение, состоящее из суммы (объединения) конкатенации всех пар символов, которые друг другу не подходят. Это все пары вида \paq\[rbs\, где q Ф г. Тогда регулярное выражение Т*Е2Т* обозначает все цепочки, не удовлетворяющие условию 2.
Теперь можно определить h3 = L2— L(fE2f). Цепочки языка L3 удовлетворяют условию 1, поскольку цепочки языка L2 начинаются стартовым состоянием. Они также удовлетворяют условию 2, так как в результате вычитания ЦТ* Е2Т*) будут удалены все цепочки, для которых это условие не выполняется. Наконец, они удовлетворяют условию 3 (последнее состояние является допускающим), поскольку доказательство было начато с цепочек языка М, допускаемых автоматом А. В результате L} состоит из цепочек языка М с состояниями допускающего вычисления такой цепочки, вставленными в каждый символ. Заметим, что язык L3 регулярен, так как он построен из регулярного языка М с помощью операций обратного гомоморфизма, пересечения и разности множеств, сохраняющих регулярность.
Напомним, что наша цель состоит в том, чтобы допустить только те цепочки из М, при обработке которых автомат проходит через каждое состояние. Выполнение этого условия можно обеспечить с помощью операции разности множеств. Пусть для каждого состояния q регулярное выражение Ец представляет собой сумму всех символов алфавита Г, в которые не входит состояние q (q не стоит ни на первой, ни на последней позиции). В результате вычитания языка L(Eq*) из L3 получим цепочки, представляющие допускающее вычисление автомата А и проходящие через состояние q, по крайней мере, один раз. Если вычесть из L3 языки L{Eq) для всех q из Q, то получим допускающие вычисления автомата А, проходящие через все состояния. Обозначим этот язык L4. По теореме 4.10 язык L4 также регулярен.
Последний шаг состоит в построении языка L из Ь4 с помощью исключения компонентов состояний, т.е. L = h(L4). Теперь L является множеством цепочек в алфавите X*, допускаемых автоматом А, причем при их обработке автомат проходит через каждое состояние, по крайней мере, один раз. Поскольку регулярные языки замкнуты относительно гомоморфизмов, делаем вывод, что язык L регулярен. □
4.2.5. Упражнения к разделу 4.2
- Пусть h— гомоморфизм из алфавита {0, 1, 2} в алфавит {а, Ь}, определенный как k(0) = a, h(l) = ab и h(2) = ba\
а) (*) найдите h(0120);
б) найдите h(2\ 120);
в) (*) найдите h(L) для/, = 1(01*2);
г) найдите h(L) для Z, = Z,(0 + 12);
д) (*) найдите h~\L) для L= {ababa}, т.е. языка, состоящего из одной- единственной цепочки ababa;
е) (!) найдите /Г (L) для
- (*!) Если L — язык, а— символ, то L/a, частное L и а, — это множество цепочек
w, для которых wa принадлежит L. Например, если L = {a, aab, baa}, то Ыа = {е, Ьа}. Докажите, что из регулярности L следует регулярность L!a. Указание. Начните с ДКА для L и рассмотрите множество допускающих состояний.
- (!) Если L — язык, а — символ, то a\L — это множество цепочек w, для которых
aw принадлежит L. Например, если L = {a, aab, Ъаа}, то d\L = {е, ab}. Докажите, что из регулярности L следует регулярность d\L. Указание. Вспомните, что регулярные языки замкнуты относительно обращения и операции деления из упражнения 4.2.2.
- (!) Какие из следующих тождеств истинны?
а) (Ua)a = L (в левой части представлена конкатенация языков L/a и {а}).
б) a(a\L) = L (снова представлена конкатенация с языком {а}, но на этот раз слева).
в) (La)/a = L.
г) a\(aL) = L.
- Операция из упражнения 4.2.3 иногда рассматривается как «производная», а выра-
^ dL ^
жение a\L записывается как —. Эти производные применяются к регулярным
da
выражениям аналогично тому, как обычные производные применяются к арифметическим выражениям. Таким образом, если R — регулярное выражение, то
— обозначает то же, что и —, если L = L(R): da da
d(R + S) dR dS
а) докажите, что———— = — + — ;
da da da
б) (*!) напишите правило для «производной» от RS. Указание. Нужно рассмотреть два случая: язык L(R) включает или не включает цепочку е. Это правило не совпадает с «правилом произведения» для обычных производных, но похоже на него;
d( R*}
в) (!) найдите «производную» от итерации, т.е. ——— ;
da
г) используя формулы (а)-(в), найдите производную регулярного выражения (0 + 1)*011;
д) (*) опишите такие языки L, для которых — = 0 ;
d0
е) (*!) опишите такие языки L, для которых = L.
- (!) Докажите замкнутость регулярных языков относительно следующих операций:
а) min(L) = {w\w принадлежит L, но ни один собственный префикс цепочки w не принадлежит L};
б) max(L) = {w | w принадлежит L, но для любого хФ е цепочка wx не принадлежит /,};
в) init(L) = {w | для некоторого х цепочка wx принадлежит /.}.
Указание. Как и в упражнении 4.2.2, проще всего начать с ДКА для L и преобразовать его для получения нужного языка.
- (!) Если w = а,а2…ап и х = Ъ1Ъ2…Ь„ — цепочки одинаковой длины, то определим alt(w, х) как цепочку, в которой символы цепочек w и х чередуются, начиная с w, т.е. a,b,a2b..anb„. Если L и М— языки, определим alt{L, М) как множество цепочек вида alt{w, х), где w — произвольная цепочка из L, ах — любая цепочка из М такой же длины. Докажите, что из регулярности языков L и М следует регулярность языка alt(L, М).
- (*!!) Пусть L — язык. Определим halJ{L) как множество первых половин цепочек языка L, т.е. множество {w | существует х, для которой wx принадлежит L, причем |х| = Н}. Например, если L = {е, 0010, 011, 010110}, то halJ{L) = {е, 00, 010}. Заметим, что цепочки с нечетной длиной не влияют на halJ[L). Докажите, что если язык L регулярен, то halj{L) также регулярен.
- (!!) Упражнение 4.2.8 можно распространить на многие функции, определяющие длину части цепочки. Если / — функция, определенная на множестве целых чисел, то обозначим через J{L) множество цепочек {w | существует цепочка х, для которой |х| =.АМ) и wx принадлежит L). Например, операция half соответствует тождественной функции Дя) = п, так как для цепочек из языка half(L) выполняется |х| = |w|. Покажите, что если язык L регулярен, то язык^/(!) также регулярен,
‘ где/— одна из следующих функций:
- a) fin) = 2я (т.е. используются первые трети цепочек);
б) Лп)= и2 (длина выбираемой части цепочки равна квадратному корню длины оставшейся части цепочки);
в) Л’1)= 2″ (длина выбираемой части цепочки равна логарифму длины ее остатка).
- (!!) Пусть L— язык, не обязательно регулярный, в алфавите {0}, т.е. цепочки языка L состоят из одних нулей. Докажите, что язык L* регулярен. Указание. На первый взгляд эта теорема кажется абсурдной. Чтобы проиллюстрировать истинность утверждения теоремы, приведем один небольшой пример. Рассмотрим язык L = {0′ | i— простое число}, который, как известно, нерегулярен (см. пример 4.3). Нетрудно доказать, что если j > 2, то 0* принадлежит С. Поскольку числа 2 и 3 — простые, цепочки 00 и 000 принадлежат L. Если j — четное число, то О1 можно получить, повторив j!2 раз цепочку 00, а если j — нечетное, можно взять одну цепочку 000 и (j — 3)/2 цепочек 00. Следовательно, L = е + 000*.
- (!!) Докажите замкнутость регулярных языков относительно следующей операции: cycle(L) = {w | цепочку w можно представить в виде w = ху, где ух принадлежит L}. Например, если L = {01,011}, то cycle(L) = {01, 10, 011, 110, 101}. Указание. Начните с ДКА для языка L и постройте е-НКА для cycle(L).
- (!!) Пусть w, = a0a0ah a wt = для всех ;> 0. Например, w3 = а0а0аiagagaia2a0a0a,а0адаia2a3. Кратчайшим регулярным выражением для языка Ln = {w„}, т.е. языка, состоящего из цепочки w„, будет сама w„, причем длина этого выражения равна 2n+1 — 1. Однако, если применить операцию пересечения, то для языка L„ можно записать выражение длиной 0(п2). Найдите такое выражение. Указание. Найдите п языков с регулярными выражениями длины О(п), пересечение которых равно L„.
- Свойства замкнутости можно использовать для доказательства нерегулярности некоторых языков. Докажите, что язык
L0n,„={(f\tt\n>0}
нерегулярен. Докажите нерегулярность следующих языков, преобразовав их с помощью операций, сохраняющих регулярность, в язык L0„i„\
а) (*) {О’О11 /*/’};
б) {0nlm2″»m | и > m > 0}.
- В теореме 4.8 представлена «конструкция произведения», в которой по двум данным ДКА построен ДКА, допускающий пересечение языков данных автоматов:
а) покажите, как построить конструкцию произведения для НКА (без е-переходов);
б) (!) продемонстрируйте, как построить конструкцию произведения для е-НКА;
в) (*) покажите, как изменить конструкцию для произведения так, чтобы результирующий ДКА допускал разность языков двух данных ДКА;
г) измените конструкцию для произведения так, чтобы результирующий ДКА допускал объединение языков двух данных ДКА.
- В доказательстве теоремы 4.8 утверждалось, что с помощью индукции по длине цепочки w можно доказать следующее равенство:
<5 ((<7/., Ям), w) = (<5 ,(qL, w), 8 w)). Приведите это доказательство.
- Завершите доказательство теоремы 4.14, рассмотрев случаи, когда выражение Е является конкатенацией двух подвыражений или итерацией некоторого выражения.
- В теореме 4.16 пропущено доказательство индукцией по длине цепочки w того, что у (q,h w)= 8 (q,h h(w)). Восполните этот пробел.
4.3. Свойства разрешимости регулярных языков
В этом разделе мы сформируем важные вопросы, связанные с регулярными языками. Сначала нужно разобраться, что значит задать вопрос о некотором языке. Типичный язык бесконечен, поэтому бессмысленно предъявлять кому-нибудь цепочки этого языка и задавать вопрос, требующий проверки бесконечного множества цепочек. Гораздо разумнее использовать одно из конечных представлений языка, а именно: ДКА, НКА, е- НКА или регулярное выражение.
Очевидно, что представленные таким образом языки будут регулярными. В действительности не существует способа представления абсолютно произвольных языков. В следующих главах предлагаются конечные методы описания более широких классов, чем класс регулярных языков, и можно будет рассматривать вопросы о языках из них. Однако алгоритмы разрешения многих вопросов о языках существуют только для класса регулярных языков. Эти же вопросы становятся «неразрешимыми» (не существует алгоритмов ответов на эти вопросы), если они поставлены с помощью более «выразительных» обозначений (используемых для выражения более широкого множества языков), чем представления, разработанные для регулярных языков.
Начнем изучение алгоритмов для вопросов о регулярных языках, рассмотрев способы, которыми одно представление языка преобразуется в другое. В частности, рассмотрим временную сложность алгоритмов, выполняющих преобразования. Затем рассмотрим три основных вопроса о языках.
- Является ли описываемый язык пустым множеством?
- Принадлежит ли некоторая цепочка w представленному языку?
- Действительно ли два разных описания представляют один и тот же язык? (Этот вопрос часто называют «эквивалентностью» языков.)
4.3.1. Преобразования различных представлений языков
Из главы 3 известно, что каждое из четырех представлений регулярных языков можно преобразовать в любое из остальных трех. На рис. 3.1 представлены переходы от одного представления к другому. Хотя существуют алгоритмы для любого из этих преобразований, иногда нас интересует не только осуществимость некоторого преобразования, но и время, необходимое для его выполнения. В частности, важно отличать алгоритмы, которые занимают экспоненциальное время (время как функция от размера входных данных) и, следовательно, могут быть выполнены только для входных данных сравнительно небольших размеров, от тех алгоритмов, время выполнения которых является линейной, квадратичной или полиномиальной с малой степенью функцией от размера входных данных. Последние алгоритмы «реалистичны», так как их можно выполнить для гораздо более широкого класса экземпляров задачи. Рассмотрим временную сложность каждого из обсуждавшихся преобразований.
Преобразование НКА в ДКА
Время выполнения преобразования НКА или е-НКА в ДКА может быть экспоненциальной функцией от количества состояний НКА. Начнем с того, что вычисление е- замыкания п состояний занимает время 0(п3). Необходимо найти все дуги с меткой е, ведущие от каждого из п состояний. Если есть п состояний, то может быть не более и2 дуг. Разумное использование системных ресурсов и хорошо спроектированные структуры данных гарантируют, что время исследования каждого состояния не превысит 0{п2). В действительности для однократного вычисления всего е-замыкания можно использовать такой алгоритм транзитивного замыкания, как алгоритм Уоршалла (Warshall)[4].
После вычисления е-замыкания можно перейти к синтезу ДКА с помощью конструкции подмножеств. Основное влияние на расход времени оказывает количество состояний ДКА, которое может равняться 2″. Для каждого состояния можно вычислить переходы за время (){п ), используя е-замыкание и таблицу переходов НКА для каждого входного символа. Предположим, нужно вычислить 5{{qh q2, …, q^}, а) для ДКА. Из каждого состояния <7, можно достичь не более п состояний вдоль путей с меткой е, и каждое из этих состояний может иметь не более, чем п дуг с меткой а. Создав массив, проиндексированный состояниями, можно вычислить объединение не более п множеств, состоящих из не более, чем п состояний, за время, пропорциональное и2.
Таким способом для каждого состояния q, можно вычислить множество состояний, достижимых из q, вдоль пути с меткой а (возможно, включая дуги, отмеченные е). Поскольку к < п, то существует не более п таких состояний q„ и для каждого из них вычисление достижимых состояний занимает время 0(п2). Таким образом, общее время вычисления достижимых состояний равно 0{пъ). Для объединения множеств достижимых состояний потребуется только 0(п2) дополнительного времени, следовательно, вычисление одного перехода ДКА занимает время 0(п).
Заметим, что количество входных символов считается постоянным и не зависит от п. Таким образом, как в этой, так и в других оценках времени работы количество входных символов не рассматривается. Размер входного алфавита влияет только на постоянный коэффициент, скрытый в обозначении «О большого».
Итак, время преобразования НКА в ДКА, включая ситуацию, когда НКА содержит е- переходы, равно 0(п32″). Конечно, на практике обычно число состояний, которые строятся, намного меньше 2П. Иногда их всего лишь п. Поэтому можно установить оценку времени работы равной 0(n3s), где .v — это число состояний, которые в действительности есть у ДКА.
Преобразование ДКА в НКА
Это простое преобразование, занимающее время 0(п) для ДКА с п состояниями. Все, что необходимо сделать, — изменить таблицу переходов для ДКА, заключив в скобки {} состояния, а также добавить столбец для е, если нужно получить е-НКА. Поскольку число входных символов (т.е. ширина таблицы переходов) считается постоянным, копирование и обработка таблицы занимает время О(п).
Преобразование автомата в регулярное выражение
Рассмотрев конструкцию из раздела 3.2.1, заметим, что на каждом из п этапов (где п — число состояний ДКА) размер конструируемого регулярного выражения может увеличиться в четыре раза, так как каждое выражение строится из четырех выражений предыдущего цикла. Таким образом, простая запись и3 выражений может занять время 0(п34″). Улучшенная конструкция из раздела 3.2.2 уменьшает постоянный коэффициент, но не влияет на экспоненциальность этой задачи (в наихудшем случае).
Аналогичная конструкция требует такого же времени работы, если преобразуется НКА, или даже е-НКА, но это здесь не доказывается. Однако использование конструкции для НКА имеет большое значение. Если сначала преобразовать НКА в ДКА, а затем ДКА — в регулярное выражение, то на это потребуется время 0(п34″32«), которое является дважды экспоненциальным.
Преобразование регулярного выражения в автомат
Для преобразования регулярного выражения в е-НКА потребуется линейное время. Необходимо эффективно проанализировать регулярное выражение, используя метод, занимающий время 0(п) для регулярного выражения длины и[5]. В результате получим дерево с одним узлом для каждого символа регулярного выражения (хотя скобки в этом дереве не встречаются, поскольку они только управляют разбором выражения).
Полученное дерево заданного регулярного выражения можно обработать, конструируя е-НКА для каждого узла. Правила преобразования регулярного выражения, представленные в разделе 3.2.3, никогда не добавляют более двух состояний и четырех дуг для каждого узла дерева выражения. Следовательно, как число состояний, так и число дуг результирующего е-НКА равны 0(п). Кроме того, работа по созданию этих элементов в каждом узле дерева анализа является постоянной при условии, что функция, обрабатывающая каждое поддерево, возвращает указатели в начальное и допускающие состояния этого автомата.
Приходим к выводу, что построение е-НКА по регулярному выражению занимает время, линейно зависящее от размера выражения. Можно исключить е-переходы из е- НКА с п состояниями, преобразовав его в обычный НКА за время 0(п3) и не увеличив числа состояний. Однако преобразование в ДКА может занять экспоненциальное время.
4.3.2. Проверка пустоты регулярных языков
На первый взгляд ответ на вопрос «является ли регулярный язык L пустым?» кажется очевидным: язык 0 пуст, а все остальные регулярные языки — нет. Однако, как говорилось в начале раздела 4.3, при постановке задачи явный перечень цепочек языка L не приводится. Обычно задается некоторое представление языка L, и нужно решить, обозначает ли оно язык 0, или нет.
Если язык задан с помощью конечного автомата любого вида, то вопрос пустоты состоит в том, есть ли какие-нибудь пути из начального состояния в допускающие. Если есть, то язык непуст, а если все допускающие состояния изолированы от начального, то язык пуст. Ответ на вопрос, можно ли перейти в допускающее состояние из начального, является простым примером достижимости в графах, подобным вычислению е- замыкания, рассмотренному в разделе 2.5.3. Искомый алгоритм можно сформулировать следующим рекурсивным образом.
Базис. Начальное состояние всегда достижимо из начального состояния.
Индукция. Если состояние q достижимо из начального, и есть дуга из q в состояние р с любой меткой (входным символом или е, если рассматривается е-НКА), то р также достижимо.
Таким способом можно вычислить все множество достижимых состояний. Если среди них есть допускающее состояние, то ответом на поставленный вопрос будет «нет» (язык данного автомата не пуст), в противном случае ответом будет «да» (язык пуст). Заметим, что если автомат имеет п состояний, то вычисление множества достижимых состояний занимает время не более 0(п2) (практически это время пропорционально числу дуг на диаграмме переходов автомата, которое может быть и меньше п2).
Если язык L представлен регулярным выражением, а не автоматом, то можно преобразовать это выражение в е-НКА, а далее продолжить так, как описано выше. Поскольку автомат, полученный в результате преобразования регулярного выражения длины п, содержит не более 0{п) состояний и переходов, для выполнения алгоритма потребуется время 0(п).
Можно проверить само выражение — пустое оно, или нет. Сначала заметим, что если в данном выражении ни разу не встречается 0, то его язык гарантированно не пуст. Если же в выражении встречается 0, то язык такого выражения не обязательно пустой. Используя следующие рекурсивные правила, можно определить, представляет ли заданное регулярное выражение пустой язык.
Базис. 0 обозначает пустой язык, но е и а для любого входного символа а обозначают не пустой язык.
Индукция. Пусть R — регулярное выражение. Нужно рассмотреть четыре варианта, соответствующие возможным способам построения этого выражения.
- R = Rt + R2. L(R) пуст тогда и только тогда, когда оба языка L(Rf) и L(R2) пусты.
- R = RiR2. L{R) пуст тогда и только тогда, когда хотя бы один из языков L{Ri) и L{R2) пуст.
- R = R, . L(R) не пуст: он содержит цепочку е.
- R = (R/). ЦЯ) пуст тогда и только тогда, кода L(R,) пуст, так как эти языки равны.
4.3.3. Проверка принадлежности регулярному языку
Следующий важный вопрос состоит в том, принадлежит ли данная цепочка w данному регулярному языку L. В то время, как цепочка w задается явно, язык L представляется с помощью автомата или регулярного выражения.
Если язык L задан с помощью ДКА, то алгоритм решения данной задачи очень прост. Имитируем ДКА, обрабатывающий цепочку входных символов w, начиная со стартового состояния. Если ДКА заканчивает в допускающем состоянии, то цепочка w принадлежит этому языку, в противном случае— нет. Этот алгоритм является предельно быстрым. Если Н = п и ДКА представлен с помощью подходящей структуры данных, например, двухмерного массива (таблицы переходов), то каждый переход требует постоянного времени, а вся проверка занимает время 0(п).
Если L представлен способом, отличным от ДКА, то преобразуем это представление в ДКА и применим описанную выше проверку. Такой подход может занять время, экспоненциально зависящее от размера данного представления и линейное относительно |w|. Однако, если язык задан с помощью НКА или е-НКА, то намного проще и эффективнее непосредственно проимитировать этот НКА. Символы цепочки w обрабатываются по одному, и запоминается множество состояний, в которые НКА может попасть после прохождения любого пути, помеченного префиксом цепочки w. Идея такой имитации была представлена на рис. 2.10.
Если длина цепочки w равна п, а количество состояний НКА равно s, то время работы этого алгоритма равно 0(ns2). Чтобы обработать очередной входной символ, необходимо взять предыдущее множество состояний, число которых не больше s, и для каждого из них найти следующее состояние. Затем объединяем не более s множеств, состоящих из не более, чем s состояний, для чего нужно время 0{s2).
Если заданный НКА содержит е-переходы, то перед тем, как начать имитацию, необходимо вычислить е-замыкание. Такая обработка очередного входного символа а состоит из двух стадий, каждая из которых занимает время 0(s2). Сначала для предыдущего множества состояний находим последующие состояния при входе а. Далее вычисляем е- замыкание полученного множества состояний. Начальным множеством состояний для такого моделирования будет е-замыкание начального состояния НКА.
И наконец, если язык L представлен регулярным выражением, длина которого s, то за время 0(s) можно преобразовать это выражение в е-НКА с числом состояний не больше 2s. Выполняем описанную выше имитацию, что требует 0(ns2) времени для входной цепочки w длиной п.
4.3.4. Упражнения к разделу 4.3
- (*) Приведите алгоритм определения, является ли регулярный язык L бесконечным. Указание. Используйте лемму о накачке для доказательства того, что если язык содержит какую-нибудь цепочку, длина которой превышает определенную нижнюю границу, то этот язык должен быть бесконечным.
- Приведите алгоритм определения, содержит ли регулярный язык L по меньшей мере 100 цепочек.
- Пусть L — регулярный язык в алфавите Z. Приведите алгоритм проверки равенства L = Z*, т.е. содержит ли язык L все цепочки в алфавите Z.
- Приведите алгоритм определения, содержат ли регулярные языки /./ и L2 хотя бы одну общую цепочку.
- Пусть Lt и L2 — два регулярных языка с одним и тем же алфавитом Z. Приведите алгоритм определения, существует ли цепочка из X*, которая не принадлежит ни I/, ни L2.
4.4. Эквивалентность и минимизация автоматов
В отличие от предыдущих вопросов — пустоты и принадлежности, алгоритмы решения которых были достаточно простыми, вопрос о том, определяют ли два представления двух регулярных языков один и тот же язык, требует значительно больших интеллектуальных усилий. В этом разделе мы обсудим, как проверить, являются ли два описания регулярных языков эквивалентными в том смысле, что они задают один и тот же язык. Важным следствием этой проверки является возможность минимизации ДКА, т.е. для любого ДКА можно найти эквивалентный ему ДКА с минимальным количеством состояний. По существу, такой ДКА один: если даны два эквивалентных ДКА с минимальным числом состояний, то всегда можно переименовать состояния так, что эти ДКА станут одинаковыми.
4.4.1. Проверка эквивалентности состояний
Начнем с вопроса об эквивалентности состояний одного ДКА. Наша цель — понять, когда два различных состояния р и q можно заменить одним, работающим одновременно как р и q. Будем говорить, что состояния р и q эквивалентны, если
- для всех входных цепочек w состояние 8 (р, и>) является допускающим тогда и только тогда, когда состояние 5 (q, w) — допускающее.
Менее формально, эквивалентные состояния puq невозможно различить, если просто проверить, допускает ли автомат данную входную цепочку, начиная работу в одном (неизвестно, каком именно) из этих состояний. Заметим, что состояния 8 (p,w) и 8 (q, vt>) могут и не совпадать — лишь бы оба они были либо допускающими, либо недопускающими.
Если два состояния р и q не эквивалентны друг другу, то будем говорить, что они различимы, т.е. существует хотя бы одна цепочка w, для которой одно из состояний 8 (р, w) и 8 (q, w) является допускающим, а другое — нет.
Пример 4.18. Рассмотрим ДКА на рис. 4.8. Функцию переходов этого автомата обозначим через 8. Очевидно, что некоторые пары состояний не эквивалентны, например С и G, потому что первое из них допускающее, а второе — нет. Пустая цепочка различает эти состояния, так как 8 (С, е) — допускающее состояние, а 8 (G, е) — нет.
о
Рис. 4.8. Автомат с эквивалентными состояниями 172 ГЛАВА 4. СВОЙСТВА РЕГУЛЯРНЫХ ЯЗЫКОВ |
Рассмотрим состояния А и G. Различить их с помощью цепочки £ невозможно, так как оба они недопускающие. О также не различает их, поскольку по входу 0 автомат переходит в состояния В и G, соответственно, а оба эти состояния недопускающие. Однако цепочка 01 различает А и G, так как 8 (А, 01) = С, 8 (G, 01) = £, состояние С— допускающее, а Е— нет. Для доказательства неэквивалентности А и G достаточно любой входной цепочки, переводящей автомат из состояний А и G в состояния, одно из которых является допускающим, а второе — нет.
Рассмотрим состояния А и Е. Ни одно из них не является допускающим, так что цепочка е не различает их. По входу 1 автомат переходит и из А, и из £ в состояние F. Таким образом, ни одна входная цепочка, начинающаяся с 1, не может различить их, поскольку 5 (А, 1х) = 5 (Е, 1х) для любой цепочки х.
Рассмотрим поведение в состояниях А и Е на входах, которые начинаются с 0. Из состояний А и £ автомат переходит в В и Я, соответственно. Так как оба эти состояния недопускающие, сама по себе цепочка 0 не отличает А от £. Однако состояния В и Яне помогут: по входу 1 оба эти состояния переходят в С, а по входу 0 — в G. Значит, ни одна входная цепочка, начинающаяся с 0, не может различить состояния А и £. Следовательно, ни одна входная цепочка не различает состояния А и £, т.е. они эквивалентны. □
Для того чтобы найти эквивалентные состояния, нужно выявить все пары различимых состояний. Как ни странно, но если найти все пары состояний, различимых в соответствии с представленным ниже алгоритмом, то те пары состояний, которые найти не удастся, будут эквивалентными. Алгоритм, который называется алгоритмом заполнения таблицы, состоит в рекурсивном обнаружении пар различимых состояний ДКА А = (в, Ъ,8,9о, F)-
Базис. Если состояние р — допускающее, a q — не допускающее, то пара состояний {р, q} различима.
Индукция. Пусть р и q — состояния, для которых существует входной символ а, приводящий их в различимые состояния г = 8(р, а) и s = S(q, а). Тогда {р, q} — пара различимых состояний. Это правило очевидно, потому что должна существовать цепочка w, отличающая г от s, т.е. только одно из состояний 8 (г, w) и 8 (s, и>) является допускающим. Тогда цепочка aw отличает р от q, так как 8 (р, aw) и 8 (q, aw) — это та же пара состояний, что и 8 (г, w) и 8 (s, и>).
Пример 4.19. Выполним алгоритм заполнения таблицы для ДКА, представленного на рис. 4.8. Окончательный вариант таблицы изображен на рис. 4.9, где х обозначает пары различимых состояний, а пустые ячейки указывают пары эквивалентных состояний. Сначала в таблице нет ни одного х.
В базисном случае, поскольку С— единственное допускающее состояние, записываем х в каждую пару состояний, в которую входит С. Зная некоторые пары различимых состояний, можно найти другие. Например, поскольку пара {С, Я} различима, а состояния £ и F по входу 0 переходят в Я и С, соответственно, то пара {Е, F} также различима. Фактически, все х на рис. 4.9, за исключением пары {A, G}, получаются очень просто: посмотрев на переходы из каждой пары состояний по символам 0 или 1, обнаружим (для одного из этих символов), что одно состояние переходит в С, а другое — нет. Различимость пары состояний {A, G} видна в следующем цикле, поскольку по символу 1 они переходят в F и Е, соответственно, а различимость состояний {Е, F} уже установлена.
в х
С х х
D ххх Е ххх
р х х х х
д х х х х х х
f] X X X X X X
А В С D Е F G Рис. 4.9. Таблица неэквивалентности состояний
Однако обнаружить другие пары различимых состояний невозможно. Следовательно, оставшиеся три пары состояний {А, £}, {В, Я} и {Д F} эквивалентны. Выясним, почему нельзя утверждать, что пара состояний {А, £} различима. По входному символу 0 состояния А и £ переходят в В и Я, соответственно, а про эту пару пока неизвестно, различима она, или нет. По символу 1 оба состояния А и £ переходят в F, так что нет никакой надежды различить их этим способом. Остальные две пары, {В, Я} и {Д F}, различить нельзя, поскольку у них одинаковые переходы как по символу 0, так и по 1. Таким образом, алгоритм заполнения таблицы останавливается на таблице, представленной на рис. 4.9, и корректно определяет эквивалентные и различимые состояния. □
Теорема 4.20. Если два состояния не различаются с помощью алгоритма заполнения таблицы, то они эквивалентны.
Доказательство. Снова рассмотрим ДКА А = (Q, <5, q0, F). Предположим, что утверждение теоремы неверно, т.е. существует хотя бы одна пара состояний {р, q), для которой выполняются следующие условия.
- Состояния р и q различимы, т.е. существует некоторая цепочка w, для которой только одно из состояний 8 (p,w) и 8 (q,w) является допускающим.
- Алгоритм заполнения таблицы не может обнаружить, что состоянияр и q различимы. Назовем такую пару состояний плохой парой.
Если существуют плохие пары, то среди них должны быть такие, которые различимы с помощью кратчайших из всех цепочек, различающих плохие пары. Пусть пара
I
I
[p, q\ — плохая, a w = aja2. ,.a„ — кратчайшая из всех цепочек, различающих р и q. Тогда только одно из состояний 8 (p,w) и 8 (q, и>) является допускающим.
Заметим, что цепочка w не может быть е, так как, если некоторая пара состояний различается с помощью е, то ее можно обнаружить, выполнив базисную часть алгоритма заполнения таблицы. Следовательно, п > 1.
Рассмотрим состояния г = 8(р, aj)\is = 8(q, а,). Эти состояния можно различить с помощью цепочки а2а3…а„, поскольку она переводит г и s в состояния 8 {р, w) и 8 (q, w). Однако цепочка, отличающая г от s, короче любой цепочки, различающей плохую пару. Следовательно, {г, 5} не может быть плохой парой, и алгоритм заполнения таблицы должен был обнаружить, что эти состояния различимы.
Но индуктивная часть алгоритма заполнения таблицы не остановится, пока не придет к выводу, что состояния р и q также различимы, поскольку уже обнаружено, что состояние 8(р, а{) = г отличается от 8(q, aj) = s. Получено противоречие с предположением о том, что существуют плохие пары состояний. Но если плохих пар нет, то любую пару различимых состояний можно обнаружить с помощью алгоритма заполнения таблицы, и теорема доказана. □
4.4.2. Проверка эквивалентности регулярных языков
Эквивалентность регулярных языков легко проверяется с помощью алгоритма заполнения таблицы. Предположим, что языки ЬиМ представлены, например, один — регулярным выражением, а второй— некоторым НКА. Преобразуем каждое из этих представлений в ДКА. Теперь представим себе ДКА, состояния которого равны объединению состояний автоматов для языков L и М. Технически этот ДКА содержит два начальных состояния, но фактически при проверке эквивалентности начальное стетояние не играет никакой роли, поэтому любое из этих двух состояний можно принять за единственное начальное.
Далее проверяем эквивалентность начальных состояний двух заданных ДКА, используя алгоритм заполнения таблицы. Если они эквивалентны, то L = М, а если нет, то ЬФМ.
Пример 4.21. Рассмотрим два ДКА (рис. 4.10). Каждый ДКА допускает пустую цепочку и все цепочки, которые заканчиваются символом 0, т.е. язык регулярного выражения е+(0 + 1)*0. Можно представить, что на рис. 4.10 изображен один ДКА, содержащий пять состояний от А до Е. Если применить алгоритм заполнения таблицы к этому автомату, то в результате получим таблицу, представленную на рис. 4.11.
Чтобы заполнить эту таблицу, начнем с размещения х в ячейках, соответствующих тем парам состояний, из которых только одно является допускающим. Оказывается, что больше делать ничего не нужно. Остальные четыре пары {А, С}, {A, D}, {С, D} и {В, Е) являются парами эквивалентных состояний. Необходимо убедиться, что в индуктивной части алгоритма заполнения таблицы различимые состояния не обнаружены. Например, с помощью такой таблицы (см. рис. 4.11) нельзя различить пару {A, D}, так как по символу 0 эти состояния переходят сами в себя, а по 1 — в пару состояний {В, Е}, которая
осталась неразличимой. Поскольку в результате проверки установлено, что состояния А и С эквиваленты и являются начальными у двух заданных автоматов, делаем вывод, что эти ДКА действительно допускают один и тот же язык. □
Рис. 4.10. Два эквивалентных ДКА |
о 1
В х С х
D х
Е х хх
А В С D
Рис. 4.11. Таблица различимости для автоматов, представленных на рис. 4.10
Время заполнения таблицы, а значит и время проверки эквивалентности двух состояний, полиномиально относительно числа состояний. Если число состояний равно п, то количество пар состояний равно Ц), или п(п- 1)/2. За один цикл рассматриваются все пары состояний, чтобы определить, является ли одна из пар состояний-преемников различимой. Значит, один цикл занимает время не больше 0(п2). Кроме того, если в некотором цикле не обнаружены новые пары различимых состояний, то алгоритм заканчивается. Следовательно, количество циклов не превышает 0{п2), а верхняя граница времени заполнения таблицы равна О(п).
Однако с помощью более аккуратно построенного алгоритма можно заполнить таблицу за время 0{п2). С этой целью для каждой пары состояний {г, 5} необходимо составить список пар состояний {р, q}, «зависящих» от {г, 5}, т.е., если пара {г, 5} различима, то {р, q\ также различима. Вначале такие списки создаются путем рассмотрения каждой
пары состояний {p,q}, и для каждого входного символа а (а их число фиксировано) пара {р, q} вносится в список для пары состояний-преемников {S(p, a), 5(q, а)}.
Если обнаруживается, что пара {г, 5} различима, то в списке этой пары каждая пока неразличимая пара отмечается как различимая и помещается в очередь пар, списки которых нужно проверить аналогичным образом.
Общее время работы этого алгоритма пропорционально сумме длин списков, так как каждый раз либо что-то добавляется в списки (инициализация), либо в первый и последний раз проверяется наличие некоторой пары в списке (когда проходим по списку пары, признанной различимой). Так как размер входного алфавита считается постоянным, то каждая пара состояний попадает в 0(1) списков. Поскольку всего пар 0(п2). суммарное время также 0(п2).
4.4.3. Минимизация ДКА
Еще одним важным следствием проверки эквивалентности состояний является возможность «минимизации» ДКА. Это значит, что для каждого ДКА можно найти эквивалентный ему ДКА с наименьшим числом состояний. Более того, для данного языка существует единственный минимальный ДКА (с точностью до выбираемого нами обозначения состояний).
Основная идея минимизации ДКА состоит в том, что понятие эквивалентности состояний позволяет объединять состояния в блоки следующим образом.
- Все состояния в блоке эквиваленты.
- Любые два состояния, выбранные из разных блоков, неэквивалентны.
Пример 4.22. Рассмотрим рис. 4.9, на котором представлены эквивалентность и различимость для состояний, изображенных на рис. 4.8. Эти состояния разбиваются на эквивалентные блоки следующим образом: ({А, £}, {В, Н}, {С}, {D, F}, {G}). Заметим, что каждая пара эквивалентных состояний помещена в отдельный блок, а состояния, отличимые от всех остальных, образуют отдельные блоки.
Для автомата, представленного на рис. 4.10, разбиение на блоки имеет вид ({А, С, D}, {В, £}). Этот пример показывает, что в блоке может быть более двух состояний. Может показаться случайностью, что состояния А, С и D помещены в один блок потому, что каждые два из них эквивалентны и ни одно из этих состояний не эквивалентно еще какому-нибудь состоянию, кроме этих. Однако следующая теорема утверждает, что такая ситуация следует из определения эквивалентности состояний. □
Теорема 4.23. Эквивалентность состояний транзитивна, т.е., если для некоторого ДКА А = (Q, Е, 5, q0, F) состояние р эквивалентно q, a q — г, то состояния риг также эквивалентны.
Доказательство. Естественно ожидать, что любое отношение, называемое «эквивалентностью», обладает свойством транзитивности. Однако, просто назвав какое-то отношение «эквивалентностью», нельзя гарантировать, что оно транзитивно — это нужно доказать.
Предположим, что {р, q} и {q, г} — пары эквивалентных состояний, а пара {р, г} — различима. Тогда должна существовать такая цепочка w, для которой только одно из состояний 8 (p,w) и 8 {г, и>) является допускающим. Используя симметрию, предположим, что 8 (p,w) — допускающее.
Теперь посмотрим, будет ли состояние 8 (q, w) допускающим. Если оно допускающее, то пара {q, г} различима, так как состояние 8 (q, w) —допускающее, а 8 (г, vi>) — нет. Если 8 (q, w) не допускающее, то по аналогичным причинам пара {р, q} различима. Полученное противоречие доказывает неразличимость пары {р, г}, т.е. состояния риг эквивалентны. □
Теорему 4.23 можно использовать для обоснования очевидного алгоритма разбиения состояний. Для каждого состояния q строится блок, состоящий из q и всех эквивалентных ему состояний. Необходимо доказать, что результирующие блоки образуют разбиение множества состояний, т.е. ни одно состояние не принадлежит двум разным блокам.
Сначала заметим, что состояния внутри каждого блока взаимно эквивалентны, т.е., если риг принадлежат блоку состояний, эквивалентных q, то согласно теореме 4.23 они эквивалентны.
Предположим, что существуют два пересекающихся, но не совпадающих блока, т.е. существует блок В, содержащий состояния р и q, и блок С, который содержит р, но не q. Поскольку состояния р и q принадлежат одному блоку, то они эквивалентны. Рассмотрим возможные варианты построения блока С. Если этот блок образован состоянием р, то q было бы в блоке С, так как эти состояния эквивалентны. Следовательно, существует некоторое третье состояние s, порождающее блок С, т.е. С — это множество состояний, эквивалентных s.
Состояния р и s эквивалентны, так как оба принадлежат С. Также р эквивалентно q, потому что оба эти состояния принадлежат В. Согласно свойству транзитивности, доказанному в теореме 4.23, состояние q эквивалентно s. Но тогда q принадлежит блоку С, что противоречит предположению о существовании пересекающихся, но не совпадающих блоков. Итак, эквивалентность состояний задает их разбиение, т.е. любые два состояния имеют или совпадающие, или не пересекающиеся множества эквивалентных им состояний. Следующая теорема подытоживает результаты проведенного анализа.
Теорема 4.24. Если для каждого состояния q некоторого ДКА создать блок, состоящий из q и эквивалентных ему состояний, то различные блоки состояний образуют разбиение множества состояний.[6] Это значит, что каждое состояние может принадлежать только одному блоку. Состояния из одного блока эквивалентны, а любые состояния, выбранные из разных блоков, не эквивалентны. □
Теперь можно кратко сформулировать алгоритм минимизации ДКА А = (Q, Е, 8, q0, F).
- Для выявления всех пар эквивалентных состояний применяем алгоритм заполнения таблицы.
- Разбиваем множество состояний Q на блоки взаимно эквивалентных состояний с помощью описанного выше метода.
- Строим ДКА В с минимальным числом состояний, используя в качестве его состояний полученные блоки. Пусть у— функция переходов автомата В. Предположим, что S — множество эквивалентных состояний автомата А, а — входной символ. Тогда должен существовать один блок состояний Т, содержащий y(q, а) для всех состояний q из S. Если это не так, то входной символ а переводит два состояния р и q из 5 в состояния, принадлежащие разным блокам согласно теореме 4.24. Из этого можно сделать вывод, что состояния р и q не были эквивалентными и не могли вместе принадлежать S. В результате определяется функция переходов ){S, а) = Т. Кроме того:
а) начальным состоянием ДКА В является блок, содержащий начальное состояние автомата А;
б) множеством допускающих состояний автомата В является множество блоков, содержащих допускающие состояния ДКА А. Заметим, что если одно состояние в блоке является допускающим, то все остальные состояния этого блока также должны быть допускающими. Причина в том, что любое допускающее состояние отличимо от любого недопускающего, поэтому допускающее и недопускающее состояния не могут принадлежать одному блоку эквивалентных состояний.
Пример 4.25. Минимизируем ДКА, представленный на рис. 4.8. В примере 4.22 установлены блоки разбиения состояний. На рис. 4.12 изображен ДКА с минимальным числом состояний. Пять состояний этого автомата соответствуют пяти блокам эквивалентных состояний автомата на рис. 4.8.
Начальным состоянием минимизированного автомата является {А, £}, так как А было начальным на рис. 4.8. Единственным допускающим — {С}, поскольку С—■ это единственное допускающее состояние на рис. 4.8. Заметим, что переходы на рис. 4.12 правильно отражают переходы на рис. 4.8. Например, на рис. 4.12 есть переход из {А,Е} в {В, Н} по символу 0. Это очевидно, так как А на рис. 4.8 переходит в В при чтении 0, а Е— в Я. Аналогично, при чтении 1 {А, £} переходит в {D, F}. По рис. 4.8 легко увидеть, что оба состояния А и Е переходят в F по 1, так что для {А, Е} состояние-преемник по 1 также выбрано правильно. Тот факт, что ни А, ни £ не переходят в D по 1, неважен. Читатель может проверить, что и все остальные переходы изображены правильно. □
Рис. 4.12. ДКА с минимальным числом состояний, эквивалентный автомату, изображенному на рис. 4.8 |
4.4.4. Почему минимизированный ДКА невозможно улучшить
Предположим, что задан ДКА А, и мы минимизируем его до ДКА М с помощью метода разбиения из теоремы 4.24. Эта теорема показывает, что невозможно получить эквивалентный ДКА, группируя состояния автомата А в еще меньшее число групп. Но все же, может ли существовать другой ДКА N, не связанный с А, который допускал бы тот же язык, что и автоматы А и М, но имел бы состояний меньше, чем автомат Ml Методом от противного докажем, что такого автомата не существует.
Сначала применим алгоритм различимости состояний из раздела 4.4.1 к состояниям автоматов М и N так, как если бы это был один автомат. Можно предположить, что общих обозначений состояний у М к N нет, так что функция переходов комбинированного автомата будет объединением функций переходов автоматов М и N, которые между собой не пересекаются. Состояния комбинированного ДКА будут допускающими тогда и только тогда, когда они являются допускающими в соответствующих им автоматах.
Начальные состояния автоматов М я N неразличимы, так как L(M) = L{N). Далее, если состояния {р, q} неразличимы, то для любого входного символа их преемники также неразличимы. Если бы преемников можно было различить, то р и q также можно было различить.
Минимизация состояний НКА
Может показаться, что метод разбиения состояний, минимизирующий ДКА, применим и для построения НКА с минимальным числом состояний, эквивалентного данному НКА или ДКА. Хотя методом полного перебора можно найти НКА с наименьшим количеством состояний, допускающий данный язык, просто сгруппировать состояния некоторого заданного НКА для этого языка нельзя.
Пример приведен на рис. 4.13. Никакие из трех состояний не являются эквивалентными. Очевидно, что допускающее состояние В отличается от не допускающих состояний А и С. Состояния А и С различаются входным символом 0. С переходит в {А} (недопускающее), тогда как А переходит в {А, В), которое включает допускающее состояние. Таким образом, группирование состояний не уменьшает количества состояний на рис. 4.13. Однако можно построить меньший НКА для этого же языка, просто удалив состояние С. Заметим, что А и В (без С) допускают все цепочки, которые заканчиваются нулем, а добавление С не позволяет допускать другие цепочки.
0,1
Начало |
Рис. 4.13. НКА, который невозможно минимизировать с помощью эквивалентности состояний
Ни М, ни N не могут иметь недостижимых состояний, иначе, исключив это состояние, можно было бы получить еще меньший ДКА для того же языка. Следовательно, каждое состояние автомата М неотличимо хотя бы от одного состояния автомата N. Выясним, почему это так. Пусть р— состояние автомата М. Тогда существует цепочка а,а2. ,.аь переводящая М из начального состояния в р. Эта цепочка также переводит N из начального в некоторое состояние q. Из того, что начальные состояния этих автоматов неразличимы, следует, что состояния-преемники, соответствующие входному символу ah также неразличимы. Состояния, следующие за этими состояниями при чтении а2, также будут неразличимыми, и так далее, пока мы не придем к заключению, что состояния р и q неразличимы.
Поскольку автомат N содержит меньше состояний, чем М, то должны существовать два состояния автомата М, которые неотличимы от одного и того же состояния автомата N. Значит, эти состояния неразличимы. Но автомат М построен таким образом, что все его состояния отличимы друг от друга. Противоречие. Следовательно, предположение о существовании N неверно, и М действительно является ДКА с наименьшим количеством состояний среди всех ДКА, эквивалентных А. Формально доказана следующая теорема.
Теорема 4.26. Если из некоторого ДКА А с помощью алгоритма, описанного в теореме 4.24, построен ДКА М, то М имеет наименьшее число состояний из всех ДКА, эквивалентных/1. □
Можно сформулировать более сильное утверждение, чем теорема 4.26. Между состояниями любого минимального ДКА N и состояниями ДКА М должно существовать взаимно однозначное соответствие. Как уже доказано, каждое состояние М эквивалентно одному состоянию N, и ни одно состояние М не может быть эквивалентным двум состояниям N. Аналогично можно доказать, что ни одно состояние N не может быть эквивалентным двум состояниям М, хотя каждое состояние автомата ./V должно быть эквивалентно одному из состояний ДКА Л/. Следовательно, существует только один ДКА с минимальным количеством состояний, эквивалентный А (с точностью до обозначений состояний).
4.4.5. Упражнения к разделу 4.4
4.4.1. (*) На рис. 4.14 представлена таблица переходов некоторого ДКА:
а) составьте таблицу различимости для этого автомата;
б) постройте эквивалентный ДКА с минимальным числом состояний.
0 | 1 | |
->А | В | А |
В | А | С |
С | D | Е |
*D | D | А |
Е | D | F |
F | G | Е |
G | F | G |
Н | G | D |
Рис. 4.14. ДКА, который нужно минимизировать Выполните упражнение 4.4.1 для ДКА, представленного на рис. 4.15. |
0 | 1 | |
->А | В | Е |
В | С | F |
*С | D | Н |
D | Е | Н |
Е | F | I |
*р | G | В |
G | Н | В |
Н | I | С |
*1 | А | Е |
Рис. 4.15. Еще один ДКА, который нужно минимизировать |
4.4.3. (!!) Пусть р и q — пара различимых состояний заданного ДКА А с п состояниями. Какой может быть самая точная верхняя граница длины кратчайшей цепочки, различающей р и q, как функция от п?
Резюме
- Лемма о накачке. Если язык регулярен, то в каждой достаточно длинной цепочке этого языка есть непустая подцепочка, которую можно «накачать», т.е. повторить произвольное число раз; получаемые при этом цепочки будут принадлежать данному языку. Эта лемма используется для доказательства нерегулярности многих языков.
- Операции, сохраняющие регулярность языков. Существует много операций, результат применения которых к регулярным языкам также является регулярным языком. В их числе объединение, конкатенация, замыкание (итерация), пересечение, дополнение, разность, обращение, гомоморфизм (замена каждого символа соответствующей цепочкой) и обратный гомоморфизм.
- Проверка пустоты регулярного языка. Существует алгоритм, который по такому заданному представлению регулярного языка, как автомат или регулярное выражение, определяет, является ли представленный язык пустым множеством.
- Проверка принадлежности регулярному языку. Существует алгоритм, который по заданной цепочке и некоторому представлению регулярного языка определяет, принадлежит ли цепочка языку.
- Проверка различимости состояний. Два состояния некоторого ДКА различимы, если существует входная цепочка, которая переводит в допускающее только одно из этих состояний. Если начать с того, что все пары, состоящие из допускающего и недопускающего состояний, различимы, и найти дополнительные пары, которые по одному символу переходят в различимые состояния, можно обнаружить все пары различимых состояний.
- Минимизация детерминированных конечных автоматов. Состояния любого ДКА можно разбить на группы взаимно неразличимых состояний. Состояния из двух разных групп всегда различимы. Если заменить каждую группу одним состоянием, получим эквивалентный ДКА с наименьшим числом состояний.
Литература
За исключением очевидных свойств замкнутости регулярных выражений (относительно объединения, конкатенации и итерации), которые были доказаны Клини [6], почти все результаты свойств замкнутости воспроизводят аналогичные результаты, полученные для контекстно-свободных языков (этому классу языков посвящены следующие главы). Таким образом, лемма о накачке для регулярных языков является упрощением соответствующего результата для контекстно-свободных языков (Бар-Хиллел, Перлес и Шамир [1]). Из результатов этой работы следуют некоторые другие свойства замкнутости, представленные в данной главе, а замкнутость относительно обратного гомоморфизма обоснована в [2].
Операция деления (см. упражнение 4.2.2) представлена в [3]. В этой работе обсуждается более общая операция, в которой вместо одиночных символов находятся регулярные языки. Ряд операций «частичного удаления», начиная с упражнения 4.2.8, в котором говорилось о первых половинах цепочек регулярного языка, был определен в [8]. Сейферас и Мак-Нотон [9] изучили общий случай, когда операция удаления сохраняет регулярность языков.
Алгоритмы разрешения, такие как проверка пустоты и конечности регулярных языков, а также проверка принадлежности к регулярному языку, берут свое начало в [7]. Алгоритмы минимизации числа состояний ДКА появились в [5]. В работе [4] предложен наиболее эффективный алгоритм нахождения минимального ДКА.
- Bar-Hillel, М. Perles, and Е. Shamir, «On formal properties of simple phrase-structure grammars,» Z Phonetik. Spachwiss. Kommunikations-forsch. 14 (1961), pp. 143-172.
- Ginsburg and G. Rose, «Operations which preserve definability in languages,» J. ACM 10:2 (1963), pp. 175-195. (Гинзбург С., Роуз Дж. Об инвариантности классов языков относительно некоторых преобразований. — Кибернетический сборник, Новая серия, вып. 5. — М.: Мир, 1968. — С. 138-166.)
- Ginsburg and Е. Н. Spanier, «Quotients of context-free languages,» J. ACM 10:4 (1963), pp. 487-492.
- E. Hopcroft, «An n log n algorithm for minimizing the states in a finite automaton,» in Z. Kohavi (ed.) The Theory of Machines and Computations, Academic Press, New York, pp. 189-196. (ХопкрофтДж. Алгоритм для минимизации конечного автомата.— Кибернетический сборник, Новая серия, вып. 11. — М.: Мир, 1974. — С. 177-184.)
- A. Huffman, «The synthesis of sequential switching circuits,» J. Franklin Inst. 257:3-4 (1954), pp. 161-190 and 275-303.
- C. Kleene, «Representation of events in nerve nets and finite automata,» in С. E. Shannon and J. McCarthy, Automata Studies, Princeton Univ. Press, 1956, pp. 3-42. (Клини С.К. Представление событий в нервных сетях. — сб. «Автоматы». — М.: ИЛ, 1956, — С. 15-67.)
- Е. Moore, «Gedanken experiments on sequential machines,» in С. E. Shannon and J. McCarthy, Automata Studies, Princeton Univ. Press, 1956, pp. 129-153. (Мур Э.Ф. Умозрительные эксперименты с последовательностными машинами. — сб. «Автоматы».— М.: ИЛ, 1956, —С. 179-210.)
- Е. Stearns and J. Hartmanis, «Regularity-preserving modifications of regular expressions,» Information and Control 6:1 (1963), pp. 55-69.
- I. Seiferas and R. McNaughton, «Regularity-preserving modifications,» Theoretical Computer Science 2:2 (1976), pp. 147-154.