Języki, automaty i obliczenia/Ćwiczenia 8: Dalsze algorytmy dla języków regularnych. Problemy rozstrzygalne: Różnice pomiędzy wersjami
m Zastępowanie tekstu – „.</math>” na „</math>.” |
m Zastępowanie tekstu – „ </math>” na „</math>” |
||
Linia 7: | Linia 7: | ||
\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>s_0</math> jest stanem początkowym oraz <math>T=\{s_0,s_2\}</math>. | gdzie <math>s_0</math> jest stanem początkowym oraz <math>T=\{s_0,s_2\}</math>. | ||
Linia 113: | Linia 113: | ||
4 '''for''' '''each '''<math>t \in S</math> | 4 '''for''' '''each '''<math>t \in S</math> | ||
5 '''for''' '''each ''' <math>a \in A</math> | 5 '''for''' '''each ''' <math>a \in A</math> | ||
6 <math>L_s \leftarrow </math>""; <math> \triangleright</math> wyrażenie puste | 6 <math>L_s \leftarrow</math>""; <math> \triangleright</math> wyrażenie puste | ||
7 '''if''' <math>f(t,a)=s</math> | 7 '''if''' <math>f(t,a)=s</math> | ||
8 '''if''' <math>L_s= </math>"" | 8 '''if''' <math>L_s=</math>"" | ||
9 <math>L_s \leftarrow L_ta</math>; <math>\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''' | ||
Linia 175: | Linia 175: | ||
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>T=\{s_0,s_1,s_2\}</math>, rozwiązaniem jest: | Ponieważ <math>T=\{s_0,s_1,s_2\}</math>, rozwiązaniem jest: | ||
Linia 189: | Linia 189: | ||
\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 | ||
Linia 206: | Linia 206: | ||
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>L_0</math> na <math>L_2a+1</math> i otrzymujemy | W równaniu drugim zamieniamy <math>L_0</math> na <math>L_2a+1</math> i otrzymujemy | ||
Linia 213: | Linia 213: | ||
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>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 = | 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 = | ||
Linia 326: | Linia 326: | ||
\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>s_0</math> jest stanem początkowym oraz <math>T=\{s_1\}</math>. | gdzie <math>s_0</math> jest stanem początkowym oraz <math>T=\{s_1\}</math>. | ||
Linia 370: | Linia 370: | ||
\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 | ||
Linia 388: | Linia 388: | ||
Metoda pierwsza: istnieje dokładnie jeden | 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>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 4. punkt 2. Jaki warunek muszą spełniać stany <math>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>(s,t) \in T</math>? | S_A, t \in S_B</math>, aby <math>(s,t) \in T</math>? |
Wersja z 10:01, 5 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 .