Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Následující verze | Předchozí verze | ||
pitel:msz:konecne_automaty [03. 07. 2012, 11.53:32] – upraveno mimo DokuWiki 127.0.0.1 | pitel:msz:konecne_automaty [30. 12. 2022, 13.43:01] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Konečné automaty ====== | ||
+ | [[pitel: | ||
+ | ===== 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< | ||
+ | * //q//₀ -- **počáteční stav** (//q//₀ ∈ //Q//) | ||
+ | * //F// -- **množina koncových stavů** (//F// ⊆ //Q//) | ||
+ | * **Konfigurace** | ||
+ | * Dvojice (//q//, //w//) ∈ //Q// × // | ||
+ | * **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) | ||
+ | * ⊢< | ||
+ | * Jazyk příjmaný KA | ||
+ | * // | ||
+ | * 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// ∈ // | ||
+ | |||
+ | 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< | ||
+ | ==== Deterministický konečný automat (DKA) ==== | ||
+ | Liší se definice funkce přechodu //δ//: //Q// × Σ -> //Q// ∪ {'' | ||
+ | * 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 '' | ||
+ | ==== 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í/ | ||
+ | Je DKA bez nedosažitelných stavů ve kterém nejsou žádné 2 stavy nerozlišitelné: | ||
+ | - 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álním DKA jsou stavy množiny stavů z původního automatu, pričemž v každé množině jsou stavy navzájem nerozlišitelné (jde v podstatě o třídy ekvivalence vzhledem k relaci nerozlíšitelnosti). | ||
+ | ===== Odstranění nedosažitelných stavů ===== | ||
+ | Převod DKA (//Q//, //Σ//, //δ//, //q//₀, //F//) na DKA bez nedosažitelných stavů (//Q//′, //Σ//, //δ//′, //q//₀, //F//′) | ||
+ | |||
+ | - Najdeme všechny dostupné stavy //Qᵢ// | ||
+ | - //i// = 0 | ||
+ | - //Q//₀ = {//q//₀} (tj. v nultém kroku je dostupný pouze počáteční stav) | ||
+ | - '' | ||
+ | - // | ||
+ | - //i//++ (tj. přejdeme k dalšímu kroku) | ||
+ | - '' | ||
+ | - Nový automat sestavíme jako: | ||
+ | * //Q//′ = //Qᵢ// 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ů (//F//′ = //F// ∩ //Qᵢ//) | ||
+ | ===== Minimalizace KA ===== | ||
+ | Převod DKA (//Q//, //Σ//, //δ//, //q//₀, //F//) na MDKA (//Q//′, //Σ//, //δ//′, // | ||
+ | - Převedeme na DKA bez nedostupných stavů | ||
+ | - Určíme relaci nerozlišitelnosti stavů (≡// | ||
+ | - //i// = 0 | ||
+ | - ≡⁰ = {(//p//, //q//) | //p// ∈ //F// <=> //q// ∈ //F//} (tj. na začátku rozlišujeme pouze dvě třídy -- koncové a nekoncová stavy) | ||
+ | - '' | ||
+ | - ≡// | ||
+ | - //i//++ | ||
+ | - '' | ||
+ | - Sestavíme nový automat jako: | ||
+ | * //Q//′ = //Q// \ ≡//ⁱ// (tj. nové stavy odpovídají třídám ekvivalence původních stavů podle relace nerozlišitelnosti) | ||
+ | * ∀ //p//, //q// ∈ //Q// ∀ //a// ∈ //Σ//: // | ||
+ | * //q//₀′ = [//q//₀] (tj. počáteční stav je ta třída ekvivalence, | ||
+ | * //F//′ = {[//q//] | //q// ∈ //F//} (tj. koncové stavy jsou ty třídy ekvivalence, | ||
+ | ===== Převod NKA na DKA ====== | ||
+ | Převod NKA (//Q//, //Σ//, //δ//, //q//₀, //F//) na DKA (//Q//′, //Σ//, //δ//′, // | ||
+ | - //Q//′ = (2< | ||
+ | - Pro všechna //S// ∈ 2< | ||
+ | * // | ||
+ | * Je-li // | ||
+ | * 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ý. | ||
+ | - //F//′ = {//S//, //S// ∈ 2< | ||
+ | |||
+ | ==== Alternativní přístup ==== | ||
+ | Využíváme skutečnost, | ||
+ | - Stavy DKA vznikají jako množiny stavů NKA | ||
+ | - Určíme počáteční stav DKA jako //q//₀ a přidáme si ho na seznam nezpracovaných stavů | ||
+ | - 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 | ||
+ | - Pokud jsou nějaké nezpracovaná stavy jdeme zpět ke 3 | ||
+ | - Za koncové stavy DKA považujeme všechny stavy jejichž množina obsahuje alespoň jeden koncový stav z NKA | ||
+ | ==== Převod rozšířeného KA na DKA ==== | ||
+ | Převod RKA na DKA je stejný jako převod NKA na DKA, akorát ve 2. kroku sa jako // | ||
+ | ===== Konstrukce NKA k pravé regulární gramatice ===== | ||
+ | Gramatika //G// = (//N//, //Σ//, //P//, //S//) na NKA (//Q//, //Σ//, //δ//, //q//₀, //F//) | ||
+ | - //Q// = //N// ∪ {// | ||
+ | - //Σ// = //Σ// (tj. vstupní abeceda a množina terminálů jsou stejné) | ||
+ | - //q//₀ = //S// (tj. počátační stav odpovídá počátečnímu nonterminálu gramatiky) | ||
+ | - Je-li //S// → //ε// pravodlo z //P// pak //F// = {//S//, // | ||
+ | - Funkci přechodů definujeme: | ||
+ | * Je-li //A// -> //aB// pravidlo z //P//, pak // | ||
+ | * Je-li //A// -> //a// pravidlo z //P//, pak // | ||
+ | ===== Konstrukce NKA k levé regulární gramatice ===== | ||
+ | Gramatika //G// = (//N//, //Σ//, //P//, //S//) na NKA (//Q//, //Σ//, //δ//, //q//₀, //F//) | ||
+ | - //Q// = //N// ∪ {//q//₀} (stavy NKA odpovídají nonterminálům gramatiky s přidaným //q//₀) | ||
+ | - //Σ// = //Σ// (tj. vstupní abeceda a množina terminálů jsou stejné) | ||
+ | - //q//₀ = //S// (tj. počátační stav odpovídá počátečnímu nonterminálu gramatiky) | ||
+ | - Je-li //S// → //ε// pravodlo z //P// pak //F// = {//S//, //q//₀} jinak //F// = {//S//} (tj. koncové stavy jsou //S// a v případě, že v gramtice je i prázdný řetezec tak i //q//₀) | ||
+ | - Funkci přechodů definujeme: | ||
+ | * Je-li //A// -> //Ba// pravidlo z //P//, pak // | ||
+ | * Je-li //A// -> //a// pravidlo z //P//, pak // |