Test GR3: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
{theor}{TWIERDZENIE}[section] | {theor}{TWIERDZENIE}[section] | ||
{rem}{UWAGA}[section] | {rem}{UWAGA}[section] | ||
Linia 28: | Linia 11: | ||
{algorithm}{Algorytm} | {algorithm}{Algorytm} | ||
{ | { Automat niedeterministyczny, lemat o pompowaniu} | ||
; Wprowadzenie | ; Wprowadzenie | ||
: W | : W tym wykładzie | ||
zdefiniujemy automat niedeterministyczny, | |||
udowodnimy jego równoważność z automatem deterministycznym oraz podamy algorytm | |||
konstrukcji równoważnego automatu deterministycznego. Wprowadzimy także automaty | |||
niedeterministyczne z pustymi przejściami. W ostatniej części wykładu | |||
sformułujemy lemat o pompowaniu dla | |||
języków rozpoznawanych przez automaty skończenie stanowe. | |||
; Słowa kluczowe | ; Słowa kluczowe | ||
: | : automat niedeterministyczny, automat niedeterministyczny z pustymi | ||
przejściami, lemat o pompowaniu. | |||
== | ==Automat niedeterministyczny== | ||
Wprowadzony wcześniej automat jest modelem obliczeń, czy też mówiąc | |||
ogólniej, modelem procesu o bardzo prostym opisie. Stan procesu | |||
zmienia się w sposób jednoznaczny pod wpływem sygnału zewnętrznego | |||
reprezentowanego przez literę alfabetu. Opisem tych zmian jest więc | |||
funkcja. Pewnym uogólnieniem powyższej sytuacji może być | |||
dopuszczenie relacji, która opisuje zmiany stanu. W efekcie opis | |||
zmiany stanów staje się niedeterministyczny w tym sensie, że z | |||
danego stanu automat przechodzi w pewien zbiór stanów. Jak | |||
udowodnimy pó{z}niej, z punktu widzenia rozpoznawania lub | |||
poprawnych obliczeń, takie uogólnienie nie rozszerza klasy języków | |||
rozpoznawanych przez automaty. | |||
'''Automatem niedeterministycznym''' nad alfabetem <math>A </math> nazywamy | |||
system <math>\mathcal{A}_{ND} </math></center> <nowiki>=</nowiki> (S,f),<math> w którym </math>S<math> jest dowolnym zbiorem, zwanym zbiorem | |||
stanów, a </math>f: S A {P}(S) <math> funkcją przejść. | |||
< | |||
\enddefin | |||
Funkcję przejść rozszerzamy do funkcji </math>f: S A^* {P}(S) <math> określonej | |||
na całym wolnym monoidzie </math>A^*<math> w następujący sposób: | |||
< | dla każdego </math>s S f(s,1) <nowiki>=</nowiki> s, <math> | ||
dla każdego </math>s S, a A<math> oraz dowolnego </math>w A^* f(s,wa)<nowiki>=</nowiki>f(f(s,w),a) | |||
.<math> | |||
Zwróćmy uwagę, że prawa strona ostatniej równości to obraz przez funkcję </math>f<math> zbioru | |||
</math>f(s,w)<math> i litery </math>a<math>. | |||
Funkcję przejść automatu niedeterministycznego można także traktować jako relację | |||
</math></center>f (S A^*) S.<center><math> | |||
W związku z powyższą definicją automat wprowadzony wcześniej, w wykładzie 3, | |||
będziemy nazywać automatem deterministycznym\index{automat deterministyczny}. | |||
\begindefin | |||
Język </math>L A^{*} <math> jest rozpoznawalny przez automat | |||
nie\-de\-ter\-mi\-nis\-tycz\-ny </math>{A}_{ND} <nowiki>=</nowiki>(S,f)<math> | |||
wtedy, gdy <math> | wtedy i tylko wtedy, gdy istnie\-je </math>I S<math> -- zbiór stanów | ||
początkowych oraz </math>F S<math> - zbiór stanów końcowych taki, że | |||
</math></center>L <nowiki>=</nowiki>w A^* : f(I,w) F .<center><math> | |||
\enddefin | |||
Niedeterministyczny automat rozpoznający język </math>L<math> będziemy oznaczać jako | |||
system </math>{A}_{ND} <nowiki>=</nowiki> (S,A,f,I,F)<math> lub </math>{A}_{ND}<nowiki>=</nowiki>(S,f,I,F), <math> | |||
jeśli wiadomo, nad jakim alfabetem określono automat. | |||
--- | Na pierwszy rzut oka mogłoby się wydawać, że wprowadzony automat istotnie rozszerza | ||
możliwości automatu deterministycznego, że jego moc obliczeniowa jest istotnie większa. | |||
Okazuje się jednak, że z punktu widzenia rozpoznawania | |||
języków, czyli właśnie z punktu widzenia mocy obliczeniowej, | |||
automaty deterministyczne i niedeterministyczne są rów\-no\-waż\-ne. | |||
\begintheor | |||
---- | Język </math>L A^*<math> jest rozpoznawany przez automat deter\-mi\-nis\-tycz\-ny wtedy i tylko wtedy, gdy jest rozpoznawany | ||
przez automat nie\-de\-ter\-mi\-nis\-tycz\-ny. | |||
\endtheor | |||
\beginprf | |||
Rozpocznijmy dowód od oczywistej obserwacji. Zauważmy, iż każdy | |||
automat deterministyczny można przekształcić w | |||
nie\-de\-ter\-mi\-nis\-tycz\-ny, modyfikując funkcję przejść w ten | |||
sposób, że jej wartościami są zbiory jednoelemen\-to\-we. | |||
Modyfikacja ta prowadzi w konsekwencji do równoważnego automatu | |||
niedeterministycznego. | |||
* <math> | Dla dowodu implikacji w stronę przeciwną załóżmy, że język </math>L<nowiki>=</nowiki>L({A}_{ND}) <math>, gdzie </math>{A}_{ND} <nowiki>=</nowiki> | ||
(S,f,I,F)<math>, jest automatem niedeterministycznym. Określamy teraz | |||
równoważny, jak się okaże, automat deterministyczny. Jako zbiór | |||
stanów przyjmujemy </math>{P}(S) <math>, czyli ogół podzbiorów | |||
zbioru </math>S<math>. Funkcję przejść </math>{f}:{P}(S) | |||
A^{*} {P}(S) <math> określamy kładąc dla | |||
dowolnego stanu </math>S_1 {P}(S) <math> oraz dowolnej litery </math> | |||
a A</center>{f} (S_1 ,a) <nowiki>=</nowiki> _{s S_1} f(s,a),<center><math> a | |||
następnie rozszerzamy ją do </math>A^{*} <math>. Łatwo sprawdzić, że funkcja | |||
</math>{f}<math> spełnia warunki funkcji przejść. Przyjmując następnie | |||
zbiór </math>I {P}(S) <math> jako stan początkowy oraz zbiór | |||
</math>T<nowiki>=</nowiki> {S}_{1} {P}(S) : S_{1} F | |||
<math>, jako zbiór stanów końcowych stwierdzamy, dla | |||
określo\-ne\-go automatu </math>{A}_{D}<nowiki>=</nowiki>( | |||
{P}(S),{f},I,T) <math>, równość | |||
</math></center>L({A}_{D})<nowiki>=</nowiki>w A^{*}: {f}(I,w) | |||
T<nowiki>=</nowiki>L<nowiki>=</nowiki>L({A}_{ND}).<center><math> | |||
Skonstruowany automat jest zatem | |||
deterministyczny i równoważny wyjściowemu, | |||
co kończy dowód twierdzenia. | |||
\begincenter \endcenter \endprf | |||
{{uwaga|[Uzupelnij]|| | |||
{{ | Dla określonego w dowodzie automatu </math>{A}_{D} <math> na ogół | ||
nie wszystkie stany są osiągalne ze stanu </math>I<math>. Aby uniknąć takich | |||
stanów, które są bezużyteczne, funkcję przejść należy zacząć | |||
definiować od stanu </math>I<math> i kolejno określać wartości | |||
<math> | dla już osiągniętych stanów. | ||
}} | |||
{{cwiczenie|[Uzupelnij]|| | |||
{ | |||
Automat </math>{A}_{ND} <nowiki>=</nowiki> (Q,A,f,I,F)<math> nad alfabetem </math>A<nowiki>=</nowiki>a,b <math> | |||
określony przez zbiory </math>Q<nowiki>=</nowiki>q_{0},q_{1},q_{2},q_4 , I<nowiki>=</nowiki>q_0, F<nowiki>=</nowiki>q_{3} <math> i | |||
zadany poniższym grafem jest przykładem automatu niedeterministycznego.\\ | |||
RYSUNEK ja-lekcja6-w-rys1 | |||
Automat ten, jak łatwo teraz zauważyć, rozpoznaje język </math>L({A})<nowiki>=</nowiki>A^*abb <math>. | |||
}} | }} | ||
Przedstawimy teraz algorytm, który mając na wejściu automat niedeterministyczny konstruuje | |||
równoważny automat deterministyczny. | |||
\newpage | \newpage | ||
\beginalgorithm | \beginalgorithm \caption{\textsc{Determinizacja} -- buduje deterministyczny automat | ||
\caption{\textsc{ | równoważny automatowi niedeterministycznemu} | ||
\beginalgorithmic [1] | \beginalgorithmic [1] | ||
\STATE Wejście: </math>{A}<nowiki>=</nowiki>(S, A, f, s_0, T)<math> -- automat | \STATE Wejście: </math>{A}<nowiki>=</nowiki>(S, A, f, s_0, T)<math> -- automat | ||
niedeterministyczny. | |||
\STATE Wyjście: | \STATE Wyjście: </math>{A}'<nowiki>=</nowiki>(S', A, f', s_0', T')<math> -- automat | ||
T')<math> | deterministyczny taki, że </math>L({A}')<nowiki>=</nowiki>L({A})<math>. | ||
\STATE </math> | \STATE </math>S' s_0<math>; | ||
\STATE </math> | \STATE </math>s_0' s_0<math>; | ||
\ | \STATE </math>{L} s_0<math>; \hfill | ||
</math>{L}<math> jest kolejką | |||
\ | \WHILE{</math>{L} <nowiki>=</nowiki> <math>} | ||
\STATE </math> | \STATE </math>M | ||
'''zdejmij'''({L})<math>; | |||
\STATE \textbf{ | \STATE \textbf{if } </math>T M <nowiki>=</nowiki> <math> \textbf{ then } </math>T' | ||
T' M<math>; | |||
\FOR{\textbf{each} </math> | \FOR{\textbf{each} </math>a A<math>} | ||
\ | \STATE </math>N _{m M} f(m,a)<math>; | ||
\IF{ | \IF{</math>N S'<math>} | ||
\STATE | { | ||
\STATE </math>S' S' N<math>; | |||
\STATE \textbf{włóż}</math>({L},N)<math>; | |||
} | |||
\ENDIF | \ENDIF | ||
\STATE </math>f'(M, a) N<math>; | |||
\STATE </math> | |||
( | |||
\ENDFOR | \ENDFOR | ||
\ | \ENDWHILE | ||
\RETURN </math>{A}'<math>; | |||
\RETURN </math>{A}' | |||
\endalgorithmic | \endalgorithmic | ||
\endalgorithm | \endalgorithm | ||
Funkcja \textbf{zdejmij}, występująca w linii [[##a1_l6|Uzupelnic a1_l6|]]., zdejmuje | |||
z kolejki element znajdujący się na jej początku i zwraca go jako | |||
swoją wartość. Procedura \textbf{włóż}</math>({L},N)<math> z linii | |||
[[##a1_l12|Uzupelnic a1_l12|]]. wstawia na koniec kolejki </math>{L}<math> element </math>N<math>. | |||
Należy zauważyć, że algorytm determinizujący automat jest algorytmem | |||
eksponencjalnym. Stany wyjściowego automatu deterministycznego | |||
etykietowane są podzbiorami zbioru stanów </math>Q<math>. Jeśli pewien stan </math>q' | |||
</math> | Q'<math> etykietowany jest zbiorem zawierającym stan końcowy z </math>F<math>, | ||
</math>< | to </math>q'<math> staje się stanem końcowym w automacie </math>{A}'<math>. | ||
Z analizy algorytmu [[##alg_1|Uzupelnic alg_1|]] wynika, że w ogólności zbiór stanów | |||
wyjściowego automatu deterministycznego może osiągać wartość rzędu | |||
</math>O(2^n)<math>, gdzie </math>n<math> jest ilością stanów automatu | |||
niedeterministycznego. | |||
Zastosujemy powyższy algorytm do uzyskania automatu deterministycznego równoważnego | |||
automatowi z przykładu 1.1. Kolejne etapy działania | |||
ilustruje zamieszczona tu animacja. | |||
ANIMACJA ja-lekcja6-w-anim1 | |||
==Automaty niedeterministyczne z przejściami pustymi== | |||
Rozszerzenie definicji automatu skończenie stanowego do automatu niedeterministycznego | |||
nie spowodowało, jak wiemy, zwiększenia mocy obliczeniowej takich modeli. Nasuwać się | |||
może pytanie, czy dołączenie do tego ostatniego modelu możliwości wewnętrznej zmiany | |||
stanu, zmiany stanu bez ingerencji sygnału zewnetrznego, czyli bez czytania litery nie zwiększy | |||
rodziny jezyków rozpoznawanych. | |||
Model taki, zwany automatem z pustymi przejściami (w skrócie: | |||
automat z p-przejściami), zdefiniujemy poniżej. | |||
\begindefin | |||
\textbf{Automatem niedeterministycznym z pustymi przejściami} nad alfabetem </math>A <math> nazy\-wa\-my | |||
system </math>{A}{^p}_{ND} <center><math> = (S,f),</math> w którym <math>S</math> jest dowolnym zbiorem, zwanym zbiorem | |||
stanów, a <math>f: S \times (A \cup \{1\}) \rightarrow \mathcal{P}(S) </math> funkcją przejść. | |||
{{uwaga|[Uzupelnij]|| | |||
Słowo puste <math>1</math> występuje w powyższej definicji w dwóch rolach. | |||
Pierwsza, to znana nam rola elementu neutralnego katenacji słów. | |||
Druga, to rola jakby "dodatkowej" litery, która może powodować | |||
zmianę aktualnego stanu automatu na inny. Ponieważ słowo puste może | |||
wystąpić przed i po każdej literze dowolnego słowa <math>w \in A^*</math> (i | |||
to wielokrotnie), dlatego też czytając słowo <math>w</math>, automat zmienia | |||
stany zgodnie nie tylko z sekwencją liter tego słowa, ale także z | |||
uwzględnieniem tej drugiej roli słowa pustego. | |||
}} | }} | ||
Rozszerzając powyższą definicję poprzez dodanie zbioru stanów | |||
początkowych i zbioru stanów końcowych, uzyskamy niedeterministyczny | |||
automat z pustymi przejściami <math>\mathcal{A}{^p}_{ND} </math></center> <nowiki>=</nowiki> | |||
(S,A,f,I,F),<math> dla którego będziemy mogli zdefiniować język | |||
rozpoznawany. W tym celu określimy najpierw działanie takiego | |||
automatu pod wpływem dowolnego słowa </math>w A^*<math>. Jeśli </math>s S<math> | |||
oraz </math>w<nowiki>=</nowiki>a A<math>, to | |||
</math></center>f(s,a)<nowiki>=</nowiki>f(1^na1^m )<nowiki>=</nowiki>f(1) ... f(1) f(a) f(1) ... f(1) : n,m {N}_0 .<center><math> | |||
</ | |||
Zwróćmy uwagę, iż zbiór określający wartość rozszerzonej funkcji jest skończony i efektywnie | |||
w | obliczalny, bo zbiór stanów automatu jest skończony. Jeśli teraz </math>s S<math> oraz </math>w<nowiki>=</nowiki>ua A<math>, to | ||
</math></center> | </math></center> f(s,w)<nowiki>=</nowiki>f(s,ua)<nowiki>=</nowiki>f(f(s,u),a).<center><math> | ||
f( | Stany ze zbioru </math>f(s,w)<math> będziemy nazywać stanami osiągalnymi z </math>s<math> | ||
pod wpływem słowa </math>w<math>. Prawdziwe jest następujące twierdzenie, które | |||
orzeka, iż z punktu widzenia rozpoznawania automaty | |||
niedeterministyczne z pustymi przejściami rozpoznają dokładnie te | |||
same języki, co automaty niedeterministyczne. | |||
\ | \begintheor | ||
Język </math>L A^*<math> jest rozpoznawany przez automat niedeter\-mi\-nis\-tycz\-ny | |||
\ | z pustymi przejściami wtedy i tylko wtedy, gdy jest rozpoznawany | ||
przez automat nie\-de\-ter\-mi\-nis\-tycz\-ny. | |||
\endtheor | |||
\beginprf (szkic) | |||
Fakt, że język </math>L<math> rozpoznawany przez automat nie\-de\-ter\-mi\-nis\-tycz\-ny jest | |||
rozpoznawany przez automat niedeter\-mi\-nis\-tycz\-ny | |||
z pustymi przejściami jest oczywisty. | |||
W | Dowód implikacji w drugą stronę polega na takiej modyfikacji | ||
automatu niedeter\-mi\-nis\-tycz\-nego z pustymi przejściami | |||
wszystkich | rozpoznającego jezyk </math>L<math>, by uzyskać automat bez pustych przejść i | ||
nie ograniczyć ani nie zwiększyć jego możliwości rozpoznawania. | |||
Zarysujemy ideę tej konstrukcji. Niech </math>{A}{^p}_{ND} <center><math> | |||
= (S,A,f,I,F),</math> będzie automatem niedeterministycznym z | |||
pustymi przejściami akceptującym język <math>L</math>. W konstruowanym | |||
automacie pozostawiamy zbiór stanów i stan początkowy bez zmian. | |||
Jeśli ze stanu początkowego <math>I</math> jest możliwość osiągnięcia jakiegoś | |||
stanu końcowego z <math>F</math>, to dodajemy stan początkowy do zbioru stanów | |||
końcowych, czyli zbiór stanów końcowych w konstruowanym automacie ma | |||
postać <math>F \cup \{I\}</math>. Jeśli nie ma takiej możliwości, to zbiór | |||
stanów końcowych pozostaje niezmieniony. Określamy wartość funkcji | |||
przejść dla dowolnego stanu <math>s \in S</math> i litery <math>a \in A</math> jako zbiór | |||
wszystkich stanów osiągalnych ze stanu <math>s</math> pod wpływem <math>a</math>. Tak | |||
skonstruowany automat niedeterministyczny nie ma pustych przejść i | |||
jak można wykazać, indukcyjnie ze względu na długość słowa, | |||
rozpoznaje dokładnie język <math>L</math>. | |||
<math>\diamondsuit</math> | |||
Algorytm usuwania przejść pustych i prowadzący do równoważnego automatu | |||
niedeterministycznego przedstawiony jest w ćwiczeniach do tego wykładu. | |||
==Lemat o pompowaniu== | |||
Jedną z wielu własności języków rozpoznawanych przez automaty | |||
skończone, i chyba jedną z najważniejszych, przedstawia prezentowane | |||
poniżej twierdzenie, zwane tradycyjnie w literaturze lematem o | |||
pompowaniu. Istota własności "pompowania" | |||
polega na tym, iż automat, mając skończoną ilość stanów, czytając i | |||
rozpoznając słowa dostatecznie długie, wykorzystuje w swoim | |||
działaniu pętlę, czyli powraca do stanu, w którym znajdował się | |||
wcześniej. Przez taką pętlę automat może przechodzić wielokrotnie, | |||
a co za tym idzie, "pompować" rozpoznawane słowo, wprowadzając do | |||
niego wielokrotnie powtarzane podsłowo odpowiadające tej pętli. | |||
\ | Niech <math>L \subset A^*</math> będzie językiem rozpoznawalnym. Istnieje liczba | ||
naturalna <math>N \geq 1</math> taka, że | |||
dowolne słowo <math>{ w} \in L</math> o długości <math>\mid { w} \mid \geq N </math> można rozłożyć na | |||
katenację <math>{ w} = { v}_1 { u v}_2,</math> gdzie <math>{ v}_1 , { v}_2 \in A^*, { u}\in A^+</math>, | |||
<math>\mid {v_{1}u} \mid \leq N</math> oraz | |||
<center><math>{ v}_1 u^* { v}_2 \subset L.</math></center> | |||
\ | Niech <math>L=L(\mathcal{A}) </math>, gdzie <math>\mathcal{A} =(S,A, | ||
f,s_0,T)</math> jest deterministycznym automatem skończenie stanowym. | |||
Niech <math>N = \#S </math> i rozważmy dowolne słowo <math>{ w } = a_1....a_k \in | |||
L</math> takie, że <math>\mid { w} \mid \geq N</math>. Oznaczmy: | |||
<center><math>s_1 = f(s_0,a_1), \;\; s_2 = f(s_1,a_2), ..., s_{i+1} = f(s_i,a_{i+1}),..., s_k = f(s_{k-1},a_k). </math></center> Słowo <math>w</math> jest | |||
akceptowane przez automat <math>\mathcal{A} </math>, więc <math>s_k \in T.</math> Ponieważ <math>\#S = N</math> oraz <math>k = \mid { w} \mid \geq N</math>, | |||
to istnieją <math>i,j\in \{1,...,N\} </math>, | |||
<math>i< j</math> takie, że <math>s_i =s_j</math>. | |||
\ | { Przyjmując teraz <math>{ v}_1 = a_1...a_i ,\;\;\; { | ||
v}_2 = a_{j+1}...a_k , \;\;\; { u} =a_{i+1}...a_j,</math> dochodzimy do | |||
nastepującej konkluzji: } | |||
\ | { <center><math>f(s_0, { v}_1) = s_i , \;\;\; f(s_j, { v}_2) = s_k \in T, \;\;\;f(s_i,{ u}) = s_i =s_j.</math></center> } | ||
\ | { A to oznacza, że słowo <math>v_{1}u^{k}v_{2} </math> jest rozpoznawane przez | ||
automat <math>\mathcal{A} </math> dla dowolnej liczby <math>k\geq 0 </math>, co | |||
kończy dowód. Nierówność <math>\mid {v_{1}u} \mid \leq N</math> wynika w oczywisty sposób | |||
z przyjętego na początku dowodu założenia, że <math>N = \#S</math>. } | |||
<math>\diamondsuit</math> | |||
Istotę dowodu przedstawia następująca animacja. | |||
ANIMACJA ja-lekcja6-w-anim2 | |||
\ | Jeśli rozpoznawalny język <math>L \subset A^*</math> jest nieskończony, to | ||
istnieją słowa <math>{ v}_1 , { u}, { v}_2 \in A^*</math> takie, że | |||
<center><math>{ v}_1 u^* { v}_2 \subset L \;\; i \;\; { u} \neq 1.</math></center> | |||
\ | Jeśli rozpoznawalny język <math>L \subset A^*</math> nie jest zbiorem pustym, to | ||
istnieje słowo <math>w\in L </math> | |||
takie, że <math>\mid w\mid <N </math>, gdzie <math>N </math> jest stałą występującą | |||
w lemacie o pompowaniu. <br> | |||
Jeśli słowo <math>w\in L </math> i <math>\mid w\mid \geq N </math>, to zgodnie z lematem | |||
o pompowaniu możemy przedstawić słowo <math>w </math> jako <math>w=v_{1}uv_{2} | |||
</math>, gdzie <math>u\neq 1 </math> oraz <math>v_{1}u^{i}v_{2}\in L </math> dla <math>i=0,1,2\ldots </math>. Przyjmując <math>i=0 </math>, mamy <math>v_{1}v_{2}\in L </math> | |||
i <math>\mid v_{1}v_{2}\mid <\mid w\mid </math>. Powtarzając powyższy | |||
rozkład skończoną ilość razy, otrzymamy słowo należące do języka <math>L </math>, o długości mniejszej od <math>N </math>. | |||
Lemat o pompowaniu wykorzystuje się najczęściej do uzasadnienia faktu, iż pewne | |||
języki nie są rozpoznawane przez automaty skończone. Przyjrzyjmy się bliżej technice | |||
takiego uzasadnienia. | |||
{{cwiczenie|[Uzupelnij]|| | |||
\ | Rozważmy język <math>L = \{ a^n b^n : n \geq 0 \}</math> nad alfabetem <math>A = \{ | ||
\ | a,b\}</math>. W oparciu o lemat o pompowaniu wykażemy, że język <math>L</math> nie | ||
jest rozpoznawany. Dla dowodu nie wprost, przypuszczamy, że <math>L</math> jest | |||
rozpoznawany. Na podstawie udowodnionego lematu istnieją zatem słowa | |||
<math>{ v}_1 , { u}, { v}_2 \in A^*</math> takie, że <math>{ v}_1 u^* { v}_2 \subset | |||
L</math> oraz <math>{ u} \neq 1.</math> Biorąc pod uwagę formę słów języka <math>L </math>, | |||
wnioskujemy, że | |||
* słowo <math>{ u} </math> nie może składać się tylko z liter <math>a</math>, gdyż słowo <math>{ v}_1 { u}^2 { v}_2</math> zawierałoby więcej liter <math>a</math> niż <math>b</math>, | |||
* słowo <math>{ u} </math> nie może składać się tylko z liter <math>b</math>, gdyż słowo <math>{ v}_1 { u}^2 { v}_2</math> zawierałoby więcej liter <math>b</math> niż <math>a</math>, | |||
</math> | |||
\ | * słowo <math>{ u} </math> nie może składać się z liter <math>a \; i \; b</math>, gdyż w słowie <math>{ v}_1 { u}^2 { v}_2</math> litera <math>b</math> poprzedzałaby literę <math>a</math>. | ||
Ponieważ słowo <math>{ v}_1 { u}^2 { v}_2,</math> | |||
należy do języka <math>L </math>, więc każdy z wyprowadzonych powyżej | |||
wniosków prowadzi do sprzeczności. | |||
}} | |||
==Rozstrzygalność== | |||
Udowodniony w poprzedniej części wykładu lemat o pompowaniu wykorzystywany bywa | |||
również w dowodach rozstrzygalności pewnych problemów w klasie języków rozpoznawalnych. | |||
\ | W klasie języków regularnych <math>\mathcal{REG}(A^{*}) </math> następujące | ||
problemy są rozstrzygalne: | |||
\ | # problem niepustości języka <math>L\neq \emptyset, </math> | ||
\ | # problem nieskończoności języka <math>card\, L=\aleph _{0}, </math> | ||
# problem równości języków <math>L_{1}=L_{2}, </math> | |||
# problem należenia słowa do języka <math>w\in L. </math> | |||
[[##niepusty|Uzupelnic niepusty|]]. | |||
Wystarczy sprawdzić niepustość skończonego podzbioru języka | |||
<math>L. </math> Prawdziwa jest bowiem równoważność | |||
<center><math>L\neq \oslash \: \Leftrightarrow \: \exists w\in L\, :\, \mid w\mid <N,</math></center> | |||
\ | gdzie <math>N </math> jest stałą występującą w lemacie o pompowaniu. | ||
Prawdziwość implikacji <math>\Leftarrow </math> jest oczywista. Fakt, że | |||
do niepustego języka należy słowo o długości ograniczonej | |||
przez <math>N </math>, wynika z lematu o pompowaniu. Jeśli <math>w\in L </math> i <math>\mid w\mid \geq N </math>, | |||
rozkładamy słowo <math>w </math> następująco: | |||
\ | <center><math>w=v_{1}uv_{2},\; \; u\neq 1,\; \; \forall i=0,1,2\ldots \: v_{1}u^{i}v_{2}\in L. </math></center> | ||
Przyjmując <math>i=0 </math> mamy: | |||
<center><math>v_{1}v_{2}\in L,\; \mid v_{1}v_{2}\mid <\mid w\mid </math></center> | |||
Powtarzając powyższy rozkład skończoną ilość razy | |||
otrzymamy słowo należące do języka, o długości ograniczonej | |||
przez <math>N </math>. | |||
\ | [[##nieskonczony|Uzupelnic nieskonczony|]]. | ||
\ | Należy udowodnić równoważność : <center><math>L \mbox{ nieskończony } \;\; \Longleftrightarrow \;\;\exists w \in L \;\; : \;\; N \leq \mid w \mid < 2N</math></center> | ||
\ | <math>\Longrightarrow </math> <br> | ||
\ | Jeśli <math>L </math> jest nieskończonym zbiorem, to istnieje słowo <math>w </math> | ||
dowolnie długie. Niech <math>\mid w\mid \geq N </math>''.'' Jeśli słowo | |||
<math>w </math> nie spełnia ograniczenia <math>\mid w\mid <2N </math>, to podobnie jak | |||
poprzednio korzystamy z lematu o pompowaniu i po skończonej ilości | |||
kroków otrzymamy słowo krótsze od <math>2N </math>. Należy jeszcze zauważyć, | |||
że wykorzystując lemat o pompowaniu możemy założyć, | |||
że usuwane słowo <math>u </math> ma długość ograniczoną | |||
przez <math>N </math>. (Zawsze znajdziemy słowo <math>u </math> spełniające ten | |||
warunek.) Oznacza to, że ze słowa dłuższego od <math>2N </math> nie | |||
dostaniemy słowa krótszego od <math>N </math>. <br> | |||
<math>\Longleftarrow </math><br> | |||
Jeśli do języka <math>L </math> należy słowo <math>w </math> o długości | |||
większej lub równej <math>N </math>, to z lematu o pompowaniu wynika, że | |||
\ | <center><math>w=v_{1}uv_{2},\: u\neq 1\;\;\; i\;\;\; v_{1}u^{*}v_{2}\subset L</math></center> | ||
Istnieje więc nieskończony podzbiór zawierający się w <math>L </math>, a zatem język <math>L </math> jest nieskończony. | |||
\ | [[##rownosc|Uzupelnic rownosc|]]. | ||
\ | Niech <math>L=(L_{1}\cap \overline{L_{2}})\cup (\overline{L_{1}}\cap L_{2}) </math>. | ||
Z domkniętości klasy <math>\mathcal{L}_{3} </math> na operaje boolowskie | |||
\ | wynika, że język <math>L </math> jest regularny. Prawdziwa jest równoważność | ||
\ | |||
<center><math>L\neq \emptyset \Longleftrightarrow L_{1}\neq L_{2}. </math></center> | |||
Poblem równoważności języków został sprowadzony do problemu | |||
niepustości. | |||
[[##nalezenie|Uzupelnic nalezenie|]]. | |||
Konstruujemy automat <math>\mathcal{A} </math></center><nowiki>=</nowiki>(S,f,s_0,T)<math> rozpoznający język | |||
</math>L <math> i sprawdzamy, czy </math>f(s_{0},w) T. <math> | |||
\begincenter \endcenter \endprf | |||
Ilustracją dla powyższego wprowadzenia może być problem skończoności w~klasie | |||
jezyków regularnych. Problem jest rozstrzygalny, bowiem w oparciu o lemat | |||
o~pom\-po\-wa\-niu można skonstruować algorytm, który dla dowolnego języka regularnego | |||
rozstrzygnie ten problem, czyli odpowie twierdząco lub przecząco na pytanie | |||
o jego skończoność.</math> |
Wersja z 12:58, 17 sie 2006
{theor}{TWIERDZENIE}[section] {rem}{UWAGA}[section] {corol}{WNIOSEK}[section] {fact}{FAKT}[section] {ex}{PRZYKŁAD}[section] {defin}{DEFINICJA}[section] {lem}{LEMAT}[section]
{prf}{DOWÓD}
{algorithm}{Algorytm}
{ Automat niedeterministyczny, lemat o pompowaniu}
- Wprowadzenie
- W tym wykładzie
zdefiniujemy automat niedeterministyczny, udowodnimy jego równoważność z automatem deterministycznym oraz podamy algorytm konstrukcji równoważnego automatu deterministycznego. Wprowadzimy także automaty niedeterministyczne z pustymi przejściami. W ostatniej części wykładu sformułujemy lemat o pompowaniu dla języków rozpoznawanych przez automaty skończenie stanowe.
- Słowa kluczowe
- automat niedeterministyczny, automat niedeterministyczny z pustymi
przejściami, lemat o pompowaniu.
Automat niedeterministyczny
Wprowadzony wcześniej automat jest modelem obliczeń, czy też mówiąc ogólniej, modelem procesu o bardzo prostym opisie. Stan procesu zmienia się w sposób jednoznaczny pod wpływem sygnału zewnętrznego reprezentowanego przez literę alfabetu. Opisem tych zmian jest więc funkcja. Pewnym uogólnieniem powyższej sytuacji może być dopuszczenie relacji, która opisuje zmiany stanu. W efekcie opis zmiany stanów staje się niedeterministyczny w tym sensie, że z danego stanu automat przechodzi w pewien zbiór stanów. Jak udowodnimy pó{z}niej, z punktu widzenia rozpoznawania lub poprawnych obliczeń, takie uogólnienie nie rozszerza klasy języków rozpoznawanych przez automaty.
Automatem niedeterministycznym nad alfabetem nazywamy
system
= (S,f),Parser nie mógł rozpoznać (błąd składni): {\displaystyle w którym } SParser nie mógł rozpoznać (błąd składni): {\displaystyle jest dowolnym zbiorem, zwanym zbiorem stanów, a } f: S A {P}(S) Parser nie mógł rozpoznać (błąd składni): {\displaystyle funkcją przejść. \enddefin Funkcję przejść rozszerzamy do funkcji } f: S A^* {P}(S) Parser nie mógł rozpoznać (błąd składni): {\displaystyle określonej na całym wolnym monoidzie } A^*Parser nie mógł rozpoznać (błąd składni): {\displaystyle w następujący sposób: dla każdego } s S f(s,1) = s, Parser nie mógł rozpoznać (błąd składni): {\displaystyle dla każdego } s S, a A
w A^* f(s,wa)=f(f(s,w),a) .Parser nie mógł rozpoznać (błąd składni): {\displaystyle Zwróćmy uwagę, że prawa strona ostatniej równości to obraz przez funkcję } f
f(s,w)
aParser nie mógł rozpoznać (błąd składni): {\displaystyle . Funkcję przejść automatu niedeterministycznego można także traktować jako relację } f (S A^*) S.
L =w A^* : f(I,w) F .
(S,f,I,F)Parser nie mógł rozpoznać (błąd składni): {\displaystyle , jest automatem niedeterministycznym. Określamy teraz równoważny, jak się okaże, automat deterministyczny. Jako zbiór stanów przyjmujemy } {P}(S) Parser nie mógł rozpoznać (błąd składni): {\displaystyle , czyli ogół podzbiorów zbioru } SParser nie mógł rozpoznać (błąd składni): {\displaystyle . Funkcję przejść } {f}:{P}(S) A^{*} {P}(S) Parser nie mógł rozpoznać (błąd składni): {\displaystyle określamy kładąc dla dowolnego stanu } S_1 {P}(S)
a A{f} (S_1 ,a) = _{s S_1} f(s,a),
Parser nie mógł rozpoznać (błąd składni): {\displaystyle , jako zbiór stanów końcowych stwierdzamy, dla określo\-ne\-go automatu } {A}_{D}=(
{P}(S),{f},I,T) Parser nie mógł rozpoznać (błąd składni): {\displaystyle , równość }L({A}_{D})=w A^{*}: {f}(I,w) T=L=L({A}_{ND}).
zdejmij({L})Parser nie mógł rozpoznać (nieznana funkcja „\STATE”): {\displaystyle ; \STATE \textbf{if } } T M = T' T' MParser nie mógł rozpoznać (nieznana funkcja „\FOR”): {\displaystyle ; \FOR{\textbf{each} } a AParser nie mógł rozpoznać (nieznana funkcja „\STATE”): {\displaystyle } \STATE } N _{m M} f(m,a)Parser nie mógł rozpoznać (nieznana funkcja „\IF”): {\displaystyle ; \IF{} N S'Parser nie mógł rozpoznać (nieznana funkcja „\STATE”): {\displaystyle } { \STATE } S' S' NParser nie mógł rozpoznać (nieznana funkcja „\STATE”): {\displaystyle ; \STATE \textbf{włóż}} ({L},N)Parser nie mógł rozpoznać (nieznana funkcja „\ENDIF”): {\displaystyle ; } \ENDIF \STATE } f'(M, a) NParser nie mógł rozpoznać (nieznana funkcja „\ENDFOR”): {\displaystyle ; \ENDFOR \ENDWHILE \RETURN } {A}'Parser nie mógł rozpoznać (nieznana funkcja „\endalgorithmic”): {\displaystyle ; \endalgorithmic \endalgorithm Funkcja \textbf{zdejmij}, występująca w linii [[##a1_l6|Uzupelnic a1_l6|]]., zdejmuje z kolejki element znajdujący się na jej początku i zwraca go jako swoją wartość. Procedura \textbf{włóż}} ({L},N)Parser nie mógł rozpoznać (błąd składni): {\displaystyle z linii [[##a1_l12|Uzupelnic a1_l12|]]. wstawia na koniec kolejki } {L}NParser nie mógł rozpoznać (błąd składni): {\displaystyle . Należy zauważyć, że algorytm determinizujący automat jest algorytmem eksponencjalnym. Stany wyjściowego automatu deterministycznego etykietowane są podzbiorami zbioru stanów } QParser nie mógł rozpoznać (błąd składni): {\displaystyle . Jeśli pewien stan } q'
Q'Parser nie mógł rozpoznać (błąd składni): {\displaystyle etykietowany jest zbiorem zawierającym stan końcowy z } Fq'Parser nie mógł rozpoznać (błąd składni): {\displaystyle staje się stanem końcowym w automacie } {A}'Parser nie mógł rozpoznać (błąd składni): {\displaystyle . Z analizy algorytmu [[##alg_1|Uzupelnic alg_1|]] wynika, że w ogólności zbiór stanów wyjściowego automatu deterministycznego może osiągać wartość rzędu } O(2^n)nParser nie mógł rozpoznać (błąd składni): {\displaystyle jest ilością stanów automatu niedeterministycznego. Zastosujemy powyższy algorytm do uzyskania automatu deterministycznego równoważnego automatowi z przykładu 1.1. Kolejne etapy działania ilustruje zamieszczona tu animacja. ANIMACJA ja-lekcja6-w-anim1 ==Automaty niedeterministyczne z przejściami pustymi== Rozszerzenie definicji automatu skończenie stanowego do automatu niedeterministycznego nie spowodowało, jak wiemy, zwiększenia mocy obliczeniowej takich modeli. Nasuwać się może pytanie, czy dołączenie do tego ostatniego modelu możliwości wewnętrznej zmiany stanu, zmiany stanu bez ingerencji sygnału zewnetrznego, czyli bez czytania litery nie zwiększy rodziny jezyków rozpoznawanych. Model taki, zwany automatem z pustymi przejściami (w skrócie: automat z p-przejściami), zdefiniujemy poniżej. \begindefin \textbf{Automatem niedeterministycznym z pustymi przejściami} nad alfabetem } A Parser nie mógł rozpoznać (błąd składni): {\displaystyle nazy\-wa\-my system } {A}{^p}_{ND}stanów, a funkcją przejść.
Słowo puste występuje w powyższej definicji w dwóch rolach. Pierwsza, to znana nam rola elementu neutralnego katenacji słów. Druga, to rola jakby "dodatkowej" litery, która może powodować zmianę aktualnego stanu automatu na inny. Ponieważ słowo puste może wystąpić przed i po każdej literze dowolnego słowa (i to wielokrotnie), dlatego też czytając słowo , automat zmienia stany zgodnie nie tylko z sekwencją liter tego słowa, ale także z uwzględnieniem tej drugiej roli słowa pustego.
Rozszerzając powyższą definicję poprzez dodanie zbioru stanów początkowych i zbioru stanów końcowych, uzyskamy niedeterministyczny
automat z pustymi przejściamif(s,a)=f(1^na1^m )=f(1) ... f(1) f(a) f(1) ... f(1) : n,m {N}_0 .
f(s,w)=f(s,ua)=f(f(s,u),a).
pustymi przejściami akceptującym język . W konstruowanym automacie pozostawiamy zbiór stanów i stan początkowy bez zmian. Jeśli ze stanu początkowego jest możliwość osiągnięcia jakiegoś stanu końcowego z , to dodajemy stan początkowy do zbioru stanów końcowych, czyli zbiór stanów końcowych w konstruowanym automacie ma postać . Jeśli nie ma takiej możliwości, to zbiór stanów końcowych pozostaje niezmieniony. Określamy wartość funkcji przejść dla dowolnego stanu i litery jako zbiór wszystkich stanów osiągalnych ze stanu pod wpływem . Tak skonstruowany automat niedeterministyczny nie ma pustych przejść i jak można wykazać, indukcyjnie ze względu na długość słowa, rozpoznaje dokładnie język .
Algorytm usuwania przejść pustych i prowadzący do równoważnego automatu niedeterministycznego przedstawiony jest w ćwiczeniach do tego wykładu.
Lemat o pompowaniu
Jedną z wielu własności języków rozpoznawanych przez automaty skończone, i chyba jedną z najważniejszych, przedstawia prezentowane poniżej twierdzenie, zwane tradycyjnie w literaturze lematem o pompowaniu. Istota własności "pompowania" polega na tym, iż automat, mając skończoną ilość stanów, czytając i rozpoznając słowa dostatecznie długie, wykorzystuje w swoim działaniu pętlę, czyli powraca do stanu, w którym znajdował się wcześniej. Przez taką pętlę automat może przechodzić wielokrotnie, a co za tym idzie, "pompować" rozpoznawane słowo, wprowadzając do niego wielokrotnie powtarzane podsłowo odpowiadające tej pętli.
Niech będzie językiem rozpoznawalnym. Istnieje liczba naturalna taka, że dowolne słowo o długości można rozłożyć na katenację gdzie , oraz
Niech , gdzie jest deterministycznym automatem skończenie stanowym. Niech i rozważmy dowolne słowo takie, że . Oznaczmy:
akceptowane przez automat , więc Ponieważ oraz , to istnieją , takie, że .
{ Przyjmując teraz dochodzimy do nastepującej konkluzji: }
{{ A to oznacza, że słowo jest rozpoznawane przez automat dla dowolnej liczby , co kończy dowód. Nierówność wynika w oczywisty sposób z przyjętego na początku dowodu założenia, że . }
Istotę dowodu przedstawia następująca animacja.
ANIMACJA ja-lekcja6-w-anim2
Jeśli rozpoznawalny język jest nieskończony, to istnieją słowa takie, że
Jeśli rozpoznawalny język nie jest zbiorem pustym, to
istnieje słowo
takie, że , gdzie jest stałą występującą
w lemacie o pompowaniu.
Jeśli słowo i , to zgodnie z lematem
o pompowaniu możemy przedstawić słowo jako , gdzie oraz dla . Przyjmując , mamy
i . Powtarzając powyższy
rozkład skończoną ilość razy, otrzymamy słowo należące do języka , o długości mniejszej od .
Lemat o pompowaniu wykorzystuje się najczęściej do uzasadnienia faktu, iż pewne języki nie są rozpoznawane przez automaty skończone. Przyjrzyjmy się bliżej technice takiego uzasadnienia.
Ćwiczenie [Uzupelnij]
Rozważmy język nad alfabetem . W oparciu o lemat o pompowaniu wykażemy, że język nie jest rozpoznawany. Dla dowodu nie wprost, przypuszczamy, że jest rozpoznawany. Na podstawie udowodnionego lematu istnieją zatem słowa takie, że oraz Biorąc pod uwagę formę słów języka , wnioskujemy, że
- słowo nie może składać się tylko z liter , gdyż słowo zawierałoby więcej liter niż ,
- słowo nie może składać się tylko z liter , gdyż słowo zawierałoby więcej liter niż ,
- słowo nie może składać się z liter , gdyż w słowie litera poprzedzałaby literę .
Ponieważ słowo należy do języka , więc każdy z wyprowadzonych powyżej wniosków prowadzi do sprzeczności.
Rozstrzygalność
Udowodniony w poprzedniej części wykładu lemat o pompowaniu wykorzystywany bywa również w dowodach rozstrzygalności pewnych problemów w klasie języków rozpoznawalnych.
W klasie języków regularnych następujące problemy są rozstrzygalne:
- problem niepustości języka
- problem nieskończoności języka
- problem równości języków
- problem należenia słowa do języka
Uzupelnic niepusty|. Wystarczy sprawdzić niepustość skończonego podzbioru języka Prawdziwa jest bowiem równoważność
gdzie jest stałą występującą w lemacie o pompowaniu. Prawdziwość implikacji jest oczywista. Fakt, że do niepustego języka należy słowo o długości ograniczonej przez , wynika z lematu o pompowaniu. Jeśli i , rozkładamy słowo następująco:
Przyjmując mamy:
Powtarzając powyższy rozkład skończoną ilość razy otrzymamy słowo należące do języka, o długości ograniczonej przez .
Należy udowodnić równoważność :
Jeśli jest nieskończonym zbiorem, to istnieje słowo
dowolnie długie. Niech . Jeśli słowo
nie spełnia ograniczenia , to podobnie jak
poprzednio korzystamy z lematu o pompowaniu i po skończonej ilości
kroków otrzymamy słowo krótsze od . Należy jeszcze zauważyć,
że wykorzystując lemat o pompowaniu możemy założyć,
że usuwane słowo ma długość ograniczoną
przez . (Zawsze znajdziemy słowo spełniające ten
warunek.) Oznacza to, że ze słowa dłuższego od nie
dostaniemy słowa krótszego od .
Jeśli do języka należy słowo o długości
większej lub równej , to z lematu o pompowaniu wynika, że
Istnieje więc nieskończony podzbiór zawierający się w , a zatem język jest nieskończony. Uzupelnic rownosc|. Niech . Z domkniętości klasy na operaje boolowskie wynika, że język jest regularny. Prawdziwa jest równoważność
Poblem równoważności języków został sprowadzony do problemu niepustości.
Konstruujemy automat