Прямая подстановка | Упрощенное выражение | |
R{2) | 1*+ 1*0(Ј+0 + 1)*0 | 1* |
г>(2) 12 | 1*0+ 1*0(Ј+0+ 1)*(Ј+0+ 1) | 1*0(0 + 1)* |
Ы2) 21 | 0 + (Ј+0+ 1)(Ј+0 + 1)*0 | 0 |
р( 2) 22 | Ј + 0 + 1 +(Ј+0 + 1)(Ј + 0 + 1)*(Ј +0+1) | (0+1)* |
Рис. 3.6. Регулярные выражения для путей, которые могут проходить через любое состояние
Окончательное регулярное выражение, эквивалентное автомату, представленному на рис. 3.4, строится путем объединения всех тех выражений, для которых первое состояние является начальным, а второе — заключительным. В нашем примере 1 -— начальное состояние, а 2 — заключительное, поэтому нам нужно лишь выражение R^), равное 1*0(0 + 1)*. Оно очень просто интерпретируется. Его язык состоит из всех цепочек, начинающихся с нулевого или некоторого количества единиц, за которыми следует 0, а за ним — любая цепочка из нулей и единиц. Иначе говоря, это все цепочки из 0 и 1, содержащие хотя бы один 0. □
3.2.2. Преобразование ДКА в регулярное выражение методом исключения состояний
Метод преобразования ДКА в регулярное выражение, представленный в разделе 3.2.1, работает всегда. Как вы, возможно, заметили, он на самом деле не зависит от того, детерминирован ли этот автомат, и точно так же применим и к НКА, и даже к е - НКА. Однако такой метод построения регулярного выражения очень трудоемок. Не только потому, что для автомата с п состояниями необходимо построить порядка п выражений, но и потому, что с каждым из п шагов индукции длина выражения может возрастать в среднем в четыре раза, если эти выражения не упрощать. Таким образом, размеры результирующих выражений могут достигать порядка 4" символов.
Существует аналогичный метод, избавляющий от некоторых повторных действий. Например, во всех выражениях с верхним индексом (к) в доказательстве теоремы 3.4 используется одно и то же подвыражение (R. fk~l) )*, которое приходится выписывать в общей сложности п2 раз.
Метод построения регулярных выражений, который мы изучим в этом разделе, предполагает исключение состояний. Если исключить некоторое состояние s, то все пути автомата, проходящие через это состояние, исчезают. Для того чтобы язык автомата при этом не изменился, необходимо написать на дуге, ведущей непосредственно из некоторого состояния q в состояние р, метки всех тех путей, которые вели из состояния q в состояние р, проходя через состояние s. Поскольку теперь метка такой дуги будет содержать цепочки, а не отдельные символы, и таких цепочек может быть даже бесконечно много, то мы не можем просто записать список этих цепочек в качестве метки. К счастью, существует простой и конечный способ для представления всех подобных цепочек, а именно, использование регулярных выражений.
Таким образом, мы пришли к рассмотрению автоматов, у которых метками являются регулярные выражения. Язык такого автомата представляет собой объединение по всем путям, ведущим от начального к заключительному состоянию, языков, образуемых с помощью конкатенации языков регулярных выражений, расположенных вдоль этих путей. Обратите внимание на то, что это правило согласуется с определением языка для любого рассмотренного выше типа автоматов. Каждый символ а или Ј, если он разрешен, можно рассматривать как регулярное выражение, языком которого является единственная цепочка, т. е. {а} или {Ј}. Можно принять это замечание за основу описываемой ниже процедуры исключения состояний.
На рис. 3.7 показано состояние s, которое мы собираемся исключить. Предположим, что автомат, содержащий j, содержит состояния qh q2, ..., qu, предшествующие j, и Ри Pi, ...,Рпи следующие за s. Возможно, некоторые из состояний q совпадают с состояниями р, но мы предполагаем, что среди q и р нет s, даже если существует петля, которая начинается и заканчивается в s, как показано на рис. 3.7. Над каждой дугой, ведущей к состоянию s, указано регулярное выражение; дуга, ведущая из состояния qt, помечена выражением Qi. Аналогично, регулярным выражением Р{ помечена дуга, ведущая из s в состояние р\, для каждого г. Петля на s имеет метку S. Наконец, регулярным выражением помечена каждая дуга, ведущая из qx в pt для всех i и j. Заметим, что некоторых из этих дуг в автомате может не быть. В этом случае в качестве выражения над дугой используется символ 0.
На рис. 3.8 показано, что получится, если исключить состояние s. Все дуги, проходящие через s, удалены. Чтобы это компенсировать, для каждого состояния <у„ предшествующего s, и для каждого рр следующего за s, вводится регулярное выражение, представляющее все пути, которые начинаются в q-„ идут к s, возможно, проходят петлю на s нуль или несколько раз, и наконец ведут в ру Выражение для таких путей равно Q\S*Py Это выражение добавляется (с помощью оператора объединения) к выражению над дугой из q\ в ру Если дуга <7; —> pi отсутствует, то вначале ей соответствует регулярное выражение 0.

Рис. 3.7. Состояние s, подлежащее исключению

Рис. 3.8. Результат исключения состояния s из автомата, изображенного на рис. 3.7
Стратегия построения регулярного выражения по конечному автомату такова.
1. Для каждого допускающего состояния q применить описанный выше процесс сокращения, чтобы построить эквивалентный автомат с дугами, помеченными регулярными выражениями. Исключить все состояния, кроме q и начального состояния q0.
1. Если q Ф q0, то должен остаться автомат с двумя состояниями, подобный автомату на рис. 3.9. Регулярное выражение для допустимых цепочек может быть записано по - разному. Один из видов — (R + SU*T)*SU*. Поясним его. Можно переходить из начального состояния в него же любое количество раз, проходя путями, метки которых принадлежат либо L(R), либо L(SU*T). Выражение SU*T представляет пути, которые ведут в допускающее состояние по пути с меткой из языка L(S), затем, возможно, несколько раз проходят через допускающее состояние, используя пути с метками из L(U), и наконец возвращаются в начальное состояние, следуя по пути с меткой из 1(7). Отсюда нужно перейти в допускающее состояние, уже никогда не возвращаясь в начальное, вдоль пути с меткой из L(S). Находясь в допускающем состоянии, можно сколько угодно раз вернуться в него по пути с меткой из L(U).

Рис. 3.9. Обобщенный автомат с двумя состояниями
3. Если же начальное состояние является допускающим, то необходимо точно так же исключить состояния исходного автомата, удалив все состояния, кроме начального. В результате получим автомат с одним состоянием, подобный представленному на рис. 3.10. Регулярное выражение R' задает цепочки, допускаемые этим автоматом.
R

4. Искомое выражение представляет собой сумму (объединение) всех выражений, полученных с помощью сокращенного автомата для каждого допускающего состояния согласно правилам 2 и 3.
Пример 3.6. Рассмотрим НКА, представленный на рис. 3.11, допускающий цепочки из нулей и единиц, у которых либо на второй, либо на третьей позиции с конца стоит 1. Вначале преобразуем этот автомат в автомат с регулярными выражениями в качестве меток.
Пока исключение состояний не производилось, то все, что нам нужно сделать, это заменить метки "О, 1" эквивалентным регулярным выражением 0+1. Результат показан на рис. 3.12.
о, 1
![]()
Начало
0,1
0, 1
0 1 /""Л
![]()
0 + 1
![]()
Рис. 3.12. Автомат, изображенный нарис. 3.11, с регулярными выражениями в качестве меток
Исключим сначала состояние В. Поскольку это состояние не является ни начальным, ни допускающим, то его не будет ни в одном из сокращенных автоматов. Мы избавимся от лишней работы, если исключим это состояние до того, как начнем строить два сокращенных автомата, соответствующих двум его допускающим состояниям.
Существует одно состояние А, предшествующее В, и одно последующее состояние С. Используя обозначения регулярных выражений диаграммы, представленной на рис. 3.7, получим: Qi = 1, Р\ = 0 + 1, Rn = 0 (потому что из А в С дуги нет) и 5=0 (поскольку нет петли в состоянии В). В результате, выражение над новой дугой из А в С равно 0 + 10*(О + 1).
Для сокращения полученного выражения сначала исключаем первый элемент 0, который можно игнорировать при объединении. Выражение приобретает вид 10*(О + 1). Напомним, что регулярное выражение 0* эквивалентно регулярному выражению Ј, поскольку
Рис. 3.11. НКА, допускающий цепочки, у которых 1 находится либо на второй, либо на третьей позиции с конца цепочки
1(0*) = {Ј} и Ц0) и Ц0)Ц0) и...
Все члены этого объединения, кроме первого, пусты, поэтому 1(0*) = {Ј}, что совпадает с L(e). Следовательно, 10*(О+1) эквивалентно выражению 1(0+1), которое использовано для дуги А —> С на рис. 3.13.
0 + 1
![]()
Рис. 3.13. Исключение состояния В
Далее нужно по отдельности исключить состояния С и D. Процедура исключения состояния С аналогична описанному выше исключению состояния В, в результате чего получится автомат, представленный на рис. 3.14.
0 + 1
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |


