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 161: | Linia 161: | ||
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> | |||
Mamy więc <math>\displaystyle L_0=L_0(b+a^+bb) + 1</math>. Korzystając z lematu Ardena, | Mamy więc <math>\displaystyle L_0=L_0(b+a^+bb) + 1</math>. Korzystając z lematu Ardena, | ||
Linia 177: | Linia 178: | ||
<center><math>\displaystyle w=L_0+L_1+L_2=(b+a^+bb)^*(1 + a^+(1 + b)).</math></center> | <center><math>\displaystyle w=L_0+L_1+L_2=(b+a^+bb)^*(1 + a^+(1 + b)).</math></center> | ||
{{cwiczenie||| | {{cwiczenie|0.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>\displaystyle \mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o | ||
Linia 222: | Linia 224: | ||
<center><math>\displaystyle L_0=(a(a+b)b^*a)^*.</math></center> | <center><math>\displaystyle L_0=(a(a+b)b^*a)^*.</math></center> | ||
{{cwiczenie||| | {{cwiczenie|0.4|| | ||
Dane niech będą automaty: <math>\displaystyle n_A</math>-stanowy <math>\displaystyle \mathcal{A}</math> i | Dane niech będą automaty: <math>\displaystyle n_A</math>-stanowy <math>\displaystyle \mathcal{A}</math> i | ||
Linia 266: | Linia 268: | ||
[[##ja-lekcja7-c-cw1.1|Uzupelnic ja-lekcja7-c-cw1.1|]] | [[##ja-lekcja7-c-cw1.1|Uzupelnic ja-lekcja7-c-cw1.1|]] | ||
{{cwiczenie||| | {{cwiczenie|0.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): | ||
Linia 329: | Linia 332: | ||
ZADANIA DOMOWE | ZADANIA DOMOWE | ||
{{cwiczenie||| | {{cwiczenie|0.6|| | ||
Zastosuj algorytm ''Automat2GReg'' do automatu o następującej | Zastosuj algorytm ''Automat2GReg'' do automatu o następującej | ||
funkcji przejść: | funkcji przejść: | ||
Linia 342: | Linia 346: | ||
}} | }} | ||
{{cwiczenie||| | {{cwiczenie|0.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>\displaystyle v_i</math> oznaczają symbole nieterminalne, <math>\displaystyle a,b</math> -- | ||
Linia 355: | Linia 360: | ||
}} | }} | ||
{{cwiczenie||| | {{cwiczenie|0.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>\displaystyle b((a+b)^*+a)</math>, | ||
Linia 365: | Linia 371: | ||
WSKAZÓWKA. Zastosuj algorytm ''WR2Automat''. | WSKAZÓWKA. Zastosuj algorytm ''WR2Automat''. | ||
{{cwiczenie||| | {{cwiczenie|0.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>\displaystyle \mathcal{A}(S=\{s_0,s_1,s_2,s_3\},A=\{a,b\},f,s_0,T=\{s_0\})</math> o | ||
Linia 380: | Linia 387: | ||
}} | }} | ||
{{cwiczenie||| | {{cwiczenie|0.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 automatyów <math>\displaystyle \mathcal{A}</math> i <math>\displaystyle \mathcal{B}</math>. | ||
Linia 401: | Linia 409: | ||
f(s_0, w_1)=s \wedge f(s,w_2)=s...</math> | f(s_0, w_1)=s \wedge f(s,w_2)=s...</math> | ||
{{cwiczenie||| | {{cwiczenie|0.11|| | ||
<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 \\ | <center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2 \\ |
Wersja z 18:42, 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):
- , , , , ,
, .
- , , , , .
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 .
ROZWIĄZANIE. Po pierwsze zauważmy, że w obliczeniach nie musimy uwzględniać stanu ani języka stowarzyszonego z tym stanem. Układ równań będzie więc posiadał 3 równania o 3 niewiadomych , oraz :
W równaniu drugim zamieniamy na i otrzymujemy
Teraz w równaniu drugim zastępujemy prawą stroną równania
pierwszego:
Korzystamy z lematu Ardena i otrzymujemy . Podstawiamy to do równania i otrzymujemy ostatecznie:
Można pokazać, że wyrażenie to jest równoważne następującemu:
Ć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.
ROZWIĄZANIE punktu 1. Niech oraz będą zadanymi automatami. Konstruujemy automat taki, że , , , gdy , , gdy , a funkcja przejść jest zdefiniowana następująco:
Zbiór stanów końcowych automatu staje się więc zbiorem stanów początkowych dla automatu , przy czym, jeśli , to każdy ze stanów jest równocześnie stanem końcowym w automacie . Zauważ, że:
Oba warunki występujące po prawej stronie równoważności są
algorytmicznie weryfikowalne i da się je sprawdzić w czasie
. Konstrukcja automatu w oczywisty sposób
również jest algorytmizowalna i da się ją wykonać w czasie
.
Ponieważ , więc posiada stanów.
ROZWIĄZANIE punktu 2. Skorzystaj z konstrukcji z ćwiczenia Uzupelnic ja-lekcja7-c-cw1.1|
Ć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 ?
ROZWIĄZANIE. Bez straty ogólności możemy założyć, że automat jest deterministyczny. W algorytmie wykorzystamy procedurę Zaznacz przedstawioną poniżej.
Algorytm
{PustośćJęzyka -- sprawdza, czy język akceptowany
przez zadany automat jest pusty.}
[1] Wejście: -- deterministyczny automat akceptujący język .
Wyjście: Odpowiedź true (tak) lub false (nie).
Zaznacz;
for each
if return false endif
endfor
return true;
Algorytm
[1]
procedure Zaznacz()
;
for each
if zaznaczone Zaznacz; endif
endfor
end procedure
Algorytm wykonuje przeszukanie automatu metodą DFS. Jego złożoność jest więc - liniowa ze względu na ilość stanów automatu. Złożoność pamięciowa także wynosi .
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):
- , , , , ,
, , .
- , , , , , .
Ćwiczenie 0.8
Zbuduj automaty (z pustymi przejściami) akceptujące poniższe języki:
- ,
- ,
- .
WSKAZÓWKA. Zastosuj algorytm WR2Automat.
Ć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 .
WSKAZÓWKA do punktu 1. Metoda pierwsza: istnieje dokładnie jeden automat minimalny. Metoda druga: rozważ automat akceptujący przecięcie tak jak w punkcie (2) zadania Uzupelnic cw_ai|. Jaki warunek muszą spełniać stany , aby ?
WSKAZÓWKI do punktu 2.
- Automat akceptuje nieskończenie wiele słów,
gdy w wyrażeniu regularnym odpowiadającym temu automatowi występuje gwiazdka Kleene'ego. Użyj metody z twierdzenia Kleene'ego (Twierdzenie 1.1, punkt 5.).
- Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle \exists s \in S, w_1, w_2 \in A^*:\ f(s_0, w_1)=s \wedge f(s,w_2)=s...}
Ćwiczenie 0.11
Dla automatów oraz konstruujemy następujący automat :
Zachodzi