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 |
Nie podano opisu zmian |
||
Linia 289: | Linia 289: | ||
</div></div> | </div></div> | ||
{{algorytm| | {{algorytm|PustośćJęzyka - sprawdza, czy język akceptowany | ||
przez zadany automat jest pusty|| | |||
przez zadany automat jest pusty | |||
'''return true'''; | 1 Wejście: <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math> - deterministyczny automat akceptujący język <math>\displaystyle L</math>. | ||
2 Wyjście: Odpowiedź '''true''' (tak) lub '''false''' (nie). | |||
3 ZAZNACZ<math>\displaystyle (s_0)</math>; | |||
4 '''for''' '''each '''<math>\displaystyle s \in T</math> | |||
5 '''if''' <math>\displaystyle \textbf{zaznaczone}[s] = 1</math> | |||
6 '''return false''' | |||
7 '''end''' '''if''' | |||
8 '''end''' '''for''' | |||
9 '''return true'''; | |||
}} | }} | ||
Linia 317: | Linia 307: | ||
{{algorytm||| | {{algorytm||| | ||
1 '''procedure''' ''Zaznacz''(<math>\displaystyle s \in S</math>) | |||
'''procedure''' ''Zaznacz''(<math>\displaystyle s \in S</math>) | 2 <math>\displaystyle \textbf{zaznaczone}[s] \leftarrow 1</math>; | ||
3 '''for''' '''each ''' <math>\displaystyle a \in A</math> | |||
<math>\displaystyle \textbf{zaznaczone}[s] \leftarrow 1</math>; | 4 '''if''' '''zaznaczone'''<math>\displaystyle [f(s,a)]\neq 1</math> | ||
5 ZAZNACZ<math>\displaystyle (f(s,a))</math>; | |||
'''for''' '''each ''' <math>\displaystyle a \in A</math> | 6 '''end''' '''if''' | ||
7 '''end''' '''for''' | |||
'''if''' '''zaznaczone'''<math>\displaystyle [f(s,a)]\neq 1</math> | 8 '''end procedure''' | ||
''' | |||
''' | |||
'''end procedure''' | |||
}} | }} |
Wersja z 19:27, 23 sie 2006
Ćwiczenie 0.1
Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:
gdzie jest stanem początkowym oraz .
Ćwiczenie 0.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 Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_s \leftarrow "";\displaystyle \triangleright} wyrażenie puste 7 if 8 if Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_s="" } 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 0.1.
Dany niech będzie automat pokazany na rysunku Uzupelnic ja-lekcja8-c-rys1| (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).
RYSUNEK ja-lekjca8-c-rys1
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 0.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 0.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 0.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 ?
Algorytm PustośćJęzyka - sprawdza, czy język akceptowany przez zadany automat jest pusty
1 Wejście: - deterministyczny automat akceptujący język . 2 Wyjście: Odpowiedź true (tak) lub false (nie). 3 ZAZNACZ; 4 for each 5 if 6 return false 7 end if 8 end for 9 return true;
Algorytm
1 procedure Zaznacz() 2 ; 3 for each 4 if zaznaczone 5 ZAZNACZ; 6 end if 7 end for 8 end procedure
ZADANIA DOMOWE
Ćwiczenie 0.6
Zastosuj algorytm Automat2GReg do automatu o następującej funkcji przejść:
gdzie jest stanem początkowym oraz .
Ćwiczenie 0.7
Zbuduj automaty akceptujące języki generowane następującymi gramatykami ( oznaczają symbole nieterminalne, -- terminalne):
1. , , , , , , , .
2. , , , , , .
Ćwiczenie 0.8
Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:
- ,
- ,
- .
Ćwiczenie 0.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 0.10
Skonstruuj algorytmy dla następujących problemów rozstrzygalnych:
- Równoważność dowolnych automatyów i .
- Nieskończoność języka dla dowolnego automatu .
Ćwiczenie 0.11
Dla automatów oraz konstruujemy następujący automat :
Zachodzi