Języki, automaty i obliczenia/Wykład 3: Automat skończenie stanowy: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m (Zastępowanie tekstu - "\:" na "\ :")
m (Zastępowanie tekstu – „<math> ” na „<math>”)
 
(Nie pokazano 20 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 30: Linia 30:
można, przyjmując następujące oznaczenia. Fakt, że osoba chce wejść do pomieszczenia
można, przyjmując następujące oznaczenia. Fakt, że osoba chce wejść do pomieszczenia
zamykanego przez takie drzwi, identyfikowany przez odpowiedni czujnik, opiszemy symbolem
zamykanego przez takie drzwi, identyfikowany przez odpowiedni czujnik, opiszemy symbolem
<math>\displaystyle WE</math>. Zamiar wyjścia symbolem <math>\displaystyle WY</math>. Symbol <math>\displaystyle WEWY</math> będzie związany z równoczesnym zamiarem
<math>WE</math>. Zamiar wyjścia symbolem <math>WY</math>. Symbol <math>WEWY</math> będzie związany z równoczesnym zamiarem
wejścia jakiejś osoby i wyjścia innej. Wreszcie symbol <math>\displaystyle BRAK</math> oznaczał będzie brak osób, które
wejścia jakiejś osoby i wyjścia innej. Wreszcie symbol <math>BRAK</math> oznaczał będzie brak osób, które
chcą wejść lub wyjść. Zatem zbiór <math>\displaystyle \{ WE, WY,WEWY,BRAK \}</math>, to alfabet nad którym określimy automat
chcą wejść lub wyjść. Zatem zbiór <math>\{ WE, WY,WEWY,BRAK \}</math>, to alfabet nad którym określimy automat
o <math>\displaystyle 2</math> stanach: <math>\displaystyle OTWARTE, ZAMKNIĘTE</math> poniższym grafem.
o <math>2</math> stanach: <math>\{ OTWARTE, ZAMKNIETE \}</math> poniższym grafem.
}}
}}


{| border="0" align="center" cellspacing="10"
[[File:ja-lekcja03-w-rys6.svg|270x270px|thumb|center|Rysunek 1]]
|<div class="thumb"><div style="width:270px;">
 
<flash>file=ja-lekcja03-w-rys6.swf|width=270|height=270</flash>
[[File:ja-lekcja03-w-rys7.mp4|250x250px|thumb|center|Animacja 1]]
<div.thumbcaption>Rysunek 1</div>
 
</div></div>
|<div class="thumb"><div style="width:250px;">
<flashwrap>file=ja-lekcja03-w-rys7.swf|size=small</flashwrap>
<div.thumbcaption>Animacja 1</div>
</div></div>
|}


Automaty reagują więc na określone sygnały zewnętrzne reprezentowane  
Automaty reagują więc na określone sygnały zewnętrzne reprezentowane  
przez litery alfabetu <math>\displaystyle A</math>, zmieniając swój stan.  Jeśli ustalimy   
przez litery alfabetu <math>A</math>, zmieniając swój stan.  Jeśli ustalimy   
stan początkowy automatu oraz dopuszczalne stany końcowe, to automat  
stan początkowy automatu oraz dopuszczalne stany końcowe, to automat  
będzie testował dowolne słowo z  <math>\displaystyle A^{*} </math> ,  startując ze stanu  
będzie testował dowolne słowo z  <math>A^{*}</math> ,  startując ze stanu  
początkowego. Jeśli rezultatem finalnym działania automatu  
początkowego. Jeśli rezultatem finalnym działania automatu  
(obliczenia) będzie stan końcowy, to słowo będzie rozpoznawane przez  
(obliczenia) będzie stan końcowy, to słowo będzie rozpoznawane przez  
automat, a obliczenie określone takim słowem poprawne. Automaty można graficznie reprezentować jako etykietowane grafy skierowane. W takim grafie każdy wierzchołek odpowiada stanowi automatu, a każda strzałka  pomiędzy wierzchołkami <math>\displaystyle u</math> i <math>\displaystyle v</math>, etykietowana symbolem <math>\displaystyle a</math>, oznacza przejście automatu ze stanu <math>\displaystyle u</math> do stanu <math>\displaystyle v</math> pod wpływem litery <math>\displaystyle a</math>.  
automat, a obliczenie określone takim słowem poprawne. Automaty można graficznie reprezentować jako etykietowane grafy skierowane. W takim grafie każdy wierzchołek odpowiada stanowi automatu, a każda strzałka  pomiędzy wierzchołkami <math>u</math> i <math>v</math>, etykietowana symbolem <math>a</math>, oznacza przejście automatu ze stanu <math>u</math> do stanu <math>v</math> pod wpływem litery <math>a</math>.  
Podamy teraz definicję automatu. Niech <math>\displaystyle A</math> oznacza dowolny alfabet.
Podamy teraz definicję automatu. Niech <math>A</math> oznacza dowolny alfabet.
Od tego momentu wykładu zakładamy, że alfabet jest zbiorem skończonym.
Od tego momentu wykładu zakładamy, że alfabet jest zbiorem skończonym.


{{definicja|1.1||
{{definicja|1.1||


'''Automatem''' nad alfabetem  <math>\displaystyle A </math>  nazywamy system  <math>\displaystyle \mathcal{A} \displaystyle =(S,f)</math>,
'''Automatem''' nad alfabetem  <math>A</math>  nazywamy system  <math>\mathcal{A} =(S,f)</math>,
w którym
w którym


<math>\displaystyle S</math> - jest dowolnym skończonym zbiorem zwanym zbiorem stanów,
<math>S</math> - jest dowolnym skończonym zbiorem zwanym zbiorem stanów,


<math>\displaystyle f: S \times A \rightarrow S</math> - jest funkcją przejść.
<math>f: S \times A \rightarrow S</math> - jest funkcją przejść.


}}
}}


Automat będąc w stanie  <math>\displaystyle s_{i} </math>  po przeczytaniu litery  <math>\displaystyle a </math>  zmienia
Automat będąc w stanie  <math>s_{i}</math>  po przeczytaniu litery  <math>a</math>  zmienia
stan na  <math>\displaystyle s_{j} </math>  zgodnie z funkcją przejścia  <math>\displaystyle f(s_{i},a)=s_{j} </math> .
stan na  <math>s_{j}</math>  zgodnie z funkcją przejścia  <math>f(s_{i},a)=s_{j}</math> .


Funkcję przejść rozszerzamy na cały wolny monoid  <math>\displaystyle A^{*} </math>  do postaci  
Funkcję przejść rozszerzamy na cały wolny monoid  <math>A^{*}</math>  do postaci  


<center><math>\displaystyle f: S \times A^* \rightarrow S,</math></center>
<center><math>f: S \times A^* \rightarrow S</math>,</center>
przyjmując:
przyjmując:


dla każdego <math>\displaystyle  s \in S\;\;\;f(s,1) = s </math> oraz
dla każdego <math>s \in S\;\;\;f(s,1) = s</math> oraz


dla każdego <math>\displaystyle s \in S,\;\;a \in A</math> i dla dowolnego <math>\displaystyle w \in A^*</math>
dla każdego <math>s \in S,\;\;a \in A</math> i dla dowolnego <math>w \in A^*</math>


<center><math>\displaystyle
<center><math>
f(s,wa) = f(f(s,w),a).
f(s,wa) = f(f(s,w),a)</math></center>
</math></center>


Działanie automatu pokazane jest na poniższej animacji 2.
Działanie automatu pokazane jest na poniższej animacji 2.
<center>
[[File:ja-lekcja03-w-rys1.mp4|250x250px|thumb|center|Animacja 2]]
<div class="thumb"><div style="width:250px;">
<flashwrap>file=ja-lekcja03-w-rys1.swf|size=small</flashwrap>
<div.thumbcaption>Animacja 2</div></div></div>
</center>


Zdefiniowany powyżej automat  <math>\displaystyle \mathcal{A} </math>  nazywamy '''skończonym''' lub
Zdefiniowany powyżej automat  <math>\mathcal{A}</math>  nazywamy '''skończonym''' lub
'''skończenie stanowym''' ze względu na założenie skończoności zbioru stanów <math>\displaystyle S</math>.<br>
'''skończenie stanowym''' ze względu na założenie skończoności zbioru stanów <math>S</math>.<br>


<span id="przyklad_1_2">{{przyklad|1.2.||
<span id="przyklad_1_2">{{przyklad|1.2.||


Niech  <math>\displaystyle A=\left\{ a,b\right\}   </math>  będzie alfabetem, a  <math>\displaystyle \mathcal{A}=(S,f) </math>  
Niech  <math>A=\left\{ a,b\right\}</math>  będzie alfabetem, a  <math>\mathcal{A}=(S,f)</math>  
automatem takim, że
automatem takim, że


<math>\displaystyle S=\left\{ s_{0},s_{1},s_{2}\right\}   </math> , a funkcja przejść zadana jest przy
<math>S=\left\{ s_{0},s_{1},s_{2}\right\}</math> , a funkcja przejść zadana jest przy
pomocy tabelki
pomocy tabelki
}}</span>
}}</span>


<center><math>\displaystyle \begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2\\
<center><math>\begin{array} {c|c|c|c|c|} f & s_0 & s_1 & s_2\\
\hline a & s_1 & s_2 & s_2\\
\hline a & s_1 & s_2 & s_2\\
\hline b & s_0 & s_0 & s_0\\
\hline b & s_0 & s_0 & s_0\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>




Linia 112: Linia 101:


<center>
<center>
<div class="thumb"><div style="width:350px;">
[[File:ja-lekcja03-w-rys2.svg|350x150px|thumb|center|Rysunek 2]]
<flash>file=ja-lekcja03-w-rys2.swf|width=350|height=150</flash>
<div.thumbcaption>Rysunek 2</div>
</div></div>
</center>
</center>


Linia 121: Linia 107:
Podamy teraz bardzo interesujący przykład zastosowania automatów  skończonych.
Podamy teraz bardzo interesujący przykład zastosowania automatów  skończonych.
Przedstawimy mianowicie wykorzystanie  tak zwanych
Przedstawimy mianowicie wykorzystanie  tak zwanych
automatów synchronizujących w przemyśle. Automat synchronizujący nad alfabetem <math>\displaystyle A</math> to
automatów synchronizujących w przemyśle. Automat synchronizujący nad alfabetem <math>A</math> to
automat <math>\displaystyle (S,f)</math>  o
automat <math>(S,f)</math>  o
następującej własności: istnieje stan <math>\displaystyle t \in S</math> oraz słowo <math>\displaystyle w \in
następującej własności: istnieje stan <math>t \in S</math> oraz słowo <math>w \in
A^*</math> takie, że dla każdego stanu <math>\displaystyle s</math> tego automatu <math>\displaystyle  f(s, w)=t</math>. Istnieje więc pewne uniwersalne
A^*</math> takie, że dla każdego stanu <math>s</math> tego automatu <math>f(s, w)=t</math>. Istnieje więc pewne uniwersalne
słowo <math>\displaystyle w</math>, pod wpływem którego wszystkie stany przechodzą w jeden,
słowo <math>w</math>, pod wpływem którego wszystkie stany przechodzą w jeden,
ustalony stan automatu <math>\displaystyle t \in S</math>. Mówimy, że następuje wtedy synchronizacja
ustalony stan automatu <math>t \in S</math>. Mówimy, że następuje wtedy synchronizacja
wszystkich stanów automatu.
wszystkich stanów automatu.


Linia 135: Linia 121:
dziedzinie.
dziedzinie.


<div class="thumb tright"><div style="width:250px;">
[[File:ja-lekcja03-w-rys-s1.svg|250x100px|thumb|right|Rysunek 3]]
<flash>file=ja-lekcja03-w-rys-s1.swf|width=250|height=100</flash>
[[File:ja-lekcja03-w-rys-s2.svg|250x100px|thumb|right|Rysunek 4]]
<div.thumbcaption>Rysunek 3</div>
[[File:ja-lekcja03-w-rys-s3.svg|250x250px|thumb|right|Rysunek 5]]
</div></div>
<div class="thumb tright"><div style="width:250px;">
<flash>file=ja-lekcja03-w-rys-s2.swf|width=250|height=100</flash>
<div.thumbcaption>Rysunek 4</div>
</div></div>
<div class="thumb tright"><div style="width:250px;">
<flash>file=ja-lekcja03-w-rys-s3.swf|width=250|height=250</flash>
<div.thumbcaption>Rysunek 5</div>
</div></div>


{{przyklad|1.3.||
{{przyklad|1.3.||
Linia 185: Linia 162:
ułożony "wypustką" w lewo. Sytuację przedstawia poniższa animacja 3:
ułożony "wypustką" w lewo. Sytuację przedstawia poniższa animacja 3:
}}
}}
<div class="thumb center"><div style="width:250px;">
[[File:ja-lekcja03-w-anim-s4.mp4|253x253px|thumb|center]]
<flashwrap>file=ja-lekcja03-w-anim-s4.swf|size=small</flashwrap>
<div.thumbcaption>Animacja 3</div></div></div>


Rozszerzymy teraz wprowadzone pojęcie automatu w ten sposób, by  
Rozszerzymy teraz wprowadzone pojęcie automatu w ten sposób, by  
uzyskać możliwość efektywnego rozstrzygania, czy dowolne słowo  
uzyskać możliwość efektywnego rozstrzygania, czy dowolne słowo  
utworzone nad alfabetem <math>\displaystyle A</math> reprezentuje poprawne obliczenie, czyli  
utworzone nad alfabetem <math>A</math> reprezentuje poprawne obliczenie, czyli  
spełnia kryteria określone przez rozszerzony automat.
spełnia kryteria określone przez rozszerzony automat.


{{definicja|1.2.||
{{definicja|1.2.||


'''Język''' <math>\displaystyle \; L~\subset A^* \;</math> jest '''rozpoznawany''' ('''akceptowany''')
'''Język''' <math>\; L~\subset A^* \;</math> jest '''rozpoznawany''' ('''akceptowany''')
wtedy i tylko wtedy, gdy istnieje automat skończony  <math>\displaystyle \mathcal{A} \displaystyle = (S,f) , \;</math> stan <math>\displaystyle \; s_0 \in S \;</math> oraz zbiór <math>\displaystyle \; T \subset S \;</math> takie, że
wtedy i tylko wtedy, gdy istnieje automat skończony  <math>\mathcal{A} = (S,f) , \;</math> stan <math>\; s_0 \in S \;</math> oraz zbiór <math>\; T \subset S \;</math> takie, że
<center><math>\displaystyle L = \{ w \in A^* \; : \; f(s_0,w) \in T \}. </math></center>
<center><math>L = \{ w \in A^* \; : \; f(s_0,w) \in T \}</math></center>
Stan <math>\displaystyle s_0 \;</math> nazywamy '''stanem początkowym''',
Stan <math>s_0 \;</math> nazywamy '''stanem początkowym''',
a <math>\displaystyle \; T \;</math> '''zbiorem stanów końcowych''' automatu  <math>\displaystyle \mathcal{A} </math> .
a <math>\; T \;</math> '''zbiorem stanów końcowych''' automatu  <math>\mathcal{A}</math> .


}}
}}


Rozszerzony w powyższy sposób automat, poprzez dodanie stanu początkowgo i zbioru stanów końcowych, w dalszym ciągu
Rozszerzony w powyższy sposób automat, poprzez dodanie stanu początkowgo i zbioru stanów końcowych, w dalszym ciągu
nazywamy automatem i oznaczamy jako piątkę  <math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math> lub czwórkę  <math>\displaystyle \mathcal{A} \displaystyle =(S,f,s_0,T)</math>, jeśli
nazywamy automatem i oznaczamy jako piątkę  <math>\mathcal{A} = (S,A,f,s_0,T)</math> lub czwórkę  <math>\mathcal{A} =(S,f,s_0,T)</math>, jeśli
wiadomo, nad jakim alfabetem rozważamy działanie automatu.
wiadomo, nad jakim alfabetem rozważamy działanie automatu.


Fakt, że język <math>\displaystyle \; L \;</math> jest rozpoznawany przez automat  <math>\displaystyle \mathcal{A}</math>  zapisujemy jako  
Fakt, że język <math>\; L \;</math> jest rozpoznawany przez automat  <math>\mathcal{A}</math>  zapisujemy jako  


<center><math>\displaystyle L=L(\mathcal{A}). </math></center>
<center><math>L=L(\mathcal{A})</math></center>


Rodzinę wszystkich języków rozpoznawalnych nad alfabetem <math>\displaystyle A</math>
Rodzinę wszystkich języków rozpoznawalnych nad alfabetem <math>A</math>
oznaczamy przez  <math>\displaystyle \mathcal{REC}(\mathcal{A}^{*}) </math> .
oznaczamy przez  <math>\mathcal{REC}(\mathcal{A}^{*})</math> .


Podobnie jak w przypadku gramatyk nie ma jednoznacznej odpowiedniości pomiędzy językami
Podobnie jak w przypadku gramatyk nie ma jednoznacznej odpowiedniości pomiędzy językami
Linia 221: Linia 196:
{{definicja|1.3.||
{{definicja|1.3.||


Automaty  <math>\displaystyle \mathcal{A}_{1} </math>  i  <math>\displaystyle \mathcal{A}_{2} </math>  są '''równoważne''',
Automaty  <math>\mathcal{A}_{1}</math>  i  <math>\mathcal{A}_{2}</math>  są '''równoważne''',
jeśli rozpoznają ten sam język, czyli
jeśli rozpoznają ten sam język, czyli


<center><math>\displaystyle L(\mathcal{A}_{1})=L(\mathcal{A}_{2}).</math></center>
<center><math>L(\mathcal{A}_{1})=L(\mathcal{A}_{2})</math>.</center>


}}
}}


W dalszych rozważaniach języków rozpoznawanych ograniczymy się do automatów
W dalszych rozważaniach języków rozpoznawanych ograniczymy się do automatów
<math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math>,
<math>\mathcal{A} = (S,A,f,s_0,T)</math>,
które spełniają warunek  <math>\displaystyle f(s_0,A^*) = S.</math>
które spełniają warunek  <math>f(s_0,A^*) = S</math>.
Nie zawęża to naszych rozważań. Jeśli bowiem język <math>\displaystyle \; L \;</math> jest rozpoznawany
Nie zawęża to naszych rozważań. Jeśli bowiem język <math>\; L \;</math> jest rozpoznawany
przez pewien automat  <math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math>, to jest również
przez pewien automat  <math>\mathcal{A} = (S,A,f,s_0,T)</math>, to jest również
rozpoznawany przez automat
rozpoznawany przez automat


<center><math>\displaystyle \mathcal{B}=\left( f(s_{0},A^{*}),A,f|_{f(s_{0},A^{*})\times A^{*}},s_{0},T\cap f(s_{0},A^{*})\right) ,</math></center>
<center><math>\mathcal{B}=\left( f(s_{0},A^{*}),A,f|_{f(s_{0},A^{*})\times A^{*}},s_{0},T\cap f(s_{0},A^{*})\right)</math>,</center>


który spełnia powyższy warunek. Zauważmy, że przyjmując to założenie, upraszczamy strukturę
który spełnia powyższy warunek. Zauważmy, że przyjmując to założenie, upraszczamy strukturę
automatu. Z punktu widzenia grafu automatu można powiedzieć, że nie występują w nim
automatu. Z punktu widzenia grafu automatu można powiedzieć, że nie występują w nim
wierzchołki (stany) nieosiagalne z <math>\displaystyle s_0</math>.  Poniżej przedstawiamy algorytm usuwający
wierzchołki (stany) nieosiagalne z <math>s_0</math>.  Poniżej przedstawiamy algorytm usuwający
z automatu stany nieosiągalne ze stanu początkowego.
z automatu stany nieosiągalne ze stanu początkowego.


{{algorytm|UsuńStanyNieosiągalne - usuwa z automatu
{{algorytm|UsuńStanyNieosiągalne - usuwa z automatu
<math>\displaystyle \mathcal{A}</math> stany nieosiągalne||
<math>\mathcal{A}</math> stany nieosiągalne||


   1  Wejście: <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math> - automat.
   1  Wejście: <math>\mathcal{A}=(S, A, f, s_0, T)</math> - automat.
   2  Wyjście: <math>\displaystyle \mathcal{A}'=(S', A, f', s_0, T')</math> - automat równoważny automatowi <math>\displaystyle \mathcal{A}</math> bez<br>    stanów nieosiągalnych.
   2  Wyjście: <math>\mathcal{A}'=(S', A, f', s_0, T')</math> - automat równoważny automatowi <math>\mathcal{A}</math> bez<br>    stanów nieosiągalnych.
   3  '''for''' '''each''' <math>\displaystyle p\in S</math> '''do'''
   3  '''for''' '''each''' <math>p\in S</math> '''do'''
   4    '''zaznaczone'''<math>\displaystyle [p] \leftarrow 0</math>;
   4    '''zaznaczone'''<math>[p] \leftarrow 0</math>;
   5  '''end''' '''for'''
   5  '''end''' '''for'''
   6  '''zaznaczone'''<math>\displaystyle [s_0] \leftarrow 1</math>;
   6  '''zaznaczone'''<math>[s_0] \leftarrow 1</math>;
   7  OZNACZ<math>\displaystyle (s_0)</math>;
   7  OZNACZ<math>(s_0)</math>;
   8  <math>\displaystyle S' \leftarrow \{s \in S:\</math> '''zaznaczone''' <math>\displaystyle  [s]=1\}</math>;
   8  <math>S' \leftarrow \{s \in S:</math> '''zaznaczone''' <math>[s]=1\}</math>;
   9  <math>\displaystyle T' \leftarrow T \cap S'</math>;
   9  <math>T' \leftarrow T \cap S'</math>;
   10  flag<math>\displaystyle \leftarrow</math>'''false'''  <math>\displaystyle \triangleright</math> jeśli nie dodamy stanu to na końcu pętli nadal flag<nowiki>=</nowiki>'''false'''
   10  flag<math>\leftarrow</math>'''false'''  <math>\triangleright</math> jeśli nie dodamy stanu to na końcu pętli nadal flag<nowiki>=</nowiki>'''false'''
   11  <math>\displaystyle f' \leftarrow f</math>;
   11  <math>f' \leftarrow f</math>;
   12  '''for''' '''each''' <math>\displaystyle p \in S</math> '''do'''
   12  '''for''' '''each''' <math>p \in S</math> '''do'''
   13    '''for''' '''each''' <math>\displaystyle a\in A</math> '''do'''
   13    '''for''' '''each''' <math>a\in A</math> '''do'''
   14      '''if''' <math>\displaystyle f'(p,a)=</math>NULL '''then'''
   14      '''if''' <math>f'(p,a)=</math>NULL '''then'''
   15        <math>\displaystyle f'(p,a)\leftarrow s_f</math>;                        <math>\displaystyle \triangleright\displaystyle f'(p,a)</math> była nieokreślona
   15        <math>f'(p,a)\leftarrow s_f</math>;                        <math>\trianglerightf'(p,a)</math> była nieokreślona
   16        flag <math>\displaystyle \leftarrow</math>'''true''';  
   16        flag <math>\leftarrow</math>'''true''';  
   17      '''end''' '''if'''
   17      '''end''' '''if'''
   18    '''end''' '''for'''
   18    '''end''' '''for'''
   19  '''end''' '''for'''
   19  '''end''' '''for'''
   20  '''if''' flag<nowiki>=</nowiki>'''true''' '''then'''
   20  '''if''' flag<nowiki>=</nowiki>'''true''' '''then'''
   21    <math>\displaystyle S'\leftarrow S'\cup \{s_f\}</math>;
   21    <math>S'\leftarrow S'\cup \{s_f\}</math>;
   22  '''end''' '''if'''  
   22  '''end''' '''if'''  
   23  '''return''' <math>\displaystyle \mathcal{A}'=(S', A, f', s_0, T')</math>;
   23  '''return''' <math>\mathcal{A}'=(S', A, f', s_0, T')</math>;
}}
}}


Linia 274: Linia 249:




   1  '''procedure''' OZNACZ<math>\displaystyle (x \in S)</math>
   1  '''procedure''' OZNACZ<math>(x \in S)</math>
   2  '''for''' '''each''' <math>\displaystyle p \in S</math>  
   2  '''for''' '''each''' <math>p \in S</math>  
   3    flag<math>\displaystyle \leftarrow</math>'''false'''
   3    flag<math>\leftarrow</math>'''false'''
   4    '''for''' '''each''' <math>\displaystyle a \in A</math> '''do'''
   4    '''for''' '''each''' <math>a \in A</math> '''do'''
   5      '''if''' <math>\displaystyle f(x,a)=p</math> '''then'''
   5      '''if''' <math>f(x,a)=p</math> '''then'''
   6        flag<math>\displaystyle \leftarrow</math>'''true'''
   6        flag<math>\leftarrow</math>'''true'''
   7      '''end''' '''if'''
   7      '''end''' '''if'''
   8    '''end''' '''for'''
   8    '''end''' '''for'''
   9    '''if''' flag<nowiki>=</nowiki>'''true''' '''and zaznaczone'''<math>\displaystyle [p]=0</math> '''then'''
   9    '''if''' flag<nowiki>=</nowiki>'''true''' '''and zaznaczone'''<math>[p]=0</math> '''then'''
   10      '''zaznaczone'''<math>\displaystyle [p] \leftarrow 1</math>;
   10      '''zaznaczone'''<math>[p] \leftarrow 1</math>;
   11      OZNACZ<math>\displaystyle (p)</math>;
   11      OZNACZ<math>(p)</math>;
   12    '''end''' '''if'''
   12    '''end''' '''if'''
   13  '''end''' '''for'''
   13  '''end''' '''for'''
Linia 294: Linia 269:


Powyższy algorytm, dla ustalonego
Powyższy algorytm, dla ustalonego
alfabetu <math>\displaystyle A</math>, posiada złożoność <math>\displaystyle O(|A| \cdot |S|)</math>, czyli liniową
alfabetu <math>A</math>, posiada złożoność <math>O(|A| \cdot |S|)</math>, czyli liniową
względem liczby stanów.
względem liczby stanów.


Linia 303: Linia 278:
{{przyklad|1.4.||
{{przyklad|1.4.||


Jeśli w przykładzie 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]])  przyjmiemy stan  <math>\displaystyle s_{0} </math>  jako stan
Jeśli w przykładzie 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]])  przyjmiemy stan  <math>s_{0}</math>  jako stan
początkowy,  <math>\displaystyle T=\left\{ s_{2}\right\}   </math>  jako zbiór stanów końcowych, to
początkowy,  <math>T=\left\{ s_{2}\right\}</math>  jako zbiór stanów końcowych, to
automat <math>\displaystyle \mathcal{A} = (S,A,f,s_0,T)</math>  rozpoznaje język  
automat <math>\mathcal{A} = (S,A,f,s_0,T)</math>  rozpoznaje język  


<center><math>\displaystyle L(\mathcal{A})= A^{*}\left\{ a^2\right\}</math></center>
<center><math>L(\mathcal{A})= A^{*}\left\{ a^2\right\}</math></center>


złożony ze słów, kończących się na  <math>\displaystyle a^2 </math> .<br>
złożony ze słów, kończących się na  <math>a^2</math> .<br>
Słowo <math>\displaystyle aba</math> nie jest akceptowane.}}
Słowo <math>aba</math> nie jest akceptowane.}}
<center>
<center>
<div class="thumb"><div style="width:350px;">
[[File:ja-lekcja03-w-rys3.svg|350x350px|thumb|center|Animacja 4]]
<flash>file=ja-lekcja03-w-rys3.swf|width=350|height=350</flash>
<div.thumbcaption>Animacja 4</div>
</div></div>
</center>
</center>
Słowo <math>\displaystyle abaa</math>  jest akceptowane.
Słowo <math>abaa</math>  jest akceptowane.
<center>
<center>
<div class="thumb"><div style="width:350px;">
[[File:ja-lekcja03-w-rys4.svg|350x350px|thumb|center|Animacja 5]]
<flash>file=ja-lekcja03-w-rys4.swf|width=350|height=350</flash>
<div.thumbcaption>Animacja 5</div>
</div></div>
</center>
</center>




Każdy automat  <math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math> wyznacza w wolnym monoidzie <math>\displaystyle A^*</math>
Każdy automat  <math>\mathcal{A} = (S,A,f,s_0,T)</math> wyznacza w wolnym monoidzie <math>A^*</math>
prawą kongruencję, nazywaną '''prawą kongruencją automatową''', określoną w następujący
prawą kongruencję, nazywaną '''prawą kongruencją automatową''', określoną w następujący
sposób:<br>
sposób:<br>
<math>\displaystyle \forall u,v \in A^*</math>
<math>\forall u,v \in A^*</math>


<center><math>\displaystyle u\sim _{\mathcal{A}}v\Longleftrightarrow f(s_{0},u)=f(s_{0},v).</math></center>
<center><math>u\sim _{\mathcal{A}}v\Longleftrightarrow f(s_{0},u)=f(s_{0},v)</math>.</center>


Dla automatu skończonego (o skończonym zbiorze stanów), a takie rozważamy,
Dla automatu skończonego (o skończonym zbiorze stanów), a takie rozważamy,
relacja  <math>\displaystyle \sim _{A} </math>  ma
relacja  <math>\sim _{A}</math>  ma
skończony indeks, czyli skończoną liczbę klas równoważności.
skończony indeks, czyli skończoną liczbę klas równoważności.


{{przyklad|1.5.||
{{przyklad|1.5.||


Automat z przykładu 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]]) ze stanem  <math>\displaystyle s_{0} </math>  jako początkowym wyznacza
Automat z przykładu 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]]) ze stanem  <math>s_{0}</math>  jako początkowym wyznacza
relację równoważności o trzech klasach:
relację równoważności o trzech klasach:


<math>\displaystyle [1]=A^*\left\{ b \right\}\cup \left\{ 1\right\}</math>,<br\>
<math>[1]=A^*\left\{ b \right\}\cup \left\{ 1\right\}</math>,<br\>
<math>\displaystyle [a]=A^*\left\{ ba\right\}  \cup \left\{ a\right\}</math>,<br\>
<math>[a]=A^*\left\{ ba\right\}  \cup \left\{ a\right\}</math>,<br\>
<math>\displaystyle [a^2]=A^*\left\{ a^2 \right\}.</math>  
<math>[a^2]=A^*\left\{ a^2 \right\}</math>.


}}
}}


Na odwrót, każda prawa kongruencja <math>\displaystyle \rho \subset (A^*)^2</math> wyznacza  
Na odwrót, każda prawa kongruencja <math>\rho \subset (A^*)^2</math> wyznacza  
automat, zwany '''ilorazowym''', w  
automat, zwany '''ilorazowym''', w  
następujący sposób:
następujący sposób:


<center><math>\displaystyle \mathcal{A}_{\rho }=(A^{*}/_{\rho },f^{*}),\; \; gdzie\; \; f^{*}([w]_{\rho },u)=[wu]_{\rho }.</math></center>
<center><math>\mathcal{A}_{\rho }=(A^{*}/_{\rho },f^{*}),\; \; gdzie\; \; f^{*}([w]_{\rho },u)=[wu]_{\rho }</math>.</center>


<math>\displaystyle \mathcal{A} \displaystyle _\rho</math> jest automatem ze stanem początkowym <math>\displaystyle [1]_\rho</math>.  <math>\displaystyle \mathcal{A}_{\rho } </math>  jest automatem skończonym
<math>\mathcal{A} _\rho</math> jest automatem ze stanem początkowym <math>[1]_\rho</math>.  <math>\mathcal{A}_{\rho }</math>  jest automatem skończonym
wtedy i&nbsp;tylko wtedy, gdy relacja <math>\displaystyle \rho</math> ma skończony indeks.<br>
wtedy i&nbsp;tylko wtedy, gdy relacja <math>\rho</math> ma skończony indeks.<br>
Z definicji prawej kongruencji wynika, że funkcja przejść <math>\displaystyle f^*</math> jest określona poprawnie.
Z definicji prawej kongruencji wynika, że funkcja przejść <math>f^*</math> jest określona poprawnie.


{{definicja|1.4.||
{{definicja|1.4.||


Niech  <math>\displaystyle \mathcal{A} \displaystyle =(S,f)</math> i  <math>\displaystyle \, \mathcal{B} \displaystyle =(T,g)</math> będą dowolnymi automatami.
Niech  <math>\mathcal{A} =(S,f)</math> i  <math>\, \mathcal{B} =(T,g)</math> będą dowolnymi automatami.
Odwzorowanie <math>\displaystyle  \varphi:S\longrightarrow T </math>
Odwzorowanie <math>\varphi:S\longrightarrow T</math>
nazywamy '''homomorfizmem automatów'''
nazywamy '''homomorfizmem automatów'''
wtedy i&nbsp;tylko
wtedy i&nbsp;tylko
wtedy, jeśli <center><math>\displaystyle \forall s \in S,\;\; \forall w \in A^*\;\;\;\varphi(f(s,w)) \; = \; g(\varphi(s),w).</math></center>
wtedy, jeśli <center><math>\forall s \in S,\;\; \forall w \in A^*\;\;\;\varphi(f(s,w)) \; = \; g(\varphi(s),w)</math>.</center>
Homomorfizm
Homomorfizm
automatów oznaczamy  <math>\displaystyle \varphi :\mathcal{A}\longrightarrow \mathcal{B} </math> .
automatów oznaczamy  <math>\varphi :\mathcal{A}\longrightarrow \mathcal{B}</math> .


}}
}}
Linia 374: Linia 343:
Prawdziwe są następujące fakty:
Prawdziwe są następujące fakty:


(1)  Dla dowolnej prawej kongruencji <math>\displaystyle \; \rho \; \subset \; (A^*)^2 </math>
(1)  Dla dowolnej prawej kongruencji <math>\; \rho \; \subset \; (A^*)^2</math>


<center><math>\displaystyle \sim _{\mathcal{A}_{\rho }}=\rho ,</math></center>
<center><math>\sim _{\mathcal{A}_{\rho }}=\rho</math>,</center>
(2)  Dowolny automat  <math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math> jest izomorficzny z automatem  <math>\displaystyle \mathcal{A}_{\sim _{\mathcal{A}}} </math> ,
(2)  Dowolny automat  <math>\mathcal{A} = (S,A,f,s_0,T)</math> jest izomorficzny z automatem  <math>\mathcal{A}_{\sim _{\mathcal{A}}}</math> ,


(3)  Dla dowolnych automatów  <math>\displaystyle \mathcal{A}_1 \displaystyle = (S_1,A,f_1,s^1_0,T_1)</math>
(3)  Dla dowolnych automatów  <math>\mathcal{A}_1= (S_1,A,f_1,s^1_0,T_1)</math>
i  <math>\displaystyle \mathcal{A}_2 \displaystyle = (S_2,A,f_2,s^2_0,T_2)</math>  prawdziwa jest równoważność
i  <math>\mathcal{A}_2 = (S_2,A,f_2,s^2_0,T_2)</math>  prawdziwa jest równoważność


<math>\displaystyle \sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2}\ : \ : \Longleftrightarrow \ :   </math>  
<math>\sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2}\ : \ : \Longleftrightarrow \ :</math>  
istnieje epimorfizm  <math>\displaystyle \varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2 </math>  taki,
istnieje epimorfizm  <math>\varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2</math>  taki,
że <math>\displaystyle \varphi(s^1_0) = s^2_0</math>.
że <math>\varphi(s^1_0) = s^2_0</math>.


}}
}}
Linia 390: Linia 359:
{{dowod|||
{{dowod|||


(1) Identyczność relacji wynika wprost z&nbsp;definicji automatu ilorazowego  <math>\displaystyle \mathcal{A} \displaystyle _\rho</math> oraz prawej kongruencji  <math>\displaystyle \sim _{A_{\rho }} </math> .
(1) Identyczność relacji wynika wprost z&nbsp;definicji automatu ilorazowego  <math>\mathcal{A} _\rho</math> oraz prawej kongruencji  <math>\sim _{A_{\rho }}</math> .


(2) Rozważmy automat  <math>\displaystyle \mathcal{A} \displaystyle = (S,A,f,s_0,T)</math> i  odwzorowanie
(2) Rozważmy automat  <math>\mathcal{A} = (S,A,f,s_0,T)</math> i  odwzorowanie


<center><math>\displaystyle \psi :\mathcal{A}\longrightarrow \mathcal{A}_{\sim _{\mathcal{A}}}, </math></center>
<center><math>\psi :\mathcal{A}\longrightarrow \mathcal{A}_{\sim _{\mathcal{A}}}</math></center>


gdzie
gdzie
<math>\displaystyle \forall s\in S </math>   
<math>\forall s\in S</math>   


<center><math>\displaystyle \psi (s)=[w]_{\sim _{\mathcal{A}}} \;\;\text{dla}\;\;  w\in A^{*} \;\;\text{i} \;\; f(s_{0},w)=s. </math></center>
<center><math>\psi (s)=[w]_{\sim _{\mathcal{A}}} \;\;\text{dla}\;\;  w\in A^{*} \;\;\text{i} \;\; f(s_{0},w)=s</math></center>


Istnienie słowa <math>\displaystyle w</math> wynika z faktu, że <math>\displaystyle s_0</math> jest stanem początkowym, natomiast z definicji relacji <math>\displaystyle \sim _{\mathcal{A}}</math> wynika, że odwzorowanie <math>\displaystyle \psi</math> jest poprawnie określone.<br>
Istnienie słowa <math>w</math> wynika z faktu, że <math>s_0</math> jest stanem początkowym, natomiast z definicji relacji <math>\sim _{\mathcal{A}}</math> wynika, że odwzorowanie <math>\psi</math> jest poprawnie określone.<br>
Odwzorowanie <math>\displaystyle \psi</math> ma być homomorfizmem, czyli dla każdego stanu  <math>\displaystyle s\in S </math>  i dowolnego
Odwzorowanie <math>\psi</math> ma być homomorfizmem, czyli dla każdego stanu  <math>s\in S</math>  i dowolnego
słowa  <math>\displaystyle w\in A^{*} </math>  spełniać warunek
słowa  <math>w\in A^{*}</math>  spełniać warunek


<center><math>\displaystyle \psi (f(s,w))=f^{*}(\psi (s),w). </math></center>
<center><math>\psi (f(s,w))=f^{*}(\psi (s),w)</math></center>


Warunek ten wynika z następujących równości
Warunek ten wynika z następujących równości


<center><math>\displaystyle \begin{array} {c}
<center><math>\begin{array} {c}
f^{*}(\psi (s),w)=f^{*}([u]_{\sim_{\mathcal{A}}},w)=[uw]_{\sim _{\mathcal{A}}}=\\
f^{*}(\psi (s),w)=f^{*}([u]_{\sim_{\mathcal{A}}},w)=[uw]_{\sim _{\mathcal{A}}}=\\
=\left\{ v\in A^{*}:f(s_{0},uw)=f(s_{0},v)\right\} = \\
=\left\{ v\in A^{*}:f(s_{0},uw)=f(s_{0},v)\right\} = \\
\left\{ v\in A^{*}:f(f(s_{0},u),w)=f(s_{0},v)\right\} = \\
\left\{ v\in A^{*}:f(f(s_{0},u),w)=f(s_{0},v)\right\} = \\
=\left\{ v\in A^{*}:f(s,w)=f(s_{0},v)\right\} =\psi (f(s,w))
=\left\{ v\in A^{*}:f(s,w)=f(s_{0},v)\right\} =\psi (f(s,w))
\end{array} </math></center>
\end{array}</math></center>


gdzie <math>\displaystyle f(s_0,u)=s</math>.
gdzie <math>f(s_0,u)=s</math>.


Z prostych  obserwacji wynika, że <math>\displaystyle \psi </math> jest suriekcją i iniekcją.
Z prostych  obserwacji wynika, że <math>\psi</math> jest suriekcją i iniekcją.


(3) Dowód implikacji "<math>\displaystyle \Rightarrow</math>" <br>
(3) Dowód implikacji "<math>\Rightarrow</math>" <br>
Załóżmy, że  <math>\displaystyle \ : \sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2 } </math> . Niech
Załóżmy, że  <math>\ : \sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2 }</math> . Niech


<center><math>\displaystyle \varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2 </math></center>
<center><math>\varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2</math></center>


będzie odwzorowaniem takim, że<br>
będzie odwzorowaniem takim, że<br>
<math>\displaystyle \forall  s\in S_1 </math>  <center><math>\displaystyle  \varphi (s) = f_2(s^2_0,w),\;\;\text{gdzie}\;\;  w\in A^{*}\;\; i \;\; f_1(s^1_0,w) = s.</math></center>
<math>\forall  s\in S_1</math>  <center><math>\varphi (s) = f_2(s^2_0,w),\;\;\text{gdzie}\;\;  w\in A^{*}\;\; i \;\; f_1(s^1_0,w) = s</math>.</center>


Stąd, że  <math>\displaystyle s^1_0 </math>  jest stanem początkowym automatu  <math>\displaystyle \mathcal{A}_1</math>  
Stąd, że  <math>s^1_0</math>  jest stanem początkowym automatu  <math>\mathcal{A}_1</math>  
wynika, że istnieje słowo <math>\displaystyle \; w \in A^* \;</math> potrzebne do określenia epimorfizmu <math>\displaystyle  \varphi</math>.<br>
wynika, że istnieje słowo <math>\; w \in A^* \;</math> potrzebne do określenia epimorfizmu <math>\varphi</math>.<br>
Z założenia  <math>\displaystyle \ : \sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2} </math>  
Z założenia  <math>\ : \sim _{\mathcal{A}_1}\ : \subseteq \ : \sim _{\mathcal{A}_2}</math>  
wynika, że <math>\displaystyle \varphi \;</math> jest poprawnie zdefiniowaną funkcją. <br>
wynika, że <math>\varphi \;</math> jest poprawnie zdefiniowaną funkcją. <br>
Uzasadnienie faktu, że <math>\displaystyle \varphi</math> jest
Uzasadnienie faktu, że <math>\varphi</math> jest
homomorfizmem, jest analogiczne jak w punkcie (2) dla <math>\displaystyle \psi</math>.<br>
homomorfizmem, jest analogiczne jak w punkcie (2) dla <math>\psi</math>.<br>
<math>\displaystyle \varphi</math> jest suriekcją, gdyż <math>\displaystyle \; s^2_0 \; </math>
<math>\varphi</math> jest suriekcją, gdyż <math>\; s^2_0 \;</math>
jest stanem początkowym automatu  <math>\displaystyle \mathcal{A}_2 </math> .<br>
jest stanem początkowym automatu  <math>\mathcal{A}_2</math> .<br>
<math>\displaystyle \; \varphi (s^1_0) = s^2_0, \;</math> ponieważ <math>\displaystyle \; f_1(s^1_0,1) = s^1_0</math>. <br>
<math>\; \varphi (s^1_0) = s^2_0, \;</math> ponieważ <math>\; f_1(s^1_0,1) = s^1_0</math>. <br>
Dowód implikacji "<math>\displaystyle \Leftarrow</math>" <br>
Dowód implikacji "<math>\Leftarrow</math>" <br>
Niech  <math>\displaystyle \varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2 </math>  będzie epimorfizmem
Niech  <math>\varphi :\mathcal{A}_1\longrightarrow \mathcal{A}_2</math>  będzie epimorfizmem
takim, że <math>\displaystyle \; \varphi (s^1_0) = s^2_0 \;</math>.<br>
takim, że <math>\; \varphi (s^1_0) = s^2_0 \;</math>.<br>
Wówczas prawdziwy jest następujący ciąg wnioskowań.
Wówczas prawdziwy jest następujący ciąg wnioskowań.


<center><math>\displaystyle \begin{array} {c}
<center><math>\begin{array} {c}
u\sim _{\mathcal{A}_1}v \Leftrightarrow f_1(s^1_0,u)=f_1(s^1_0,v)
u\sim _{\mathcal{A}_1}v \Leftrightarrow f_1(s^1_0,u)=f_1(s^1_0,v)
\Rightarrow\\
\Rightarrow\\
Linia 450: Linia 419:
</math></center>
</math></center>


To oznacza, że  <math>\displaystyle \sim _{\mathcal{A}_1}\subseteq \sim _{\mathcal{A}_2} </math> .
To oznacza, że  <math>\sim _{\mathcal{A}_1}\subseteq \sim _{\mathcal{A}_2}</math> .


}}
}}


Symbolem <math>\displaystyle S^S</math> oznaczamy rodzinę wszystkich funkcji określonych na zbiorze <math>\displaystyle S</math> i przyjmujących
Symbolem <math>S^S</math> oznaczamy rodzinę wszystkich funkcji określonych na zbiorze <math>S</math> i przyjmujących
wartości w <math>\displaystyle S</math>. Łatwo zauważyć, iż  rodzina ta wraz ze składaniem odwzorowań jest
wartości w <math>S</math>. Łatwo zauważyć, iż  rodzina ta wraz ze składaniem odwzorowań jest
monoidem  <math>\displaystyle (S^S,\circ)</math> .
monoidem  <math>(S^S,\circ)</math> .


{{definicja|1.5.||
{{definicja|1.5.||


Niech  <math>\displaystyle \mathcal{A} \displaystyle = (S,f)</math> będzie dowolnym automatem.
Niech  <math>\mathcal{A} = (S,f)</math> będzie dowolnym automatem.
'''Reprezentacją automatu'''  <math>\displaystyle \mathcal{A} </math>  nazywamy funkcję  <math>\displaystyle \tau  
'''Reprezentacją automatu'''  <math>\mathcal{A}</math>  nazywamy funkcję  <math>\tau  
_{\mathcal{A}}:A^{*}\longrightarrow S^{S} </math> , określoną dla  
_{\mathcal{A}}:A^{*}\longrightarrow S^{S}</math> , określoną dla  
dowolnych <math>\displaystyle  w \in A^*</math> i <math>\displaystyle \; s \in S \;</math> równością
dowolnych <math>w \in A^*</math> i <math>\; s \in S \;</math> równością


<center><math>\displaystyle \tau _{\mathcal{A}}(w)(s)=f(s,w). </math></center>
<center><math>\tau _{\mathcal{A}}(w)(s)=f(s,w)</math></center>


}}
}}


Reprezentacja automatu jest
Reprezentacja automatu jest
homomorfizmem monoidu <math>\displaystyle A^*</math> w monoid <math>\displaystyle S^S</math>, bowiem dla dowolnych <math>\displaystyle  v,w \in A^* </math>
homomorfizmem monoidu <math>A^*</math> w monoid <math>S^S</math>, bowiem dla dowolnych <math>v,w \in A^*</math>
spełnione są warunki
spełnione są warunki


<center><math>\displaystyle \begin{array} {c}
<center><math>\begin{array} {c}
\tau _{\mathcal{A}}(vw)=\tau _{\mathcal{A}}(w)\circ \tau _{\mathcal{A}}(v),\\
\tau _{\mathcal{A}}(vw)=\tau _{\mathcal{A}}(w)\circ \tau _{\mathcal{A}}(v),\\
\tau _{\mathcal{A}}(1)=id_{S}.
\tau _{\mathcal{A}}(1)=id_{S}.
\end{array} </math></center>
\end{array}</math></center>


{{definicja|1.6.||
{{definicja|1.6.||


Niech  <math>\displaystyle \mathcal{A} \displaystyle = (S,f)</math> będzie dowolnym automatem. '''Monoidem przejść'''
Niech  <math>\mathcal{A} = (S,f)</math> będzie dowolnym automatem. '''Monoidem przejść'''
automatu  <math>\displaystyle \mathcal{A} </math>  nazywamy monoid
automatu  <math>\mathcal{A}</math>  nazywamy monoid


<center><math>\displaystyle \mathcal{M}(\mathcal{A})=\tau _{\mathcal{A}}(A^{*})\subset S^{S}.</math></center>
<center><math>\mathcal{M}(\mathcal{A})=\tau _{\mathcal{A}}(A^{*})\subset S^{S}</math>.</center>


}}
}}
Linia 492: Linia 461:
{{wniosek|1.1.||
{{wniosek|1.1.||


(1) Monoid przejść automatu  <math>\displaystyle \mathcal{A} </math>  jest podmonoidem monoidu <math>\displaystyle S^S</math> i  zbiór
(1) Monoid przejść automatu  <math>\mathcal{A}</math>  jest podmonoidem monoidu <math>S^S</math> i  zbiór
<math>\displaystyle \left\{ \tau _{\mathcal{A}}(a):a\in A\right\}   </math>  jest zbiorem  
<math>\left\{ \tau _{\mathcal{A}}(a):a\in A\right\}</math>  jest zbiorem  
generatorów tego monoidu. <center><math>\displaystyle \mathcal{M}(\mathcal{A})=\left\{ \tau  
generatorów tego monoidu. <center><math>\mathcal{M}(\mathcal{A})=\left\{ \tau  
_{\mathcal{A}}(a):a\in A\right\} ^{*}.</math></center>
_{\mathcal{A}}(a):a\in A\right\} ^{*}</math>.</center>
Wynika to z faktu, że  <math>\displaystyle \tau _{\mathcal{A}} </math>  jest epimorfizmem i z twierdzenia 2.1 z wykładu 1. (patrz [[Języki, automaty i obliczenia/Wykład 1: Słowa, katenacja - elementy teorii półgrup, półgrupy i monoidy wolne#uwaga_Dla_zainteresowanych_twierdzenie_2.1|twierdzenie 2.1. wykład 1]])
Wynika to z faktu, że  <math>\tau _{\mathcal{A}}</math>  jest epimorfizmem i z twierdzenia 2.1 z wykładu 1. (patrz [[Języki, automaty i obliczenia/Wykład 1: Słowa, katenacja - elementy teorii półgrup, półgrupy i monoidy wolne#uwaga_Dla_zainteresowanych_twierdzenie_2.1|twierdzenie 2.1. wykład 1]])


(2) Monoid przejść automatu skończonego jest skończony.
(2) Monoid przejść automatu skończonego jest skończony.


(3) Monoid przejść automatu  <math>\displaystyle \mathcal{A} </math>  jest izomorficzny z monoidem ilorazowym  <math>\displaystyle A^{*}/_{Ker_{\tau _{\mathcal{A}}}} </math> .
(3) Monoid przejść automatu  <math>\mathcal{A}</math>  jest izomorficzny z monoidem ilorazowym  <math>A^{*}/_{Ker_{\tau _{\mathcal{A}}}}</math> .
Jest to wniosek z twierdzenia o rozkładzie epimorfizmu, które w tym przypadku ilustruje poniższy diagram.}}
Jest to wniosek z twierdzenia o rozkładzie epimorfizmu, które w tym przypadku ilustruje poniższy diagram.}}


<center>
<center>
<div class="thumb"><div style="width:350px;">
[[File:ja-lekcja03-w-rys5.svg|350x200px|thumb|center|Rysunek 6]]
<flash>file=ja-lekcja03-w-rys5.swf|width=350|height=200</flash>
<div.thumbcaption>Rysunek 6</div>
</div></div>
</center>
</center>


Linia 513: Linia 479:


Określimy monoid przejść dla automatu z przykładu 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]]).  
Określimy monoid przejść dla automatu z przykładu 1.2 (patrz [[#przyklad_1_2|przykład 1.2.]]).  
Wypisujemy kolejne funkcje  <math>\displaystyle \tau _{\mathcal{A}}(w) </math>  dla  <math>\displaystyle w\in  
Wypisujemy kolejne funkcje  <math>\tau _{\mathcal{A}}(w)</math>  dla  <math>w\in  
\{a,b\}^{*} </math> . Zauważmy, że ze względu na występujące w tabelce  
\{a,b\}^{*}</math> . Zauważmy, że ze względu na występujące w tabelce  
powtórzenia, będące wynikiem równości, np.  <math>\displaystyle \tau  
powtórzenia, będące wynikiem równości, np.  <math>\tau  
_{\mathcal{A}}(b^2)=\tau _{\mathcal{A}}(b)</math>  nie ma potrzeby  
_{\mathcal{A}}(b^2)=\tau _{\mathcal{A}}(b)</math>  nie ma potrzeby  
określać funkcji  <math>\displaystyle \tau _{\mathcal{A}}(b^{n}) </math>  dla  <math>\displaystyle n\geq 3 </math> .  
określać funkcji  <math>\tau _{\mathcal{A}}(b^{n})</math>  dla  <math>n\geq 3</math> .  
Podobna obserwacja ma miejsce w innych przypadkach, co sprawia, że  
Podobna obserwacja ma miejsce w innych przypadkach, co sprawia, że  
tabelka zawiera skończoną liczbę różnych funkcji.
tabelka zawiera skończoną liczbę różnych funkcji.
Linia 523: Linia 489:




<center><math>\displaystyle \begin{array} {c|c|c|c|c|}  & s_0 & s_1 & s_2\\
<center><math>\begin{array} {c|c|c|c|c|}  & s_0 & s_1 & s_2\\
\hline \tau _{\mathcal{A}}(1) & s_0 & s_1 & s_2\\
\hline \tau _{\mathcal{A}}(1) & s_0 & s_1 & s_2\\
\hline \tau _{\mathcal{A}}(a) & s_1 & s_2 & s_2\\
\hline \tau _{\mathcal{A}}(a) & s_1 & s_2 & s_2\\
Linia 533: Linia 499:
\hline \tau _{\mathcal{A}}(aba) & s_1 & s_1 & s_2\\
\hline \tau _{\mathcal{A}}(aba) & s_1 & s_1 & s_2\\
\hline ... & ... & ... & ...\\
\hline ... & ... & ... & ...\\
\hline \end{array} </math></center>
\hline \end{array}</math></center>




<center><math>\displaystyle M(\mathcal{A})=\left\{ \tau _{\mathcal{A}}(1),\tau _{\mathcal{A}}(a),\tau _{\mathcal{A}}(b),
<center><math>M(\mathcal{A})=\left\{ \tau _{\mathcal{A}}(1),\tau _{\mathcal{A}}(a),\tau _{\mathcal{A}}(b),
\tau _{\mathcal{A}}(a^2),\tau _{\mathcal{A}}(b), \tau _{\mathcal{A}}(ba), \tau _{\mathcal{A}}(aba)\right\}
\tau _{\mathcal{A}}(a^2),\tau _{\mathcal{A}}(b), \tau _{\mathcal{A}}(ba), \tau _{\mathcal{A}}(aba)\right\}
.</math></center>
</math>.</center>




Linia 547: Linia 513:
automatu||
automatu||


   1  Wejście: <math>\displaystyle \mathcal{A}=(S, A, f, s_0, T)</math> - automat
   1  Wejście: <math>\mathcal{A}=(S, A, f, s_0, T)</math> - automat
   2  Wyjście: <math>\displaystyle M</math> - monoid przejść dla <math>\displaystyle \mathcal{A}</math>
   2  Wyjście: <math>M</math> - monoid przejść dla <math>\mathcal{A}</math>
   3  <math>\displaystyle L \leftarrow \emptyset</math>;  <math>\displaystyle \triangleright L</math> jest listą
   3  <math>L \leftarrow \emptyset</math>;  <math>\triangleright L</math> jest listą
   4  <math>\displaystyle M \leftarrow \emptyset</math>;
   4  <math>M \leftarrow \emptyset</math>;
   5  '''for''' '''each''' <math>\displaystyle a \in A \cup \{1\}</math> '''do'''
   5  '''for''' '''each''' <math>a \in A \cup \{1\}</math> '''do'''
   6    '''insert'''<math>\displaystyle (L, \{\tau_{\mathcal{A}}(a)\})</math>;  <math>\displaystyle \triangleright </math> gdzie <math>\displaystyle \tau_{\mathcal{A}}(a)(s)=f(s, a)</math> dla każdego <math>\displaystyle s \in S</math>
   6    '''insert'''<math>(L, \{\tau_{\mathcal{A}}(a)\})</math>;  <math>\triangleright</math> gdzie <math>\tau_{\mathcal{A}}(a)(s)=f(s, a)</math> dla każdego <math>s \in S</math>
   7  '''end''' '''for'''
   7  '''end''' '''for'''
   8  '''while''' <math>\displaystyle L \not = \emptyset</math>; '''do'''  
   8  '''while''' <math>L \not = \emptyset</math>; '''do'''  
   9  <math>\displaystyle \tau_{\mathcal{A}}(w) \leftarrow </math> '''first''' <math>\displaystyle  (L)</math>;
   9  <math>\tau_{\mathcal{A}}(w) \leftarrow</math> '''first''' <math>(L)</math>;
   10  <math>\displaystyle M \leftarrow M \cup \tau_{\mathcal{A}}(w)</math>;
   10  <math>M \leftarrow M \cup \tau_{\mathcal{A}}(w)</math>;
   11  '''for''' '''each''' <math>\displaystyle a \in A</math> '''do'''
   11  '''for''' '''each''' <math>a \in A</math> '''do'''
   12    '''for''' '''each''' <math>\displaystyle s \in S</math> '''do'''
   12    '''for''' '''each''' <math>s \in S</math> '''do'''
   13        <math>\displaystyle \tau'_{\mathcal{A}}(wa)(s)\leftarrow f(\tau_{\mathcal{A}}(w)(s),a)</math>;
   13        <math>\tau'_{\mathcal{A}}(wa)(s)\leftarrow f(\tau_{\mathcal{A}}(w)(s),a)</math>;
   14      '''end''' '''for'''
   14      '''end''' '''for'''
   15      '''if''' <math>\displaystyle \tau'_{\mathcal{A}}(wa) \not \in L \cup M</math>  
   15      '''if''' <math>\tau'_{\mathcal{A}}(wa) \not \in L \cup M</math>  
   16        '''insert'''<math>\displaystyle (L, \tau'_{\mathcal{A}}(wa))</math>;
   16        '''insert'''<math>(L, \tau'_{\mathcal{A}}(wa))</math>;
   17      '''end''' '''if'''
   17      '''end''' '''if'''
   18    '''end''' '''for'''
   18    '''end''' '''for'''
   19  '''end''' '''while'''
   19  '''end''' '''while'''
   20  '''return''' <math>\displaystyle M</math>;
   20  '''return''' <math>M</math>;
}}
}}




Procedura '''insert'''<math>\displaystyle (L, x)</math> wkłada na koniec listy <math>\displaystyle L</math> element
Procedura '''insert'''<math>(L, x)</math> wkłada na koniec listy <math>L</math> element
<math>\displaystyle x</math>. Funkcja '''first'''<math>\displaystyle (L)</math> wyjmuje pierwszy element znajdujący
<math>x</math>. Funkcja '''first'''<math>(L)</math> wyjmuje pierwszy element znajdujący
się na liście <math>\displaystyle L</math> i zwraca go. Algorytm działa w następujący sposób:
się na liście <math>L</math> i zwraca go. Algorytm działa w następujący sposób:
najpierw na listę <math>\displaystyle L</math> wkładane są elementy monoidu przejść
najpierw na listę <math>L</math> wkładane są elementy monoidu przejść
<math>\displaystyle \tau_{\mathcal{A}}(a)</math> dla każdej litery <math>\displaystyle a \in A \cup 1</math>. Te
<math>\tau_{\mathcal{A}}(a)</math> dla każdej litery <math>a \in A \cup 1</math>. Te
funkcje można obliczyć bezpośrednio z tabelki reprezentującej
funkcje można obliczyć bezpośrednio z tabelki reprezentującej
funkcję przejścia automatu <math>\displaystyle \mathcal{A}</math>. Następnie z listy po kolei
funkcję przejścia automatu <math>\mathcal{A}</math>. Następnie z listy po kolei
ściągane są poszczególne funkcje <math>\displaystyle \tau_{\mathcal{A}}(w)</math>. Każda z
ściągane są poszczególne funkcje <math>\tau_{\mathcal{A}}(w)</math>. Każda z
nich dodawana jest do zbioru <math>\displaystyle M</math>, a następnie algorytm sprawdza dla
nich dodawana jest do zbioru <math>M</math>, a następnie algorytm sprawdza dla
każdej litery <math>\displaystyle a \in A</math>, czy funkcja <math>\displaystyle \tau_{\mathcal{A}}(wa)</math>
każdej litery <math>a \in A</math>, czy funkcja <math>\tau_{\mathcal{A}}(wa)</math>
istnieje już na liście <math>\displaystyle L</math> lub w zbiorze <math>\displaystyle M</math>. Jeśli nie, to funkcja
istnieje już na liście <math>L</math> lub w zbiorze <math>M</math>. Jeśli nie, to funkcja
ta dodawana jest do listy. Procedura powyższa trwa do czasu, gdy
ta dodawana jest do listy. Procedura powyższa trwa do czasu, gdy
lista <math>\displaystyle L</math> zostanie pusta. Wtedy wszystkie elementy monoidu przejść
lista <math>L</math> zostanie pusta. Wtedy wszystkie elementy monoidu przejść
znajdą się w zbiorze <math>\displaystyle M</math>.
znajdą się w zbiorze <math>M</math>.


Przeanalizujmy działanie algorytmu dla automatu z przykładu 1.2
Przeanalizujmy działanie algorytmu dla automatu z przykładu 1.2
(patrz [[#przyklad_1_2|przykład 1.2.]]).
(patrz [[#przyklad_1_2|przykład 1.2.]]).


Na początku na listę <math>\displaystyle L</math> włożone zostaną funkcje
Na początku na listę <math>L</math> włożone zostaną funkcje
<math>\displaystyle \tau_{\mathcal{A}}(1)</math>, <math>\displaystyle \tau_{\mathcal{A}}(a)</math> oraz
<math>\tau_{\mathcal{A}}(1)</math>, <math>\tau_{\mathcal{A}}(a)</math> oraz
<math>\displaystyle \tau_{\mathcal{A}}(b)</math>. Z listy zdejmujemy funkcję
<math>\tau_{\mathcal{A}}(b)</math>. Z listy zdejmujemy funkcję
<math>\displaystyle \tau_{\mathcal{A}}(1)</math> i dodajemy ją do zbioru <math>\displaystyle M</math>. Ponieważ
<math>\tau_{\mathcal{A}}(1)</math> i dodajemy ją do zbioru <math>M</math>. Ponieważ
<math>\displaystyle \forall a \in A\displaystyle \tau_{\mathcal{A}}(1a)=\tau_{\mathcal{A}}(a)</math>, a
<math>\forall a \in A\tau_{\mathcal{A}}(1a)=\tau_{\mathcal{A}}(a)</math>, a
funkcje <math>\displaystyle \tau_{\mathcal{A}}(a)</math> oraz <math>\displaystyle \tau_{\mathcal{A}}(b)</math>
funkcje <math>\tau_{\mathcal{A}}(a)</math> oraz <math>\tau_{\mathcal{A}}(b)</math>
znajdują się już na liście, zatem nie dodajemy ich do <math>\displaystyle L</math>. Bierzemy
znajdują się już na liście, zatem nie dodajemy ich do <math>L</math>. Bierzemy
kolejny element listy, <math>\displaystyle \tau_{\mathcal{A}}(a)</math>, dodajemy go do <math>\displaystyle M</math> i
kolejny element listy, <math>\tau_{\mathcal{A}}(a)</math>, dodajemy go do <math>M</math> i
obliczamy funkcje <math>\displaystyle \tau_{\mathcal{A}}(aa)</math> oraz
obliczamy funkcje <math>\tau_{\mathcal{A}}(aa)</math> oraz
<math>\displaystyle \tau_{\mathcal{A}}(ab)</math>. Ponieważ <math>\displaystyle \tau_{\mathcal{A}}(aa)</math> nie jest
<math>\tau_{\mathcal{A}}(ab)</math>. Ponieważ <math>\tau_{\mathcal{A}}(aa)</math> nie jest
tożsama z żadną funkcją ze zbioru <math>\displaystyle L \cup M</math>, dodajemy ją do listy.
tożsama z żadną funkcją ze zbioru <math>L \cup M</math>, dodajemy ją do listy.
Funkcja <math>\displaystyle \tau_{\mathcal{A}}(ab)</math> również nie jest równa żadnej z
Funkcja <math>\tau_{\mathcal{A}}(ab)</math> również nie jest równa żadnej z
funkcji należących do zbioru <math>\displaystyle L \cup M</math>, zatem wstawiamy ją na
funkcji należących do zbioru <math>L \cup M</math>, zatem wstawiamy ją na
koniec listy. Na liście <math>\displaystyle L</math> mamy zatem teraz następujące elementy:
koniec listy. Na liście <math>L</math> mamy zatem teraz następujące elementy:
<math>\displaystyle \tau_{\mathcal{A}}(b)</math>, <math>\displaystyle \tau_{\mathcal{A}}(a^2)</math> oraz
<math>\tau_{\mathcal{A}}(b)</math>, <math>\tau_{\mathcal{A}}(a^2)</math> oraz
<math>\displaystyle \tau_{\mathcal{A}}(ab)</math>. Zdejmujemy z listy funkcję
<math>\tau_{\mathcal{A}}(ab)</math>. Zdejmujemy z listy funkcję
<math>\displaystyle \tau_{\mathcal{A}}(b)</math>, dodajemy ją do <math>\displaystyle M</math> i obliczamy
<math>\tau_{\mathcal{A}}(b)</math>, dodajemy ją do <math>M</math> i obliczamy
<math>\displaystyle \tau_{\mathcal{A}}(ba)</math> oraz <math>\displaystyle \tau_{\mathcal{A}}(bb)</math>. Pierwsza z
<math>\tau_{\mathcal{A}}(ba)</math> oraz <math>\tau_{\mathcal{A}}(bb)</math>. Pierwsza z
tych funkcji jest nowa, tzn. nie jest tożsama z żadną funkcją ze
tych funkcji jest nowa, tzn. nie jest tożsama z żadną funkcją ze
zbioru <math>\displaystyle L \cup M</math> więc dodajemy ją na koniec listy. Druga z nich
zbioru <math>L \cup M</math> więc dodajemy ją na koniec listy. Druga z nich
równa jest funkcji <math>\displaystyle \tau_{\mathcal{A}}(b)</math>, więc nie dodajemy jej do
równa jest funkcji <math>\tau_{\mathcal{A}}(b)</math>, więc nie dodajemy jej do
listy. W tym momencie zbiór <math>\displaystyle M</math> zawiera następujące elementy:
listy. W tym momencie zbiór <math>M</math> zawiera następujące elementy:
<math>\displaystyle \tau_{\mathcal{A}}(1)</math>, <math>\displaystyle \tau_{\mathcal{A}}(a)</math>,
<math>\tau_{\mathcal{A}}(1)</math>, <math>\tau_{\mathcal{A}}(a)</math>,
<math>\displaystyle \tau_{\mathcal{A}}(b)</math>, natomiast lista zawiera elementy
<math>\tau_{\mathcal{A}}(b)</math>, natomiast lista zawiera elementy
<math>\displaystyle \tau_{\mathcal{A}}(a^2)</math>, <math>\displaystyle \tau_{\mathcal{A}}(ab)</math>,
<math>\tau_{\mathcal{A}}(a^2)</math>, <math>\tau_{\mathcal{A}}(ab)</math>,
<math>\displaystyle \tau_{\mathcal{A}}(ba)</math>. Zdejmujemy z <math>\displaystyle L</math> funkcję
<math>\tau_{\mathcal{A}}(ba)</math>. Zdejmujemy z <math>L</math> funkcję
<math>\displaystyle \tau_{\mathcal{A}}(a^2)</math>, dodajemy ja do <math>\displaystyle M</math> i ponieważ
<math>\tau_{\mathcal{A}}(a^2)</math>, dodajemy ja do <math>M</math> i ponieważ
<math>\displaystyle \tau_{\mathcal{A}}(a^2a)=\tau_{\mathcal{A}}(a^2)</math> i
<math>\tau_{\mathcal{A}}(a^2a)=\tau_{\mathcal{A}}(a^2)</math> i
<math>\displaystyle \tau_{\mathcal{A}}(a^2b)=\tau_{\mathcal{A}}(b)</math>, nic nie dodajemy  
<math>\tau_{\mathcal{A}}(a^2b)=\tau_{\mathcal{A}}(b)</math>, nic nie dodajemy  
do <math>\displaystyle L</math>. Zdejmujemy teraz z listy funkcję <math>\displaystyle \tau_{\mathcal{A}}(ab)</math>,  
do <math>L</math>. Zdejmujemy teraz z listy funkcję <math>\tau_{\mathcal{A}}(ab)</math>,  
dodajemy ją do <math>\displaystyle M</math> i ponieważ <math>\displaystyle \tau_{\mathcal{A}}(aba)</math> nie należy  
dodajemy ją do <math>M</math> i ponieważ <math>\tau_{\mathcal{A}}(aba)</math> nie należy  
do <math>\displaystyle L \cup M</math> dodajemy ją do listy.  
do <math>L \cup M</math> dodajemy ją do listy.  
<math>\displaystyle \tau_{\mathcal{A}}(abb)=\tau_{\mathcal{A}}(b)</math>, więc tej funkcji  
<math>\tau_{\mathcal{A}}(abb)=\tau_{\mathcal{A}}(b)</math>, więc tej funkcji  
nie dodajemy do <math>\displaystyle L</math>. Z <math>\displaystyle L</math> ściągamy <math>\displaystyle \tau_{\mathcal{A}}(ba)</math>,  
nie dodajemy do <math>L</math>. Z <math>L</math> ściągamy <math>\tau_{\mathcal{A}}(ba)</math>,  
dodajemy ją do <math>\displaystyle M</math> i widzimy, że  
dodajemy ją do <math>M</math> i widzimy, że  
<math>\displaystyle \tau_{\mathcal{A}}(baa)=\tau_{\mathcal{A}}(a^2)</math> oraz  
<math>\tau_{\mathcal{A}}(baa)=\tau_{\mathcal{A}}(a^2)</math> oraz  
<math>\displaystyle \tau_{\mathcal{A}}(bab)=\tau_{\mathcal{A}}(b)</math>, więc nic nie  
<math>\tau_{\mathcal{A}}(bab)=\tau_{\mathcal{A}}(b)</math>, więc nic nie  
dodajemy do <math>\displaystyle L</math>. Na liście pozostała funkcja  
dodajemy do <math>L</math>. Na liście pozostała funkcja  
<math>\displaystyle \tau_{\mathcal{A}}(aba)</math>. Ściągamy ją z listy i dodajemy do <math>\displaystyle M</math>.  
<math>\tau_{\mathcal{A}}(aba)</math>. Ściągamy ją z listy i dodajemy do <math>M</math>.  
Widzimy, że <math>\displaystyle \tau_{\mathcal{A}}(abaa)=\tau_{\mathcal{A}}(a^2)</math> i  
Widzimy, że <math>\tau_{\mathcal{A}}(abaa)=\tau_{\mathcal{A}}(a^2)</math> i  
<math>\displaystyle \tau_{\mathcal{A}}(abab)=\tau_{\mathcal{A}}(b)</math>, zatem nic nie  
<math>\tau_{\mathcal{A}}(abab)=\tau_{\mathcal{A}}(b)</math>, zatem nic nie  
dodajemy do listy <math>\displaystyle L</math>. Lista jest w tym momencie pusta i działanie  
dodajemy do listy <math>L</math>. Lista jest w tym momencie pusta i działanie  
algorytmu zakończyło się. Ostatecznie mamy
algorytmu zakończyło się. Ostatecznie mamy
<center><math>\displaystyle M(\mathcal{A})=\{ \tau_{\mathcal{A}}(1),\tau_{\mathcal{A}}(a),
<center><math>M(\mathcal{A})=\{ \tau_{\mathcal{A}}(1),\tau_{\mathcal{A}}(a),
\tau_{\mathcal{A}}(b),\tau_{\mathcal{A}}(a^2),\tau_{\mathcal{A}}(ab),
\tau_{\mathcal{A}}(b),\tau_{\mathcal{A}}(a^2),\tau_{\mathcal{A}}(ab),
\tau_{\mathcal{A}}(ba),\tau_{\mathcal{A}}(aba)\},</math></center>
\tau_{\mathcal{A}}(ba),\tau_{\mathcal{A}}(aba)\}</math>,</center>


co zgadza się z wynikiem otrzymanym w przykładzie.
co zgadza się z wynikiem otrzymanym w przykładzie.
Linia 641: Linia 607:
<span id="twierdzenie_1_2">{{twierdzenie|1.2.||
<span id="twierdzenie_1_2">{{twierdzenie|1.2.||


Niech <math>\displaystyle \; L \subset A^* \;</math> będzie dowolnym językiem. Równoważne są następujące warunki:
Niech <math>\; L \subset A^* \;</math> będzie dowolnym językiem. Równoważne są następujące warunki:
:(1)  Język <math>\displaystyle \; L \;</math> jest rozpoznawalny,
:(1)  Język <math>\; L \;</math> jest rozpoznawalny,
:(2)  Język <math>\displaystyle \; L \;</math> jest sumą wybranych klas równoważności pewnej prawej kongruencji <math>\displaystyle \rho</math> na <math>\displaystyle \; A^* \;</math> o skończonym indeksie: <center><math>\displaystyle L = \bigcup_{w\in L}[w]_\rho.</math></center>
:(2)  Język <math>\; L \;</math> jest sumą wybranych klas równoważności pewnej prawej kongruencji <math>\rho</math> na <math>\; A^* \;</math> o skończonym indeksie: <center><math>L = \bigcup_{w\in L}[w]_\rho</math>.</center>
: (3)  Język <math>\displaystyle \; L \;</math> jest sumą wybranych klas równoważności pewnej kongruencji <math>\displaystyle \rho</math> na <math>\displaystyle \; A^* \;</math> o skończonym indeksie: <center><math>\displaystyle L = \bigcup_{w\in L}[w]_\rho.</math></center>
: (3)  Język <math>\; L \;</math> jest sumą wybranych klas równoważności pewnej kongruencji <math>\rho</math> na <math>\; A^* \;</math> o skończonym indeksie: <center><math>L = \bigcup_{w\in L}[w]_\rho</math>.</center>
: (4)  Istnieje skończony monoid <math>\displaystyle \; M \;</math> i istnieje epimorfizm <math>\displaystyle \varphi : A^* \longrightarrow M</math> taki, że <center><math>\displaystyle L = \varphi^{-1}(\varphi (L)).</math></center>
: (4)  Istnieje skończony monoid <math>\; M \;</math> i istnieje epimorfizm <math>\varphi : A^* \longrightarrow M</math> taki, że <center><math>L = \varphi^{-1}(\varphi (L))</math>.</center>


}}</span>
}}</span>
Linia 653: Linia 619:
Dowód równoważności czterech powyższych warunków przeprowadzimy zgodnie z następującym schematem:
Dowód równoważności czterech powyższych warunków przeprowadzimy zgodnie z następującym schematem:


<center><math>\displaystyle 4 \Longrightarrow 3 \Longrightarrow 2\Longrightarrow 1 \Longrightarrow 4</math></center>
<center><math>4 \Longrightarrow 3 \Longrightarrow 2\Longrightarrow 1 \Longrightarrow 4</math></center>


<math>\displaystyle 4 \Longrightarrow 3</math>  
<math>4 \Longrightarrow 3</math>  


Dany jest homomorfizm <center><math>\displaystyle \varphi: A^* \longrightarrow M, </math></center>
Dany jest homomorfizm <center><math>\varphi: A^* \longrightarrow M</math></center>
gdzie <math>\displaystyle M</math> jest skończonym monoidem.<br>
gdzie <math>M</math> jest skończonym monoidem.<br>
Określamy relację <math>\displaystyle \; \rho \;</math> na <math>\displaystyle A^*</math>, przyjmując dla dowolnych <math>\displaystyle  u, v \in A^* </math>
Określamy relację <math>\; \rho \;</math> na <math>A^*</math>, przyjmując dla dowolnych <math>u, v \in A^*</math>
<center><math>\displaystyle u \; \rho \; v \;\; \Longleftrightarrow \;\; \varphi (u) = \varphi (v).</math></center>
<center><math>u \; \rho \; v \;\; \Longleftrightarrow \;\; \varphi (u) = \varphi (v)</math>.</center>


Tak określona relacja jest kongruencją.  Natomiast jej skończony indeks wynika z faktu, że monoid <math>\displaystyle \; M \;</math> jest skończony.
Tak określona relacja jest kongruencją.  Natomiast jej skończony indeks wynika z faktu, że monoid <math>\; M \;</math> jest skończony.
Pokażemy teraz, że:
Pokażemy teraz, że:


<center><math>\displaystyle L = \bigcup_{w\in L}[w]_\rho .</math></center>
<center><math>L = \bigcup_{w\in L}[w]_\rho</math>.</center>
Inkluzja <math>\displaystyle \; \subseteq \;</math> jest oczywista.<br>
Inkluzja <math>\; \subseteq \;</math> jest oczywista.<br>
Inkluzja w przeciwną stronę (<math>\displaystyle L \supseteq \bigcup_{w\in L}[w]_\rho,</math>) oznacza, że każda klasa równoważności relacji
Inkluzja w przeciwną stronę (<math>L \supseteq \bigcup_{w\in L}[w]_\rho</math>,) oznacza, że każda klasa równoważności relacji
<math>\displaystyle \; \rho \;</math> albo cała zawiera się w języku <math>\displaystyle L</math>, albo cała zawiera się w uzupełnieniu języka <math>\displaystyle L</math>.<br>
<math>\; \rho \;</math> albo cała zawiera się w języku <math>L</math>, albo cała zawiera się w uzupełnieniu języka <math>L</math>.<br>
Załóżmy, że <math>\displaystyle \; u \in [w]_\rho</math> dla pewnego <math>\displaystyle  w \in L. \;</math>
Załóżmy, że <math>\; u \in [w]_\rho</math> dla pewnego <math>w \in L. \;</math>
Oznacza to, że
Oznacza to, że
<center><math>\displaystyle u \; \rho \; w \Leftrightarrow \varphi (u) = \varphi (w) \in \varphi (L)\Rightarrow
<center><math>u \; \rho \; w \Leftrightarrow \varphi (u) = \varphi (w) \in \varphi (L)\Rightarrow
u \in \varphi^{-1}(\varphi (u)) \;\; \subset \varphi^{-1}(\varphi (L)) = L.</math></center>
u \in \varphi^{-1}(\varphi (u)) \;\; \subset \varphi^{-1}(\varphi (L)) = L</math>.</center>


Implikuje to ostatecznie, że <math>\displaystyle u \in L</math>.
Implikuje to ostatecznie, że <math>u \in L</math>.


<math>\displaystyle 3 \Longrightarrow 2</math>
<math>3 \Longrightarrow 2</math>


Każda kongruencja jest prawą kongruencją.
Każda kongruencja jest prawą kongruencją.


<math>\displaystyle 2 \Longrightarrow 1</math>
<math>2 \Longrightarrow 1</math>


Niech <math>\displaystyle \; \rho \;</math> będzie prawą kongruencją o skończonym indeksie na <math>\displaystyle \; A^* \;</math> taką, że
Niech <math>\; \rho \;</math> będzie prawą kongruencją o skończonym indeksie na <math>\; A^* \;</math> taką, że
<center><math>\displaystyle L = \bigcup_{w\in L}[w]_\rho .</math></center>
<center><math>L = \bigcup_{w\in L}[w]_\rho</math>.</center>


Automat  <math>\displaystyle \mathcal{A}_{\rho } \displaystyle = (A^*/\rho,f^*,[1]_\rho,T),</math> dla którego
Automat  <math>\mathcal{A}_{\rho } = (A^*/\rho,f^*,[1]_\rho,T)</math>, dla którego


<center><math>\displaystyle f^*([w]_\rho,u) =[wu]_\rho \;, \;\;\;\;\; T = \{ [w]_\rho \; : \; w \in L \}</math></center>
<center><math>f^*([w]_\rho,u) =[wu]_\rho \;, \;\;\;\;\; T = \{ [w]_\rho \; : \; w \in L \}</math></center>
akceptuje język <math>\displaystyle L</math>.
akceptuje język <math>L</math>.


<math>\displaystyle 1 \Longrightarrow 4</math>
<math>1 \Longrightarrow 4</math>


Niech język <math>\displaystyle \; L=L(\mathcal{A}) \;</math>, gdzie  <math>\displaystyle \mathcal{A} \displaystyle = (S,f,s_0,T)</math>.<br>
Niech język <math>\; L=L(\mathcal{A}) \;</math>, gdzie  <math>\mathcal{A} = (S,f,s_0,T)</math>.<br>
Określamy odwzorowanie  
Określamy odwzorowanie  


<center><math>\displaystyle \varphi :A^{*}\longrightarrow A^{*}/_{Ker\tau _{\mathcal{A}}}, </math></center>
<center><math>\varphi :A^{*}\longrightarrow A^{*}/_{Ker\tau _{\mathcal{A}}}</math></center>


przyjmując dla każdego  <math>\displaystyle v\in A^{*} </math>   
przyjmując dla każdego  <math>v\in A^{*}</math>   


<center><math>\displaystyle \varphi (v)=[v]_{Ker\tau _{\mathcal{A}}}. </math></center>
<center><math>\varphi (v)=[v]_{Ker\tau _{\mathcal{A}}}</math></center>


Jest to odwzorowanie kanoniczne monoidu <math>\displaystyle \; A^* \;</math> na monoid ilorazowy, a więc jest to epimorfizm.<br>
Jest to odwzorowanie kanoniczne monoidu <math>\; A^* \;</math> na monoid ilorazowy, a więc jest to epimorfizm.<br>
<math>\displaystyle A^{*}/_{Ker\tau _{\mathcal{A}}} </math>  jest monoidem skończonym, ponieważ <math>\displaystyle \; S \;</math> jest zbiorem skończonym.
<math>A^{*}/_{Ker\tau _{\mathcal{A}}}</math>  jest monoidem skończonym, ponieważ <math>\; S \;</math> jest zbiorem skończonym.


Dla dowodu równości <math>\displaystyle L = \varphi^{-1}(\varphi (L))</math> wystarczy udowodnić
Dla dowodu równości <math>L = \varphi^{-1}(\varphi (L))</math> wystarczy udowodnić
inkluzję <math>\displaystyle L \supset \varphi^{-1}(\varphi (L))</math>. (Inkluzja <math>\displaystyle \; L \subseteq \varphi^{-1}(\varphi (L))\;</math>
inkluzję <math>L \supset \varphi^{-1}(\varphi (L))</math>. (Inkluzja <math>\; L \subseteq \varphi^{-1}(\varphi (L))\;</math>
wynika z&nbsp;definicji przeciwobrazu.) <br>
wynika z&nbsp;definicji przeciwobrazu.) <br>
Niech <math>\displaystyle \; u \in \varphi^{-1}(\varphi (L)) .\;</math> Oznacz to, że
Niech <math>\; u \in \varphi^{-1}(\varphi (L)) .\;</math> Oznacz to, że


<center><math>\displaystyle \begin{array} {c}
<center><math>\begin{array} {c}
\varphi (u)\in \varphi (L) \Leftrightarrow \exists v\in L :\varphi (u)=\varphi (v) \Leftrightarrow
\varphi (u)\in \varphi (L) \Leftrightarrow \exists v\in L :\varphi (u)=\varphi (v) \Leftrightarrow
\exists v\in L : [u]_{_{Ker\tau _{\mathcal{A}}}}=[v]_{_{Ker\tau _{\mathcal{A}}}} \Leftrightarrow \\
\exists v\in L : [u]_{_{Ker\tau _{\mathcal{A}}}}=[v]_{_{Ker\tau _{\mathcal{A}}}} \Leftrightarrow \\
Linia 715: Linia 681:
\exists v\in L : \forall s \in S \;f(s,u)=f(s,v)
\exists v\in L : \forall s \in S \;f(s,u)=f(s,v)


\end{array} </math></center>
\end{array}</math></center>


W szczególności  <center><math>\displaystyle  f(s_0,u) = f(s_0,v) \in T, </math></center>
W szczególności  <center><math>f(s_0,u) = f(s_0,v) \in T</math></center>
czyli  <math>\displaystyle u \in L.
czyli  <math>u \in L</math>.
}}</math>
}}
}}

Aktualna wersja na dzień 22:18, 11 wrz 2023

W rozdziale tym zdefiniujemy automat - drugi, obok gramatyki, model obliczeń. Określimy język rozpoznawany przez automat i podamy warunki równoważne na to, by język był rozpoznawany.

Automaty

Wprowadzimy teraz pojęcie automatu. Jak już wspomnieliśmy w wykładzie drugim automat to drugi, obok gramatyki, model obliczeń będący przedmiotem badań teorii języków i automatów. Model realizujący warunek efektywności analitycznej, czyli taki na podstawie którego możliwe jest sformułowanie algorytmu rozstrzygającego w skończonej liczbie kroków, czy dowolne słowo należy, czy też nie należy do języka rozpoznawanego przez ten automat. Lub inaczej możemy powiedzieć, że taki automat daje algorytm efektywnie rozstrzygający, czy dowolne obliczenie sformułowane nad alfabetem automatu jest poprawne.

Wprowadzony w tym wykładzie automat, zwany automatem skończenie stanowym, jest jednym z najprostszych modeli obliczeń. Jest to model z bardzo istotnie ograniczoną pamięcią. Działanie takiego automatu sprowadza się do zmiany stanu pod wpływem określonego zewnętrznego sygnału czy impulsu.

Pomimo tych ograniczeń urządzenia techniczne oparte o modele takich automatów spotkać możemy dość często. Jako przykład służyć mogą automatyczne drzwi, automaty sprzedające napoje, winda, czy też urządzenia sterujące taśmą produkcyjną.

Przykład 1.1.

Drzwi automatycznie otwierane są sterowane automatem, którego działanie opisać można, przyjmując następujące oznaczenia. Fakt, że osoba chce wejść do pomieszczenia zamykanego przez takie drzwi, identyfikowany przez odpowiedni czujnik, opiszemy symbolem . Zamiar wyjścia symbolem . Symbol będzie związany z równoczesnym zamiarem wejścia jakiejś osoby i wyjścia innej. Wreszcie symbol oznaczał będzie brak osób, które chcą wejść lub wyjść. Zatem zbiór , to alfabet nad którym określimy automat o stanach: poniższym grafem.

Rysunek 1


Automaty reagują więc na określone sygnały zewnętrzne reprezentowane przez litery alfabetu , zmieniając swój stan. Jeśli ustalimy stan początkowy automatu oraz dopuszczalne stany końcowe, to automat będzie testował dowolne słowo z , startując ze stanu początkowego. Jeśli rezultatem finalnym działania automatu (obliczenia) będzie stan końcowy, to słowo będzie rozpoznawane przez automat, a obliczenie określone takim słowem poprawne. Automaty można graficznie reprezentować jako etykietowane grafy skierowane. W takim grafie każdy wierzchołek odpowiada stanowi automatu, a każda strzałka pomiędzy wierzchołkami i , etykietowana symbolem , oznacza przejście automatu ze stanu do stanu pod wpływem litery . Podamy teraz definicję automatu. Niech oznacza dowolny alfabet. Od tego momentu wykładu zakładamy, że alfabet jest zbiorem skończonym.

Definicja 1.1

Automatem nad alfabetem nazywamy system , w którym

- jest dowolnym skończonym zbiorem zwanym zbiorem stanów,

- jest funkcją przejść.

Automat będąc w stanie po przeczytaniu litery zmienia stan na zgodnie z funkcją przejścia .

Funkcję przejść rozszerzamy na cały wolny monoid do postaci

,

przyjmując:

dla każdego oraz

dla każdego i dla dowolnego

Działanie automatu pokazane jest na poniższej animacji 2.

Zdefiniowany powyżej automat nazywamy skończonym lub skończenie stanowym ze względu na założenie skończoności zbioru stanów .

Przykład 1.2.

Niech będzie alfabetem, a automatem takim, że

, a funkcja przejść zadana jest przy pomocy tabelki


Automat możemy również jednoznacznie określić przy pomocy grafu.

Rysunek 2


Podamy teraz bardzo interesujący przykład zastosowania automatów skończonych. Przedstawimy mianowicie wykorzystanie tak zwanych automatów synchronizujących w przemyśle. Automat synchronizujący nad alfabetem to automat o następującej własności: istnieje stan oraz słowo takie, że dla każdego stanu tego automatu Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle f(s, w)=t} . Istnieje więc pewne uniwersalne słowo Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle w} , pod wpływem którego wszystkie stany przechodzą w jeden, ustalony stan automatu Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle t \in S} . Mówimy, że następuje wtedy synchronizacja wszystkich stanów automatu.

Poniżej prezentujemy przykład zaczerpnięty z pracy Ananicheva i Volkova (D. S. Ananichev, M. V. Volkov, Synchronizing Monotonic Automata, Lecture Notes in Computer Science, 2710(2003), 111-121.), ukazujący ideę użycia automatów synchronizujących w tej dziedzinie.

Rysunek 3
Rysunek 4
Rysunek 5

Przykład 1.3.

Załóżmy, że pewna fabryka produkuje detale w kształcie kwadratu z "wypustką" na jednym boku (patrz rys. 3). Po wyprodukowaniu detale należy umieścić w opakowaniach w ten sposób, by wszystkie były w tej samej orientacji - mianowicie "wypustką" w lewo.

Załóżmy ponadto dla uproszczenia, że detale mogą przyjmować jedną z czterech orientacji (rys. 4): "wypustką" w górę, w dół, w lewo lub w prawo.

Należy zatem skonstruować takie urządzenie (orienter), które będzie ustawiało wszystkie detale w żądanej orientacji. Oczywiście istnieje wiele metod rozwiązania tego problemu, ale z praktycznego punktu widzenia potrzebne jest rozwiązanie najprostsze i najtańsze. Jednym z takich sposobów jest umieszczanie detali na pasie transmisyjnym z zamontowaną wzdłuż niego pewną ilością przeszkód dwojakiego rodzaju: niskich (low) oraz wysokich (HIGH). Wysoka przeszkoda ma tę własność, że każdy detal, który ją napotka, zostanie obrócony o 90 stopni w prawo (zakładamy, że elementy jadą od lewej do prawej strony). Przeszkoda niska obróci o 90 stopni w prawo tylko te detale, które są ułożone "wypustką" w dół. Na rys. 5 przedstawione zostały przejścia pomiędzy orientacjami detali w zależności od napotkania odpowiedniej przeszkody.

Można zauważyć, że automat z rysunku 5 jest automatem synchronizującym. Słowem, które go synchronizuje, jest następująca sekwencja przeszkód:

low-HIGH-HIGH-HIGH-low-HIGH-HIGH-HIGH-low.

Niezależnie od tego, w jakiej orientacji początkowej znajduje się detal, po przejściu przez powyższą sekwencję przeszkód zawsze będzie ułożony "wypustką" w lewo. Sytuację przedstawia poniższa animacja 3:

Rozszerzymy teraz wprowadzone pojęcie automatu w ten sposób, by uzyskać możliwość efektywnego rozstrzygania, czy dowolne słowo utworzone nad alfabetem Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle A} reprezentuje poprawne obliczenie, czyli spełnia kryteria określone przez rozszerzony automat.

Definicja 1.2.

Język Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle \; L~\subset A^* \;} jest rozpoznawany (akceptowany) wtedy i tylko wtedy, gdy istnieje automat skończony Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle \mathcal{A} = (S,f) , \;} stan Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle \; s_0 \in S \;} oraz zbiór Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle \; T \subset S \;} takie, że

Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle L = \{ w \in A^* \; : \; f(s_0,w) \in T \}}

Stan nazywamy stanem początkowym, a zbiorem stanów końcowych automatu .

Rozszerzony w powyższy sposób automat, poprzez dodanie stanu początkowgo i zbioru stanów końcowych, w dalszym ciągu nazywamy automatem i oznaczamy jako piątkę lub czwórkę , jeśli wiadomo, nad jakim alfabetem rozważamy działanie automatu.

Fakt, że język jest rozpoznawany przez automat zapisujemy jako

Rodzinę wszystkich języków rozpoznawalnych nad alfabetem oznaczamy przez .

Podobnie jak w przypadku gramatyk nie ma jednoznacznej odpowiedniości pomiędzy językami rozpoznawalnymi a automatami. Wprowadza się więc relację, która identyfikuje automaty rozpoznające ten sam język.

Definicja 1.3.

Automaty i równoważne, jeśli rozpoznają ten sam język, czyli

.

W dalszych rozważaniach języków rozpoznawanych ograniczymy się do automatów , które spełniają warunek . Nie zawęża to naszych rozważań. Jeśli bowiem język jest rozpoznawany przez pewien automat , to jest również rozpoznawany przez automat

,

który spełnia powyższy warunek. Zauważmy, że przyjmując to założenie, upraszczamy strukturę automatu. Z punktu widzenia grafu automatu można powiedzieć, że nie występują w nim wierzchołki (stany) nieosiagalne z . Poniżej przedstawiamy algorytm usuwający z automatu stany nieosiągalne ze stanu początkowego.

Algorytm UsuńStanyNieosiągalne - usuwa z automatu stany nieosiągalne



  1  Wejście:  - automat.
  2  Wyjście:  - automat równoważny automatowi  bez
stanów nieosiągalnych. 3 for each do 4 zaznaczone; 5 end for 6 zaznaczone; 7 OZNACZ; 8 zaznaczone ; 9 ; 10 flagfalse jeśli nie dodamy stanu to na końcu pętli nadal flag=false 11 ; 12 for each do 13 for each do 14 if NULL then 15 ; Parser nie mógł rozpoznać (SVG (MathML może zostać włączone przez wtyczkę w przeglądarce): Nieprawidłowa odpowiedź („Math extension cannot connect to Restbase.”) z serwera „https://wazniak.mimuw.edu.pl/api/rest_v1/”:): {\displaystyle \trianglerightf'(p,a)} była nieokreślona 16 flag true; 17 end if 18 end for 19 end for 20 if flag=true then 21 ; 22 end if 23 return ;


Algorytm Procedure Oznacz



  1  procedure OZNACZ
  2  for each  
  3    flagfalse
  4    for each  do
  5      if  then
  6        flagtrue
  7      end if
  8    end for
  9    if flag=true and zaznaczone then
 10      zaznaczone;
 11      OZNACZ;
 12    end if
 13  end for
 14  end procedure



Powyższy algorytm, dla ustalonego alfabetu , posiada złożoność , czyli liniową względem liczby stanów.

Przedstawiając automat przy pomocy grafu przyjmujemy następującą konwencję. Jeśli w automacie występuje stan początkowy, oznaczać go będziemy zieloną strzałką wchodzącą do tego stanu. Jeśli w automacie występują stany końcowe, oznaczać je będziemy niebieską obwódką.


Przykład 1.4.

Jeśli w przykładzie 1.2 (patrz przykład 1.2.) przyjmiemy stan jako stan początkowy, jako zbiór stanów końcowych, to automat rozpoznaje język

złożony ze słów, kończących się na .

Słowo nie jest akceptowane.

Słowo jest akceptowane.


Każdy automat wyznacza w wolnym monoidzie prawą kongruencję, nazywaną prawą kongruencją automatową, określoną w następujący sposób:

.

Dla automatu skończonego (o skończonym zbiorze stanów), a takie rozważamy, relacja ma skończony indeks, czyli skończoną liczbę klas równoważności.

Przykład 1.5.

Automat z przykładu 1.2 (patrz przykład 1.2.) ze stanem jako początkowym wyznacza relację równoważności o trzech klasach:

,<br\> ,<br\> .

Na odwrót, każda prawa kongruencja wyznacza automat, zwany ilorazowym, w następujący sposób:

.

jest automatem ze stanem początkowym . jest automatem skończonym wtedy i tylko wtedy, gdy relacja ma skończony indeks.
Z definicji prawej kongruencji wynika, że funkcja przejść jest określona poprawnie.

Definicja 1.4.

Niech i będą dowolnymi automatami. Odwzorowanie nazywamy homomorfizmem automatów wtedy i tylko

wtedy, jeśli
.

Homomorfizm automatów oznaczamy .

Twierdzenie 1.1.

Prawdziwe są następujące fakty:

(1) Dla dowolnej prawej kongruencji

,

(2) Dowolny automat jest izomorficzny z automatem ,

(3) Dla dowolnych automatów i prawdziwa jest równoważność

istnieje epimorfizm taki, że .

Dowód

(1) Identyczność relacji wynika wprost z definicji automatu ilorazowego oraz prawej kongruencji .

(2) Rozważmy automat i odwzorowanie

gdzie

Istnienie słowa wynika z faktu, że jest stanem początkowym, natomiast z definicji relacji wynika, że odwzorowanie jest poprawnie określone.
Odwzorowanie ma być homomorfizmem, czyli dla każdego stanu i dowolnego słowa spełniać warunek

Warunek ten wynika z następujących równości

gdzie .

Z prostych obserwacji wynika, że jest suriekcją i iniekcją.

(3) Dowód implikacji ""
Załóżmy, że . Niech

będzie odwzorowaniem takim, że

.

Stąd, że jest stanem początkowym automatu wynika, że istnieje słowo potrzebne do określenia epimorfizmu .
Z założenia wynika, że jest poprawnie zdefiniowaną funkcją.
Uzasadnienie faktu, że jest homomorfizmem, jest analogiczne jak w punkcie (2) dla .
jest suriekcją, gdyż jest stanem początkowym automatu .
ponieważ .
Dowód implikacji ""
Niech będzie epimorfizmem takim, że .
Wówczas prawdziwy jest następujący ciąg wnioskowań.

To oznacza, że .

End of proof.gif

Symbolem oznaczamy rodzinę wszystkich funkcji określonych na zbiorze i przyjmujących wartości w . Łatwo zauważyć, iż rodzina ta wraz ze składaniem odwzorowań jest monoidem .

Definicja 1.5.

Niech będzie dowolnym automatem. Reprezentacją automatu nazywamy funkcję , określoną dla dowolnych i równością

Reprezentacja automatu jest homomorfizmem monoidu w monoid , bowiem dla dowolnych spełnione są warunki

Definicja 1.6.

Niech będzie dowolnym automatem. Monoidem przejść automatu nazywamy monoid

.

Następujące wnioski są konsekwencjami rozważań przeprowadzonych powyżej.

Wniosek 1.1.

(1) Monoid przejść automatu jest podmonoidem monoidu i zbiór jest zbiorem

generatorów tego monoidu.
.

Wynika to z faktu, że jest epimorfizmem i z twierdzenia 2.1 z wykładu 1. (patrz twierdzenie 2.1. wykład 1)

(2) Monoid przejść automatu skończonego jest skończony.

(3) Monoid przejść automatu jest izomorficzny z monoidem ilorazowym .

Jest to wniosek z twierdzenia o rozkładzie epimorfizmu, które w tym przypadku ilustruje poniższy diagram.
Rysunek 6

Przykład 1.6.

Określimy monoid przejść dla automatu z przykładu 1.2 (patrz przykład 1.2.). Wypisujemy kolejne funkcje dla . Zauważmy, że ze względu na występujące w tabelce powtórzenia, będące wynikiem równości, np. nie ma potrzeby określać funkcji dla . Podobna obserwacja ma miejsce w innych przypadkach, co sprawia, że tabelka zawiera skończoną liczbę różnych funkcji.



.


Poniżej zamieszczamy algorytm obliczający monoid przejść dla automatu skończenie stanowego.

Algorytm WyznaczMonoidPrzejść - wyznacza monoid przejść dla automatu



  1  Wejście:  - automat
  2  Wyjście:  - monoid przejść dla 
  3  ;   jest listą
  4  ;
  5  for each  do
  6    insert;   gdzie  dla każdego 
  7  end for
  8  while ; do 
  9    first ;
 10   ;
 11   for each  do
 12     for each  do
 13        ;
 14      end for
 15      if  
 16        insert;
 17      end if
 18    end for
 19  end while
 20  return ;


Procedura insert wkłada na koniec listy element . Funkcja first wyjmuje pierwszy element znajdujący się na liście i zwraca go. Algorytm działa w następujący sposób: najpierw na listę wkładane są elementy monoidu przejść dla każdej litery . Te funkcje można obliczyć bezpośrednio z tabelki reprezentującej funkcję przejścia automatu . Następnie z listy po kolei ściągane są poszczególne funkcje . Każda z nich dodawana jest do zbioru , a następnie algorytm sprawdza dla każdej litery , czy funkcja istnieje już na liście lub w zbiorze . Jeśli nie, to funkcja ta dodawana jest do listy. Procedura powyższa trwa do czasu, gdy lista zostanie pusta. Wtedy wszystkie elementy monoidu przejść znajdą się w zbiorze .

Przeanalizujmy działanie algorytmu dla automatu z przykładu 1.2 (patrz przykład 1.2.).

Na początku na listę włożone zostaną funkcje , oraz . Z listy zdejmujemy funkcję i dodajemy ją do zbioru . Ponieważ , a funkcje oraz znajdują się już na liście, zatem nie dodajemy ich do . Bierzemy kolejny element listy, , dodajemy go do i obliczamy funkcje oraz . Ponieważ nie jest tożsama z żadną funkcją ze zbioru , dodajemy ją do listy. Funkcja również nie jest równa żadnej z funkcji należących do zbioru , zatem wstawiamy ją na koniec listy. Na liście mamy zatem teraz następujące elementy: , oraz . Zdejmujemy z listy funkcję , dodajemy ją do i obliczamy oraz . Pierwsza z tych funkcji jest nowa, tzn. nie jest tożsama z żadną funkcją ze zbioru więc dodajemy ją na koniec listy. Druga z nich równa jest funkcji , więc nie dodajemy jej do listy. W tym momencie zbiór zawiera następujące elementy: , , , natomiast lista zawiera elementy , , . Zdejmujemy z funkcję , dodajemy ja do i ponieważ i , nic nie dodajemy do . Zdejmujemy teraz z listy funkcję , dodajemy ją do i ponieważ nie należy do dodajemy ją do listy. , więc tej funkcji nie dodajemy do . Z ściągamy , dodajemy ją do i widzimy, że oraz , więc nic nie dodajemy do . Na liście pozostała funkcja . Ściągamy ją z listy i dodajemy do . Widzimy, że i , zatem nic nie dodajemy do listy . Lista jest w tym momencie pusta i działanie algorytmu zakończyło się. Ostatecznie mamy

,

co zgadza się z wynikiem otrzymanym w przykładzie.

Twierdzenie poniższe zbiera dotychczas uzyskane charakteryzacje języków rozpoznawanych.

Twierdzenie 1.2.

Niech będzie dowolnym językiem. Równoważne są następujące warunki:

(1) Język jest rozpoznawalny,
(2) Język jest sumą wybranych klas równoważności pewnej prawej kongruencji na o skończonym indeksie:
.
(3) Język jest sumą wybranych klas równoważności pewnej kongruencji na o skończonym indeksie:
.
(4) Istnieje skończony monoid i istnieje epimorfizm taki, że
.

Dowód

Dowód równoważności czterech powyższych warunków przeprowadzimy zgodnie z następującym schematem:

Dany jest homomorfizm

gdzie jest skończonym monoidem.
Określamy relację na , przyjmując dla dowolnych

.

Tak określona relacja jest kongruencją. Natomiast jej skończony indeks wynika z faktu, że monoid jest skończony. Pokażemy teraz, że:

.

Inkluzja jest oczywista.
Inkluzja w przeciwną stronę (,) oznacza, że każda klasa równoważności relacji albo cała zawiera się w języku , albo cała zawiera się w uzupełnieniu języka .
Załóżmy, że dla pewnego Oznacza to, że

.

Implikuje to ostatecznie, że .

Każda kongruencja jest prawą kongruencją.

Niech będzie prawą kongruencją o skończonym indeksie na taką, że

.

Automat , dla którego

akceptuje język .

Niech język , gdzie .
Określamy odwzorowanie

przyjmując dla każdego

Jest to odwzorowanie kanoniczne monoidu na monoid ilorazowy, a więc jest to epimorfizm.
jest monoidem skończonym, ponieważ jest zbiorem skończonym.

Dla dowodu równości wystarczy udowodnić inkluzję . (Inkluzja wynika z definicji przeciwobrazu.)
Niech Oznacz to, że

W szczególności

czyli .

End of proof.gif