Języki, automaty i obliczenia/Wykład 7: Twierdzenie Kleene'ego. Własności języków i gramatyk regularnych: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu – „<math> ” na „<math>”
m Zastępowanie tekstu – „<math> ” na „<math>”
 
(Nie pokazano 4 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 23: Linia 23:
{{dowod|||
{{dowod|||


Dowód pierwszej części twierdzenia, czyli inkluzja  <math>\mathcal{REG}(A^{*})\subseteq \mathcal{REC}(A^{*}) </math> , będzie  
Dowód pierwszej części twierdzenia, czyli inkluzja  <math>\mathcal{REG}(A^{*})\subseteq \mathcal{REC}(A^{*})</math> , będzie  
prowadzony zgodnie ze strukturą definicji rodziny języków  
prowadzony zgodnie ze strukturą definicji rodziny języków  
regularnych  <math>\mathcal{REG}(A^{*}) </math> .
regularnych  <math>\mathcal{REG}(A^{*})</math> .


1. Język pusty <math>\emptyset</math> jest rozpoznawany przez dowolny
1. Język pusty <math>\emptyset</math> jest rozpoznawany przez dowolny
Linia 42: Linia 42:
= (S,f,{s_0},T)</math>, dla którego <math>S = S_1 \times S_2</math>, <math>s_0 =  
= (S,f,{s_0},T)</math>, dla którego <math>S = S_1 \times S_2</math>, <math>s_0 =  
({s_0}^1,{s_0}^2)</math>,  <math>\ :  T = T_1 \times S_2\; \cup \;S_1 \times  
({s_0}^1,{s_0}^2)</math>,  <math>\ :  T = T_1 \times S_2\; \cup \;S_1 \times  
T_2</math> oraz dla dowolnego stanu  <math>(s_{1},s_{2})\in S </math>  i litery  <math>a\in A </math>  funkcja przejść określona jest równością
T_2</math> oraz dla dowolnego stanu  <math>(s_{1},s_{2})\in S</math>  i litery  <math>a\in A</math>  funkcja przejść określona jest równością


<center><math>f((s_{1},s_{2}),a)=(f_{1}(s_{1},a),f_{2}(s_{2},a))</math>.</center>
<center><math>f((s_{1},s_{2}),a)=(f_{1}(s_{1},a),f_{2}(s_{2},a))</math>.</center>
Linia 51: Linia 51:
automat  <math>\mathcal{A}  = (S,f,{s_0},T)</math>, dla którego
automat  <math>\mathcal{A}  = (S,f,{s_0},T)</math>, dla którego
<math>S=S_{1}\times \mathcal{P}(S_{2}),\quad s_{0}=\left(  
<math>S=S_{1}\times \mathcal{P}(S_{2}),\quad s_{0}=\left(  
s_{0}^{1},\emptyset \right) </math>  oraz dla dowolnego stanu <math>(s_1,S'_2)  
s_{0}^{1},\emptyset \right)</math>  oraz dla dowolnego stanu <math>(s_1,S'_2)  
\in S</math> i litery  <math>a\in A </math>  funkcja przejść określona jest  
\in S</math> i litery  <math>a\in A</math>  funkcja przejść określona jest  
następująco:  
następująco:  


<center><math>f((s_1,S'_2),a) = \left\{ \begin{array} {ll} (f_1(s_1,a),f_2(S'_2,a)) &  \text{gdy} f_1(s_1,a) \notin T_1 ,\\ (f_1(s_1,a),f_2(S'_2,a) \cup \{ {s_0}^2\}) &  \text{gdy}f_1(s_1,a) \in T_1,  \end{array}  \right.</math></center>
<center><math>f((s_1,S'_2),a) = \left\{ \begin{array} {ll} (f_1(s_1,a),f_2(S'_2,a)) &  \text{gdy} f_1(s_1,a) \notin T_1 ,\\ (f_1(s_1,a),f_2(S'_2,a) \cup \{ {s_0}^2\}) &  \text{gdy}f_1(s_1,a) \in T_1,  \end{array}  \right</math>.</center>


a zbiorem stanów końcowych jest
a zbiorem stanów końcowych jest
Linia 69: Linia 69:


<center><math>f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} &  \text{gdy} f(s,a) \notin T ,\\
<center><math>f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} &  \text{gdy} f(s,a) \notin T ,\\
\{ f(s,a),s_0 \} &  \text{gdy} f(s,a) \in T  \end{array}  \right.</math></center>
\{ f(s,a),s_0 \} &  \text{gdy} f(s,a) \in T  \end{array}  \right</math>.</center>


rozpoznaje język  język <math>L^+</math>.  Dowód tego faktu jest indukcyjny i pozostawiamy go na ćwiczenia.
rozpoznaje język  język <math>L^+</math>.  Dowód tego faktu jest indukcyjny i pozostawiamy go na ćwiczenia.
Linia 77: Linia 77:
</center>
</center>


Ponieważ  <math>L^{*}=L^{+}\cup \left\{ 1\right\} </math> , to  
Ponieważ  <math>L^{*}=L^{+}\cup \left\{ 1\right\}</math> , to  
korzystając z udowodnionej już zamkniętości języków rozpoznawanych  
korzystając z udowodnionej już zamkniętości języków rozpoznawanych  
ze względu na sumę mnogościową, stwierdzamy, że istnieje automat  
ze względu na sumę mnogościową, stwierdzamy, że istnieje automat  
Linia 83: Linia 83:


Zatem dowód
Zatem dowód
inkluzji  <math>\mathcal{REG}(A^{*})\subseteq \mathcal{REC}(A^{*}) </math>  jest zakończony.
inkluzji  <math>\mathcal{REG}(A^{*})\subseteq \mathcal{REC}(A^{*})</math>  jest zakończony.


Przejdziemy teraz do dowodu inkluzji
Przejdziemy teraz do dowodu inkluzji
<math>\mathcal{REG}(A^{*})\supseteq \mathcal{RE}C(A^{*}) </math> .
<math>\mathcal{REG}(A^{*})\supseteq \mathcal{RE}C(A^{*})</math> .


Niech <math>L</math> oznacza dowolny język rozpoznawany przez automat  
Niech <math>L</math> oznacza dowolny język rozpoznawany przez automat  
Linia 98: Linia 98:
<center><math>L(s,t) = \{w \in A^* : f(s,w) = t \}</math>.</center>
<center><math>L(s,t) = \{w \in A^* : f(s,w) = t \}</math>.</center>


Jest to język złożony ze słów, które przeprowadzają stan  <math>s </math>   
Jest to język złożony ze słów, które przeprowadzają stan  <math>s</math>   
automatu  <math>\mathcal{A} </math>  w stan  <math>t </math> . Ogół liter alfabetu  <math>A  
automatu  <math>\mathcal{A}</math>  w stan  <math>t</math> . Ogół liter alfabetu  <math>A  
</math>  przeprowadzających stan  <math>s </math>  w  <math>t </math>  oznaczymy przez  
</math>  przeprowadzających stan  <math>s</math>  w  <math>t</math>  oznaczymy przez  
<center><math>A(s,t) = \{a \in A : f(s,a) = t \}</math>.</center>
<center><math>A(s,t) = \{a \in A : f(s,a) = t \}</math>.</center>


Linia 122: Linia 122:


Wprost z określeń wynika, że wszystkie wprowadzone powyżej języki są  
Wprost z określeń wynika, że wszystkie wprowadzone powyżej języki są  
regularne, czyli należą do rodziny  <math>\mathcal{REG}(A^{*}) </math> . Dowód  
regularne, czyli należą do rodziny  <math>\mathcal{REG}(A^{*})</math> . Dowód  
tego faktu przebiega indukcyjnie ze względu na liczbę  
tego faktu przebiega indukcyjnie ze względu na liczbę  
elementów zbiorów <math>S_1</math> i <math>S_2</math>. Szczegóły tego dowodu pominiemy.  
elementów zbiorów <math>S_1</math> i <math>S_2</math>. Szczegóły tego dowodu pominiemy.  
Linia 181: Linia 181:
<span id="twierdzenie_2_1">{{twierdzenie|2.1.||
<span id="twierdzenie_2_1">{{twierdzenie|2.1.||


Rodzina  <math>\mathcal{REG}(A^{*})=\mathcal{REC}(A^{*}) </math>  jest zamknięta ze względu na:
Rodzina  <math>\mathcal{REG}(A^{*})=\mathcal{REC}(A^{*})</math>  jest zamknięta ze względu na:
:(1)  sumę mnogościową, przecięcie, różnicę i uzupełnienie,
:(1)  sumę mnogościową, przecięcie, różnicę i uzupełnienie,
:(2)  katenację i operację iteracji <math>* , </math>
:(2)  katenację i operację iteracji <math>* </math>
:(3)  obraz homomorficzny,
:(3)  obraz homomorficzny,
:(4)  podstawienie regularne,
:(4)  podstawienie regularne,
Linia 193: Linia 193:
{{dowod|||
{{dowod|||


1.  Zamkniętość rodziny języków  <math>\mathcal{REG}(A^{*})</math> ze względu na sumę mnogościową wynika z twierdzenia Kleene'ego. Automat akceptujący iloczyn języków otrzymujemy, zmieniając odpowiednio zbiór stanów końcowych w automacie rozpoznającym sumę. Bowiem pozostając przy oznaczeniach punktu 3 z dowodu twierdzenia Kleene'ego, automat  <math>\mathcal{A}  =(S,f,{s_0},F)</math>, gdzie <math>F = T_1 \times T_2</math>, rozpoznaje język <math>L_1 \cap L_2</math>. Jeśli automat  <math>\mathcal{A} =(S,f,s_0,T)</math> akceptuje język <math>L</math>, to automat  <math>\overline{\mathcal{A}}  =(S,f,s_0,S\backslash T)</math> akceptuje język <math>\overline{L}=A^{*}\setminus L. </math>  Ostatnia własność implikuje zamkniętość ze względu na uzupełnienie.
1.  Zamkniętość rodziny języków  <math>\mathcal{REG}(A^{*})</math> ze względu na sumę mnogościową wynika z twierdzenia Kleene'ego. Automat akceptujący iloczyn języków otrzymujemy, zmieniając odpowiednio zbiór stanów końcowych w automacie rozpoznającym sumę. Bowiem pozostając przy oznaczeniach punktu 3 z dowodu twierdzenia Kleene'ego, automat  <math>\mathcal{A}  =(S,f,{s_0},F)</math>, gdzie <math>F = T_1 \times T_2</math>, rozpoznaje język <math>L_1 \cap L_2</math>. Jeśli automat  <math>\mathcal{A} =(S,f,s_0,T)</math> akceptuje język <math>L</math>, to automat  <math>\overline{\mathcal{A}}  =(S,f,s_0,S\backslash T)</math> akceptuje język <math>\overline{L}=A^{*}\setminus L</math>. Ostatnia własność implikuje zamkniętość ze względu na uzupełnienie.


2  Z twierdzenia Kleene'ego, punkt 4 i 5, wynika zamkniętość ze względu na katenację i operację iteracji <math>* </math>.
2  Z twierdzenia Kleene'ego, punkt 4 i 5, wynika zamkniętość ze względu na katenację i operację iteracji <math>*</math>.


3.  Niech <math>h: A^* \longrightarrow B^*</math> będzie homomorfizmem. Dowód implikacji
3.  Niech <math>h: A^* \longrightarrow B^*</math> będzie homomorfizmem. Dowód implikacji
Linia 202: Linia 202:


przeprowadzimy zgodnie ze strukturą definicji  rodziny języków regularnych.
przeprowadzimy zgodnie ze strukturą definicji  rodziny języków regularnych.
Dla  <math>L=\emptyset </math>  i dla  <math>L=\{a\} </math>
Dla  <math>L=\emptyset</math>  i dla  <math>L=\{a\}</math>
gdzie  <math>a </math>  jest dowolną literą alfabetu  <math>A </math> , implikacja jest  
gdzie  <math>a</math>  jest dowolną literą alfabetu  <math>A</math> , implikacja jest  
oczywista. W pierwszym przypadku obrazem homomorficznym jest język  
oczywista. W pierwszym przypadku obrazem homomorficznym jest język  
pusty, a w drugim język  <math>\{w\} </math> , gdzie  <math>w </math>  jest pewnym  
pusty, a w drugim język  <math>\{w\}</math> , gdzie  <math>w</math>  jest pewnym  
słowem nad alfabetem  <math>B </math> . Dla dowolnych języków regularnych <math>X,  
słowem nad alfabetem  <math>B</math> . Dla dowolnych języków regularnych <math>X,  
Y \in\mathcal{REG}(A^{*}) </math>  prawdziwe są równości:
Y \in\mathcal{REG}(A^{*})</math>  prawdziwe są równości:
* <math>h( X \cup Y)=h(X) \cup h(Y) \in\mathcal{REG}(B^{*}) </math> ,
* <math>h( X \cup Y)=h(X) \cup h(Y) \in\mathcal{REG}(B^{*})</math> ,
* <math>h( X \cdot Y) = h(X) \cdot h(Y) \in\mathcal{REG}(B^{*}) </math> ,
* <math>h( X \cdot Y) = h(X) \cdot h(Y) \in\mathcal{REG}(B^{*})</math> ,
* <math>{h(X^*)=h( \bigcup_{n=0} ^\infty X^n) = \bigcup_{n=0} ^\infty (h(X))^n = (h(X))^* \in}\mathcal{REG}(B^{*}), </math>  
* <math>{h(X^*)=h( \bigcup_{n=0} ^\infty X^n) = \bigcup_{n=0} ^\infty (h(X))^n = (h(X))^* \in}\mathcal{REG}(B^{*})</math>  


co kończy dowód tego punktu.
co kończy dowód tego punktu.


4.  Uzasadnienie jest podobne jak dla homomorfizmu. Jedyna różnica tkwi w tym, że dla podstawienia regularnego  <math>s:A^{*}\longrightarrow \mathcal{P}(B^{*}) </math> i dla dowolnej litery <math>a \in A</math> wartość podstawienia na literze jest pewnym językiem regularnym  <math>s(a)=L\in \mathcal{REG}(B^{*}) </math> , a nie słowem jak w przypadku
4.  Uzasadnienie jest podobne jak dla homomorfizmu. Jedyna różnica tkwi w tym, że dla podstawienia regularnego  <math>s:A^{*}\longrightarrow \mathcal{P}(B^{*})</math> i dla dowolnej litery <math>a \in A</math> wartość podstawienia na literze jest pewnym językiem regularnym  <math>s(a)=L\in \mathcal{REG}(B^{*})</math> , a nie słowem jak w przypadku
homomorfizmu.
homomorfizmu.


Linia 224: Linia 224:


odwołamy się do własności, że dla języka <math>L  
odwołamy się do własności, że dla języka <math>L  
\in\mathcal{REG}(B^{*}) </math>  istnieje
\in\mathcal{REG}(B^{*})</math>  istnieje
skończony monoid <math>\; M \;</math> i
skończony monoid <math>\; M \;</math> i
homomorfizm <math>\varphi : B^* \longrightarrow M</math> taki, że
homomorfizm <math>\varphi : B^* \longrightarrow M</math> taki, że
Linia 231: Linia 231:


Korzystając teraz z punktu 4 twierdzenia 1.2 z wykładu 3 (patrz [[Języki, automaty i obliczenia/Wykład 3: Automat skończenie stanowy #twierdzenie_1_2|twierdzenie 1.2. wykład 3]]), wnioskujemy, że
Korzystając teraz z punktu 4 twierdzenia 1.2 z wykładu 3 (patrz [[Języki, automaty i obliczenia/Wykład 3: Automat skończenie stanowy #twierdzenie_1_2|twierdzenie 1.2. wykład 3]]), wnioskujemy, że
<math>h^{-1}(L) \in\mathcal{REG}(A^{*}) </math> .
<math>h^{-1}(L) \in\mathcal{REG}(A^{*})</math> .


6.  Wykorzystamy tutaj zapis języka regularnego
6.  Wykorzystamy tutaj zapis języka regularnego
przez wyrażenie regularne. Niech
przez wyrażenie regularne. Niech
dla języka <math>L \in\mathcal{REG}(A^{*}) </math>  wyrażenie regularne  <math>\alpha \in \mathcal{WR} </math>  
dla języka <math>L \in\mathcal{REG}(A^{*})</math>  wyrażenie regularne  <math>\alpha \in \mathcal{WR}</math>  
będzie takie, że <math>L = \mid {\bf \alpha} \mid</math>. Wtedy język <math>\stackrel{\leftarrow}{L}</math>
będzie takie, że <math>L = \mid {\bf \alpha} \mid</math>. Wtedy język <math>\stackrel{\leftarrow}{L}</math>
jest opisany przez wyrażenie regularne <math>\stackrel{\leftarrow}{\bf \alpha}</math>,
jest opisany przez wyrażenie regularne <math>\stackrel{\leftarrow}{\bf \alpha}</math>,
Linia 246: Linia 246:
szczególności do gramatyki  typu '''(3)''', czyli regularnej. Przypomnijmy, że
szczególności do gramatyki  typu '''(3)''', czyli regularnej. Przypomnijmy, że
produkcje takiej gramatyki <math>G=(V_N ,V_T ,v_0 ,P )</math> mają postać:
produkcje takiej gramatyki <math>G=(V_N ,V_T ,v_0 ,P )</math> mają postać:
<center><math>v \rightarrow v' x \;\; lub \;\;\; v \rightarrow x,</math></center>
<center><math>v \rightarrow v' x \;\; lub \;\;\; v \rightarrow x</math></center>


gdzie <math>v,v' \in V_N , \; x \in {V_T}^*</math>. Gramatykę typu  
gdzie <math>v,v' \in V_N , \; x \in {V_T}^*</math>. Gramatykę typu  
Linia 253: Linia 253:
(prawoliniową). Jest to  
(prawoliniową). Jest to  
gramatyka <math>G=(V_N ,V_T ,v _0 ,P)</math>,  której produkcje są postaci:
gramatyka <math>G=(V_N ,V_T ,v _0 ,P)</math>,  której produkcje są postaci:
<center><math>v \rightarrow xv' \;\; lub \;\;\; v \rightarrow x,</math></center>
<center><math>v \rightarrow xv' \;\; lub \;\;\; v \rightarrow x</math></center>


gdzie <math>v,v' \in V_N , \; x \in {V_T}^*</math>. Jeśli język <math>L=L(G)</math> jest  
gdzie <math>v,v' \in V_N , \; x \in {V_T}^*</math>. Jeśli język <math>L=L(G)</math> jest  
Linia 262: Linia 262:
odbicie zwierciadlane prawych stron produkcji. Oznacza to, iż  
odbicie zwierciadlane prawych stron produkcji. Oznacza to, iż  
zmieniamy produkcje według następujących zasad:
zmieniamy produkcje według następujących zasad:
<center><math>v \rightarrow v' x \;\; </math> zastępujemy przez <math> \;\;\; v \rightarrow \stackrel{\leftarrow}{x}v',</math></center>
<center><math>v \rightarrow v' x \;\;</math> zastępujemy przez <math>\;\;\; v \rightarrow \stackrel{\leftarrow}{x}v'</math></center>


<center><math>v \rightarrow x \;\; </math> zastępujemy przez <math> \;\;\; v \rightarrow \stackrel{\leftarrow}{x}.</math></center>
<center><math>v \rightarrow x \;\;</math> zastępujemy przez <math>\;\;\; v \rightarrow \stackrel{\leftarrow}{x}</math>.</center>


Oczywiście, jeśli <math>L</math> jest językiem generowanym przez gramatykę prawoliniową, to
Oczywiście, jeśli <math>L</math> jest językiem generowanym przez gramatykę prawoliniową, to
Linia 270: Linia 270:
generowany przez odpowiednią gramatykę lewoliniową.
generowany przez odpowiednią gramatykę lewoliniową.


Podamy teraz charakterystykę rodziny języków regularnych  <math>\mathcal{REG}(A^{*}) </math>  
Podamy teraz charakterystykę rodziny języków regularnych  <math>\mathcal{REG}(A^{*})</math>  
przez rodzinę gramatyk prawoliniowych.
przez rodzinę gramatyk prawoliniowych.


<span id="twierdzenie_2_2">{{twierdzenie|2.2.||
<span id="twierdzenie_2_2">{{twierdzenie|2.2.||


Niech <math>L \subset A^*</math>. Język <math>L \in\mathcal{REG}(A^{*}) </math>  wtedy i tylko wtedy,
Niech <math>L \subset A^*</math>. Język <math>L \in\mathcal{REG}(A^{*})</math>  wtedy i tylko wtedy,
gdy <math>L =L(G)</math> dla pewnej gramatyki prawoliniowej <math>G</math>.
gdy <math>L =L(G)</math> dla pewnej gramatyki prawoliniowej <math>G</math>.


Linia 282: Linia 282:
{{dowod|||
{{dowod|||


Załóżmy, że automat  <math>\mathcal{A}  =(S,A,f,s_0,T)</math>  rozpoznaje język  <math>L </math> .
Załóżmy, że automat  <math>\mathcal{A}  =(S,A,f,s_0,T)</math>  rozpoznaje język  <math>L</math> .
Definiujemy gramatykę <math>G = (V_N , V_T , v_0 ,P)</math>
Definiujemy gramatykę <math>G = (V_N , V_T , v_0 ,P)</math>
przyjmując <math>V_N = S,\;\; V_T = A, \;\; v_0 = s_0</math> oraz określając w następujący sposób
przyjmując <math>V_N = S,\;\; V_T = A, \;\; v_0 = s_0</math> oraz określając w następujący sposób
Linia 289: Linia 289:


Dla dowolnego stanu <math>s \in S</math> i słowa <math>w \in A^+</math> prawdziwa jest równoważność
Dla dowolnego stanu <math>s \in S</math> i słowa <math>w \in A^+</math> prawdziwa jest równoważność
<center><math>s_0 \mapsto^* ws \ ;\ ; \Longleftrightarrow \ ;\ ; f(s_0 ,w) = s.</math></center>
<center><math>s_0 \mapsto^* ws \ ;\ ; \Longleftrightarrow \ ;\ ; f(s_0 ,w) = s</math>.</center>


Dowód przeprowadzimy indukcyjnie ze względu na długość słowa <math>w</math>. Niech <math>w = a,</math> dla pewnego <math>a \in A</math>.
Dowód przeprowadzimy indukcyjnie ze względu na długość słowa <math>w</math>. Niech <math>w = a</math> dla pewnego <math>a \in A</math>.
Z definicji zbioru produkcji <math>P</math> wynika równoważność
Z definicji zbioru produkcji <math>P</math> wynika równoważność
<center><math>s_0 \rightarrow as \; \Longleftrightarrow \; s = f(s_0 ,a)</math>.</center>
<center><math>s_0 \rightarrow as \; \Longleftrightarrow \; s = f(s_0 ,a)</math>.</center>
Linia 300: Linia 300:
oraz, że <math>s = f(s' ,a_n )</math> wtedy
oraz, że <math>s = f(s' ,a_n )</math> wtedy
i tylko wtedy, gdy <math>s' \mapsto a_n s</math>. A więc fakt, że
i tylko wtedy, gdy <math>s' \mapsto a_n s</math>. A więc fakt, że
<math>s=f(s_{0},w)=f(s_{0},a_{1}\ldots a_{n})=f(f(s_{0},a_{1}\ldots a_{n-1}),a_{n}) </math>  jest
<math>s=f(s_{0},w)=f(s_{0},a_{1}\ldots a_{n})=f(f(s_{0},a_{1}\ldots a_{n-1}),a_{n})</math>  jest
równoważny temu,
równoważny temu,
że  <math>s'=f(s_{0},a_{1}\ldots a_{n-1})\mapsto a_{n}s </math> . A to z kolei równoważne jest
że  <math>s'=f(s_{0},a_{1}\ldots a_{n-1})\mapsto a_{n}s</math> . A to z kolei równoważne jest


<center><math>s_{0}\mapsto^{*}a_{1}\ldots a_{n-1}s',\;\;\;s'\mapsto a_{n}s</math></center>
<center><math>s_{0}\mapsto^{*}a_{1}\ldots a_{n-1}s',\;\;\;s'\mapsto a_{n}s</math></center>


i ostatecznie równoważne faktowi, że  <math>s_{0}\mapsto ^{*}a_{1}\ldots a_{n-1}a_{n}s </math> .
i ostatecznie równoważne faktowi, że  <math>s_{0}\mapsto ^{*}a_{1}\ldots a_{n-1}a_{n}s</math> .
A zatem dowodzona równoważność jest prawdziwa dla <math>w \in A^+</math>, ponieważ
A zatem dowodzona równoważność jest prawdziwa dla <math>w \in A^+</math>, ponieważ


<center><math>w\in L(\mathcal{A})\ : \Longleftrightarrow \ : s=f(s_{0},w)\in T\ : \Longleftrightarrow \ : s_{o}\mapsto ^{*}ws,\, s\rightarrow 1\in P\ : \Longleftrightarrow \ : w\in L(G)</math>.</center>
<center><math>w\in L(\mathcal{A})\ : \Longleftrightarrow \ : s=f(s_{0},w)\in T\ : \Longleftrightarrow \ : s_{o}\mapsto ^{*}ws,\, s\rightarrow 1\in P\ : \Longleftrightarrow \ : w\in L(G)</math>.</center>


Dla  <math>w=1 </math>  mamy  <math>1\in L(\mathcal{A})\ : \Longleftrightarrow \ : s_{0}\rightarrow 1\in P\ : \Longleftrightarrow \ : 1\in L(G), </math>  
Dla  <math>w=1</math>  mamy  <math>1\in L(\mathcal{A})\ : \Longleftrightarrow \ : s_{0}\rightarrow 1\in P\ : \Longleftrightarrow \ : 1\in L(G)</math>  
co kończy dowód w jedną stronę.
co kończy dowód w jedną stronę.


Linia 317: Linia 317:
<math>G = (V_N , V_T , v_0 ,P)</math>. Skonstruujemy gramatykę równoważną
<math>G = (V_N , V_T , v_0 ,P)</math>. Skonstruujemy gramatykę równoważną
<math>G</math> i taką, w której wszystkie produkcje są postaci
<math>G</math> i taką, w której wszystkie produkcje są postaci
<math>v \rightarrow a v' </math>  lub  <math> v \rightarrow 1</math>, gdzie <math>v,v' \in V_N , a \in A</math>.
<math>v \rightarrow a v'</math>  lub  <math>v \rightarrow 1</math>, gdzie <math>v,v' \in V_N , a \in A</math>.
Będziemy zamieniać produkcje występujące w gramatyce <math>G</math> na inne, o
Będziemy zamieniać produkcje występujące w gramatyce <math>G</math> na inne, o
żądanej postaci, zgodnie z następująmi zasadami:
żądanej postaci, zgodnie z następująmi zasadami:
Linia 340: Linia 340:
nieterminalnego <math>V_N</math> dodajemy nowy symbol <math>v_x</math>. Następnie ze  
nieterminalnego <math>V_N</math> dodajemy nowy symbol <math>v_x</math>. Następnie ze  
zbioru <math>P</math> usuwamy powyższą produkcję i dodajemy dwie nowe:
zbioru <math>P</math> usuwamy powyższą produkcję i dodajemy dwie nowe:
<center><math>v \rightarrow xv_x , \;\; v_x \rightarrow 1.</math></center>
<center><math>v \rightarrow xv_x , \;\; v_x \rightarrow 1</math>.</center>


Zauważmy, że jeśli <math>x\neq y</math>, to <math>v_x \neq v_y</math>.
Zauważmy, że jeśli <math>x\neq y</math>, to <math>v_x \neq v_y</math>.
Linia 358: Linia 358:
<math>\mathcal{A}  =(S,A,f,\{s_0\},T)</math>, przyjmując <math>S= V_N</math>, <math>A= V_T</math>  
<math>\mathcal{A}  =(S,A,f,\{s_0\},T)</math>, przyjmując <math>S= V_N</math>, <math>A= V_T</math>  
oraz <math>s_0 = v_0</math> i definiując następująco funkcję przejść: <math>f(v,a) =  
oraz <math>s_0 = v_0</math> i definiując następująco funkcję przejść: <math>f(v,a) =  
\{ v' \in V_N \; : \; v \rightarrow av' \in P \}.</math> Przjmując
\{ v' \in V_N \; : \; v \rightarrow av' \in P \}</math>. Przjmując
<math>T = \{ v \in V_N \; : \; v \rightarrow 1 \in P \}</math>  jako zbiór stanów końcowych, stwierdzamy,
<math>T = \{ v \in V_N \; : \; v \rightarrow 1 \in P \}</math>  jako zbiór stanów końcowych, stwierdzamy,
że automat  <math>\mathcal{A} </math>  rozpoznaje język
że automat  <math>\mathcal{A}</math>  rozpoznaje język


<center><math>L(\mathcal{A})=\{w\in V_{T}^{*}\ : :\ : f(s_{0})\cap T\neq \emptyset \}=L.</math></center>
<center><math>L(\mathcal{A})=\{w\in V_{T}^{*}\ : :\ : f(s_{0})\cap T\neq \emptyset \}=L</math>.</center>


Uzyskany rezultat, w świetle równości  <math>\mathcal{REG}(A^{*})=\mathcal{RE}C(A^{*}) </math> ,
Uzyskany rezultat, w świetle równości  <math>\mathcal{REG}(A^{*})=\mathcal{RE}C(A^{*})</math> ,
kończy dowód twierdzenia.
kończy dowód twierdzenia.


Linia 409: Linia 409:
właśnie rodzina, czyli ogół języków
właśnie rodzina, czyli ogół języków
typu '''(3)''' w hierarchii
typu '''(3)''' w hierarchii
Chomsky'ego pokrywa się z rodziną  <math>\mathcal{REG}(A^{*}) </math>  .
Chomsky'ego pokrywa się z rodziną  <math>\mathcal{REG}(A^{*})</math>  .


<span id="twierdzenie_2_3">{{twierdzenie|2.3.||
<span id="twierdzenie_2_3">{{twierdzenie|2.3.||


Dla dowolnego alfabetu  <math>A </math>  rodziny języków regularnych  <math>A^{*} </math>  
Dla dowolnego alfabetu  <math>A</math>  rodziny języków regularnych  <math>A^{*}</math>  
oraz języków generowanych przez gramatyki regularne są równe, czyli
oraz języków generowanych przez gramatyki regularne są równe, czyli
<math>\mathcal{REG}(A^{*})=\mathcal{L}_{3} </math> .
<math>\mathcal{REG}(A^{*})=\mathcal{L}_{3}</math> .


}}</span>
}}</span>
Linia 421: Linia 421:
{{dowod|||
{{dowod|||


Odbicie zwierciadlane  dowolnego języka  <math>L\in \mathcal{REG}(A^{*}) </math> , czyli język
Odbicie zwierciadlane  dowolnego języka  <math>L\in \mathcal{REG}(A^{*})</math> , czyli język
<math>\overleftarrow{L} </math>  należy również do rodziny  <math>\mathcal{REG}(A^{*}) </math> ,
<math>\overleftarrow{L}</math>  należy również do rodziny  <math>\mathcal{REG}(A^{*})</math> ,
co oznacza, że  <math>\overleftarrow{L}\in \mathcal{RE}C(A^{*}) </math> .
co oznacza, że  <math>\overleftarrow{L}\in \mathcal{RE}C(A^{*})</math> .
Na podstawie twierdzenia 2.2. (patrz [[#twierdzenie_2_2|twierdzenie 2.2.]]) istnieje więc gramatyka prawoliniowa
Na podstawie twierdzenia 2.2. (patrz [[#twierdzenie_2_2|twierdzenie 2.2.]]) istnieje więc gramatyka prawoliniowa
<math>G </math>  taka, że  <math>\overleftarrow{L}=L(G) </math> . A stąd wniosek, że
<math>G</math>  taka, że  <math>\overleftarrow{L}=L(G)</math> . A stąd wniosek, że
<math>L=\overleftarrow{\overleftarrow{L}}=L(\overline{G}) </math>  
<math>L=\overleftarrow{\overleftarrow{L}}=L(\overline{G})</math>  
dla pewnej gramatyki  <math>\overline{G} </math>  typu '''(3)'''. Zatem  <math>L\in \mathcal{L}_{3} </math> .
dla pewnej gramatyki  <math>\overline{G}</math>  typu '''(3)'''. Zatem  <math>L\in \mathcal{L}_{3}</math> .


Rozważmy teraz język  <math>L </math>  typu '''(3)''', czyli  <math>L=L(G) </math>  dla pewnej
Rozważmy teraz język  <math>L</math>  typu '''(3)''', czyli  <math>L=L(G)</math>  dla pewnej
gramatyki regularnej. A więc  <math>\overleftarrow{L}=L(\overline{G}) </math>  
gramatyki regularnej. A więc  <math>\overleftarrow{L}=L(\overline{G})</math>  
dla pewnej gramatyki prawoliniowej i  <math>\overleftarrow{L}\in \mathcal{RE}C(A^{*}) </math> .
dla pewnej gramatyki prawoliniowej i  <math>\overleftarrow{L}\in \mathcal{RE}C(A^{*})</math> .
Z twierdzenia Kleene'ego wynika, że  <math>\overleftarrow{L}\in \mathcal{REG}(A^{*}) </math>  
Z twierdzenia Kleene'ego wynika, że  <math>\overleftarrow{L}\in \mathcal{REG}(A^{*})</math>  
i ostatecznie  <math>L=\overleftarrow{\overleftarrow{L}}\in \mathcal{REG}(A^{*}) </math> ,
i ostatecznie  <math>L=\overleftarrow{\overleftarrow{L}}\in \mathcal{REG}(A^{*})</math> ,
co kończy dowód twierdzenia.
co kończy dowód twierdzenia.



Aktualna wersja na dzień 22:14, 11 wrz 2023

W wykładzie udowodnimy twierdzenie Kleene'ego, które orzeka, że rodzina języków regularnych jest identyczna z rodziną języków rozpoznawanych przez automaty o skończonej liczbie stanów. Przedstawimy własności języków regularnych i gramatyk typu (3). Na koniec uzasadnimy, że rodziny języków regularnych, rozpoznawalnych oraz generowanych przez gramatyki typu (3), są tożsame.

Twierdzenie Kleene

Stephen Cole Kleene (1909-1994)
Zobacz biografię

Wiemy już, z poprzednich wykładów, że rodzina wyrażeń regularnych

określa rodzinę języków regularnych. Celem pierwszej części tego wykładu jest ustalenie związku pomiędzy rodziną języków regularnych a rodziną języków rozpoznawanych przez automaty o skończonej liczbie stanów. Twierdzenie, udowodnione przez S.C.Kleene'ego w roku 1956, orzeka, iż te dwie rodziny języków są identyczne.

Twierdzenie 1.1.

Dla dowolnego skończonego alfabetu A

𝒢(A*)=𝒞(A*)

Dowód

Dowód pierwszej części twierdzenia, czyli inkluzja 𝒢(A*)𝒞(A*) , będzie prowadzony zgodnie ze strukturą definicji rodziny języków regularnych 𝒢(A*) .

1. Język pusty jest rozpoznawany przez dowolny automat 𝒜=(S,A,f,s0,T), w którym zbiór stanów końcowych T jest pusty.

2. Język a złożony z dowolnej litery aA jest rozpoznawany przez automat
Rysunek 1

Dla dalszej części dowodu ustalmy, iż dane są języki L1,L2 rozpoznawane odpowiednio przez automaty deterministyczne 𝒜i=(Si,fi,s0i,Ti), gdzie i=1,2.

3. Sumę mnogościową języków L1,L2, czyli język L=L1L2 rozpoznaje automat 𝒜=(S,f,s0,T), dla którego S=S1×S2, s0=(s01,s02),  :T=T1×S2S1×T2 oraz dla dowolnego stanu (s1,s2)S i litery aA funkcja przejść określona jest równością

f((s1,s2),a)=(f1(s1,a),f2(s2,a)).

4. Katenację języków L1,L2, czyli język L=L1L2 rozpoznaje automat 𝒜=(S,f,s0,T), dla którego S=S1×𝒫(S2),s0=(s01,) oraz dla dowolnego stanu (s1,S'2)S i litery aA funkcja przejść określona jest następująco:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle f((s_1,S'_2),a) = \left\{ \begin{array} {ll} (f_1(s_1,a),f_2(S'_2,a)) & \text{gdy} f_1(s_1,a) \notin T_1 ,\\ (f_1(s_1,a),f_2(S'_2,a) \cup \{ {s_0}^2\}) & \text{gdy}f_1(s_1,a) \in T_1, \end{array} \right} .

a zbiorem stanów końcowych jest

T=S1×{S𝒫(S2):ST2}.

5. Załóżmy, że język L rozpoznaje automat 𝒜=(S,f,s0,T). Określimy automat niedeterministyczny, który będzie rozpoznawał gwiazdkę Kleene języka L, czyli L*. Automat niedeterministyczny 𝒜=(S,f,{s0},T), w którym

Parser nie mógł rozpoznać (błąd składni): {\displaystyle f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} & \text{gdy} f(s,a) \notin T ,\\ \{ f(s,a),s_0 \} & \text{gdy} f(s,a) \in T \end{array} \right} .

rozpoznaje język język L+. Dowód tego faktu jest indukcyjny i pozostawiamy go na ćwiczenia. Zauważmy teraz, że język {1} rozpoznaje automat

Rysunek 2

Ponieważ L*=L+{1} , to korzystając z udowodnionej już zamkniętości języków rozpoznawanych ze względu na sumę mnogościową, stwierdzamy, że istnieje automat rozpoznający język L*.

Zatem dowód inkluzji 𝒢(A*)𝒞(A*) jest zakończony.

Przejdziemy teraz do dowodu inkluzji 𝒢(A*)C(A*) .

Niech L oznacza dowolny język rozpoznawany przez automat 𝒜=(S,f,s0,T). Dowód polega na rozbiciu języka L na fragmenty, dla których stwierdzenie, że są to języki regularne będzie dość oczywiste. Natomiast sam język L będzie wynikiem operacji regularnych określonych na tych właśnie fragmentach. Poniżej przeprowadzamy defragmentację języka L.

Dla s,tS niech

L(s,t)={wA*:f(s,w)=t}.

Jest to język złożony ze słów, które przeprowadzają stan s automatu 𝒜 w stan t . Ogół liter alfabetu A przeprowadzających stan s w t oznaczymy przez

A(s,t)={aA:f(s,a)=t}.

Dla stanów s,tS i zbioru S1S niech

L(s,S1,t)={wA*:f(s,w)=t,f(s,w1)S1:w=w1v,w1,vA*}.

Jest to język, który można przedstawić graficznie następująco:

Rysunek 3

Na koniec przyjmijmy

L(s,S2,t)={wA*:f(s,w)=t,f(s,w1)S2:w=w1v,w1,vA+},

określony dla S2S i s,tSS2

Język ten jest graficznie interpretowany poniżej.

Rysunek 4

Wprost z określeń wynika, że wszystkie wprowadzone powyżej języki są regularne, czyli należą do rodziny 𝒢(A*) . Dowód tego faktu przebiega indukcyjnie ze względu na liczbę elementów zbiorów S1 i S2. Szczegóły tego dowodu pominiemy. Natomiast warto wskazać rolę, jaką spełniają w dowodzie wprowadzone wyżej języki. A mianowicie:

L(s,{s},s)=A(s,s)*,


L(s,{r},t)=A(s,r)A(r,r)*A(r,t),


L(s,S1,t)=L(s,S1{s},s)*[rS1{s}A(s,r)L(r,S1{s},t)].

Tę ostatnią równość przedstawia poniższy rysunek.

Rysunek 5
L(s,S2,t)=r,rS2A(s,r)L(r,S2,r)A(r,t),

co graficznie można przedstawić następująco:

Rysunek 6

Dochodzimy więc do konkluzji, iż jezyki L(s,S1,t) oraz L(s,S2,t) są regularne. W szczególności zatem regularny jest język L(s0,S,t)=L(s0,t).

Język L możemy przedstawić w następującej postaci:

L=tT{wA*:f(s0,w)=t}=tTL(s0,t),

co w połączeniu z ustaleniami punktu 3 z poprzedniej części dowodu uzasadnia tezę, że język L należy do rodziny 𝒢(A*).

Własności języków regularnych i gramatyk regularnych

W tej części wykładu omówimy własności rodziny języków i gramatyk regularnych, czyli typu (3) w hierarchii Chomsky'ego. Ustalimy też związek pomiędzy językami a gramatykami regularnymi. Zbadamy zamkniętość rodziny języków regularnych ze względu na operacje mnogościowe, czyli ze względu na sumę, przecięcie, różnicę i uzupełnienie. Rozpoczniemy jednak tę część wykładu od wprowadzenia jednoargumentowego działania na słowach zwanego odbiciem zwierciadlanym.

Definicja 2.1.

Odbiciem zwierciadlanym słowa w=a1anA* nazywamy słowo w=ana1. Odbiciem zwierciadlanym języka LA* nazywamy język L={wA*:wL}.

Twierdzenie 2.1.

Rodzina 𝒢(A*)=𝒞(A*) jest zamknięta ze względu na:

(1) sumę mnogościową, przecięcie, różnicę i uzupełnienie,
(2) katenację i operację iteracji *
(3) obraz homomorficzny,
(4) podstawienie regularne,
(5) przeciwobraz homomorficzny,
(6) odbicie zwierciadlane.

Dowód

1. Zamkniętość rodziny języków 𝒢(A*) ze względu na sumę mnogościową wynika z twierdzenia Kleene'ego. Automat akceptujący iloczyn języków otrzymujemy, zmieniając odpowiednio zbiór stanów końcowych w automacie rozpoznającym sumę. Bowiem pozostając przy oznaczeniach punktu 3 z dowodu twierdzenia Kleene'ego, automat 𝒜=(S,f,s0,F), gdzie F=T1×T2, rozpoznaje język L1L2. Jeśli automat 𝒜=(S,f,s0,T) akceptuje język L, to automat 𝒜=(S,f,s0,ST) akceptuje język L=A*L. Ostatnia własność implikuje zamkniętość ze względu na uzupełnienie.

2 Z twierdzenia Kleene'ego, punkt 4 i 5, wynika zamkniętość ze względu na katenację i operację iteracji *.

3. Niech h:A*B* będzie homomorfizmem. Dowód implikacji

L𝒢(A*) :h(L)𝒢(B*)

przeprowadzimy zgodnie ze strukturą definicji rodziny języków regularnych. Dla L= i dla L={a} gdzie a jest dowolną literą alfabetu A , implikacja jest oczywista. W pierwszym przypadku obrazem homomorficznym jest język pusty, a w drugim język {w} , gdzie w jest pewnym słowem nad alfabetem B . Dla dowolnych języków regularnych X,Y𝒢(A*) prawdziwe są równości:

  • h(XY)=h(X)h(Y)𝒢(B*) ,
  • h(XY)=h(X)h(Y)𝒢(B*) ,
  • h(X*)=h(n=0Xn)=n=0(h(X))n=(h(X))*𝒢(B*)

co kończy dowód tego punktu.

4. Uzasadnienie jest podobne jak dla homomorfizmu. Jedyna różnica tkwi w tym, że dla podstawienia regularnego s:A*𝒫(B*) i dla dowolnej litery aA wartość podstawienia na literze jest pewnym językiem regularnym s(a)=L𝒢(B*) , a nie słowem jak w przypadku homomorfizmu.

5. Niech h:A*B* będzie homomorfizmem. Aby udowodnić implikację

L𝒢(B*) :h1(L)𝒢(A*),

odwołamy się do własności, że dla języka L𝒢(B*) istnieje skończony monoid M i homomorfizm φ:B*M taki, że L=φ1(φ(L)). Dla

homomorfizmu φh:A*M mamy równość:
((φh)1(φh))(h1(L))=h1(L).

Korzystając teraz z punktu 4 twierdzenia 1.2 z wykładu 3 (patrz twierdzenie 1.2. wykład 3), wnioskujemy, że h1(L)𝒢(A*) .

6. Wykorzystamy tutaj zapis języka regularnego przez wyrażenie regularne. Niech dla języka L𝒢(A*) wyrażenie regularne α𝒲 będzie takie, że L=α. Wtedy język L jest opisany przez wyrażenie regularne α, które uzyskujemy z α przez odbicie zwierciadlane, a dokładniej odwrócenie kolejności katenacji w każdej sekwencji tego działania występującej w wyrażeniu regularnym.

W wykładzie drugim wprowadziliśmy pojęcie gramatyki. Wracamy do tego pojęcia, a w szczególności do gramatyki typu (3), czyli regularnej. Przypomnijmy, że produkcje takiej gramatyki G=(VN,VT,v0,P) mają postać:

vvxlubvx

gdzie v,vVN,xVT*. Gramatykę typu (3), nazywamy inaczej lewostronną lub lewoliniową. Określa się też gramatykę regularną prawostronną (prawoliniową). Jest to gramatyka G=(VN,VT,v0,P), której produkcje są postaci:

vxvlubvx

gdzie v,vVN,xVT*. Jeśli język L=L(G) jest generowany przez gramatykę typu (3) (lewoliniową), to jego odbiciem zwierciadlanym jest L=L(G), gdzie G jest gramatyką prawoliniową, którą uzyskuje się z gramatyki G przez odbicie zwierciadlane prawych stron produkcji. Oznacza to, iż zmieniamy produkcje według następujących zasad:

vvx zastępujemy przez vxv
vx zastępujemy przez vx.

Oczywiście, jeśli L jest językiem generowanym przez gramatykę prawoliniową, to L jest generowany przez odpowiednią gramatykę lewoliniową.

Podamy teraz charakterystykę rodziny języków regularnych 𝒢(A*) przez rodzinę gramatyk prawoliniowych.

Twierdzenie 2.2.

Niech LA*. Język L𝒢(A*) wtedy i tylko wtedy, gdy L=L(G) dla pewnej gramatyki prawoliniowej G.

Dowód

Załóżmy, że automat 𝒜=(S,A,f,s0,T) rozpoznaje język L . Definiujemy gramatykę G=(VN,VT,v0,P) przyjmując VN=S,VT=A,v0=s0 oraz określając w następujący sposób zbiór produkcji

P={saf(s,a);:sS,aA}{s1;:sT}.

Dla dowolnego stanu sS i słowa wA+ prawdziwa jest równoważność

s0*ws ; ; ; ;f(s0,w)=s.

Dowód przeprowadzimy indukcyjnie ze względu na długość słowa w. Niech w=a dla pewnego aA. Z definicji zbioru produkcji P wynika równoważność

s0ass=f(s0,a).

Rozważmy teraz w=a1an oraz s0*ws. Z założenia indukcyjnego

wynika, że
f(s0,a1an1)=ss0*a1an1s

oraz, że s=f(s,an) wtedy i tylko wtedy, gdy sans. A więc fakt, że s=f(s0,w)=f(s0,a1an)=f(f(s0,a1an1),an) jest równoważny temu, że s=f(s0,a1an1)ans . A to z kolei równoważne jest

s0*a1an1s,sans

i ostatecznie równoważne faktowi, że s0*a1an1ans . A zatem dowodzona równoważność jest prawdziwa dla wA+, ponieważ

wL(𝒜) : :s=f(s0,w)T : :so*ws,s1P : :wL(G).

Dla w=1 mamy 1L(𝒜) : :s01P : :1L(G) co kończy dowód w jedną stronę.

Rozważmy teraz język L=L(G) generowany przez pewna gramatykę prawoliniową G=(VN,VT,v0,P). Skonstruujemy gramatykę równoważną G i taką, w której wszystkie produkcje są postaci vav lub v1, gdzie v,vVN,aA. Będziemy zamieniać produkcje występujące w gramatyce G na inne, o żądanej postaci, zgodnie z następująmi zasadami:

1. Produkcje typu vv, gdzie v,vVN

Z symbolem nieterminalnym vVN kojarzymy określony poniżej zbiór

VN(v)={vVN:vv1vnvwG}

oraz zbiór produkcji

P(v)={vxv:x1,vVN(v),vxvP}
{vx:vVN(v),vxP}.

Dla każdego takiego symbolu vVN usuwamy ze zbioru P wszystkie produkcje vv i wprowadzamy na to miejsce wszystkie produkcje ze zbioru P(v).

2. Produkcje typu vx dla x1.

Jeśli produkcja taka występuje w P i x1, to do alfabetu nieterminalnego VN dodajemy nowy symbol vx. Następnie ze zbioru P usuwamy powyższą produkcję i dodajemy dwie nowe:

vxvx,vx1.

Zauważmy, że jeśli xy, to vxvy.

3. Produkcje typu vxv dla x>1.

Jeśli va1anvP, przy czym n2, to do alfabetu nieterminalnego VN dodajemy nowe symbole v1,vn, produkcję va1anv usuwamy ze zbioru P i

dodajemy produkcje:
va1v1,v1a2v2,,vn1anv.

Po opisanych powyżej trzech modyfikacjach gramatyki G generowany język, co łatwo zauważyć, nie ulega zmianie. Zatem skonstruowana gramatyka jest równoważna wyjściowej. Dla otrzymanej gramatyki określamy teraz automat niedeterministyczny 𝒜=(S,A,f,{s0},T), przyjmując S=VN, A=VT oraz s0=v0 i definiując następująco funkcję przejść: f(v,a)={vVN:vavP}. Przjmując T={vVN:v1P} jako zbiór stanów końcowych, stwierdzamy, że automat 𝒜 rozpoznaje język

L(𝒜)={wVT* :: :f(s0)T}=L.

Uzyskany rezultat, w świetle równości 𝒢(A*)=C(A*) , kończy dowód twierdzenia.

Algorytmiczną stroną równoważności udowodnionej w powyższym twierdzeniu zajmiemy się w następnym wykładzie. Przykłady ilustrujące twierdzenie zamieszczamy poniżej.

Przykład 2.1.

1. Niech 𝒜=(S,A,f,s0,T) będzie automatem takim, że

S={s0,s1,s2},A={a,b},T={s1}, a graf przejść wygląda następująco:
Rysunek 7

Gramatyka G=(S,A,s0,P), gdzie

P={s0as1,s0bs2,s1as2,s1bs0,s11,s2as0,s2bs1}

akceptuje język L(𝒜).

Zauważmy, że język

L(𝒜)=L(G)={wA*:#aw#bw=1mod3}.

2. Niech G=({v0,v1},{a,b},v0,P), gdzie

P={v0av0,v0ab,v0bv1,v11}.

Gramatykę G przekształcamy w równoważną gramatykę

G=({v0,v1,v2,vb},{a,b},v0,P),

gdzie

P={v0av0,v0av2,v0bv1,v2bvb,v11,vb1}.

Niedeterministyczny automat 𝒜ND=({v0,v1,v2,vb},{a,b},f,v0,{v1,vb}), gdzie graf przejśc wygląda następująco:

Rysunek 8


L(G)=L(𝒜ND)=a*b

Wykorzystując udowodnione do tej pory własności rodziny języków generowanych przez gramatyki regularne, uzasadnimy teraz, iż ta właśnie rodzina, czyli ogół języków typu (3) w hierarchii Chomsky'ego pokrywa się z rodziną 𝒢(A*) .

Twierdzenie 2.3.

Dla dowolnego alfabetu A rodziny języków regularnych A* oraz języków generowanych przez gramatyki regularne są równe, czyli 𝒢(A*)=3 .

Dowód

Odbicie zwierciadlane dowolnego języka L𝒢(A*) , czyli język L należy również do rodziny 𝒢(A*) , co oznacza, że LC(A*) . Na podstawie twierdzenia 2.2. (patrz twierdzenie 2.2.) istnieje więc gramatyka prawoliniowa G taka, że L=L(G) . A stąd wniosek, że L=L=L(G) dla pewnej gramatyki G typu (3). Zatem L3 .

Rozważmy teraz język L typu (3), czyli L=L(G) dla pewnej gramatyki regularnej. A więc L=L(G) dla pewnej gramatyki prawoliniowej i LC(A*) . Z twierdzenia Kleene'ego wynika, że L𝒢(A*) i ostatecznie L=L𝒢(A*) , co kończy dowód twierdzenia.

Zamkniemy rozważania następującą konkluzją podsumowującą główne rezultaty tego wykładu.

Dla dowolnego skończonego alfabetu A prawdziwe są równości:

𝒢(A*)=𝒞(A*)=3

czyli wprowadzone pojęcia rodziny języków regularnych, rozpoznawalnych oraz generowanych przez gramatyki typu (3) są tożsame.