Упражнение 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},
![\Delta = \{
\lp 1 , a , 2 \rp ,\
\lp 2 , b^* ba , 2 \rp ,\
\lp 2 , b^* , 3 \rp
\} ,](/sites/default/files/tex_cache/bca32e046379629cc11b45a98d47e31a.png)
![\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)
![\Sigma](/sites/default/files/tex_cache/025b3f94d79319f2067156076bf05243.png)
Теорема 5.3.5 (теорема Клини). Язык L является регулярным тогда и только тогда, когда он является автоматным.
Доказательство. Пусть e - регулярное выражение. Индукцией по построению e легко показать, что задаваемый им язык является автоматным (см. теорему 3.1.1).
Обратно, пусть язык L распознается некоторым
(недетерминированным) конечным автоматом
с одним начальным состоянием и одним заключительным состоянием.
Существует эквивалентный ему обобщенный конечный автомат ,
где
.
Если есть несколько переходов с общим началом и общим концом
(такие переходы называются параллельными ),
заменим их на один переход,
используя операцию +.
Устраним по очереди все состояния, кроме q1
и q2.
При устранении состояния q
нужно для каждого перехода вида ,
где
,
и для каждого перехода вида
,
где
,
добавить переход
,
где регулярное выражение g -
метка перехода из q в q
(если нет перехода из q в q,
то надо добавить переход
),
и снова всюду заменить параллельные переходы на один переход,
используя операцию +.
После устранения всех состояний, кроме q1 и q2,
получится обобщенный конечный автомат ,
где
![\Delta' =
\{
\lp q_1 , e_{11} , q_1 \rp ,
\lp q_1 , e_{12} , q_2 \rp ,
\lp q_2 , e_{21} , q_1 \rp ,
\lp q_2 , e_{22} , q_2 \rp
\} .](/sites/default/files/tex_cache/8954eaa8fb3f5f2255f7e43b590aa400.png)
![\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)
![L = \regval{ e_{11}^* e_{12}
( e_{22} \replus e_{21} e_{11}^* e_{12} )^* }](/sites/default/files/tex_cache/7437cb17341321756aa5469784d4f67c.png)
Пример 5.3.6. Рассмотрим язык, распознаваемый конечным автоматом
![M = \lalg \{ q_1 , q_2 , q_3 , q_4 \} , \Sigma , \Delta ,
\{ q_1 \} , \{ q_2 \} \ralg ,](/sites/default/files/tex_cache/3ef6899ff1c9a6d6477bb8baebd91742.png)
![\Sigma = \{ a , b , c \}](/sites/default/files/tex_cache/545719529838765861c9f2e32c76694c.png)
![\begin{multiline*}
\Delta = \{
\lp q_1 , a , q_4 \rp ,\
\lp q_2 , cb , q_2 \rp ,\
\lp q_2 , bac , q_4 \rp ,\
\\
\lp q_3 , a , q_1 \rp ,\
\lp q_3 , c , q_2 \rp ,\
\lp q_3 , c , q_4 \rp ,\
\lp q_4 , \varepsilon , q_3 \rp ,\
\lp q_4 , b , q_4 \rp
\} .
\end{multiline*}](/sites/default/files/tex_cache/5dbcddb747e12a73db02e0aad16a9e6d.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> ^{\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)
![M_1 \peq \lalg \{ q_1 , q_2 , q_3 , q_4 \} , \Sigma , \Delta_1 ,
\{ q_1 \} , \{ q_2 \} \ralg ,](/sites/default/files/tex_cache/598c3596bed3e713c45266a8fb69c2cf.png)
![\begin{multiline*}
\Delta_1 = \{
\lp q_1 , a , q_4 \rp ,\
\lp q_2 , cb , q_2 \rp ,\
\lp q_2 , bac , q_4 \rp ,\
\\
\lp q_3 , a , q_1 \rp ,\
\lp q_3 , c , q_2 \rp ,\
\lp q_3 , c , q_4 \rp ,\
\lp q_4 , 1 , q_3 \rp ,\
\lp q_4 , b , q_4 \rp
\} .
\end{multiline*}](/sites/default/files/tex_cache/45e18b5f84764f115820da0dcd20640a.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)
![M_2 = \lalg \{ q_1 , q_2 , q_4 \} , \Sigma , \Delta_2 ,
\{ q_1 \} , \{ q_2 \} \ralg ,](/sites/default/files/tex_cache/6b3b759cd9173a62d0f0e22f4cee9c84.png)
![\begin{multiline*}
\Delta_2 = \{
\lp q_1 , a , q_4 \rp ,\
\lp q_2 , cb , q_2 \rp ,\
\lp q_2 , bac , q_4 \rp ,\
\\
\lp q_4 , 1 \redot a , q_1 \rp ,\
\lp q_4 , 1 \redot c , q_2 \rp ,\
\lp q_4 , b \replus 1 \redot c , q_4 \rp
\} .
\end{multiline*}](/sites/default/files/tex_cache/90c5fa363bb93c6c1faeb5b3527092e1.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)
![\begin{multiline*}
\Delta_2' = \{
\lp q_1 , a , q_4 \rp ,\
\lp q_2 , cb , q_2 \rp ,\
\lp q_2 , bac , q_4 \rp ,\
\\
\lp q_4 , a , q_1 \rp ,\
\lp q_4 , c , q_2 \rp ,\
\lp q_4 , b \replus c , q_4 \rp
\} .
\end{multiline*}](/sites/default/files/tex_cache/65e608efb245af2597e1e1fb686bcb1b.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)
![M_3 = \lalg \{ q_1 , q_2 \} , \Sigma , \Delta_3 ,
\{ q_1 \} , \{ q_2 \} \ralg ,](/sites/default/files/tex_cache/95788d9053494c9f752e866a2dd558be.png)
![\begin{multiline*}
\Delta_3 = \{
\lp q_1 , a ( b \replus c )^* a , q_1 \rp ,\
\lp q_1 , a ( b \replus c )^* c , q_2 \rp ,\
\\
\lp q_2 , bac ( b \replus c )^* a , q_1 \rp ,\
\lp q_2 , cb \replus bac ( b \replus c )^* c , q_2 \rp
\} .
\end{multiline*}](/sites/default/files/tex_cache/6334735db6bcc5c1fd4f02de2434f555.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)
![\begin{multiline*}
( a ( b \replus c )^* a )^*
a ( b \replus c )^* c
\redot \\ \redot
( cb \replus bac ( b \replus c )^* c
\replus
bac ( b \replus c )^* a
( a ( b \replus c )^* a )^*
a ( b \replus c )^* c )^* .
\end{multiline*}](/sites/default/files/tex_cache/415995d1c78ba64170ce2fffea1d1cfd.png)
![L ( M ) = \regval{
a ( aa \replus b \replus c \replus c (cb)^* bac)^* c (cb)^* } .](/sites/default/files/tex_cache/579d9ba6081516784f062c9a34df0bbf.png)
Упражнение 5.3.7. Найти регулярное выражение для языка, порождаемого грамматикой
![\begin{align*}
\regl{ S \tto b T }
\regl{ S \tto a U }
\regl{ T \tto c R }
\regl{ T \tto e U }
\regl{ R \tto d T }
\regl{ U \tto \varepsilon }.
\end{align*}](/sites/default/files/tex_cache/2d800777090d908495fddc02e9d5c47a.png)
Упражнение 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}.