Języki, automaty i obliczenia/Ćwiczenia 8: Dalsze algorytmy dla języków regularnych. Problemy rozstrzygalne: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „,...,” na „,\ldots,” |
||
(Nie pokazano 28 wersji utworzonych przez 3 użytkowników) | |||
Linia 1: | Linia 1: | ||
{{cwiczenie| | {{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> | <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} | \hline \end{array}</math></center> | ||
gdzie <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> | Pętla w liniach 7.--17. do zbioru <math>P</math> doda następujące | ||
produkcje: <math> | produkcje: <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow bv_3</math>, <math>v_1 | ||
\rightarrow av_2</math>, <math> | \rightarrow av_2</math>, <math>v_1 \rightarrow bv_2</math>, <math>v_2 \rightarrow av_0</math>, | ||
<math> | <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> | 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> | liniach 12.--14.) dodane zostaną jeszcze produkcje <math>v_0 \rightarrow | ||
1</math> oraz <math> | 1</math> oraz <math>v_2 \rightarrow 1</math>. | ||
</div></div> | </div></div> | ||
{{cwiczenie| | {{cwiczenie|2|| | ||
Zbuduj automaty akceptujące języki generowane następującymi | Zbuduj automaty akceptujące języki generowane następującymi | ||
gramatykami (<math> | gramatykami (<math>v_i</math> oznaczają symbole nieterminalne, <math>a,b</math> -- | ||
terminalne): | terminalne): | ||
1. <math> | 1. <math>v_0 \rightarrow av_0</math>, <math>v_0 \rightarrow bv_1</math>, <math>v_0 | ||
\rightarrow bv_2</math>, <math> | \rightarrow bv_2</math>, <math>v_1 \rightarrow bv_0</math>, <math>v_1 \rightarrow av_2</math>, | ||
<math> | <math>v_2 \rightarrow av_0</math>, <math>v_2 \rightarrow 1</math>. | ||
2. <math> | 2. <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow b</math>, <math>v_1 \rightarrow | ||
bv_0</math>, <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> | (w tym przypadku niedeterministycznego) o stanach <math>s_0, s_1, s_2</math> | ||
(stanem początkowym jest <math> | (stanem początkowym jest <math>s_0</math>): | ||
<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> | <math>f(s_2,a)=s_0</math>. Ponieważ w gramatyce istnieje produkcja <math>v_2 | ||
\rightarrow 1</math>, stan <math> | \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> | 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> | 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> | 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> | <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> | Ponieważ w gramatyce wystąpiły produkcje <math>v_1 \rightarrow 1</math> oraz | ||
<math> | <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> | 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> | <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> | 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> | posiada jedyne rozwiązanie <math>X=SR^*</math>, które jest językiem | ||
regularnym. | regularnym. | ||
}}</span> | }}</span> | ||
Zdefiniujmy najpierw <math> | Zdefiniujmy najpierw <math>L_i</math> jako język tych słów, które byłyby | ||
akceptowane przez <math> | 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> | Zauważmy, że jeśli do stanu <math>s_t</math> wchodzą strzałki prowadzące ze | ||
stanów <math> | stanów <math>s_{i_1}, s_{i_2}, ..., s_{i_n}</math> odpowiednio z etykietami | ||
<math> | <math>a_1, a_2,\ldots, a_n</math> (i tylko takie), to | ||
<center><math> | <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> | równań, w którym każde równanie będzie postaci <math>L_i=\sum_{j \in | ||
I}L_ja_j</math>, <math> | I}L_ja_j</math>, <math>I=\{i_1,i_2,\ldots,i_n\}</math> | ||
, gdzie <math> | , 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> | zmienną <math>L_i</math> (tu pomocny będzie lemat Ardena). Szukanym przez nas | ||
wyrażeniem regularnym będzie wyrażenie postaci <math> | wyrażeniem regularnym będzie wyrażenie postaci <math>\sum_{i\in I}L_i</math>, | ||
gdzie <math> | gdzie <math>I</math> jest zbiorem indeksów <math>i</math> stanów końcowych <math>s_i</math> automatu | ||
<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> | 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> | 2 Wyjście: <math>r</math> -- wyrażenie regularne opisujące język <math>L</math>. | ||
3 '''for''' '''each '''<math> | 3 '''for''' '''each '''<math>s \in S</math> | ||
4 | 4 '''for''' '''each '''<math>t \in S</math> | ||
5 | 5 '''for''' '''each ''' <math>a \in A</math> | ||
6 | 6 <math>L_s \leftarrow</math>""; <math> \triangleright</math> wyrażenie puste | ||
7 | 7 '''if''' <math>f(t,a)=s</math> | ||
8 | 8 '''if''' <math>L_s=</math>"" | ||
9 | 9 <math>L_s \leftarrow L_ta</math>; <math>\triangleright</math> podstawiamy wyrażenie regularne | ||
10 | 10 '''else''' | ||
11 | 11 <math>L_s \leftarrow L_s + L_ta</math>; <math>\triangleright</math> podstawiamy wyrażenie regularne | ||
12 | 12 '''end''' '''if''' | ||
13 | 13 '''end''' '''if''' | ||
14 | 14 '''end''' '''for''' | ||
15 | 15 '''end''' '''for''' | ||
16 | 16 '''if''' <math>s=s_0</math> ''' and ''' <math>s \in T</math> '''then''' | ||
17 | 17 <math>L_s \leftarrow L_s + 1</math>; <math>\triangleright</math> podstawiamy wyrażenie regularne | ||
18 | 18 '''end''' '''if''' | ||
19 '''end''' '''for''' | 19 '''end''' '''for''' | ||
20 '''rozwiąż''' <math> | 20 '''rozwiąż''' <math>\{L_i = \sum_{t \in S} L_t | ||
\}_{i=0, | \}_{i=0,\ldots,|S|-1}</math>; | ||
21 <math> | 21 <math>r \leftarrow \sum_{s_i \in T} L_i</math>; | ||
22 '''return''' <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> | 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> | Rozwiązanie można wykonać metodą rugowania, przechodząc od <math>L_n</math> do | ||
<math> | <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> | 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> | podstawiamy do pozostałych równań (tzn. równań dla <math>i=0,\dots,i-1</math>). | ||
Mając już wyliczone <math> | Mając już wyliczone <math>L_0</math>, wyliczamy kolejne <math>L_i</math> idąc od <math>1</math> do | ||
<math> | <math>|S|-1</math>. Dla lepszego zrozumienia metody przedstawiamy następujący | ||
przykład. | przykład. | ||
{{przyklad| | {{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ą | ||
strzałkę wychodzącą ze stanu <math>s_2</math> w celu uniknięcia zwiększenia | |||
strzałkę wychodzącą ze stanu <math> | |||
liczby stanów, gdyż chcąc formalnie narysować automat | liczby stanów, gdyż chcąc formalnie narysować automat | ||
deterministyczny, musielibyśmy dodać stan <math> | deterministyczny, musielibyśmy dodać stan <math>s_3</math> i zdefiniować | ||
<math> | <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> | 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> | |||
[[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> | <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> | Mamy więc <math>L_0=L_0(b+a^+bb) + 1</math>. Korzystając z lematu Ardena, | ||
otrzymujemy <math> | otrzymujemy <math>L_0=1(b+a^+bb)^*=(b+a^+bb)^*</math>. Podstawiając obliczone | ||
<math> | <math>L_0</math> do równania i obliczając pozostałe <math>L_i</math>, otrzymujemy | ||
ostatecznie: | ostatecznie: | ||
<center><math> | <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 | \end{array} \right</math></center> | ||
Ponieważ <math> | Ponieważ <math>T=\{s_0,s_1,s_2\}</math>, rozwiązaniem jest: | ||
<center><math> | <center><math>w=L_0+L_1+L_2=(b+a^+bb)^*(1 + a^+(1 + b))</math>.</center> | ||
{{cwiczenie| | {{cwiczenie|3|| | ||
Niech dany będzie automat | Niech dany będzie automat | ||
<math> | <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> | <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} | \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> | regularne odpowiadające językowi akceptowanemu przez <math>\mathcal{A}</math>. | ||
}} | }} | ||
Linia 198: | Linia 198: | ||
<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"> | ||
Po pierwsze zauważmy, że w obliczeniach nie musimy | Po pierwsze zauważmy, że w obliczeniach nie musimy | ||
uwzględniać stanu <math> | 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> | niewiadomych <math>L_0</math>, <math>L_1</math> oraz <math>L_2</math>: | ||
<center><math> | <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 | \end{array} \right</math></center> | ||
W równaniu drugim zamieniamy <math> | W równaniu drugim zamieniamy <math>L_0</math> na <math>L_2a+1</math> i otrzymujemy | ||
<center><math> | <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 | \end{array} \right</math></center> | ||
Teraz <math> | 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 = | ||
L_2(a^3+a^2b+b)+a^2+ab | 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> | <math>L_2=(a^2+ab)(a^3+a^2b+b)^*</math>. Podstawiamy to do równania | ||
<math> | <math>L_0=L_2a+1</math> i otrzymujemy ostatecznie: | ||
<center><math> | <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> | <center><math>L_0=(a(a+b)b^*a)^*</math>.</center> | ||
</div></div> | </div></div> | ||
{{cwiczenie| | {{cwiczenie|4|| | ||
Dane niech będą automaty: <math> | Dane niech będą automaty: <math>n_A</math>-stanowy <math>\mathcal{A}</math> i | ||
<math> | <math>n_B</math>-stanowy <math>\mathcal{B}</math>, oba nad alfabetem <math>A</math> i akceptujące | ||
odpowiednio języki <math> | odpowiednio języki <math>L(\mathcal{A})</math> i <math>L(\mathcal{B})</math>. Pokaż, że | ||
problem stwierdzenia, czy dla dowolnego <math> | 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> | # poprzez skonstruowanie niedeterministycznego automatu posiadającego <math>O(n_A+n_B)</math> stanów, | ||
# poprzez skonstruowanie deterministycznego automatu <math> | # poprzez skonstruowanie deterministycznego automatu <math>n_A \cdot | ||
n_B</math>-stanowego. | n_B</math>-stanowego. | ||
Linia 240: | Linia 240: | ||
<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"> | <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"> | ||
Niech <math> | Niech <math>\mathcal{A}=(S_A, A, f_A, s_A^0, T_A)</math> | ||
oraz <math> | oraz <math>\mathcal{B}=(S_B, A, f_B, s_B^0, T_B)</math> będą zadanymi | ||
automatami. Konstruujemy automat <math> | automatami. Konstruujemy automat <math>\mathcal{C}=(S, A, f, s_0, T)</math> | ||
taki, że <math> | taki, że <math>S = S_A \cup S_B \backslash \{s_B^0\}</math>, <math>s_0=s_A^0</math>, | ||
<math> | <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> | T_B</math>, a funkcja przejść <math>f</math> jest zdefiniowana następująco: | ||
<center><math>\ | <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). | ||
\ | \end{align}</math></center> | ||
Zbiór stanów końcowych automatu <math> | Zbiór stanów końcowych automatu <math>\mathcal{A}</math> staje się więc zbiorem | ||
stanów początkowych dla automatu <math> | stanów początkowych dla automatu <math>\mathcal{B}</math>, przy czym, jeśli | ||
<math> | <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> | końcowym w automacie <math>\mathcal{C}</math>. Zauważ, że: | ||
<center><math> | <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 | 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> | <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> | <math>O(|A|(n_A+n_B))</math>. | ||
Ponieważ <math> | 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> | </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"> | ||
Skorzystaj z konstrukcji z ćwiczenia | Skorzystaj z konstrukcji z ćwiczenia 1 z ćwiczeń 7 | ||
</div></div> | </div></div> | ||
{{cwiczenie| | |||
{{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> | Dany jest automat <math>\mathcal{A}=(S, A, f, s_0, T)</math>. Czy | ||
<math> | <math>L(\mathcal{A})=\emptyset</math>? | ||
}} | }} | ||
Linia 285: | Linia 285: | ||
deterministyczny. W algorytmie wykorzystamy procedurę | deterministyczny. W algorytmie wykorzystamy procedurę | ||
''Zaznacz'' przedstawioną poniżej. | ''Zaznacz'' przedstawioną poniżej. | ||
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>. | |||
{{algorytm|PustośćJęzyka - sprawdza, czy język akceptowany | |||
przez zadany automat jest pusty|| | |||
''' | 1 Wejście: <math>\mathcal{A}=(S, A, f, s_0, T)</math> - deterministyczny automat akceptujący język <math>L</math>. | ||
'' | 2 Wyjście: Odpowiedź '''true''' (tak) lub '''false''' (nie). | ||
''' | 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'''; | |||
'''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> | ||
ZADANIA DOMOWE | <center>ZADANIA DOMOWE</center> | ||
{{cwiczenie| | {{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> | <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} | \hline \end{array}</math></center> | ||
gdzie <math> | gdzie <math>s_0</math> jest stanem początkowym oraz <math>T=\{s_1\}</math>. | ||
}} | }} | ||
{{cwiczenie| | {{cwiczenie|7|| | ||
Zbuduj automaty akceptujące języki generowane następującymi | Zbuduj automaty akceptujące języki generowane następującymi | ||
gramatykami (<math> | gramatykami (<math>v_i</math> oznaczają symbole nieterminalne, <math>a,b</math> -- | ||
terminalne): | terminalne): | ||
\rightarrow bv_0</math>, <math> | 1. <math>v_0 \rightarrow av_1</math>, <math>v_0 \rightarrow bv_2</math>, <math>v_0 | ||
<math> | \rightarrow bv_0</math>, <math>v_1 \rightarrow bv_1</math>, <math>v_1 \rightarrow av_0</math>, | ||
<math>v_2 \rightarrow bv_0</math>, <math>v_2 \rightarrow bv_2</math>, <math>v_2 \rightarrow 1</math>. | |||
bv_0</math>, <math> | |||
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| | {{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> | # <math>b((a+b)^*+a)</math>, | ||
# <math> | # <math>(a+b)^*(a^*b^*)</math>, | ||
# <math> | # <math>a(b^*a^*)^*+1</math>. | ||
}} | }} | ||
<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| | {{cwiczenie|9|| | ||
Niech dany będzie automat | Niech dany będzie automat | ||
<math> | <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> | <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} | \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> | regularne odpowiadające językowi akceptowanemu przez <math>\mathcal{A}</math>. | ||
}} | }} | ||
{{cwiczenie| | {{cwiczenie|10|| | ||
Skonstruuj algorytmy dla następujących problemów rozstrzygalnych: | Skonstruuj algorytmy dla następujących problemów rozstrzygalnych: | ||
# Równoważność dowolnych | # Równoważność dowolnych automatów <math>\mathcal{A}</math> i <math>\mathcal{B}</math>. | ||
# Nieskończoność języka <math> | # Nieskończoność języka <math>L(\mathcal{A})</math> dla dowolnego automatu <math>\mathcal{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">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> | przecięcie <math>L(\mathcal{A}) \cap L(\mathcal{B})</math> tak jak w punkcie | ||
(2) zadania | (2) zadania 4. punkt 2. Jaki warunek muszą spełniać stany <math>s \in | ||
S_A, t \in S_B</math>, aby <math> | S_A, t \in S_B</math>, aby <math>(s,t) \in T</math>? | ||
</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">Wskazówka do punktu 2 </span><div class="mw-collapsible-content" style="display:none"> | |||
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.). | ||
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> | |||
Aktualna wersja na dzień 21:57, 15 wrz 2023
Ćwiczenie 1
Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:
gdzie jest stanem początkowym oraz .
Ćwiczenie 2
Zbuduj automaty akceptujące języki generowane następującymi gramatykami ( oznaczają symbole nieterminalne, -- terminalne):
1. , , , , , , .
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 . Chcemy zbudować wyrażenie regularne opisujące język akceptowany przez . Do wyprowadzenia metody potrzebować będziemy lematu Ardena.
Lemat 0.1. [Arden]
posiada jedyne rozwiązanie , które jest językiem regularnym.
Zdefiniujmy najpierw jako język tych słów, które byłyby
akceptowane przez
, gdyby stanem końcowym był stan
, tzn. gdyby
:
Zauważmy, że jeśli do stanu wchodzą strzałki prowadzące ze stanów odpowiednio z etykietami (i tylko takie), to
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 , , gdzie traktowane są jak niewiadome. Następnie układ taki rozwiążemy ze względu na każdą zmienną (tu pomocny będzie lemat Ardena). Szukanym przez nas wyrażeniem regularnym będzie wyrażenie postaci , gdzie jest zbiorem indeksów stanów końcowych 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: - automat akceptujący język . 2 Wyjście: -- wyrażenie regularne opisujące język . 3 for each 4 for each 5 for each 6 ""; wyrażenie puste 7 if 8 if "" 9 ; podstawiamy wyrażenie regularne 10 else 11 ; podstawiamy wyrażenie regularne 12 end if 13 end if 14 end for 15 end for 16 if and then 17 ; podstawiamy wyrażenie regularne 18 end if 19 end for 20 rozwiąż ; 21 ; 22 return ;
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 , .
Rozwiązanie można wykonać metodą rugowania, przechodząc od do . Równanie rozwiązujemy, korzystając ze wzoru w lemacie Ardena (rolę w lemacie odgrywa ) i podstawiamy do pozostałych równań (tzn. równań dla ). Mając już wyliczone , wyliczamy kolejne idąc od do . 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 w celu uniknięcia zwiększenia liczby stanów, gdyż chcąc formalnie narysować automat deterministyczny, musielibyśmy dodać stan i zdefiniować , , ale widać, że wcale nie trzeba wtedy obliczać języka , gdyż z tego stanu nie da się już wyjść - jest to tzw. sink state).

Ułóżmy równania do naszego układu równań. Mamy:
Mamy więc . Korzystając z lematu Ardena, otrzymujemy . Podstawiając obliczone do równania i obliczając pozostałe , otrzymujemy ostatecznie:
Ponieważ , rozwiązaniem jest:
Ćwiczenie 3
Niech dany będzie automat o następującej funkcji przejść:
Wykorzystując algorytm Automat2WR2, wyznacz wyrażenie regularne odpowiadające językowi akceptowanemu przez .
Ćwiczenie 4
Dane niech będą automaty: -stanowy i -stanowy , oba nad alfabetem i akceptujące odpowiednio języki i . Pokaż, że problem stwierdzenia, czy dla dowolnego zachodzi , jest rozstrzygalny:
- poprzez skonstruowanie niedeterministycznego automatu posiadającego stanów,
- poprzez skonstruowanie deterministycznego automatu -stanowego.
Ć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 . Czy ?
Ćwiczenie 6
Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:
gdzie jest stanem początkowym oraz .
Ćwiczenie 7
Zbuduj automaty akceptujące języki generowane następującymi gramatykami ( oznaczają symbole nieterminalne, -- terminalne):
1. , , , , , , , .
2. , , , , , .
Ćwiczenie 8
Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:
- ,
- ,
- .
Ćwiczenie 9
Niech dany będzie automat o następującej funkcji przejść:
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:
- Równoważność dowolnych automatów i .
- Nieskończoność języka dla dowolnego automatu .