Języki, automaty i obliczenia/Ćwiczenia 8: Dalsze algorytmy dla języków regularnych. Problemy rozstrzygalne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rogoda (dyskusja | edycje)
Nie podano opisu zmian
m Zastępowanie tekstu – „,...,” na „,\ldots,”
 
(Nie pokazano 29 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
{{cwiczenie|0.1||
{{cwiczenie|1||


Zastosuj algorytm ''Automat2GReg'' do automatu o następującej
Zastosuj algorytm ''Automat2GReg'' do automatu o następującej
funkcji przejść:
funkcji przejść:


<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
<center><math>\begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
\hline a & s_1 & s_2 & s_0 & s_2\\
\hline a & s_1 & s_2 & s_0 & s_2\\
\hline b & s_3 & s_2 & s_2 & s_2\\
\hline b & s_3 & s_2 & s_2 & s_2\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>


gdzie <math>\displaystyle s_0</math> jest stanem początkowym oraz <math>\displaystyle T=\{s_0,s_2\}</math>.
gdzie <math>s_0</math> jest stanem początkowym oraz <math>T=\{s_0,s_2\}</math>.


}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">  
Pętla w liniach 7.--17. do zbioru <math>\displaystyle P</math> doda następujące
Pętla w liniach 7.--17. do zbioru <math>P</math> doda następujące
produkcje: <math>\displaystyle v_0 \rightarrow av_1</math>, <math>\displaystyle v_0 \rightarrow bv_3</math>, <math>\displaystyle v_1
produkcje: <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow bv_3</math>, <math>v_1
\rightarrow av_2</math>, <math>\displaystyle v_1 \rightarrow bv_2</math>, <math>\displaystyle v_2 \rightarrow av_0</math>,
\rightarrow av_2</math>, <math>v_1 \rightarrow bv_2</math>, <math>v_2 \rightarrow av_0</math>,
<math>\displaystyle v_2 \rightarrow bv_2</math>, <math>\displaystyle v_3 \rightarrow av_2</math>, <math>\displaystyle v_3 \rightarrow
<math>v_2 \rightarrow bv_2</math>, <math>v_3 \rightarrow av_2</math>, <math>v_3 \rightarrow
bv_2</math>. Ponieważ stanami końcowymi są <math>\displaystyle s_0</math> i <math>\displaystyle s_2</math>, w pętli (w
bv_2</math>. Ponieważ stanami końcowymi są <math>s_0</math> i <math>s_2</math>, w pętli (w
liniach 12.--14.) dodane zostaną jeszcze produkcje <math>\displaystyle v_0 \rightarrow  
liniach 12.--14.) dodane zostaną jeszcze produkcje <math>v_0 \rightarrow  
1</math> oraz <math>\displaystyle v_2 \rightarrow 1</math>.
1</math> oraz <math>v_2 \rightarrow 1</math>.
</div></div>
</div></div>


{{cwiczenie|0.2||
{{cwiczenie|2||


Zbuduj automaty akceptujące języki generowane następującymi
Zbuduj automaty akceptujące języki generowane następującymi
gramatykami (<math>\displaystyle v_i</math> oznaczają symbole nieterminalne, <math>\displaystyle a,b</math> --
gramatykami (<math>v_i</math> oznaczają symbole nieterminalne, <math>a,b</math> --
terminalne):
terminalne):


1.  <math>\displaystyle v_0 \rightarrow av_0</math>, <math>\displaystyle v_0 \rightarrow bv_1</math>, <math>\displaystyle v_0
1.  <math>v_0 \rightarrow av_0</math>, <math>v_0 \rightarrow bv_1</math>, <math>v_0
\rightarrow bv_2</math>, <math>\displaystyle v_1 \rightarrow bv_0</math>, <math>\displaystyle v_1 \rightarrow av_2</math>,
\rightarrow bv_2</math>, <math>v_1 \rightarrow bv_0</math>, <math>v_1 \rightarrow av_2</math>,
<math>\displaystyle v_2 \rightarrow av_0</math>, <math>\displaystyle v_2 \rightarrow 1</math>.
<math>v_2 \rightarrow av_0</math>, <math>v_2 \rightarrow 1</math>.


2.  <math>\displaystyle v_0 \rightarrow av_1</math>, <math>\displaystyle v_0 \rightarrow b</math>, <math>\displaystyle v_1 \rightarrow
2.  <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow b</math>, <math>v_1 \rightarrow
bv_0</math>, <math>\displaystyle v_1 \rightarrow av_1</math>, <math>\displaystyle v_1 \rightarrow 1</math>.
bv_0</math>, <math>v_1 \rightarrow av_1</math>, <math>v_1 \rightarrow 1</math>.


}}
}}
Linia 41: Linia 41:
Postępując zgodnie z algorytmem
Postępując zgodnie z algorytmem
''GReg2Automat'', obliczamy funkcję przejść tworzonego automatu
''GReg2Automat'', obliczamy funkcję przejść tworzonego automatu
(w tym przypadku niedeterministycznego) o stanach <math>\displaystyle s_0, s_1, s_2</math>
(w tym przypadku niedeterministycznego) o stanach <math>s_0, s_1, s_2</math>
(stanem początkowym jest <math>\displaystyle s_0</math>):
(stanem początkowym jest <math>s_0</math>):


<math>\displaystyle f(s_0,a)=\{f_0\}</math>, <math>\displaystyle f(s_0,b)=\{s_1,s_2\}</math>, <math>\displaystyle f(s_1,b)=\{s_0,s_2\}</math>,
<math>f(s_0,a)=\{f_0\}</math>, <math>f(s_0,b)=\{s_1,s_2\}</math>, <math>f(s_1,b)=\{s_0,s_2\}</math>,
<math>\displaystyle f(s_2,a)=s_0</math>. Ponieważ w gramatyce istnieje produkcja <math>\displaystyle v_2
<math>f(s_2,a)=s_0</math>. Ponieważ w gramatyce istnieje produkcja <math>v_2
\rightarrow 1</math>, stan <math>\displaystyle s_2</math> oznaczamy jako końcowy.
\rightarrow 1</math>, stan <math>s_2</math> oznaczamy jako końcowy.
</div></div>
</div></div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie punktu 2</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie punktu 2</span><div class="mw-collapsible-content" style="display:none">
Ponieważ w gramatyce występuje produkcja <math>\displaystyle v_0
Ponieważ w gramatyce występuje produkcja <math>v_0
\rightarrow b</math>, która ma postać niezgodną z postacią produkcji
\rightarrow b</math>, która ma postać niezgodną z postacią produkcji
będących wejściem algorytmu, przekształcamy gramatykę, usuwając tę
będących wejściem algorytmu, przekształcamy gramatykę, usuwając tę
produkcję i dodając dwie inne: <math>\displaystyle v_0 \rightarrow bv_k</math> oraz <math>\displaystyle v_k
produkcję i dodając dwie inne: <math>v_0 \rightarrow bv_k</math> oraz <math>v_k
\rightarrow 1</math>. Teraz możemy skonstruować automat. Jego zbiór stanów
\rightarrow 1</math>. Teraz możemy skonstruować automat. Jego zbiór stanów
to <math>\displaystyle s_0, s_1, s_k</math>, stanem początkowym jest <math>\displaystyle s_0</math>, a funkcja przejść
to <math>s_0, s_1, s_k</math>, stanem początkowym jest <math>s_0</math>, a funkcja przejść
zdefiniowana jest następująco:
zdefiniowana jest następująco:


<math>\displaystyle f(s_0,a)= s_1</math>, <math>\displaystyle f(s_0,b)=s_k</math>, <math>\displaystyle f(s_1,a)=s_1</math>, <math>\displaystyle s(s_1,b)=s_0</math>.
<math>f(s_0,a)= s_1</math>, <math>f(s_0,b)=s_k</math>, <math>f(s_1,a)=s_1</math>, <math>s(s_1,b)=s_0</math>.


Ponieważ w gramatyce wystąpiły produkcje <math>\displaystyle v_1 \rightarrow 1</math> oraz
Ponieważ w gramatyce wystąpiły produkcje <math>v_1 \rightarrow 1</math> oraz
<math>\displaystyle v_k \rightarrow 1</math>, stany <math>\displaystyle v_1</math> oraz <math>\displaystyle v_k</math> są stanami końcowymi.
<math>v_k \rightarrow 1</math>, stany <math>v_1</math> oraz <math>v_k</math> są stanami końcowymi.
</div></div>
</div></div>
W wykładzie podany został algorytm ''Automat2WR1'' budujący
W wykładzie podany został algorytm ''Automat2WR1'' budujący
Linia 67: Linia 67:
językach.
językach.


Dany niech będzie automat <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math>. Chcemy
Dany niech będzie automat <math>\mathcal{A}=(S, A, f, s_0, T)</math>. Chcemy
zbudować wyrażenie regularne opisujące język akceptowany przez
zbudować wyrażenie regularne opisujące język akceptowany przez
<math>\displaystyle \mathcal{A}</math>. Do wyprowadzenia metody potrzebować będziemy lematu
<math>\mathcal{A}</math>. Do wyprowadzenia metody potrzebować będziemy lematu
Ardena.
Ardena.


<span id="lemat_0_1">{{lemat|0.1. [Arden]||
<span id="lemat_0_1">{{lemat|0.1. [Arden]||


Niech <math>\displaystyle R \subseteq A^+</math> i <math>\displaystyle S \subseteq A^*</math> będą językami regularnymi. Wtedy równanie <center><math>\displaystyle X = XR
Niech <math>R \subseteq A^+</math> i <math>S \subseteq A^*</math> będą językami regularnymi. Wtedy równanie <center><math>X = XR
+ S</math></center>
+ S</math></center>
posiada jedyne  rozwiązanie <math>\displaystyle X=SR^*</math>, które jest językiem
posiada jedyne  rozwiązanie <math>X=SR^*</math>, które jest językiem
regularnym.
regularnym.
}}</span>
}}</span>


Zdefiniujmy najpierw <math>\displaystyle L_i</math> jako język tych słów, które byłyby
Zdefiniujmy najpierw <math>L_i</math> jako język tych słów, które byłyby
akceptowane przez <math>\displaystyle \mathcal{A}</math>, gdyby stanem końcowym był stan <math>\displaystyle s_i</math>, tzn. gdyby <math>\displaystyle T=\{s_i\}</math>: <center><math>\displaystyle L_i=\{w \in A^*:\ f(s_0,w)=s_i\}.</math></center>
akceptowane przez <math>\mathcal{A}</math>, gdyby stanem końcowym był stan <math>s_i</math>, tzn. gdyby <math>T=\{s_i\}</math>: <center><math>L_i=\{w \in A^*:\ f(s_0,w)=s_i\}</math>.</center>


Zauważmy, że jeśli do stanu <math>\displaystyle s_t</math> wchodzą strzałki prowadzące ze
Zauważmy, że jeśli do stanu <math>s_t</math> wchodzą strzałki prowadzące ze
stanów <math>\displaystyle s_{i_1}, s_{i_2}, ..., s_{i_n}</math> odpowiednio z etykietami
stanów <math>s_{i_1}, s_{i_2}, ..., s_{i_n}</math> odpowiednio z etykietami
<math>\displaystyle a_1, a_2,..., a_n</math> (i tylko takie), to
<math>a_1, a_2,\ldots, a_n</math> (i tylko takie), to
<center><math>\displaystyle L_t=\sum_{j=1}^n L_{i_j}a_j.</math></center>
<center><math>L_t=\sum_{j=1}^n L_{i_j}a_j</math>.</center>


Obserwacja ta jest podstawą do konstrukcji metody otrzymywania
Obserwacja ta jest podstawą do konstrukcji metody otrzymywania
wyrażenia regularnego na podstawie automatu. Będziemy budować układ
wyrażenia regularnego na podstawie automatu. Będziemy budować układ
równań, w którym każde równanie będzie postaci <math>\displaystyle L_i=\sum_{j \in
równań, w którym każde równanie będzie postaci <math>L_i=\sum_{j \in
I}L_ja_j</math>, <math>\displaystyle I=\{i_1,i_2,...,i_n\}</math>
I}L_ja_j</math>, <math>I=\{i_1,i_2,\ldots,i_n\}</math>
, gdzie <math>\displaystyle L_i</math> traktowane są jak
, gdzie <math>L_i</math> traktowane są jak
niewiadome. Następnie układ taki rozwiążemy ze względu na każdą
niewiadome. Następnie układ taki rozwiążemy ze względu na każdą
zmienną <math>\displaystyle L_i</math> (tu pomocny będzie lemat Ardena). Szukanym przez nas
zmienną <math>L_i</math> (tu pomocny będzie lemat Ardena). Szukanym przez nas
wyrażeniem regularnym będzie wyrażenie postaci <math>\displaystyle \sum_{i\in I}L_i</math>,
wyrażeniem regularnym będzie wyrażenie postaci <math>\sum_{i\in I}L_i</math>,
gdzie <math>\displaystyle I</math> jest zbiorem indeksów <math>\displaystyle i</math> stanów końcowych <math>\displaystyle s_i</math> automatu
gdzie <math>I</math> jest zbiorem indeksów <math>i</math> stanów końcowych <math>s_i</math> automatu
<math>\displaystyle \mathcal{A}</math>.
<math>\mathcal{A}</math>.


Można postawić w tym momencie pytanie, czy budowany układ równań ma  
Można postawić w tym momencie pytanie, czy budowany układ równań ma  
Linia 108: Linia 108:
regularne opisujące język akceptowany przez automat skończony||
regularne opisujące język akceptowany przez automat skończony||


   1  Wejście: <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math> - automat akceptujący język <math>\displaystyle L</math>.
   1  Wejście: <math>\mathcal{A}=(S, A, f, s_0, T)</math> - automat akceptujący język <math>L</math>.
   2  Wyjście: <math>\displaystyle r</math> -- wyrażenie regularne opisujące język <math>\displaystyle L</math>.
   2  Wyjście: <math>r</math> -- wyrażenie regularne opisujące język <math>L</math>.
   3  '''for''' '''each '''<math>\displaystyle s \in S</math>  
   3  '''for''' '''each '''<math>s \in S</math>  
   4 '''for''' '''each '''<math>\displaystyle t \in S</math>  
   4   '''for''' '''each '''<math>t \in S</math>  
   5 '''for''' '''each ''' <math>\displaystyle a \in A</math>
   5     '''for''' '''each ''' <math>a \in A</math>
   6 <math>\displaystyle L_s \leftarrow "";\displaystyle      \triangleright</math> wyrażenie puste
   6       <math>L_s \leftarrow</math>"";                               <math>  \triangleright</math> wyrażenie puste
   7 '''if''' <math>\displaystyle f(t,a)=s</math>  
   7       '''if''' <math>f(t,a)=s</math>  
   8 '''if''' <math>\displaystyle L_s="" </math>
   8         '''if''' <math>L_s=</math>""
   9 <math>\displaystyle L_s \leftarrow L_ta</math>;          <math>\displaystyle \triangleright</math> podstawiamy wyrażenie regularne
   9           <math>L_s \leftarrow L_ta</math>;          <math>\triangleright</math> podstawiamy wyrażenie regularne
   10 '''else'''
   10         '''else'''
   11 <math>\displaystyle L_s \leftarrow L_s + L_ta</math>;                 <math>\displaystyle \triangleright</math> podstawiamy wyrażenie regularne
   11           <math>L_s \leftarrow L_s + L_ta</math>;     <math>\triangleright</math> podstawiamy wyrażenie regularne
   12 '''end''' '''if'''
   12         '''end''' '''if'''
   13 '''end''' '''if'''
   13       '''end''' '''if'''
   14 '''end''' '''for'''
   14     '''end''' '''for'''
   15 '''end''' '''for'''
   15   '''end''' '''for'''
   16 '''if''' <math>\displaystyle s=s_0</math> ''' and ''' <math>\displaystyle s \in T</math> '''then'''
   16   '''if''' <math>s=s_0</math> ''' and ''' <math>s \in T</math> '''then'''
   17 <math>\displaystyle L_s \leftarrow L_s + 1</math>;             <math>\displaystyle \triangleright</math> podstawiamy wyrażenie regularne
   17     <math>L_s \leftarrow L_s + 1</math>;             <math>\triangleright</math> podstawiamy wyrażenie regularne
   18 '''end''' '''if'''
   18   '''end''' '''if'''
   19  '''end''' '''for'''
   19  '''end''' '''for'''
   20  '''rozwiąż''' <math>\displaystyle \{L_i = \sum_{t \in S} L_t
   20  '''rozwiąż''' <math>\{L_i = \sum_{t \in S} L_t
\}_{i=0,...,|S|-1}</math>;
\}_{i=0,\ldots,|S|-1}</math>;
   21  <math>\displaystyle r \leftarrow \sum_{s_i \in T} L_i</math>;
   21  <math>r \leftarrow \sum_{s_i \in T} L_i</math>;
   22  '''return''' <math>\displaystyle r</math>;
   22  '''return''' <math>r</math>;


}}
}}
Linia 137: Linia 137:
Funkcja '''rozwiąż''' w algorytmie ''Automat2Wr2''
Funkcja '''rozwiąż''' w algorytmie ''Automat2Wr2''
rozwiązuje układ równań (mający na podstawie wcześniejszych uwag
rozwiązuje układ równań (mający na podstawie wcześniejszych uwag
jednoznaczne rozwiązania), zwraca obliczone języki <math>\displaystyle L_i</math>, <math>\displaystyle i=0, ..., |S|-1</math>.
jednoznaczne rozwiązania), zwraca obliczone języki <math>L_i</math>, <math>i=0, ..., |S|-1</math>.


Rozwiązanie można wykonać metodą rugowania, przechodząc od <math>\displaystyle L_n</math> do
Rozwiązanie można wykonać metodą rugowania, przechodząc od <math>L_n</math> do
<math>\displaystyle L_1</math>. Równanie <math>\displaystyle L_i=\sum_{t \in S} L_t</math> rozwiązujemy, korzystając  
<math>L_1</math>. Równanie <math>L_i=\sum_{t \in S} L_t</math> rozwiązujemy, korzystając  
ze wzoru w lemacie Ardena (rolę <math>\displaystyle X</math> w lemacie odgrywa <math>\displaystyle L_i</math>) i  
ze wzoru w lemacie Ardena (rolę <math>X</math> w lemacie odgrywa <math>L_i</math>) i  
podstawiamy do pozostałych równań (tzn. równań dla <math>\displaystyle i=0,\dots,i-1</math>).  
podstawiamy do pozostałych równań (tzn. równań dla <math>i=0,\dots,i-1</math>).  
Mając już wyliczone <math>\displaystyle L_0</math>, wyliczamy kolejne <math>\displaystyle L_i</math> idąc od <math>\displaystyle 1</math> do  
Mając już wyliczone <math>L_0</math>, wyliczamy kolejne <math>L_i</math> idąc od <math>1</math> do  
<math>\displaystyle |S|-1</math>.  Dla lepszego zrozumienia metody przedstawiamy następujący  
<math>|S|-1</math>.  Dla lepszego zrozumienia metody przedstawiamy następujący  
przykład.
przykład.


{{przyklad|0.1.||
{{przyklad|1.1.||


Dany niech będzie automat pokazany na rysunku
Dany niech będzie automat pokazany na rysunku 1 (pominęliśmy tu dla uproszczenia jedną
[[##ja-lekcja8-c-rys1|Uzupelnic ja-lekcja8-c-rys1|]] (pominęliśmy tu dla uproszczenia jedną
strzałkę wychodzącą ze stanu <math>s_2</math> w celu uniknięcia zwiększenia
strzałkę wychodzącą ze stanu <math>\displaystyle s_2</math> w celu uniknięcia zwiększenia
liczby stanów, gdyż chcąc formalnie narysować automat
liczby stanów, gdyż chcąc formalnie narysować automat
deterministyczny, musielibyśmy dodać stan <math>\displaystyle s_3</math> i zdefiniować
deterministyczny, musielibyśmy dodać stan <math>s_3</math> i zdefiniować
<math>\displaystyle f(s_2, a)=s_3</math>, <math>\displaystyle f(s_3,a)=f(s_3,b)=s_3</math>, ale widać, że wcale nie
<math>f(s_2, a)=s_3</math>, <math>f(s_3,a)=f(s_3,b)=s_3</math>, ale widać, że wcale nie
trzeba wtedy obliczać języka <math>\displaystyle L_3</math>, gdyż z tego stanu nie da się już
trzeba wtedy obliczać języka <math>L_3</math>, gdyż z tego stanu nie da się już
wyjść - jest to tzw. sink state).
wyjść - jest to tzw. sink state).
}}
}}
 
<center>
RYSUNEK ja-lekjca8-c-rys1
[[File:ja-lekcja08-c-rys1.svg|250x150px|thumb|center|Rysunek 1]]
</center>


Ułóżmy równania do naszego układu równań. Mamy:
Ułóżmy równania do naszego układu równań. Mamy:




<math>\displaystyle  \left\{ \begin{array} {l} L_0 = L_0b + L_2b + 1 \\ L_1 = L_0a +  L_1a \\ L_2 = L_1b \end{array}  \right. \Leftrightarrow \left\{ \begin{array} {l} L_0 = L_0b + L_1bb + 1 \\ L_1 = L_0a + L_1a \\ \end{array}  \right. \Leftrightarrow L_0=L_0b+L_0aa^*bb^*+1</math>
<math>\left\{ \begin{array} {l} L_0 = L_0b + L_2b + 1 \\ L_1 = L_0a +  L_1a \\ L_2 = L_1b \end{array}  \right. \Leftrightarrow \left\{ \begin{array} {l} L_0 = L_0b + L_1bb + 1 \\ L_1 = L_0a + L_1a \\ \end{array}  \right. \Leftrightarrow L_0=L_0b+L_0aa^*bb^*+1</math>


Mamy więc <math>\displaystyle L_0=L_0(b+a^+bb) + 1</math>. Korzystając z lematu Ardena,
Mamy więc <math>L_0=L_0(b+a^+bb) + 1</math>. Korzystając z lematu Ardena,
otrzymujemy <math>\displaystyle L_0=1(b+a^+bb)^*=(b+a^+bb)^*</math>. Podstawiając obliczone
otrzymujemy <math>L_0=1(b+a^+bb)^*=(b+a^+bb)^*</math>. Podstawiając obliczone
<math>\displaystyle L_0</math> do równania i obliczając pozostałe <math>\displaystyle L_i</math>, otrzymujemy
<math>L_0</math> do równania i obliczając pozostałe <math>L_i</math>, otrzymujemy
ostatecznie:
ostatecznie:


<center><math>\displaystyle  \left\{ \begin{array} {l}
<center><math>\left\{ \begin{array} {l}
L_0 = (b+a^+bb)^* \\
L_0 = (b+a^+bb)^* \\
L_1 = (b+a^+bb)^*a^+ \\
L_1 = (b+a^+bb)^*a^+ \\
L_2 = (b+a^+bb)^*a^+b.
L_2 = (b+a^+bb)^*a^+b.
\end{array}  \right. </math></center>
\end{array}  \right</math></center>


Ponieważ <math>\displaystyle T=\{s_0,s_1,s_2\}</math>, rozwiązaniem jest:
Ponieważ <math>T=\{s_0,s_1,s_2\}</math>, rozwiązaniem jest:
<center><math>\displaystyle w=L_0+L_1+L_2=(b+a^+bb)^*(1 + a^+(1 + b)).</math></center>
<center><math>w=L_0+L_1+L_2=(b+a^+bb)^*(1 + a^+(1 + b))</math>.</center>


{{cwiczenie|0.3||
{{cwiczenie|3||


Niech dany będzie automat
Niech dany będzie automat
<math>\displaystyle \mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o
<math>\mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o
następującej funkcji przejść:
następującej funkcji przejść:


<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
<center><math>\begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
\hline a & s_1 & s_2 & s_0 & s_3\\
\hline a & s_1 & s_2 & s_0 & s_3\\
\hline b & s_3 & s_2 & s_2 & s_3\\
\hline b & s_3 & s_2 & s_2 & s_3\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>


Wykorzystując algorytm ''Automat2WR2'', wyznacz wyrażenie
Wykorzystując algorytm ''Automat2WR2'', wyznacz wyrażenie
regularne odpowiadające językowi akceptowanemu przez <math>\displaystyle \mathcal{A}</math>.
regularne odpowiadające językowi akceptowanemu przez <math>\mathcal{A}</math>.


}}
}}


ROZWIĄZANIE. Po pierwsze zauważmy, że w obliczeniach nie musimy
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">
uwzględniać stanu <math>\displaystyle s_3</math> ani języka <math>\displaystyle L_3</math> stowarzyszonego z tym
Po pierwsze zauważmy, że w obliczeniach nie musimy
uwzględniać stanu <math>s_3</math> ani języka <math>L_3</math> stowarzyszonego z tym
stanem. Układ równań będzie więc posiadał 3 równania o 3
stanem. Układ równań będzie więc posiadał 3 równania o 3
niewiadomych <math>\displaystyle L_0</math>, <math>\displaystyle L_1</math> oraz <math>\displaystyle L_2</math>:
niewiadomych <math>L_0</math>, <math>L_1</math> oraz <math>L_2</math>:


<center><math>\displaystyle  \left\{ \begin{array} {l}
<center><math>\left\{ \begin{array} {l}
L_0 = L_2a+1 \\
L_0 = L_2a+1 \\
L_1 = L_0a \\
L_1 = L_0a \\
L_2 = L_1(a+b)+L_2b
L_2 = L_1(a+b)+L_2b
\end{array}  \right. </math></center>
\end{array}  \right</math></center>


W równaniu drugim zamieniamy <math>\displaystyle L_0</math> na <math>\displaystyle L_2a+1</math> i otrzymujemy
W równaniu drugim zamieniamy <math>L_0</math> na <math>L_2a+1</math> i otrzymujemy


<center><math>\displaystyle  \left\{ \begin{array} {l}
<center><math>\left\{ \begin{array} {l}
L_1 = (L_2a+1)a = L_2a^2+a \\
L_1 = (L_2a+1)a = L_2a^2+a \\
L_2 = L_1(a+b)+L_2b.
L_2 = L_1(a+b)+L_2b.
\end{array}  \right. </math></center>
\end{array}  \right</math></center>


Teraz <math>\displaystyle L_1</math> w równaniu drugim zastępujemy prawą stroną równania
Teraz <math>L_1</math> w równaniu drugim zastępujemy prawą stroną równania pierwszego: <center><math>L_2 = L_1(a+b)+L_2b = (L_2a^2+a)(a+b)+L_2b =
pierwszego: <center><math>\displaystyle L_2 = L_1(a+b)+L_2b = (L_2a^2+a)(a+b)+L_2b =
L_2(a^3+a^2b+b)+a^2+ab</math>.</center>
L_2(a^3+a^2b+b)+a^2+ab.</math></center>


Korzystamy z lematu Ardena i otrzymujemy
Korzystamy z lematu Ardena i otrzymujemy
<math>\displaystyle L_2=(a^2+ab)(a^3+a^2b+b)^*</math>. Podstawiamy to do równania
<math>L_2=(a^2+ab)(a^3+a^2b+b)^*</math>. Podstawiamy to do równania
<math>\displaystyle L_0=L_2a+1</math> i otrzymujemy ostatecznie:
<math>L_0=L_2a+1</math> i otrzymujemy ostatecznie:
<center><math>\displaystyle L_0=(a^2+ab)(a^3+a^2b+b)^*a+1= (a^2+ab)(a^2(a+b)+b)^*a+1.</math></center>
<center><math>L_0=(a^2+ab)(a^3+a^2b+b)^*a+1= (a^2+ab)(a^2(a+b)+b)^*a+1</math>.</center>


Można pokazać, że wyrażenie to jest równoważne następującemu:
Można pokazać, że wyrażenie to jest równoważne następującemu:
<center><math>\displaystyle L_0=(a(a+b)b^*a)^*.</math></center>
<center><math>L_0=(a(a+b)b^*a)^*</math>.</center>
 
</div></div>
{{cwiczenie|0.4||
{{cwiczenie|4||


Dane niech będą automaty: <math>\displaystyle n_A</math>-stanowy <math>\displaystyle \mathcal{A}</math> i
Dane niech będą automaty: <math>n_A</math>-stanowy <math>\mathcal{A}</math> i
<math>\displaystyle n_B</math>-stanowy <math>\displaystyle \mathcal{B}</math>, oba nad alfabetem <math>\displaystyle A</math> i akceptujące
<math>n_B</math>-stanowy <math>\mathcal{B}</math>, oba nad alfabetem <math>A</math> i akceptujące
odpowiednio języki <math>\displaystyle L(\mathcal{A})</math> i <math>\displaystyle L(\mathcal{B})</math>. Pokaż, że
odpowiednio języki <math>L(\mathcal{A})</math> i <math>L(\mathcal{B})</math>. Pokaż, że
problem stwierdzenia, czy dla dowolnego <math>\displaystyle w \in A^*</math> zachodzi <math>\displaystyle w \in
problem stwierdzenia, czy dla dowolnego <math>w \in A^*</math> zachodzi <math>w \in
L(\mathcal{A}) \cap L(\mathcal{B})</math>, jest rozstrzygalny:
L(\mathcal{A}) \cap L(\mathcal{B})</math>, jest rozstrzygalny:
# poprzez skonstruowanie niedeterministycznego automatu posiadającego <math>\displaystyle O(n_A+n_B)</math> stanów,
# poprzez skonstruowanie niedeterministycznego automatu posiadającego <math>O(n_A+n_B)</math> stanów,
# poprzez skonstruowanie deterministycznego automatu <math>\displaystyle n_A \cdot
# poprzez skonstruowanie deterministycznego automatu <math>n_A \cdot
n_B</math>-stanowego.
n_B</math>-stanowego.


}}
}}


ROZWIĄZANIE punktu 1. Niech <math>\displaystyle \mathcal{A}=(S_A, A, f_A, s_A^0, T_A)</math>
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie punktu 1</span><div class="mw-collapsible-content" style="display:none">
oraz <math>\displaystyle \mathcal{B}=(S_B, A, f_B, s_B^0, T_B)</math> będą zadanymi
Niech <math>\mathcal{A}=(S_A, A, f_A, s_A^0, T_A)</math>
automatami. Konstruujemy automat <math>\displaystyle \mathcal{C}=(S, A, f, s_0, T)</math>
oraz <math>\mathcal{B}=(S_B, A, f_B, s_B^0, T_B)</math> będą zadanymi
taki, że <math>\displaystyle S = S_A \cup S_B \backslash \{s_B^0\}</math>, <math>\displaystyle s_0=s_A^0</math>,
automatami. Konstruujemy automat <math>\mathcal{C}=(S, A, f, s_0, T)</math>
<math>\displaystyle T=T_B</math>, gdy <math>\displaystyle s_B^0 \not \in T_B</math>, <math>\displaystyle T=T_B \cup T_A</math>, gdy <math>\displaystyle s_B^0 \in
taki, że <math>S = S_A \cup S_B \backslash \{s_B^0\}</math>, <math>s_0=s_A^0</math>,
T_B</math>, a funkcja przejść <math>\displaystyle f</math> jest zdefiniowana następująco:
<math>T=T_B</math>, gdy <math>s_B^0 \not \in T_B</math>, <math>T=T_B \cup T_A</math>, gdy <math>s_B^0 \in
T_B</math>, a funkcja przejść <math>f</math> jest zdefiniowana następująco:


<center><math>\displaystyle \aligned \forall s \in S_A, a \in A\  f(s,a) &=f_A(s,a) \\ \forall s \in S_B
<center><math>\begin{align} \forall s \in S_A, a \in A\  f(s,a) &=f_A(s,a) \\ \forall s \in S_B
\backslash \{s_B^0\}, a \in A\ f(s,a) &= f_B(s,a)
\backslash \{s_B^0\}, a \in A\ f(s,a) &= f_B(s,a)
\\
\\
\forall s \in T_A, a \in A\ f(s,a) &= f(s_B^0,a).
\forall s \in T_A, a \in A\ f(s,a) &= f(s_B^0,a).
\endaligned</math></center>
\end{align}</math></center>


Zbiór stanów końcowych automatu <math>\displaystyle \mathcal{A}</math> staje się więc zbiorem
Zbiór stanów końcowych automatu <math>\mathcal{A}</math> staje się więc zbiorem
stanów początkowych dla automatu <math>\displaystyle \mathcal{B}</math>, przy czym, jeśli
stanów początkowych dla automatu <math>\mathcal{B}</math>, przy czym, jeśli
<math>\displaystyle s_B^0 \in T_B</math>, to każdy ze stanów <math>\displaystyle T_A</math> jest równocześnie stanem
<math>s_B^0 \in T_B</math>, to każdy ze stanów <math>T_A</math> jest równocześnie stanem
końcowym w automacie <math>\displaystyle \mathcal{C}</math>. Zauważ, że:
końcowym w automacie <math>\mathcal{C}</math>. Zauważ, że:


<center><math>\displaystyle w \in L(\mathcal{A}) \cap L(\mathcal{B}) \Longleftrightarrow
<center><math>w \in L(\mathcal{A}) \cap L(\mathcal{B}) \Longleftrightarrow
ww \in L(\mathcal{C}) \wedge f(s_0,w) \cap T_A \not = \emptyset.</math></center>
ww \in L(\mathcal{C}) \wedge f(s_0,w) \cap T_A \not = \emptyset</math>.</center>


Oba warunki występujące po prawej stronie równoważności są  
Oba warunki występujące po prawej stronie równoważności są  
algorytmicznie weryfikowalne i da się je sprawdzić w czasie  
algorytmicznie weryfikowalne i da się je sprawdzić w czasie  
<math>\displaystyle O(|w|)</math>. Konstrukcja automatu <math>\displaystyle \mathcal{C}</math> w oczywisty sposób  
<math>O(|w|)</math>. Konstrukcja automatu <math>\mathcal{C}</math> w oczywisty sposób  
również jest algorytmizowalna i da się ją wykonać w czasie  
również jest algorytmizowalna i da się ją wykonać w czasie  
<math>\displaystyle O(|A|(n_A+n_B))</math>.
<math>O(|A|(n_A+n_B))</math>.
Ponieważ <math>\displaystyle |S|=n_A+n_B-1</math>, więc <math>\displaystyle \mathcal{C}</math> posiada <math>\displaystyle O(n_A+n_B)</math> stanów. <br>
Ponieważ <math>|S|=n_A+n_B-1</math>, więc <math>\mathcal{C}</math> posiada <math>O(n_A+n_B)</math> stanów. <br>
 
</div></div>
ROZWIĄZANIE punktu 2. Skorzystaj z konstrukcji z ćwiczenia  
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie punktu 2</span><div class="mw-collapsible-content" style="display:none">
[[##ja-lekcja7-c-cw1.1|Uzupelnic ja-lekcja7-c-cw1.1|]]
Skorzystaj z konstrukcji z ćwiczenia 1 z ćwiczeń 7
</div></div>


{{cwiczenie|0.5||
{{cwiczenie|5||


Skonstruuj algorytm (oraz określ jego złożoność) dla następującego
Skonstruuj algorytm (oraz określ jego złożoność) dla następującego
problemu (tym samym dowodząc jego rozstrzygalności):
problemu (tym samym dowodząc jego rozstrzygalności):


Dany jest automat <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math>. Czy
Dany jest automat <math>\mathcal{A}=(S, A, f, s_0, T)</math>. Czy
<math>\displaystyle L(\mathcal{A})=\emptyset</math>?
<math>L(\mathcal{A})=\emptyset</math>?
}}
}}


ROZWIĄZANIE. Bez straty ogólności możemy założyć, że automat jest
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">
Bez straty ogólności możemy założyć, że automat jest
deterministyczny. W algorytmie wykorzystamy procedurę
deterministyczny. W algorytmie wykorzystamy procedurę
''Zaznacz'' przedstawioną poniżej.
''Zaznacz'' przedstawioną poniżej.


{{algorytm|||
Algorytm wykonuje przeszukanie automatu metodą DFS. Jego złożoność jest więc <math>O(|A| \cdot |S|)</math> - liniowa ze względu na ilość stanów automatu. Złożoność pamięciowa także wynosi <math>O(|A| \cdot |S|)</math>.
 
{''PustośćJęzyka'' -- sprawdza, czy język akceptowany
przez zadany automat jest pusty.}
 
[1]
Wejście: <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math> -- deterministyczny
automat akceptujący język <math>\displaystyle L</math>.
 
Wyjście: Odpowiedź '''true''' (tak) lub '''false'''
(nie).
 
''Zaznacz''<math>\displaystyle (s_0)</math>;
 
'''for''' '''each '''<math>\displaystyle s \in T</math>
 
'''if''' <math>\displaystyle \textbf{zaznaczone}[s] = 1</math>
'''return false'''
'''endif'''
 
'''endfor'''
 
'''return true''';
 
}}
 
{{algorytm|||


[1]
'''procedure''' ''Zaznacz''(<math>\displaystyle s \in S</math>)


<math>\displaystyle \textbf{zaznaczone}[s] \leftarrow 1</math>;
{{algorytm|PustośćJęzyka - sprawdza, czy język akceptowany
przez zadany automat jest pusty||


'''for''' '''each ''' <math>\displaystyle a \in A</math>


'''if''' '''zaznaczone'''<math>\displaystyle [f(s,a)]\neq 1</math>  
  1  Wejście: <math>\mathcal{A}=(S, A, f, s_0, T)</math> - deterministyczny automat akceptujący język <math>L</math>.
''Zaznacz''<math>\displaystyle (f(s,a))</math>;
  2  Wyjście: Odpowiedź '''true''' (tak) lub '''false''' (nie).
'''endif'''
  3  ZAZNACZ<math>(s_0)</math>;
  4  '''for''' '''each '''<math>s \in T</math>  
  5    '''if''' <math>\textbf{zaznaczone}[s] = 1</math>  
  6      '''return false'''
  7    '''end''' '''if'''
  8  '''end''' '''for'''
  9  '''return true''';


'''endfor'''


'''end procedure'''
  1  '''procedure''' ''Zaznacz''(<math>s \in S</math>)
  2  <math>\textbf{zaznaczone}[s] \leftarrow 1</math>;
  3  '''for''' '''each ''' <math>a \in A</math>
  4    '''if''' '''zaznaczone'''<math>[f(s,a)]\neq 1</math>
  5      ZAZNACZ<math>(f(s,a))</math>;
  6    '''end''' '''if'''
  7  '''end''' '''for'''
  8  '''end procedure'''


}}
}}</div></div>


Algorytm wykonuje przeszukanie automatu metodą DFS. Jego złożoność
jest więc <math>\displaystyle O(|A| \cdot |S|)</math> - liniowa ze względu na ilość stanów
automatu. Złożoność pamięciowa także wynosi <math>\displaystyle O(|A| \cdot |S|)</math>.


ZADANIA DOMOWE
<center>ZADANIA DOMOWE</center>


{{cwiczenie|0.6||
{{cwiczenie|6||


Zastosuj algorytm ''Automat2GReg'' do automatu o następującej
Zastosuj algorytm ''Automat2GReg'' do automatu o następującej
funkcji przejść:
funkcji przejść:


<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
<center><math>\begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
\hline a & s_1 & s_3 & s_3 & s_3\\
\hline a & s_1 & s_3 & s_3 & s_3\\
\hline b & s_2 & s_2 & s_0 & s_0\\
\hline b & s_2 & s_2 & s_0 & s_0\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>


gdzie <math>\displaystyle s_0</math> jest stanem początkowym oraz <math>\displaystyle T=\{s_1\}</math>.
gdzie <math>s_0</math> jest stanem początkowym oraz <math>T=\{s_1\}</math>.


}}
}}


{{cwiczenie|0.7||
{{cwiczenie|7||


Zbuduj automaty akceptujące języki generowane następującymi
Zbuduj automaty akceptujące języki generowane następującymi
gramatykami (<math>\displaystyle v_i</math> oznaczają symbole nieterminalne, <math>\displaystyle a,b</math> --
gramatykami (<math>v_i</math> oznaczają symbole nieterminalne, <math>a,b</math> --
terminalne):
terminalne):
# <math>\displaystyle v_0 \rightarrow av_1</math>, <math>\displaystyle v_0 \rightarrow bv_2</math>, <math>\displaystyle v_0
 
\rightarrow bv_0</math>, <math>\displaystyle v_1 \rightarrow bv_1</math>, <math>\displaystyle v_1 \rightarrow av_0</math>,
1.  <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow bv_2</math>, <math>v_0
<math>\displaystyle v_2 \rightarrow bv_0</math>, <math>\displaystyle v_2 \rightarrow bv_2</math>, <math>\displaystyle v_2 \rightarrow 1</math>.
\rightarrow bv_0</math>, <math>v_1 \rightarrow bv_1</math>, <math>v_1 \rightarrow av_0</math>,
# <math>\displaystyle v_0 \rightarrow bv_2</math>, <math>\displaystyle v_0 \rightarrow b</math>, <math>\displaystyle v_1 \rightarrow
<math>v_2 \rightarrow bv_0</math>, <math>v_2 \rightarrow bv_2</math>, <math>v_2 \rightarrow 1</math>.
bv_0</math>, <math>\displaystyle v_1 \rightarrow av_1</math>, <math>\displaystyle v_1 \rightarrow 1</math>, <math>\displaystyle v_2 \rightarrow
 
2. <math>v_0 \rightarrow bv_2</math>, <math>v_0 \rightarrow b</math>, <math>v_1 \rightarrow
bv_0</math>, <math>v_1 \rightarrow av_1</math>, <math>v_1 \rightarrow 1</math>, <math>v_2 \rightarrow
av_1</math>.
av_1</math>.


}}
}}


{{cwiczenie|0.8||
{{cwiczenie|8||


Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:
Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:
# <math>\displaystyle b((a+b)^*+a)</math>,
# <math>b((a+b)^*+a)</math>,
# <math>\displaystyle (a+b)^*(a^*b^*)</math>,
# <math>(a+b)^*(a^*b^*)</math>,
# <math>\displaystyle a(b^*a^*)^*+1</math>.
# <math>a(b^*a^*)^*+1</math>.


}}
}}


WSKAZÓWKA. Zastosuj algorytm ''WR2Automat''.
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
Zastosuj algorytm ''WR2Automat''.
</div></div>


{{cwiczenie|0.9||
{{cwiczenie|9||


Niech dany będzie automat
Niech dany będzie automat
<math>\displaystyle \mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o
<math>\mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o
następującej funkcji przejść:
następującej funkcji przejść:


<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
<center><math>\begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 & s_3\\
\hline a & s_1 & s_2 & s_0 & s_2\\
\hline a & s_1 & s_2 & s_0 & s_2\\
\hline b & s_3 & s_2 & s_2 & s_2\\
\hline b & s_3 & s_2 & s_2 & s_2\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>


Wykorzystując algorytm ''Automat2WR2'', wyznacz wyrażenie
Wykorzystując algorytm ''Automat2WR2'', wyznacz wyrażenie
regularne odpowiadające językowi akceptowanemu przez <math>\displaystyle \mathcal{A}</math>.
regularne odpowiadające językowi akceptowanemu przez <math>\mathcal{A}</math>.


}}
}}


{{cwiczenie|0.10||
{{cwiczenie|10||


Skonstruuj algorytmy dla następujących problemów rozstrzygalnych:
Skonstruuj algorytmy dla następujących problemów rozstrzygalnych:
# Równoważność dowolnych  automatyów <math>\displaystyle \mathcal{A}</math> i <math>\displaystyle \mathcal{B}</math>.
# Równoważność dowolnych  automatów <math>\mathcal{A}</math> i <math>\mathcal{B}</math>.
# Nieskończoność języka <math>\displaystyle L(\mathcal{A})</math> dla dowolnego automatu  <math>\displaystyle \mathcal{A}</math>.
# Nieskończoność języka <math>L(\mathcal{A})</math> dla dowolnego automatu  <math>\mathcal{A}</math>.


}}
}}


WSKAZÓWKA do punktu 1. Metoda pierwsza: istnieje dokładnie jeden
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka do punktu 1 </span><div class="mw-collapsible-content" style="display:none">
Metoda pierwsza: istnieje dokładnie jeden
automat minimalny. Metoda druga: rozważ automat akceptujący  
automat minimalny. Metoda druga: rozważ automat akceptujący  
przecięcie <math>\displaystyle L(\mathcal{A}) \cap L(\mathcal{B}) </math>  tak jak w punkcie  
przecięcie <math>L(\mathcal{A}) \cap L(\mathcal{B})</math>  tak jak w punkcie  
(2) zadania [[##cw_ai|Uzupelnic cw_ai|]]. Jaki warunek muszą spełniać stany <math>\displaystyle s \in  
(2) zadania 4. punkt 2. Jaki warunek muszą spełniać stany <math>s \in  
S_A, t \in S_B</math>, aby <math>\displaystyle (s,t) \in T</math>?
S_A, t \in S_B</math>, aby <math>(s,t) \in T</math>?
 
</div></div>
WSKAZÓWKI do punktu 2.
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka do punktu 2 </span><div class="mw-collapsible-content" style="display:none">
# Automat akceptuje nieskończenie wiele słów,
1. Automat akceptuje nieskończenie wiele słów,
gdy w wyrażeniu regularnym odpowiadającym temu automatowi występuje
gdy w wyrażeniu regularnym odpowiadającym temu automatowi występuje
gwiazdka Kleene'ego. Użyj metody z twierdzenia Kleene'ego
gwiazdka Kleene'ego. Użyj metody z twierdzenia Kleene'ego
(Twierdzenie 1.1, punkt 5.).
(Twierdzenie 1.1, punkt 5.).
# <math>\displaystyle \exists s \in S, w_1, w_2 \in A^*:\
f(s_0, w_1)=s \wedge f(s,w_2)=s...</math>


{{cwiczenie|0.11||
2.  <math>\exists s \in S, w_1, w_2 \in A^*:\ f(s_0, w_1)=s \wedge f(s,w_2)=s</math>..
 
</div></div>
<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 \\
\hline a & s_1 & s_1 & s_2 \\
\hline b & s_2 & s_0 & s_0 \\
\hline \end{array} </math></center>
 
}}
 
Dla automatów <math>\displaystyle \mathcal{A}=(S_A, A, f_A,
s_A^0, T_A)</math> oraz <math>\displaystyle \mathcal{B}=(S_B, A, f_B, s_B^0, T_B)</math>
konstruujemy następujący automat <math>\displaystyle \mathcal{C}=(S, A, f, s_0, T)</math>:
* <math>\displaystyle S = S_A \times S_B,</math>
* <math>\displaystyle s_0 = (s_A^0,s_B^0),</math>
* <math>\displaystyle T = \{(s,t): s \in T_A, t \in T_B\}</math>
* <math>\displaystyle f((s,t),a)=(f_A(s,a),f_B(s,a)).</math>
 
Zachodzi <center><math>\displaystyle w \in L(\mathcal{A}) \cap L(\mathcal{B})
\Longleftrightarrow w \in L(\mathcal{C}).</math></center>

Aktualna wersja na dzień 21:57, 15 wrz 2023

Ćwiczenie 1

Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:

fs0s1s2s3as1s2s0s2bs3s2s2s2

gdzie s0 jest stanem początkowym oraz T={s0,s2}.

Rozwiązanie

Ćwiczenie 2

Zbuduj automaty akceptujące języki generowane następującymi gramatykami (vi oznaczają symbole nieterminalne, a,b -- terminalne):

1. v0av0, v0bv1, v0bv2, v1bv0, v1av2, v2av0, v21.

2. v0av1, v0b, v1bv0, v1av1, v11.

Rozwiązanie punktu 1
Rozwiązanie punktu 2

W wykładzie podany został algorytm Automat2WR1 budujący wyrażenie regularne na podstawie zadanego automatu. Opiszemy teraz inną metodę rozwiązania tego problemu, wykorzystującą równania na językach.

Dany niech będzie automat 𝒜=(S,A,f,s0,T). Chcemy zbudować wyrażenie regularne opisujące język akceptowany przez 𝒜. Do wyprowadzenia metody potrzebować będziemy lematu Ardena.

Lemat 0.1. [Arden]

Niech RA+ i SA* będą językami regularnymi. Wtedy równanie
X=XR+S

posiada jedyne rozwiązanie X=SR*, które jest językiem regularnym.

Zdefiniujmy najpierw Li jako język tych słów, które byłyby

akceptowane przez

𝒜

, gdyby stanem końcowym był stan

si

, tzn. gdyby

T={si}

:

Li={wA*: f(s0,w)=si}.

Zauważmy, że jeśli do stanu st wchodzą strzałki prowadzące ze stanów si1,si2,...,sin odpowiednio z etykietami a1,a2,,an (i tylko takie), to

Lt=j=1nLijaj.

Obserwacja ta jest podstawą do konstrukcji metody otrzymywania wyrażenia regularnego na podstawie automatu. Będziemy budować układ równań, w którym każde równanie będzie postaci Li=jILjaj, I={i1,i2,,in} , gdzie Li traktowane są jak niewiadome. Następnie układ taki rozwiążemy ze względu na każdą zmienną Li (tu pomocny będzie lemat Ardena). Szukanym przez nas wyrażeniem regularnym będzie wyrażenie postaci iILi, gdzie I jest zbiorem indeksów i stanów końcowych si automatu 𝒜.

Można postawić w tym momencie pytanie, czy budowany układ równań ma rozwiązanie, a jeśli tak, to czy jest ono jedyne. Okazuje się że w rozważanej przez nas sytuacji ma to miejsce, choć dowód tego faktu nie jest natychmiastowy. Fakt ten, podobnie jak lemat Ardena, podajemy tutaj bez dowodu.

Algorytm Automat2WR2 - buduje inną metodą wyrażenie regularne opisujące język akceptowany przez automat skończony



  1  Wejście: 𝒜=(S,A,f,s0,T) - automat akceptujący język L.
  2  Wyjście: r -- wyrażenie regularne opisujące język L.
  3  for each sS 
  4    for each tS 
  5      for each  aA
  6        Ls"";                                 wyrażenie puste
  7        if f(t,a)=s 
  8          if Ls=""
  9            LsLta;            podstawiamy wyrażenie regularne
 10          else
 11            LsLs+Lta;       podstawiamy wyrażenie regularne
 12          end if
 13        end if
 14      end for
 15    end for
 16    if s=s0  and  sT then
 17      LsLs+1;               podstawiamy wyrażenie regularne
 18    end if
 19  end for
 20  rozwiąż {Li=tSLt}i=0,,|S|1;
 21  rsiTLi;
 22  return r;



Funkcja rozwiąż w algorytmie Automat2Wr2 rozwiązuje układ równań (mający na podstawie wcześniejszych uwag jednoznaczne rozwiązania), zwraca obliczone języki Li, i=0,...,|S|1.

Rozwiązanie można wykonać metodą rugowania, przechodząc od Ln do L1. Równanie Li=tSLt rozwiązujemy, korzystając ze wzoru w lemacie Ardena (rolę X w lemacie odgrywa Li) i podstawiamy do pozostałych równań (tzn. równań dla i=0,,i1). Mając już wyliczone L0, wyliczamy kolejne Li idąc od 1 do |S|1. Dla lepszego zrozumienia metody przedstawiamy następujący przykład.

Przykład 1.1.

Dany niech będzie automat pokazany na rysunku 1 (pominęliśmy tu dla uproszczenia jedną strzałkę wychodzącą ze stanu s2 w celu uniknięcia zwiększenia liczby stanów, gdyż chcąc formalnie narysować automat deterministyczny, musielibyśmy dodać stan s3 i zdefiniować f(s2,a)=s3, f(s3,a)=f(s3,b)=s3, ale widać, że wcale nie trzeba wtedy obliczać języka L3, gdyż z tego stanu nie da się już wyjść - jest to tzw. sink state).

Rysunek 1

Ułóżmy równania do naszego układu równań. Mamy:


{L0=L0b+L2b+1L1=L0a+L1aL2=L1b{L0=L0b+L1bb+1L1=L0a+L1aL0=L0b+L0aa*bb*+1

Mamy więc L0=L0(b+a+bb)+1. Korzystając z lematu Ardena, otrzymujemy L0=1(b+a+bb)*=(b+a+bb)*. Podstawiając obliczone L0 do równania i obliczając pozostałe Li, otrzymujemy ostatecznie:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\{ \begin{array} {l} L_0 = (b+a^+bb)^* \\ L_1 = (b+a^+bb)^*a^+ \\ L_2 = (b+a^+bb)^*a^+b. \end{array} \right}

Ponieważ T={s0,s1,s2}, rozwiązaniem jest:

w=L0+L1+L2=(b+a+bb)*(1+a+(1+b)).

Ćwiczenie 3

Niech dany będzie automat 𝒜(S={s0,s1,s2,s3},A={a,b},f,s0,T={s0}) o następującej funkcji przejść:

fs0s1s2s3as1s2s0s3bs3s2s2s3

Wykorzystując algorytm Automat2WR2, wyznacz wyrażenie regularne odpowiadające językowi akceptowanemu przez 𝒜.

Rozwiązanie

Ćwiczenie 4

Dane niech będą automaty: nA-stanowy 𝒜 i nB-stanowy , oba nad alfabetem A i akceptujące odpowiednio języki L(𝒜) i L(). Pokaż, że problem stwierdzenia, czy dla dowolnego wA* zachodzi wL(𝒜)L(), jest rozstrzygalny:

  1. poprzez skonstruowanie niedeterministycznego automatu posiadającego O(nA+nB) stanów,
  2. poprzez skonstruowanie deterministycznego automatu nAnB-stanowego.
Rozwiązanie punktu 1
Rozwiązanie punktu 2

Ćwiczenie 5

Skonstruuj algorytm (oraz określ jego złożoność) dla następującego problemu (tym samym dowodząc jego rozstrzygalności):

Dany jest automat 𝒜=(S,A,f,s0,T). Czy L(𝒜)=?

Rozwiązanie


ZADANIA DOMOWE

Ćwiczenie 6

Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:

fs0s1s2s3as1s3s3s3bs2s2s0s0

gdzie s0 jest stanem początkowym oraz T={s1}.

Ćwiczenie 7

Zbuduj automaty akceptujące języki generowane następującymi gramatykami (vi oznaczają symbole nieterminalne, a,b -- terminalne):

1. v0av1, v0bv2, v0bv0, v1bv1, v1av0, v2bv0, v2bv2, v21.

2. v0bv2, v0b, v1bv0, v1av1, v11, v2av1.

Ćwiczenie 8

Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:

  1. b((a+b)*+a),
  2. (a+b)*(a*b*),
  3. a(b*a*)*+1.
Wskazówka

Ćwiczenie 9

Niech dany będzie automat 𝒜(S={s0,s1,s2,s3},A={a,b},f,s0,T={s0}) o następującej funkcji przejść:

fs0s1s2s3as1s2s0s2bs3s2s2s2

Wykorzystując algorytm Automat2WR2, wyznacz wyrażenie regularne odpowiadające językowi akceptowanemu przez 𝒜.

Ćwiczenie 10

Skonstruuj algorytmy dla następujących problemów rozstrzygalnych:

  1. Równoważność dowolnych automatów 𝒜 i .
  2. Nieskończoność języka L(𝒜) dla dowolnego automatu 𝒜.
Wskazówka do punktu 1
Wskazówka do punktu 2