Kalábovi

Kalábovic wikina

Uživatelské nástroje

Nástroje pro tento web


msz:konecne_automaty

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
msz:konecne_automaty [06. 06. 2012, 17.35:50] – [DKA bez nedosažitelných stavů] pitelmsz:konecne_automaty [16. 08. 2026, 14.02:58] (aktuální) – odstraněno - upraveno mimo DokuWiki (Neznámé datum) 127.0.0.1
Řádek 1: Řádek 1:
-====== Konečné automaty ====== 
-===== Definice (nedeterministického) KA (NKA) ===== 
-//M// = (//Q//, //Σ//, //δ//, //q//₀, //F//) 
-  * //Q// -- konečná **množina stavů** 
-  * //Σ// -- konečná **vstupní abeceda** 
-  * //δ// -- **funkce přechodu** (zobrazení //Q// × //Σ// -> 2<sup>//Q//</sup>) 
-  * //q//₀ -- **počáteční stav** (//q//₀ ∈ //Q//) 
-  * //F// -- **množina koncových stavů** (//F// ⊆ //Q//) 
  
-  * **Konfigurace** 
-    * Dvojice (//q//, //w//) ∈ //Q// × //Σ//<sup>*</sup> tj. stav a zbývající vstup 
-  * **Počáteční konfigurace** 
-    * Dvojice (//q//₀, //w//) tj. počáteční stav a celý vstup 
-  * **Koncová konfigurace** 
-    * Dvojice (//q// ∈ //F//, //ε//) tj. některý koncový stav a prázdný vstup 
-  * **Přechod ⊢** 
-    * Změna jedné konfigurace na jinou jednou aplikací funkce přechodu (přečtení jednoho znaku ze vstupu a změna stavu) 
-    * ⊢//ᵏ// -- //k// přechodů po sobě 
-    * ⊢⁺ -- libovolný počet přechodů (> 0) (tranzitivní uzávěr relace přechodu) 
-    * ⊢<sup>*</sup> -- libovolný počet přechodů (tranzitivní a reflexivní uzávěr relace přechodu) 
-  * Jazyk příjmaný KA 
-    * //L//(//M//) = {//w// | (//q//₀, //w//) ⊢<sup>*</sup> (//q//, //ε//) ∧ //q// ∈ //F//} 
-    * tj. množina všech řetězců pro které KA přejde z počáteční do koncové konfigurace 
-  * Rozlišitelné stavy 
-    * Stavy jsou rozlišitelné pokud existuje nějaký vstupní řetězec pro který automat z jednoho stavu skončí v koncovém stavu a z druhého ne. 
-    * Formálně: Stavy //p//, //q// jsou rozlišitelné pokud ∃ //w// ∈ //Σ//<sup>*</sup>: (//p//, //w//) ⊢<sup>*</sup> (//p//₁, //ε//) ∧ (//q//, //w//) ⊢<sup>*</sup> (//q//₁, //ε//) a právě jeden z //p//₁, //q//₁ je v //F// 
- 
-Jazyky přijímané KA jsou jazyky třídy 3 Chomského hierarchie (regulární jazyky). 
-===== Varianty konečných automatů ===== 
-==== Rozšířený KA ==== 
-Liší se definice funkce přechodu //δ//: (//Q// × (//Σ// ∪ {//ε//}) -> 2<sup>//Q//</sup>, tj. je rozšířený o //ε//-přechody. 
-==== Deterministický konečný automat (DKA) ==== 
-Liší se definice funkce přechodu //δ//: //Q// × Σ -> //Q// ∪ {''nedef''}, ''nedef'' ∉ //Q//, tj. pro každou konfiguraci existuje jen jeden možný přechod. 
-  * Jsou ekvivalentní NKA 
-  * Každý NKA lze převést na DKA 
-==== Úplný DKA ==== 
-Funkce přechodu je definována pro všechny kombinace vstupního znaku a stavu. tj. //δ// je totální funkcí na //Q// × //Σ//. 
- 
-Pro případy, kdy neúplná KA nemohl pokračovat (a tím odmítl vstup) zavádíme speciální nekoncový stav ''ERROR'' (//SINK//, //T//, ...) do kterého, když se automat dostane tak jej nemůže opustit (tj. po přečtení celého vstupu je stále v nekoncovém stavu a tak vstup odmítne). 
-==== DKA bez nedosažitelných stavů ==== 
-Je DKA ve kterém eliminujeme nedosažitelné stavy. To jsou ty stavy, do kterých se nedá z počátečního stavu dostat. 
-==== Minimální/redukovaný DKA (MDKA) ==== 
-Je DKA bez nedosažitelných stavů ve kterém nie sú žiadne 2 stavy nerozlíšiteľné: 
-* redukujeme nerozlišitelné stavy 
-* odstraníme přebytečné stavy (stavy nemající vliv na přijímání vstupního řetězce) 
-* v minimálnom DKA sú stavy množiny stavov z pôvodného automatu, pričom v každej množine sú stavy navzájom nerozlíšiteľné (ide v podstate o triedy ekvivalencie vzhladom k relácii nerozlíšiteľnosti) 
- 
-===== Odstranění nedosažitelných stavů ===== 
-Převod DKA <math>(Q, \Sigma, \delta, q_0, F)</math> na DKA bez nedosažitelných stavů<math>(S', \Sigma, \delta', q_0, F')</math> 
- 
-'''1)''' Najdeme všechny dostupné stavy (<math>S_i</math>) 
-:: <math>i := 0</math>  
-:: <math>S_0 := \{q_0\}</math> ''(tj. v nultém kroku je dostupný pouze počáteční stav)'' 
-:: repeat 
-::: <math>S_{i+1} := S_i \cup \{q | \exists p \in S_i \exists a \in \Sigma : \delta(p, a) = q\}</math> ''(tj. do množiny dostupných stavů přidáme všechny stavy do kterých se dá libovolným symbolem přejít z některého dostupného stavu z minulého kroku)'' 
-::: <math>i := i + 1</math> ''(tj. přejdeme k dalšímu kroku)'' 
-:: unitil <math>S_i =S_{i-1}</math> ''(tj. končíme pokud se nám v posledním kroku množina dostupných stavů nezměnila)'' 
- 
-'''2)''' Nový automat sestavíme jako: 
-:: <math>S' = S_i</math> (tj. použijeme pouze dosažitelné stavy) 
-:: použijeme pouze přechody obsahující dosažitelné stavy 
-:: použijeme pouze koncové stavy z množiny dosažitelných stavů (<math>F' = F \cap S_i</math>) 
- 
-===== Minimalizace KA ===== 
-Převod DKA <math>(Q, \Sigma, \delta, q_0, F)</math> na MDKA <math>(Q', \Sigma, \delta', q_0', F')</math> 
- 
-'''1)''' Převedeme na DKA bez nedostupných stavů 
- 
-'''2)''' Určíme relaci nerozlišitelnosti stavů (<math>\equiv^i</math>) 
- 
-::<math>i := 0</math> 
-::<math>\equiv^0 := \{(p,q) | p \in F \Leftrightarrow q \in F\}</math> ''(tj. na začátku rozlišujeme pouze dvě třídy - koncové a nekoncová stavy)'' 
-:: repeat 
-::: <math>\equiv^{i+1} := \{(p,q) | p \equiv^i q \forall a \in \Sigma : \delta(p,a) \equiv^i \delta(q,a) \}</math> ''(tj. prvky zůstanou ekvivalentní pouze pokud v minulém kroku vyšly ekvivalentní a všechny možné výsledky odpovídajících přechodů z nich jsou také ekvivalentní)'' 
-::: <math> i := i + 1</math> 
-:: unitil <math>\equiv^i = \equiv^{i-1}</math> ''(tj. končíme pokud v posledník kroku nedošlo k žádným změnám tříd ekvivalence)'' 
-'''3)''' Sestavíme nový automat jako: 
-:: <math>Q' = Q / \equiv^i</math> ''(tj. nové stavy odpovídají třídám ekvivalence původních stavů podle relace nerozlišitelnosti)'' 
-:: <math>\forall p,q \in Q \forall a \in \Sigma : \delta'([p], a) = [q] \Leftrightarrow \delta(p, a) = q</math> ''(tj. nové přechody jsou mezi těmi třídami ekvivalence u ktrých existuje alespoň jeden odpovídající přechod mezi některými jejich prvky)'' 
-:: <math>q_0' = [q_0]</math> ''(tj. počáteční stav je ta třída ekvivalence, která obsahuje původní počáteční stav)'' 
-:: <math>F' = \{[q] | q \in F\}</math> ''(tj. koncové stavy jsou ty třídy ekvivalence, která obsahují některý z původních koncových stavů)'' 
- 
-===== Převod NKA na DKA ====== 
-Převod NKA <math>(Q, \Sigma, \delta, q_0, F)</math> na DKA <math>(Q', \Sigma, \delta', q_0', F')</math> 
- 
-'''1)''' <math>Q' = (2^Q \setminus \{\emptyset\}) \cup \{nedef.\}</math> 
- 
-''(tj. nové stavy označujeme jako množiny původních stavů, místo prázdné množiny máme spec. stav {nedef.})'' 
- 
-'''2)''' Pro všechna <math>S \in 2^Q \setminus \{\emptyset\}</math> a pro všechna <math>a \in \Sigma</math> polož: 
-:: <math>\delta'(S, a) = \bigcup_{q \in S} \delta (q, a)</math> 
-:Je-li  <math>\delta'(S, a) = \{\emptyset\}</math> polož <math>\delta'(S, a) = nedef.</math> 
- 
-''(tj. pro všechny možné stavy S DKA a všechny možné znaky a na vstupu určíme následující stav jako sjednocení všech stavů do kterých vedou přechody se znakem a ze stavů v množině S. Pokud žádné takové přechody neexistují je přechod nedefinovaný.)'' 
- 
-'''3)''' <math>F' = \{S, S \in 2^Q \wedge S \cap F \neq \emptyset\}</math> 
- 
-''(tj. za koncové stavy DKA považujeme všechny stavy jejichž množina obsahuje alespoň jeden koncový stav z NKA)'' 
- 
-'''Alternativní přístup''' 
- 
-(využíváme skutečnost, že většina stavů z <math>2^Q</math> je nedostupná) 
- 
-'''1)''' Stavy DKA vznikají jako množiny stavů NKA 
- 
-'''2)''' Určíme počáteční stav DKA jako <math>\{q_0\}</math> a přidáme si ho na seznam nezpracovaných stavů 
- 
-'''3)''' Pro každý nezpracovaný stav X: 
-:: vezmeme všechny stavy NKA, které jsou součástí množiny X - označíme {X} 
-:: podíváme se jaké všechny symboly se vyskytují u přechodů vedoucích z {X} 
-:: pro každý z těchto symbolů pak: 
-::: určíme množinu stavů NKA (označíme Y) do kterých se lze dostat nějakým přechodem s tímto symbolem z některého z některého stavu v {X} 
-::: do DKA přidáme přechod s tímto symbolem vedoucí z X do Y 
-::: pokud Y dosud není součástí DKA přidáme ho na seznam nezpracovaných stavů 
-:: stav X označíme za zpracovaný a přidáme ho do množiny stavů DKA 
- 
-'''4)''' Pokud jsou nějaké nezpracovaná stavy jdeme zpět ke 3 
- 
-'''5)''' Za koncové stavy DKA považujeme všechny stavy jejichž množina obsahuje alespoň jeden koncový stav z NKA 
- 
-==== Prevod rozšíreného KA na DKA ==== 
- 
-Prevod RKA na DKA je rovnaký ako prevod NKA na DKA, akurát v 2. kroku sa ako <math>\delta'(S,a)</math> neberie zjednotenie, ale <math>\epsilon-uzaver</math> množiny, kotrá vznikne týmto zjednotením. 
- 
-===== Konstrukce NKA k pravé regulární gramatice ===== 
-Gramatika <math>g = (N, \Sigma, P, S)</math> na NKA <math>(Q, \Sigma, \delta, q_0, F)</math> 
- 
-'''1)''' <math>Q = N \cup \{q_F\}</math> ''(stavy NKA odpovídají nonterminálům gramatiky s přidaným <math>q_F</math>)'' 
- 
-'''2)''' <math>\Sigma = \Sigma</math> ''(tj. vstupní abeceda a množina terminálů jsou stejné)'' 
- 
-'''3)''' <math>q_0 = S</math> ''(tj. počátační stav odpovídá počátečnímu nonterminálu gramatiky)'' 
- 
-'''4)''' Je-li <math>S \rightarrow \epsilon</math> pravodlo z P pak <math>F = \{S, q_F\}</math> jinak <math>F = \{q_F\}</math> 
-''(tj. koncové stavy jsou  <math>q_F</math>) a v případě, že v gramtice je i prázdný řetezec tak i S'' 
- 
-'''5)''' funkci přechodů definujeme: 
-:: Je-li <math>A \rightarrow aB</math> pravidlo z P, pak <math>\delta (A, a) obsahuje B</math> 
-:: Je-li <math>A \rightarrow a</math> pravidlo z P, pak <math>\delta (A, a)</math> obsahuje <math>q_F</math> 
- 
-===== Konstrukce NKA k levé regulární gramatice ===== 
-Gramatika <math>g = (N, \Sigma, P, S)</math> na NKA <math>(Q, \Sigma, \delta, q_0, F)</math> 
- 
-'''1)''' <math>Q = N \cup \{q_0\}</math> ''(stavy NKA odpovídají nonterminálům abecedy s přidaným <math>q_0</math>)'' 
- 
-'''2)''' <math>\Sigma = \Sigma</math> ''(tj. vstupní abeceda a množina terminálů jsou stejné)'' 
- 
-'''3)''' <math>q_0</math> je počáteční stav 
- 
-'''4)''' Je-li <math>S \rightarrow \epsilon</math> pravodlo z P pak <math>F = \{S, q_0\}</math> jinak <math>F = \{S\}</math> 
-''(tj. koncové stavy jsou  <math>S</math>) a v případě, že v gramtice je i prázdný řetezec tak i <math>q_0</math>'' 
- 
-'''5)''' funkci přechodů definujeme: 
-:: Je-li <math>A \rightarrow Ba</math> pravidlo z P, pak <math>\delta (B, a) obsahuje A</math> 
-:: Je-li <math>A \rightarrow a</math> pravidlo z P, pak <math>\delta (q_0, a)</math> obsahuje A 
/var/www/wiki/data/attic/msz/konecne_automaty.1339004150.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)