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
Rogoda (dyskusja | edycje)
m Zastępowanie tekstu – „<math> ” na „<math>”
 
(Nie pokazano 23 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
W wykładzie udowodnimy twierdzenie Kleene'ego, które orzeka, że
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.
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.
 
__FORCETOC__
==Twierdzenie Kleene==
==Twierdzenie Kleene==


Wiemy już, z poprzednich wykładów, że rodzina wyrażeń regularnych  
[[grafika:Kleene.gif|thumb|right||Stephen Cole Kleene (1909-1994)<br>[[Biografia Kleene|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  
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  
wykładu jest ustalenie związku pomiędzy rodziną języków regularnych  
Linia 13: Linia 13:
<span id="twierdzenie_1_1">{{twierdzenie|1.1.||
<span id="twierdzenie_1_1">{{twierdzenie|1.1.||


Dla dowolnego skończonego alfabetu <math>\displaystyle A</math>
Dla dowolnego skończonego alfabetu <math>A</math>


<center><math>\displaystyle \mathcal{REG}(A^{*})=\mathcal{REC}(A^{*})</math></center>
<center>
<math>\mathcal{REG}(A^{*})=\mathcal{REC}(A^{*})</math>
</center>


}}</span>
}}</span>
Linia 21: Linia 23:
{{dowod|||
{{dowod|||


Dowód pierwszej części twierdzenia, czyli inkluzja  <math>\displaystyle \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>\displaystyle \mathcal{REG}(A^{*}) </math> .
regularnych  <math>\mathcal{REG}(A^{*})</math> .


1. Język pusty <math>\displaystyle \emptyset</math> jest rozpoznawany przez dowolny
1. Język pusty <math>\emptyset</math> jest rozpoznawany przez dowolny
automat  <math>\displaystyle \mathcal{A}  \displaystyle =(S,A,f,s_0,T),</math> w którym zbiór stanów końcowych <math>\displaystyle T</math> jest pusty.
automat  <math>\mathcal{A}  =(S,A,f,s_0,T)</math>, w którym zbiór stanów końcowych <math>T</math> jest pusty.


2. Język a złożony z dowolnej litery <math>\displaystyle a \in A</math> jest rozpoznawany przez automat
2. Język a złożony z dowolnej litery <math>a \in A</math> jest rozpoznawany przez automat}}
<center>
[[File:ja-lekcja07-w-rys1.svg|250x150px|thumb|center|Rysunek 1]]
</center>


RYSUNEK ja-lekcja7-w-rys1
Dla dalszej części dowodu  ustalmy, iż dane są języki <math>L_1, L_2</math> rozpoznawane odpowiednio
przez automaty deterministyczne  <math>\mathcal{A}_{i}  = (S_i,f_i,{s_0}^i,T_i)</math>, gdzie  <math>i=1,2</math>.


Dla dalszej części dowodu ustalmy, iż dane są języki <math>\displaystyle L_1, L_2</math> rozpoznawane odpowiednio
3. Sumę mnogościową języków <math>L_1, L_2</math>,
przez automaty deterministyczne <math>\displaystyle \mathcal{A}_{i} \displaystyle = (S_i,f_i,{s_0}^i,T_i)</math>, gdzie <math>\displaystyle i=1,2.</math>
czyli język <math>L = L_1 \cup L_2</math> rozpoznaje automat <math>\mathcal{A}  
= (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
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ą


3.  Sumę mnogościową języków <math>\displaystyle L_1, L_2</math>,
<center><math>f((s_{1},s_{2}),a)=(f_{1}(s_{1},a),f_{2}(s_{2},a))</math>.</center>
czyli język <math>\displaystyle L = L_1 \cup L_2</math> rozpoznaje automat  <math>\displaystyle \mathcal{A}
\displaystyle = (S,f,{s_0},T)</math>, dla którego <math>\displaystyle S = S_1 \times S_2</math>, <math>\displaystyle s_0 =
({s_0}^1,{s_0}^2)</math>,  <math>\displaystyle \:  \displaystyle T = T_1 \times S_2\; \cup \;S_1 \times
T_2</math> oraz dla dowolnego stanu  <math>\displaystyle (s_{1},s_{2})\in S  </math>  i litery  <math>\displaystyle a\in A  </math>  funkcja przejść określona jest równością
 
<center><math>\displaystyle f((s_{1},s_{2}),a)=(f_{1}(s_{1},a),f_{2}(s_{2},a)).</math></center>


4.  
4.  
Katenację języków <math>\displaystyle L_1, L_2</math>, czyli
Katenację języków <math>L_1, L_2</math>, czyli
język <math>\displaystyle L = L_1 \cdot L_2</math> rozpoznaje
język <math>L = L_1 \cdot L_2</math> rozpoznaje
automat  <math>\displaystyle \mathcal{A}  \displaystyle = (S,f,{s_0},T)</math>, dla którego
automat  <math>\mathcal{A}  = (S,f,{s_0},T)</math>, dla którego
<math>\displaystyle 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>\displaystyle (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>\displaystyle 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>\displaystyle f((s_1,S'_2),a) = \left\{ \begin{array} {ll} (f_1(s_1,a),f_2(S'_2,a)) &  \textrm{gdy} \displaystyle f_1(s_1,a) \notin T_1\displaystyle  ,\\ (f_1(s_1,a),f_2(S'_2,a) \cup \{ {s_0}^2\}) &  \textrm{gdy}\displaystyle f_1(s_1,a) \in T_1, \displaystyle   \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


<center><math>\displaystyle T=S_{1}\times \left\{ S'\in \mathcal{P}(S_{2})\, :\, S'\cap T_{2}\neq \emptyset \right\} .</math></center>
<center><math>T=S_{1}\times \left\{ S'\in \mathcal{P}(S_{2})\, :\, S'\cap T_{2}\neq \emptyset \right\}</math>.</center>


5.  
5.  
Załóżmy, że język <math>\displaystyle L</math>  rozpoznaje automat  <math>\displaystyle \mathcal{A}  
Załóżmy, że język <math>L</math>  rozpoznaje automat  <math>\mathcal{A}  
\displaystyle =(S,f,s_0,T)</math>. Określimy automat niedeterministyczny,  który  
=(S,f,s_0,T)</math>. Określimy automat niedeterministyczny,  który  
będzie rozpoznawał gwiazdkę Kleene języka <math>\displaystyle L</math>, czyli <math>\displaystyle L^*.</math> Automat  
będzie rozpoznawał gwiazdkę Kleene języka <math>L</math>, czyli <math>L^*</math>. Automat  
niedeterministyczny  <math>\displaystyle \mathcal{A}'  \displaystyle =(S,f',\{ s_0\},T)</math>,
niedeterministyczny  <math>\mathcal{A}'  =(S,f',\{ s_0\},T)</math>,
w którym  
w którym  


<center><math>\displaystyle f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} &  \textrm{gdy} \displaystyle f(s,a) \notin T\displaystyle  ,\\
<center><math>f'(s,a) = \left\{ \begin{array} {ll} \{ f(s,a)\} &  \text{gdy} f(s,a) \notin T ,\\
\{ f(s,a),s_0 \} &  \textrm{gdy} \displaystyle f(s,a) \in T\displaystyle  \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>\displaystyle L^+.</math>  Dowód tego faktu jest indukcyjny i pozostawiamy go na
rozpoznaje język  język <math>L^+</math>.   Dowód tego faktu jest indukcyjny i pozostawiamy go na ćwiczenia.
ćwiczenia.
Zauważmy teraz, że język <math>\{1\}</math> rozpoznaje automat
Zauważmy teraz, że język <math>\displaystyle \{1\}</math> rozpoznaje automat
<center>
[[File:ja-lekcja07-w-rys2.svg|250x150px|thumb|center|Rysunek 2]]
</center>


RYSUNEK ja-lekcja7-w-rys2
Ponieważ  <math>L^{*}=L^{+}\cup \left\{ 1\right\}</math> , to  
 
Ponieważ  <math>\displaystyle 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  
rozpoznający język <math>\displaystyle L^*</math>.
rozpoznający język <math>L^*</math>.


Zatem dowód
Zatem dowód
inkluzji  <math>\displaystyle \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>\displaystyle \mathcal{REG}(A^{*})\supseteq \mathcal{RE}C(A^{*}) </math> .
<math>\mathcal{REG}(A^{*})\supseteq \mathcal{RE}C(A^{*})</math> .


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


Dla <math>\displaystyle s,t \in S</math>  niech
Dla <math>s,t \in S</math>  niech
<center><math>\displaystyle 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>\displaystyle s </math>   
Jest to język złożony ze słów, które przeprowadzają stan  <math>s</math>   
automatu  <math>\displaystyle \mathcal{A} </math>  w stan  <math>\displaystyle t </math> . Ogół liter alfabetu  <math>\displaystyle A  
automatu  <math>\mathcal{A}</math>  w stan  <math>t</math> . Ogół liter alfabetu  <math>A  
</math>  przeprowadzających stan  <math>\displaystyle s </math>  w  <math>\displaystyle t </math>  oznaczymy przez  
</math>  przeprowadzających stan  <math>s</math>  w  <math>t</math>  oznaczymy przez  
<center><math>\displaystyle 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>


Dla stanów <math>\displaystyle s,t \in S </math> i zbioru <math>\displaystyle  S_1 \subseteq S</math> niech
Dla stanów <math>s,t \in S</math> i zbioru <math>S_1 \subseteq S</math> niech
<center><math>\displaystyle L(s,S_1,t) = \{ w \in A^* : f(s,w) =t, f(s,w_1) \in S_1\;:\;w= w_1v,\; w_1, v \in A^* \}.</math></center>
<center><math>L(s,S_1,t) = \{ w \in A^* : f(s,w) =t, f(s,w_1) \in S_1\;:\;w= w_1v,\; w_1, v \in A^* \}</math>.</center>


Jest to język, który można przedstawić graficznie następująco:<br>
Jest to język, który można przedstawić graficznie następująco:<br>
<center>
[[File:ja-lekcja07-w-rys3.svg|350x150px|thumb|center|Rysunek 3]]
</center>


RYSUNEK ja-lekcja7-w-rys3
Na koniec przyjmijmy <center><math>\overline{L}(s,S_2,t) = \{ w \in A^* : f(s,w)  
 
=t, f(s,w_1) \in S_2\; : \;w = w_1v,\; w_1,v \in A^+ \}</math>,</center>
Na koniec przyjmijmy <center><math>\displaystyle \overline{L}(s,S_2,t) = \{ w \in A^* : f(s,w)  
=t, f(s,w_1) \in S_2\; : \;w = w_1v,\; w_1,v \in A^+ \},</math></center>
określony  
określony  
dla <math>\displaystyle  S_2 \subseteq S</math> i <math>\displaystyle s,t \in S - S_2</math>
dla <math>S_2 \subseteq S</math> i <math>s,t \in S - S_2</math>


Język ten jest graficznie interpretowany poniżej.<br>
Język ten jest graficznie interpretowany poniżej.<br>
 
<center>
RYSUNEK ja-lekcja7-w-rys4
[[File:ja-lekcja07-w-rys4.svg|350x150px|thumb|center|Rysunek 4]]
</center>


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>\displaystyle \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>\displaystyle S_1</math> i <math>\displaystyle 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.  
Natomiast warto wskazać rolę, jaką spełniają w dowodzie wprowadzone  
Natomiast warto wskazać rolę, jaką spełniają w dowodzie wprowadzone  
wyżej języki. A mianowicie:
wyżej języki. A mianowicie:


<center><math>\displaystyle L(s,\left\{ s\right\} ,s)=A(s,s)^{*},</math></center>
<center><math>L(s,\left\{ s\right\} ,s)=A(s,s)^{*}</math>,</center>




<center><math>\displaystyle \overline{L}(s,\left\{ r\right\} ,t)=A(s,r)A(r,r)^{*}A(r,t),</math></center>
<center><math>\overline{L}(s,\left\{ r\right\} ,t)=A(s,r)A(r,r)^{*}A(r,t)</math>,</center>




<center><math>\displaystyle L(s,S_1,t) = \overline{L}(s,S_1 \setminus \{s\},s)^*\;
<center><math>L(s,S_1,t) = \overline{L}(s,S_1 \setminus \{s\},s)^*\;
{\Large [}\bigcup_{r \in S_1 \setminus \{s\}}A(s,r)L(r,S_1 -  
[\bigcup_{r \in S_1 \setminus \{s\}}A(s,r)L(r,S_1 -  
\{s\},t)\;{\Large ]}.</math></center>
\{s\},t)\;]</math>.</center>


Tę ostatnią równość  przedstawia poniższy rysunek.<br>
Tę ostatnią równość  przedstawia poniższy rysunek.<br>
<center>
[[File:ja-lekcja07-w-rys5.svg|350x150px|thumb|center|Rysunek 5]]
</center>


RYSUNEK ja-lekcja7-w-rys5
<center><math>\overline{L}(s,S_2,t) = \bigcup_{r,r' \in S_2} A(s,r) L(r,S_2,r') A(r',t)</math>,</center>
 
<center><math>\displaystyle \overline{L}(s,S_2,t) = \bigcup_{r,r' \in S_2} A(s,r) L(r,S_2,r') A(r',t),</math></center>


co graficznie można przedstawić następująco:<br>
co graficznie można przedstawić następująco:<br>
 
<center>
RYSUNEK ja-lekcja7-w-rys6
[[File:ja-lekcja07-w-rys6.svg|350x150px|thumb|center|Rysunek 6]]
</center>


Dochodzimy więc do  konkluzji, iż
Dochodzimy więc do  konkluzji, iż
jezyki <math>\displaystyle L(s,S_{1},t)</math> oraz <math>\displaystyle \overline{L}(s,S_{2},t)</math>  są regularne.
jezyki <math>L(s,S_{1},t)</math> oraz <math>\overline{L}(s,S_{2},t)</math>  są regularne.
W szczególności zatem regularny jest język
W szczególności zatem regularny jest język
<math>\displaystyle L(s_{0},S,t)=L(s_{0},t)</math>.
<math>L(s_{0},S,t)=L(s_{0},t)</math>.


Język <math>\displaystyle L</math> możemy przedstawić w następującej postaci:
Język <math>L</math> możemy przedstawić w następującej postaci:
<center><math>\displaystyle L = \bigcup_{t \in T} \{w \in A^* : f(s_0,w) = t \} = \bigcup_{t \in T} L(s_0,t),</math></center>
<center><math>L = \bigcup_{t \in T} \{w \in A^* : f(s_0,w) = t \} = \bigcup_{t \in T} L(s_0,t)</math>,</center>


co w połączeniu z ustaleniami punktu 3 z poprzedniej części dowodu uzasadnia tezę, że
co w połączeniu z ustaleniami punktu 3 z poprzedniej części dowodu uzasadnia tezę, że
język <math>\displaystyle L</math> należy do rodziny  <math>\displaystyle \mathcal{REG}(A^{*})</math>.
język <math>L</math> należy do rodziny  <math>\mathcal{REG}(A^{*})</math>.
}}


==Własności języków regularnych i gramatyk regularnych==
==Własności języków regularnych i gramatyk regularnych==
Linia 167: Linia 173:
<span id="definicja_2_1">{{definicja|2.1.||
<span id="definicja_2_1">{{definicja|2.1.||


Odbiciem zwierciadlanym słowa <math>\displaystyle  w = a_1 \ldots a_n \in A^*</math> nazywamy
Odbiciem zwierciadlanym słowa <math>w = a_1 \ldots a_n \in A^*</math> nazywamy
słowo <math>\displaystyle  \stackrel{\leftarrow}{w} = a_n \ldots a_1 </math>. Odbiciem zwierciadlanym języka <math>\displaystyle L \subset A^*</math>
słowo <math>\stackrel{\leftarrow}{w} = a_n \ldots a_1</math>. Odbiciem zwierciadlanym języka <math>L \subset A^*</math>
nazywamy język <math>\displaystyle  \stackrel{\leftarrow}{L} = \{ \stackrel{\leftarrow}{w} \in A^* \; : \; w \in L \}.</math>
nazywamy język <math>\stackrel{\leftarrow}{L} = \{ \stackrel{\leftarrow}{w} \in A^* \; : \; w \in L \}</math>.


}}</span>
}}</span>
Linia 175: Linia 181:
<span id="twierdzenie_2_1">{{twierdzenie|2.1.||
<span id="twierdzenie_2_1">{{twierdzenie|2.1.||


Rodzina  <math>\displaystyle \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>\displaystyle "*" ,  </math>
:(2)  katenację i operację iteracji <math>* </math>
:(3)  obraz homomorficzny,
:(3)  obraz homomorficzny,
:(4)  podstawienie regularne,
:(4)  podstawienie regularne,
Linia 187: Linia 193:
{{dowod|||
{{dowod|||


1.  Zamkniętość rodziny języków  <math>\displaystyle \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>\displaystyle \mathcal{A}  \displaystyle =(S,f,{s_0},F),</math> gdzie <math>\displaystyle F = T_1 \times T_2</math>, rozpoznaje język <math>\displaystyle L_1 \cap L_2.</math> Jeśli automat  <math>\displaystyle \mathcal{A} \displaystyle =(S,f,s_0,T)</math> akceptuje język <math>\displaystyle L</math>, to automat  <math>\displaystyle \overline{\mathcal{A}}  \displaystyle =(S,f,s_0,S\backslash T)</math> akceptuje język <math>\displaystyle \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>\displaystyle "*</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>\displaystyle 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


<center><math>\displaystyle L\in \mathcal{REG}(A^{*})\Longrightarrow \: h(L)\in \mathcal{REG}(B^{*})</math></center>
<center><math>L\in \mathcal{REG}(A^{*})\Longrightarrow \ : h(L)\in \mathcal{REG}(B^{*})</math></center>


przeprowadzimy zgodnie ze strukturą definicji  rodziny języków regularnych.
przeprowadzimy zgodnie ze strukturą definicji  rodziny języków regularnych.
Dla  <math>\displaystyle L=\emptyset   </math>  i dla  <math>\displaystyle L=\{a\} </math>
Dla  <math>L=\emptyset</math>  i dla  <math>L=\{a\}</math>
gdzie  <math>\displaystyle a </math>  jest dowolną literą alfabetu  <math>\displaystyle 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>\displaystyle \{w\} </math> , gdzie  <math>\displaystyle w </math>  jest pewnym  
pusty, a w drugim język  <math>\{w\}</math> , gdzie  <math>w</math>  jest pewnym  
słowem nad alfabetem  <math>\displaystyle B </math> . Dla dowolnych języków regularnych <math>\displaystyle  X,  
słowem nad alfabetem  <math>B</math> . Dla dowolnych języków regularnych <math>X,  
Y \in\displaystyle \mathcal{REG}(A^{*}) </math>  prawdziwe są równości:
Y \in\mathcal{REG}(A^{*})</math>  prawdziwe są równości:
* <math>\displaystyle h( X \cup Y)=h(X) \cup h(Y) \in\displaystyle \mathcal{REG}(B^{*}) </math> ,
* <math>h( X \cup Y)=h(X) \cup h(Y) \in\mathcal{REG}(B^{*})</math> ,
* <math>\displaystyle h( X \cdot Y) = h(X) \cdot h(Y) \in\displaystyle \mathcal{REG}(B^{*}) </math> ,
* <math>h( X \cdot Y) = h(X) \cdot h(Y) \in\mathcal{REG}(B^{*})</math> ,
* <math>\displaystyle {\displaystyle h(X^*)=h( \bigcup_{n=0} ^\infty X^n) = \bigcup_{n=0} ^\infty (h(X))^n = (h(X))^* \in}\displaystyle \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>\displaystyle s:A^{*}\longrightarrow \mathcal{P}(B^{*}) </math> i dla dowolnej litery <math>\displaystyle a \in A</math> wartość podstawienia na literze jest pewnym językiem regularnym  <math>\displaystyle 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.


5.  Niech <math>\displaystyle h: A^* \longrightarrow B^*</math> będzie homomorfizmem.
5.  Niech <math>h: A^* \longrightarrow B^*</math> będzie homomorfizmem.
Aby udowodnić implikację
Aby udowodnić implikację


<center><math>\displaystyle L\in \mathcal{REG}(B^{*})\Longrightarrow \: h^{-1}(L)\in  
<center><math>L\in \mathcal{REG}(B^{*})\Longrightarrow \ : h^{-1}(L)\in  
\mathcal{REG}(A^{*}),</math></center>
\mathcal{REG}(A^{*})</math>,</center>


odwołamy się do własności, że dla języka <math>\displaystyle L  
odwołamy się do własności, że dla języka <math>L  
\in\displaystyle \mathcal{REG}(B^{*}) </math>  istnieje
\in\mathcal{REG}(B^{*})</math>  istnieje
skończony monoid <math>\displaystyle \; M \;</math> i
skończony monoid <math>\; M \;</math> i
homomorfizm <math>\displaystyle \varphi : B^* \longrightarrow M</math> taki, że
homomorfizm <math>\varphi : B^* \longrightarrow M</math> taki, że
<math>\displaystyle L = \varphi^{-1}(\varphi (L)).</math> Dla
<math>L = \varphi^{-1}(\varphi (L))</math>. Dla
homomorfizmu <math>\displaystyle  \varphi \circ h : A^* \longrightarrow M </math> mamy równość: <center><math>\displaystyle  ((\varphi \circ h)^{-1} \circ (\varphi \circ h))(h^{-1} (L)) = h^{-1}(L).</math></center>
homomorfizmu <math>\varphi \circ h : A^* \longrightarrow M</math> mamy równość: <center><math>((\varphi \circ h)^{-1} \circ (\varphi \circ h))(h^{-1} (L)) = h^{-1}(L)</math>.</center>


Korzystając teraz z
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
punktu [[##4|Uzupelnic 4|]] twierdzenia [[##ja-lekcja3-w tw2.1|Uzupelnic ja-lekcja3-w tw2.1|]], wnioskujemy, że
<math>h^{-1}(L) \in\mathcal{REG}(A^{*})</math> .
<math>\displaystyle  h^{-1}(L) \in\displaystyle \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>\displaystyle L \in\displaystyle \mathcal{REG}(A^{*}) </math>  wyrażenie regularne  <math>\displaystyle \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>\displaystyle  L = \mid {\bf \alpha} \mid </math>. Wtedy język <math>\displaystyle \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>\displaystyle \stackrel{\leftarrow}{\bf \alpha}</math>,
jest opisany przez wyrażenie regularne <math>\stackrel{\leftarrow}{\bf \alpha}</math>,
które uzyskujemy z <math>\displaystyle {\bf \alpha}</math> przez odbicie zwierciadlane, a dokładniej odwrócenie
które uzyskujemy z <math>{\bf \alpha}</math> przez odbicie zwierciadlane, a dokładniej odwrócenie
kolejności katenacji w każdej sekwencji tego działania występującej w
kolejności katenacji w każdej sekwencji tego działania występującej w
wyrażeniu regularnym.
wyrażeniu regularnym.
Linia 240: Linia 245:
W wykładzie drugim wprowadziliśmy pojęcie gramatyki. Wracamy do tego pojęcia, a w
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
szczególności do gramatyki  typu '''(3)''', czyli regularnej. Przypomnijmy, że
produkcje takiej gramatyki <math>\displaystyle 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>\displaystyle  v \rightarrow v' x \;\; lub \;\;\; v \rightarrow x, </math></center>
<center><math>v \rightarrow v' x \;\; lub \;\;\; v \rightarrow x</math></center>


gdzie <math>\displaystyle 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  
'''(3)''', nazywamy inaczej lewostronną lub lewoliniową.  Określa się też gramatykę regularną  
'''(3)''', nazywamy inaczej lewostronną lub lewoliniową.  Określa się też gramatykę regularną  
prawostronną  
prawostronną  
(prawoliniową). Jest to  
(prawoliniową). Jest to  
gramatyka <math>\displaystyle 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>\displaystyle  v \rightarrow xv' \;\; lub \;\;\; v \rightarrow x, </math></center>
<center><math>v \rightarrow xv' \;\; lub \;\;\; v \rightarrow x</math></center>


gdzie <math>\displaystyle v,v' \in V_N , \; x \in {V_T}^*</math>. Jeśli język <math>\displaystyle 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  
generowany przez gramatykę typu '''(3)''' (lewoliniową), to  
generowany przez gramatykę typu '''(3)''' (lewoliniową), to  
jego odbiciem zwierciadlanym jest <math>\displaystyle  \stackrel{\leftarrow}{L} =L (  
jego odbiciem zwierciadlanym jest <math>\stackrel{\leftarrow}{L} =L (  
\stackrel{\leftarrow}{G})</math>, gdzie <math>\displaystyle \stackrel{\leftarrow}{G}</math> jest  
\stackrel{\leftarrow}{G})</math>, gdzie <math>\stackrel{\leftarrow}{G}</math> jest  
gramatyką prawoliniową, którą uzyskuje się z gramatyki <math>\displaystyle G</math> przez  
gramatyką prawoliniową, którą uzyskuje się z gramatyki <math>G</math> przez  
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>\displaystyle  v \rightarrow v' x \;\; </math> zastępujemy przez <math>\displaystyle  \;\;\; 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>\displaystyle  v \rightarrow x \;\; </math> zastępujemy przez <math>\displaystyle  \;\;\; 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>\displaystyle 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
<math>\displaystyle  \stackrel{\leftarrow}{L}</math> jest
<math>\stackrel{\leftarrow}{L}</math> jest
generowany przez odpowiednią gramatykę lewoliniową.
generowany przez odpowiednią gramatykę lewoliniową.


Podamy teraz charakterystykę rodziny języków regularnych  <math>\displaystyle \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>\displaystyle L \subset A^*</math>. Język <math>\displaystyle L \in\displaystyle \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>\displaystyle L =L(G)</math> dla pewnej gramatyki prawoliniowej <math>\displaystyle G</math>.
gdy <math>L =L(G)</math> dla pewnej gramatyki prawoliniowej <math>G</math>.


}}</span>
}}</span>
Linia 277: Linia 282:
{{dowod|||
{{dowod|||


Załóżmy, że automat  <math>\displaystyle \mathcal{A}  \displaystyle =(S,A,f,s_0,T) </math>  rozpoznaje język  <math>\displaystyle 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>\displaystyle G = (V_N , V_T , v_0 ,P)</math>
Definiujemy gramatykę <math>G = (V_N , V_T , v_0 ,P)</math>
przyjmując <math>\displaystyle 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
zbiór produkcji
zbiór produkcji
<center><math>\displaystyle P = \{ s \rightarrow a f(s ,a) \; :s \in S, a \in A \} \cup \{ s \rightarrow 1 \; : s \in T \} .</math></center>
<center><math>P = \{ s \rightarrow a f(s ,a) ; :s \in S, a \in A \} \cup \{ s \rightarrow 1 ; : s \in T \}</math>.</center>


Dla dowolnego stanu <math>\displaystyle  s \in S</math> i słowa <math>\displaystyle 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>\displaystyle  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>\displaystyle w</math>. Niech <math>\displaystyle w = a, </math> dla pewnego <math>\displaystyle 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>\displaystyle P</math> wynika równoważność
Z definicji zbioru produkcji <math>P</math> wynika równoważność
<center><math>\displaystyle 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>


Rozważmy teraz <math>\displaystyle w = a_1 \ldots a_n</math> oraz <math>\displaystyle s_0 \mapsto^* ws</math>. Z założenia indukcyjnego
Rozważmy teraz <math>w = a_1 \ldots a_n</math> oraz <math>s_0 \mapsto^* ws</math>. Z założenia indukcyjnego
wynika, że <center><math>\displaystyle  f(s_0 , a_1 \ldots a_{n-1}) =s' \Longleftrightarrow s_0 \mapsto^* a_1 \ldots a_{n-1}s'</math></center>
wynika, że <center><math>f(s_0 , a_1 \ldots a_{n-1}) =s' \Longleftrightarrow s_0 \mapsto^* a_1 \ldots a_{n-1}s'</math></center>


oraz, że <math>\displaystyle  s = f(s' ,a_n )</math> wtedy
oraz, że <math>s = f(s' ,a_n )</math> wtedy
i tylko wtedy, gdy <math>\displaystyle 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>\displaystyle 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>\displaystyle 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>\displaystyle 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>\displaystyle 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>\displaystyle w \in A^+ </math>, ponieważ
A zatem dowodzona równoważność jest prawdziwa dla <math>w \in A^+</math>, ponieważ


<center><math>\displaystyle 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>\displaystyle w=1 </math>  mamy  <math>\displaystyle 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ę.


Rozważmy teraz język <math>\displaystyle L = L(G)</math> generowany przez pewna gramatykę prawoliniową
Rozważmy teraz język <math>L = L(G)</math> generowany przez pewna gramatykę prawoliniową
<math>\displaystyle 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>\displaystyle G</math> i taką, w której wszystkie produkcje są postaci
<math>G</math> i taką, w której wszystkie produkcje są postaci
<math>\displaystyle v \rightarrow a v' </math>  lub  <math>\displaystyle  v \rightarrow 1</math>, gdzie <math>\displaystyle 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>\displaystyle 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:


1. Produkcje typu <math>\displaystyle  v \rightarrow v'</math>, gdzie <math>\displaystyle v,v' \in V_N </math>
1. Produkcje typu <math>v \rightarrow v'</math>, gdzie <math>v,v' \in V_N</math>


Z symbolem nieterminalnym <math>\displaystyle v \in V_N </math> kojarzymy określony poniżej zbiór
Z symbolem nieterminalnym <math>v \in V_N</math> kojarzymy określony poniżej zbiór
<center><math>\displaystyle V_N(v) = \{ v' \in V_N \; : \; v \rightarrow v_1 \rightarrow \ldots \rightarrow v_n \rightarrow v' \; w \; G \}</math></center>
<center><math>V_N(v) = \{ v' \in V_N \; : \; v \rightarrow v_1 \rightarrow \ldots \rightarrow v_n \rightarrow v' \; w \; G \}</math></center>


oraz zbiór produkcji
oraz zbiór produkcji
<center><math>\displaystyle P(v) = \{ v \rightarrow xv" \; : \; x \neq 1 , \; \exists v' \in V_N(v) , v' \rightarrow xv" \in P \} \cup</math></center>
<center><math>P(v) = \{ v \rightarrow xv'' \; : \; x \neq 1 , \; \exists v' \in V_N(v) , v' \rightarrow xv'' \in P \} \cup</math></center>


<center><math>\displaystyle \cup \{ v \rightarrow x \; : \; \exists v' \in V_N(v) , v' \rightarrow x \in P \}.</math></center>
<center><math>\cup \{ v \rightarrow x \; : \; \exists v' \in V_N(v) , v' \rightarrow x \in P \}</math>.</center>


Dla każdego takiego symbolu <math>\displaystyle v \in V_N </math> usuwamy ze zbioru <math>\displaystyle P</math> wszystkie produkcje
Dla każdego takiego symbolu <math>v \in V_N</math> usuwamy ze zbioru <math>P</math> wszystkie produkcje
<math>\displaystyle  v \rightarrow v'</math> i&nbsp;wprowadzamy na to
<math>v \rightarrow v'</math> i&nbsp;wprowadzamy na to
miejsce wszystkie produkcje ze zbioru <math>\displaystyle P(v)</math>.
miejsce wszystkie produkcje ze zbioru <math>P(v)</math>.


2. Produkcje typu <math>\displaystyle  v \rightarrow x </math> dla <math>\displaystyle x \neq 1</math>.
2. Produkcje typu <math>v \rightarrow x</math> dla <math>x \neq 1</math>.


Jeśli  produkcja taka występuje w <math>\displaystyle P</math> i <math>\displaystyle  x \neq 1</math>, to do alfabetu  
Jeśli  produkcja taka występuje w <math>P</math> i <math>x \neq 1</math>, to do alfabetu  
nieterminalnego <math>\displaystyle V_N</math> dodajemy nowy symbol <math>\displaystyle v_x</math>. Następnie ze  
nieterminalnego <math>V_N</math> dodajemy nowy symbol <math>v_x</math>. Następnie ze  
zbioru <math>\displaystyle P</math> usuwamy powyższą produkcję i dodajemy dwie nowe:
zbioru <math>P</math> usuwamy powyższą produkcję i dodajemy dwie nowe:
<center><math>\displaystyle  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>\displaystyle x\neq y</math>, to <math>\displaystyle v_x \neq v_y</math>.
Zauważmy, że jeśli <math>x\neq y</math>, to <math>v_x \neq v_y</math>.


3. Produkcje typu <math>\displaystyle  v \rightarrow x v' </math> dla <math>\displaystyle \mid x \mid > 1.</math>
3. Produkcje typu <math>v \rightarrow x v'</math> dla <math>\mid x \mid > 1</math>.


Jeśli <math>\displaystyle  v \rightarrow a_1 \ldots a_n v' \in P </math>, przy czym <math>\displaystyle n \geq 2</math>, to do alfabetu
Jeśli <math>v \rightarrow a_1 \ldots a_n v' \in P</math>, przy czym <math>n \geq 2</math>, to do alfabetu
nieterminalnego <math>\displaystyle V_N</math> dodajemy
nieterminalnego <math>V_N</math> dodajemy
nowe symbole <math>\displaystyle  v_1 , \ldots v_n </math>, produkcję <math>\displaystyle  v \rightarrow a_1 \ldots a_n v' </math> usuwamy ze
nowe symbole <math>v_1 , \ldots v_n</math>, produkcję <math>v \rightarrow a_1 \ldots a_n v'</math> usuwamy ze
zbioru <math>\displaystyle P</math> i
zbioru <math>P</math> i
dodajemy produkcje: <center><math>\displaystyle  v \rightarrow a_1 v_1 , v_1 \rightarrow a_2 v_2 , \ldots ,v_{n-1} \rightarrow a_n v'.</math></center>
dodajemy produkcje: <center><math>v \rightarrow a_1 v_1 , v_1 \rightarrow a_2 v_2 , \ldots ,v_{n-1} \rightarrow a_n v'</math>.</center>


Po opisanych powyżej trzech modyfikacjach gramatyki <math>\displaystyle G</math>  
Po opisanych powyżej trzech modyfikacjach gramatyki <math>G</math>  
generowany język, co łatwo zauważyć, nie ulega zmianie. Zatem  
generowany język, co łatwo zauważyć, nie ulega zmianie. Zatem  
skonstruowana gramatyka jest równoważna wyjściowej. Dla  
skonstruowana gramatyka jest równoważna wyjściowej. Dla  
otrzymanej gramatyki określamy teraz automat niedeterministyczny  
otrzymanej gramatyki określamy teraz automat niedeterministyczny  
<math>\displaystyle \mathcal{A}  \displaystyle =(S,A,f,\{s_0\},T)</math>, przyjmując <math>\displaystyle S= V_N</math>, <math>\displaystyle 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>\displaystyle s_0 = v_0</math> i definiując następująco funkcję przejść: <math>\displaystyle 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>\displaystyle 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>\displaystyle \mathcal{A} </math>  rozpoznaje język
że automat  <math>\mathcal{A}</math>  rozpoznaje język


<center><math>\displaystyle 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>\displaystyle \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 367: Linia 372:
w następnym wykładzie. Przykłady ilustrujące twierdzenie zamieszczamy poniżej.
w następnym wykładzie. Przykłady ilustrujące twierdzenie zamieszczamy poniżej.


{{przyklad|2.1.||
<span id="przyklad__">{{przyklad|2.1.||


# Niech <math>\displaystyle \mathcal{A}=(S,A,f,s_0,T)</math> będzie automatem takim, że<br>
1.  Niech <math>\mathcal{A}=(S,A,f,s_0,T)</math> będzie automatem takim, że<br>
<math>\displaystyle S=\{ s_0,s_1, s_2 \}, A=\{a,b\}, T=\{s_1\}</math>, a graf przejść wygląda następująco:<br>
<math>S=\{ s_0,s_1, s_2 \}, A=\{a,b\}, T=\{s_1\}</math>, a graf przejść wygląda następująco:}}
<center>
[[File:ja-lekcja07-w-rys7.svg|250x250px|thumb|center|Rysunek 7]]
</center>


RYSUNEK ja-lekcja7-w-rys7
Gramatyka <math>G=(S,A,s_0,P)</math>, gdzie
 
<center><math>P=\{s_0 \rightarrow as_1, s_0 \rightarrow bs_2, s_1 \rightarrow as_2, s_1 \rightarrow bs_0, s_1 \rightarrow 1,
Gramatyka <math>\displaystyle G=(S,A,s_0,P)</math>, gdzie
<center><math>\displaystyle P=\{s_0 \rightarrow as_1, s_0 \rightarrow bs_2, s_1 \rightarrow as_2, s_1 \rightarrow bs_0, s_1 \rightarrow 1,
s_2 \rightarrow as_0, s_2 \rightarrow bs_1\}</math></center>
s_2 \rightarrow as_0, s_2 \rightarrow bs_1\}</math></center>
akceptuje język <math>\displaystyle L(\mathcal{A})</math>. <br>
akceptuje język <math>L(\mathcal{A})</math>. <br>
Zauważmy, że język <center><math>\displaystyle L(\mathcal{A})=L(G)=\{ w \in A^* : \#_aw-\#_bw=1 mod 3\}.</math></center>
Zauważmy, że język <center><math>L(\mathcal{A})=L(G)=\{ w \in A^* : \#_aw-\#_bw=1 mod 3\}</math>.</center>
# Niech <math>\displaystyle G=(\{v_0,v_1\},\{a,b\},v_0,P)</math>, gdzie
2.  Niech <math>G=(\{v_0,v_1\},\{a,b\},v_0,P)</math>, gdzie
<center><math>\displaystyle P=\{v_0 \rightarrow av_0, v_0 \rightarrow ab, v_0 \rightarrow bv_1, v_1 \rightarrow 1 \}.</math></center>
<center><math>P=\{v_0 \rightarrow av_0, v_0 \rightarrow ab, v_0 \rightarrow bv_1, v_1 \rightarrow 1 \}</math>.</center>


Gramatykę <math>\displaystyle G</math> przekształcamy w  równoważną gramatykę
Gramatykę <math>G</math> przekształcamy w  równoważną gramatykę
<center><math>\displaystyle G'=(\{v_0,v_1,v_2,v_b\},\{a,b\},v_0,P'),</math></center>
<center><math>G'=(\{v_0,v_1,v_2,v_b\},\{a,b\},v_0,P')</math>,</center>
gdzie
gdzie
<center><math>\displaystyle P'=\{v_0 \rightarrow av_0, v_0 \rightarrow av_2, v_0 \rightarrow bv_1 , v_2 \rightarrow bv_b,
<center><math>P'=\{v_0 \rightarrow av_0, v_0 \rightarrow av_2, v_0 \rightarrow bv_1 , v_2 \rightarrow bv_b,
v_1 \rightarrow 1 , v_b \rightarrow 1\}.</math></center>
v_1 \rightarrow 1 , v_b \rightarrow 1\}</math>.</center>


Niedeterministyczny automat <math>\displaystyle \mathcal{A}_{ND}=(\{v_0,v_1,v_2,v_b\},\{a,b\},f,v_0,\{v_1,v_b\})</math>, gdzie graf przejśc
Niedeterministyczny automat <math>\mathcal{A}_{ND}=(\{v_0,v_1,v_2,v_b\},\{a,b\},f,v_0,\{v_1,v_b\})</math>, gdzie graf przejśc
wygląda następująco:<br>
wygląda następująco:
<center>
[[File:ja-lekcja07-w-rys8.svg|250x250px|thumb|center|Rysunek 8]]
</center>


RYSUNEK ja-lekcja7-w-rys8


<center><math>\displaystyle L(G)=L(\mathcal{A}_{ND})=a^*b</math></center>
<center><math>L(G)=L(\mathcal{A}_{ND})=a^*b</math></center>


}}
</span>


Wykorzystując  udowodnione do tej pory własności rodziny języków  
Wykorzystując  udowodnione do tej pory własności rodziny języków  
Linia 401: 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>\displaystyle \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>\displaystyle A </math>  rodziny języków regularnych  <math>\displaystyle 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>\displaystyle \mathcal{REG}(A^{*})=\mathcal{L}_{3} </math> .
<math>\mathcal{REG}(A^{*})=\mathcal{L}_{3}</math> .


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


Odbicie zwierciadlane  dowolnego języka  <math>\displaystyle 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>\displaystyle \overleftarrow{L} </math>  należy również do rodziny  <math>\displaystyle \mathcal{REG}(A^{*}) </math> ,
<math>\overleftarrow{L}</math>  należy również do rodziny  <math>\mathcal{REG}(A^{*})</math> ,
co oznacza, że  <math>\displaystyle \overleftarrow{L}\in \mathcal{RE}C(A^{*}) </math> .
co oznacza, że  <math>\overleftarrow{L}\in \mathcal{RE}C(A^{*})</math> .
Na podstawie twierdzenia [[##twprawlin|Uzupelnic twprawlin|]] istnieje więc gramatyka prawoliniowa
Na podstawie twierdzenia 2.2. (patrz [[#twierdzenie_2_2|twierdzenie 2.2.]]) istnieje więc gramatyka prawoliniowa
<math>\displaystyle G </math>  taka, że  <math>\displaystyle \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>\displaystyle L=\overleftarrow{\overleftarrow{L}}=L(\overline{G}) </math>  
<math>L=\overleftarrow{\overleftarrow{L}}=L(\overline{G})</math>  
dla pewnej gramatyki  <math>\displaystyle \overline{G} </math>  typu '''(3)'''. Zatem  <math>\displaystyle 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>\displaystyle L </math>  typu '''(3)''', czyli  <math>\displaystyle 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>\displaystyle \overleftarrow{L}=L(\overline{G}) </math>  
gramatyki regularnej. A więc  <math>\overleftarrow{L}=L(\overline{G})</math>  
dla pewnej gramatyki prawoliniowej i  <math>\displaystyle \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>\displaystyle \overleftarrow{L}\in \mathcal{REG}(A^{*}) </math>  
Z twierdzenia Kleene'ego wynika, że  <math>\overleftarrow{L}\in \mathcal{REG}(A^{*})</math>  
i ostatecznie  <math>\displaystyle 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.


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


Dla dowolnego skończonego alfabetu <math>\displaystyle A</math> prawdziwe są równości:
Dla dowolnego skończonego alfabetu <math>A</math> prawdziwe są równości:


<center><math>\displaystyle \mathcal{REG}(A^{*})=\mathcal{REC}(A^{*})= \mathcal{L}_{3} </math></center>
<center><math>\mathcal{REG}(A^{*})=\mathcal{REC}(A^{*})= \mathcal{L}_{3}</math></center>


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

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.