Упражнение 2.1.25 |
Регулярные выражения
5.3. Теорема Клини
Определение 5.3.1. Назовем обобщенным конечным автоматом аналог конечного автомата, где переходы помечены не словами, а регулярными выражениями. Метка пути такого автомата - произведение регулярных выражений на переходах данного пути. Слово w допускается обобщенным конечным автоматом, если оно принадлежит языку, задаваемому меткой некоторого успешного пути.
Замечание 5.3.2. Каждый конечный автомат можно преобразовать в обобщенный конечный автомат, допускающий те же слова. Для этого достаточно заменить всюду в метках переходов пустое слово на 1, а каждое непустое слово - на произведение его букв.
Замечание 5.3.3. Если к обобщенному конечному автомату добавить переход с меткой 0, то множество допускаемых этим автоматом слов не изменится.
Пример 5.3.4.
Пусть .
Обобщенный конечный автомат
,
где Q = {1,2,3}, I = {1,2}, F = {3},

![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix {
*=[o][F-]{1}
\ar @`{+/l16mm/} [] ^{}
\ar "2,1" _{a}
&
\\
*=[o][F-]{2}
\ar @`{+/l16mm/} [] ^{}
\ar "2,2" _{b^*}
\rloop{0,-1} ^{b^*ba}
& *=[o][F=]{3}
}](/sites/default/files/tex_cache/0982edeb66b716104641e21d4ed4cdb7.png)

Теорема 5.3.5 (теорема Клини). Язык L является регулярным тогда и только тогда, когда он является автоматным.
Доказательство. Пусть e - регулярное выражение. Индукцией по построению e легко показать, что задаваемый им язык является автоматным (см. теорему 3.1.1).
Обратно, пусть язык L распознается некоторым
(недетерминированным) конечным автоматом
с одним начальным состоянием и одним заключительным состоянием.
Существует эквивалентный ему обобщенный конечный автомат ,
где
.
Если есть несколько переходов с общим началом и общим концом
(такие переходы называются параллельными ),
заменим их на один переход,
используя операцию +.
Устраним по очереди все состояния, кроме q1
и q2.
При устранении состояния q
нужно для каждого перехода вида ,
где
,
и для каждого перехода вида
,
где
,
добавить переход
,
где регулярное выражение g -
метка перехода из q в q
(если нет перехода из q в q,
то надо добавить переход
),
и снова всюду заменить параллельные переходы на один переход,
используя операцию +.
После устранения всех состояний, кроме q1 и q2,
получится обобщенный конечный автомат ,
где

![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix {
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\rloop{0,1} ^{e_{11}}
\ar "1,2" <0.6mm> ^{e_{12}}
& *=[o][F=]{q_2}
\ar "1,1" <0.6mm> ^{e_{21}}
\rloop{0,1} ^{e_{22}}
}](/sites/default/files/tex_cache/457745bcd611a47d08c6bee762bb0229.png)

Пример 5.3.6. Рассмотрим язык, распознаваемый конечным автоматом



![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix {
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\ar "1,2" ^{a}
& *=[o][F-]{q_4}
\ar "2,2" <0.6mm> ^{\varepsilon}
\rloop{0,1} ^{b}
& *=[o][F=]{q_2}
\rloop{0,1} ^{cb}
\ar "1,2" _{bac}
\\
%
& *=[o][F-]{q_3}
\ar "1,1" ^{a}
\ar "1,3" _{c}
\ar "1,2" <0.6mm> ^{c}
&
}](/sites/default/files/tex_cache/42a56cdd993fba299837ddae4fabf935.png)


![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix {
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\ar "1,2" ^{a}
& *=[o][F-]{q_4}
\ar "2,2" <0.6mm> ^{1}
\rloop{0,1} ^{b}
& *=[o][F=]{q_2}
\rloop{0,1} ^{cb}
\ar "1,2" _{bac}
\\
%
& *=[o][F-]{q_3}
\ar "1,1" ^{a}
\ar "1,3" _{c}
\ar "1,2" <0.6mm> ^{c}
&
}](/sites/default/files/tex_cache/68d98b01837e7ee59f3fb52733ef3e9e.png)


![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix @=11mm{
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\ar "1,2" <0.6mm> ^{a}
& *=[o][F-]{q_4}
\ar "1,1" <0.6mm> ^{1 \cdot a}
\ar "1,3" <0.6mm> ^{1 \cdot c}
\rloop{0,1} ^{b + 1 \cdot c}
& *=[o][F=]{q_2}
\rloop{0,1} ^{cb}
\ar "1,2" <0.6mm> ^{bac}
}](/sites/default/files/tex_cache/1f4ae4c725100ef8aa3da5abb75de838.png)

![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix @=11mm{
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\ar "1,2" <0.6mm> ^{a}
& *=[o][F-]{q_4}
\ar "1,1" <0.6mm> ^{a}
\ar "1,3" <0.6mm> ^{c}
\rloop{0,1} ^{b + c}
& *=[o][F=]{q_2}
\rloop{0,1} ^{cb}
\ar "1,2" <0.6mm> ^{bac}
}](/sites/default/files/tex_cache/ab0a2aa8d1d99aa4fc94b7ad9407019f.png)


![\objectwidth={5mm} \objectheight={5mm} \let\objectstyle=\scriptstyle
\xymatrix @=11mm{
*=[o][F-]{q_1}
\ar @`{+/l16mm/} [] ^{}
\rloop{0,1} ^{a (b+c)^* a}
\ar "1,3" <0.6mm> ^{a (b+c)^* c}
&
& *=[o][F=]{q_2}
\ar "1,1" <0.6mm> ^{bac (b+c)^* a}
\rloop{0,1} ^{cb + bac (b+c)^* c}
}](/sites/default/files/tex_cache/50359351bcae501fbc82fb38a5f700b2.png)


Упражнение 5.3.7. Найти регулярное выражение для языка, порождаемого грамматикой

Упражнение 5.3.8. Найти регулярное выражение для языка
Упражнение 5.3.9. Найти регулярное выражение для языка ,
где L1 = (aaab+c+d)*, L2 = (a*ba*ba*bc+d)*, L3 = ((a+b)*c(a+b)*cd)*
Упражнение 5.3.10 Найти регулярное выражение для дополнения языка (a+b)*bbb(a+b)* в алфавите {a,b}.
Упражнение 5.3.11 Найти регулярное выражение для дополнения языка (ab+ba)*(1+a+b) в алфавите {a,b}.
Упражнение 5.3.12 Найти регулярное выражение для дополнения языка (a+b)*(aab+abaa+abb)(a+b)* в алфавите {a,b}.
Упражнение 5.3.13 Найти регулярное выражение для дополнения языка (aa(ab)*bb(ab)*)* в алфавите {a,b}.