Skip to content
Snippets Groups Projects
Commit 66c3580d authored by Martin Mareš's avatar Martin Mareš
Browse files

Merge branch 'master' of gitlab.kam.mff.cuni.cz:mj/automaty

parents e7a690ac c2a5df0e
No related branches found
No related tags found
No related merge requests found
...@@ -250,6 +250,30 @@ jak automatem~$A_1$, tak~$A_2$. Proto $L(A) = L(A_1) \cap L(A_2)$. ...@@ -250,6 +250,30 @@ jak automatem~$A_1$, tak~$A_2$. Proto $L(A) = L(A_1) \cap L(A_2)$.
Průnik dvou regulárních jazyků je zase regulární jazyk. Průnik dvou regulárních jazyků je zase regulární jazyk.
} }
\subsectionstar{Automaty s~výstupem}
Automat může místo rozpoznávání jazyka produkovat výstup.
To můžeme definovat například následovně:
\defn{\em{Mooreův stroj}
je uspořádaná pětice $(Q,\Sigma,\Delta,\delta,q_0,G)$, kde:
\list{o}
\:$Q$ je konečná neprázdná \em{množina stavů,}
\:$\Sigma$ je konečná neprázdná \em{vstupní abeceda,}
\:$\Delta$ je konečná neprázdná \em{výstupní abeceda,}
\:$\delta: Q\times \Sigma \rightarrow Q$ je \em{přechodová funkce,}
\:$q_0\in Q$ je \em{počáteční stav,}
\:$G: Q\rightarrow \Delta$ je \em{výstupní funkce.}
\endlist
}
\defn{
Výpočet stroje nad vstupem $\alpha\in\Sigma^*$ délky~$n$ definujeme opět jako
posloupnost stavů $s_0,s_1,\ldots,s_n$, kde $s_i = \delta^*(q_0,\alpha[{}:i]$).
\em{Výstup stroje} je pak řetězec $G(s_1)\ldots G(s_n)$.
Stroj tedy počítá nějakou funkci ze~$\Sigma^n$ do~$\Delta^n$.
}
\exercises \exercises
\excmt{ \excmt{
...@@ -314,6 +338,23 @@ kde~$S$ je počet stavů KMP.} ...@@ -314,6 +338,23 @@ kde~$S$ je počet stavů KMP.}
\ex{Dokažte, že iterační lemma není ekvivalence: najděte neregulární jazyk~$L$, \ex{Dokažte, že iterační lemma není ekvivalence: najděte neregulární jazyk~$L$,
který \uv{jde pumpovat}.} který \uv{jde pumpovat}.}
\exx{Sestrojte Mooreův stroj na sčítání binárních čísel $x_n\ldots x_0$
a $y_n\ldots y_0$. Stroj na vstupu dostane posloupnost dvojic bitů $(x_0,y_0)
\ldots (x_n,y_n)$ od nejnižšího řádu k~nejvyššímu, na výstupu vydá bity součtu
v~tomtéž pořadí.}
\exx{Jiný způsob, jak automatem produkovat výstup, dává \em{Mealyho stroj.}
Ten tvoří výstup přechodovou funkcí $\delta: Q\times\Sigma \rightarrow Q\times\Delta$,
která každé dvojici stavu a znaku se vstupu přiřadí nový stav a znak k~vypsání
na výstup. Ukažte, že Mealyho stroje umí počítat tytéž funkce jako Mooreovy stroje.
}
\exx{Podobně jako u~\cc{NP}-úplnosti můžeme i zde jazyky porovnávat vhodnými redukcemi.
Jazyk $K$ se dá regulárně převést na jazyk~$L$ ($K\rightarrow_R L$), pokud existuje funkce~$f$ spočítatelná
Mooreovým strojem taková, že platí $\alpha\in K$ právě tehdy, když $f(\alpha)\in L$.
Dokažte, že pokud $K\rightarrow_R L$ a $L$ je regulární, pak $K$ je regulární.
}
\endexercises \endexercises
\section{Nedeterministické automaty} \section{Nedeterministické automaty}
...@@ -1024,6 +1065,9 @@ Algoritmus tedy doběhne v~čase $\Theta(S^2A)$. ...@@ -1024,6 +1065,9 @@ Algoritmus tedy doběhne v~čase $\Theta(S^2A)$.
\ex{Funguje myšlenka ekvivalence stavů a faktorizace automatu i pro nedeterministické automaty?} \ex{Funguje myšlenka ekvivalence stavů a faktorizace automatu i pro nedeterministické automaty?}
\exx{Rozšiřte ekvivalenci stavů a faktorizaci automatů na automaty s~výstupem
(Mooreovy stroje).}
\endexercises \endexercises
\sectionstar{Kanonické automaty} \sectionstar{Kanonické automaty}
......
...@@ -176,9 +176,12 @@ Na rozdíl od konečných automatů mohou být různé TM pro tentýž vstup roz ...@@ -176,9 +176,12 @@ Na rozdíl od konečných automatů mohou být různé TM pro tentýž vstup roz
\em{Prostor výpočtu} je počet políček pásky, která během výpočtu navštívila hlava stroje. \em{Prostor výpočtu} je počet políček pásky, která během výpočtu navštívila hlava stroje.
} }
\defn{\em{Časová složitost} stroje je funkce, která každé délce vstupu~$n$ přiřadí \defn{\em{Časová složitost} stroje je funkce, která každému přirozenému čísl~$u$
maximální čas výpočtu pro vstupy z~$\Sigma^n$. Podobně prostorová složitost přiřadí maximální čas výpočtu pro vstupy délky nejvýše~$n$.\foot{Často se složitost
přiřadí délce vstupu maximální prostor výpočtu. Pokud se některý výpočet definuje přes vstupy délky \em{právě~$n$.} Naše definice má tu výhodu, že vždy dává
neklesající funkce, se kterými se zachází snáz.}
Podobně prostorová složitost přiřadí délce vstupu maximální prostor výpočtu.
Pokud se některý výpočet
nezastaví, časová složitost bude nekonečná a prostorová možná také.} nezastaví, časová složitost bude nekonečná a prostorová možná také.}
\examplen{proměnné ve stavu}{Často se hodí, aby si stroj pamatoval několik \examplen{proměnné ve stavu}{Často se hodí, aby si stroj pamatoval několik
...@@ -867,10 +870,11 @@ Turingova stroje, který je rozhoduje: ...@@ -867,10 +870,11 @@ Turingova stroje, který je rozhoduje:
\defn{Nechť $f$ je funkce z~$\N$ do~$\N$. Potom: \defn{Nechť $f$ je funkce z~$\N$ do~$\N$. Potom:
\list{o} \list{o}
\:$L\in\cc{TIME}(f)$ právě tehdy, když je rozhodován Turingovým strojem, který se pro \:$L\in\cc{TIME}(f)$ právě tehdy, když je rozhodován Turingovým strojem, který se pro
vstup délky~$n$ zastaví za $\O(f(n))$ kroků. vstup délky nejvýše~$n$ zastaví za $\O(f(n))$ kroků.
\:$L\in\cc{SPACE}(f)$ právě tehdy, když je rozhodován Turingovým strojem, který pro \:$L\in\cc{SPACE}(f)$ právě tehdy, když je rozhodován Turingovým strojem, který pro
vstup délky~$n$ spotřebuje prostor $\O(f(n))$. vstup délky nejvýše~$n$ spotřebuje prostor $\O(f(n))$.
\:$\cc{NTIME}(f)$ a $\cc{NSPACE}(f)$ jsou definovány analogicky přes nedeterministické stroje. \:$\cc{NTIME}(f)$ a $\cc{NSPACE}(f)$ jsou definovány analogicky přes nedeterministické stroje.\foot{Někdy se používá \cc{DTIME} a \cc{DSPACE} místo \cc{TIME} a \cc{SPACE},
abychom zdůraznili determinismus.}
\:$\cc{P}$ je sjednocení tříd $\cc{TIME}(n^k)$ přes všechna $k\ge 0$. \:$\cc{P}$ je sjednocení tříd $\cc{TIME}(n^k)$ přes všechna $k\ge 0$.
\:$\cc{NP}$ je sjednocení tříd $\cc{NTIME}(n^k)$ přes všechna $k\ge 0$. \:$\cc{NP}$ je sjednocení tříd $\cc{NTIME}(n^k)$ přes všechna $k\ge 0$.
\endlist \endlist
...@@ -904,89 +908,90 @@ Nyní dokážeme, že to vyjde nastejno -- každý jazyk přijímaný obousměrn ...@@ -904,89 +908,90 @@ Nyní dokážeme, že to vyjde nastejno -- každý jazyk přijímaný obousměrn
\theorem{Obousměrné konečné automaty přijímají právě regulární jazyky.} \theorem{Obousměrné konečné automaty přijímají právě regulární jazyky.}
\proof \proof
Připomeňme definici TFA: je to Turingův stroj, který dostane vstup $\|<|\alpha\|>|$ Připomeňme definici TFA: je to jednopáskový Turingův stroj, který dostane vstup $\|<|\alpha\|>|$
a nemá ho povoleno měnit. Navíc na levé zarážce~$\|<|$ nesmí vykonat pohyb doleva a nemá ho povoleno měnit. Navíc na levé zarážce~$\|<|$ nesmí vykonat pohyb doleva
a na pravé zarážce~$\|>|$ nesmí jít doprava. Aby byl TFA podobnější konečným automatům, a na pravé zarážce~$\|>|$ nesmí jít doprava.
výpočet začíná s~hlavou na prvním znaku slova~$\alpha$. To je ale detail: TFA můžeme snadno upravit,
aby výpočet začínal na~$\|<|$ -- stačí přidat nový počáteční stav, v~němž provedeme jeden pohyb
hlavou doprava a přejdeme do původního počátečního stavu.
Každý regulární jazyk je určitě přijímán nějakým TFA, který vznikne přímočarým Každý regulární jazyk je určitě přijímán nějakým TFA, který vznikne přímočarým
překladem příslušného DFA. Opačná implikace je méně triviální. překladem příslušného DFA. Opačná implikace je méně triviální.
Uvažme TFA rozpoznávající nějaký jazyk~$L$ a jeho výpočet nad nějakým vstupem~$\alpha$ Uvažme TFA rozpoznávající nějaký jazyk~$L$ a jeho výpočet nad nějakým vstupem~$\alpha$
délky~$n$. Do vstupu ještě doplníme zarážky $\alpha[-1] = \|<|$ a $\alpha[n] = \|>|$. délky~$n$. Do vstupu ještě doplníme zarážky $\alpha[-1] = \|<|$ a $\alpha[n] = \|>|$.
Potřebujeme se nějak vyrovnat s~tím, že automat se může během výpočtu na jedno Představme si výpočet obousměrného automatu, který právě navštívil znak~$\alpha[i]$.
políčko vracet opakovaně. Představme si, že se díváme dovnitř výpočtu, hlava zrovna stojí Pokud se automat pohne doprava, můžeme tento krok provést i~konečným automatem.
na $i$-tém políčku slova~$\alpha$, stroj se právě přepíná ze stavu~$s$ do~$s'$ a chystá se Pokud vyčkává na místě, jenom mění stavy, takže DFA může celou posloupnost změn provést
odejít doprava do nějakého suffixu $\alpha[i+1:{}]$. najednou.
Jak bude výpočet pokračovat? Jedna možnost je, že se stroj po čase vrátí zprava na $i$-té políčko v~nějakém novém stavu,
přičemž nic kromě stavu stroje se nezměnilo (na pásku nemůžeme zapisovat). Problém nastane, pokud se TFA pohybem doleva vrátí do prefixu $\alpha[{}:i]$,
Nebo se předtím stroj stihl zastavit a přijmout/odmítnout. který už jednou zpracoval. Uvnitř prefixu se může libovolně dlouho toulat, než nastane
Případně se stroj zacyklil v~nekonečné smyčce, což rovněž odpovídá odmítnutí vstupu. jedna ze tří možností: buď prefix opustí doprava v~nějakém novém stavu a~je opět
na znaku~$\alpha[i]$. Anebo se zastaví ve stavu $q_+$ či~$q_-$, případně se zacyklí
Z~této úvahy plyne, že kdybychom znali chování stroje na suffixu $\alpha[i+1:{}]$ (tím také odmítne vstup, takže je to ekvivalentní se zastavením v~$q_-$).
(jakému vstupnímu stavu odpovídá jaký výstupní), mohli bychom pomocí něj určit,
co bude stroj dělat na políčku~$\alpha[i]$, aniž bychom se dívali na následující Jelikož TFA nemůže měnit obsah pásky, můžeme jeho chování v~prefixu $\alpha[{}:i]$
znaky. Z~toho bychom mohli určit chování na suffixu $\alpha[i:{}]$ a tak dále. jednoznačně popsat nějakou funkcí $f_i: Q\setminus\{q_+, q_-\} \rightarrow Q$.
Zkusme to provést. Ta jako argument dostane stav~$s$, ve kterém stroj začíná na posledním znaku prefixu, tedy
$\alpha[i-1]$. Výsledkem funkce je stav~$s'$, v~němž stroj prefix opustí pohybem vpravo.
Chování stroje na suffixu vstupu $\alpha[i:{}]$ popíšeme nějakou funkcí~$f_i(s)$. Pokud je $s'=q_+$, stroj z~prefixu neodešel, nýbrž se zastavil a přijal.
Ta dostane počáteční stav~$s\in Q\setminus\{q_+, q_-\}$, v~němž stroj vstoupí Je-li $s'=q_-$, stroj odmítl zastavením nebo zacyklením se.
na $\alpha[i]$. Výsledkem funkce je koncový stav~$s'\in Q$, v~němž stroj odchází
ze suffixu doleva. Pokud je $s'=q_+$, stroj se místo odejití doleva zastavil a přijal. Budeme se snažit sestrojit DFA, který si bude ve stavu udržovat chování prefixu~$f_i$
Pokud $s'=q_-$, stroj odmítl zastavením nebo zacyklením se. nalevo od aktuální pozice.
Ukážeme, jak sestrojit funkci~$f_i$, pokud už známe~$f_{i+1}$. Začněme tou nejzajímavější částí: konstrukcí~$f_{i+1}$ z~$f_i$.
Chceme-li stanovit $f(s)$, budeme konstruovat posloupnost stavů $s_0$, $s_1$, $s_2$, \dots{} Nechť chceme spočítat $f_{i+1}(s)$. TFA tedy stojí na políčku $\alpha[i]$ ve stavu~$s$.
Jelikož se na toto políčko může vracet, budeme konstruovat posloupnost stavů $s_0$, $s_1$, $s_2$, \dots{}
při jednotlivých návštěvách políčka $\alpha[i]$. při jednotlivých návštěvách políčka $\alpha[i]$.
Na počátku položíme $s_0=s$. Na počátku položíme $s_0=s$.
Nyní budeme z~libovolného~$s_j$ počítat $s_{j+1}$. Nyní budeme z~libovolného~$s_j$ počítat $s_{j+1}$.
Podíváme se, co stroj provede, přečte-li ve stavu~$s_j$ znak~$\alpha[i]$. Podíváme se, co stroj provede, přečte-li ve stavu~$s_j$ znak~$\alpha[i]$.
Vyhodnotíme tedy přechodovou funkci $\delta(s_j, \alpha[i])$, čímž získáme instrukci, která Vyhodnocením přechodové funkce $\delta(s_j, \alpha[i])$ získáme instrukci, která
přechází do nějakého stavu~$s'_j$, zapisuje nezměněný znak~$\alpha[i]$ a možná pohybuje hlavou: přechází do nějakého stavu~$s'_j$, zapisuje nezměněný znak~$\alpha[i]$ a možná pohybuje hlavou:
\list{o} \list{o}
\:Pokud hlava odchází doleva, položíme $f_i(s) = s'_j$ a jsme hotovi. \:Pokud hlava odchází doprava, položíme $f_{i+1}(s) = s'_j$ a jsme hotovi.
\:Pokud hlava zůstává na místě, položíme $s_{j+1} = s'_j$ a pokračujeme ve vytváření posloupnosti \:Pokud hlava zůstává na místě, položíme $s_{j+1} = s'_j$ a pokračujeme ve vytváření posloupnosti
s~několika výjimkami: Je-li $s'_j$ rovno $q_+$ nebo~$q_-$, položíme $f_i(s) = s'_j$ a skončíme. s~několika výjimkami: Je-li $s'_j$ rovno $q_+$ nebo~$q_-$, položíme $f_{i+1}(s) = s'_j$ a skončíme.
Je-li $s'_j$ rovno některému z~předešlých~$s_k$ pro $k\le j$, stroj se zacyklil, takže položíme Je-li $s'_j$ rovno některému z~předešlých~$s_k$ pro $k\le j$, stroj se zacyklil, takže položíme
$f_i(s) = q_-$ a skončíme. $f_{i+1}(s) = q_-$ a skončíme.
\:Pokud hlava odchází doprava, využijeme známou funkci $f_{i+1}$ popisující chování na suffixu \:Pokud hlava odchází doleva, využijeme známou funkci $f_i$ popisující chování na prefixu
$\alpha[i+1:{}]$, takže položíme $s_{j+1} = f_{i+1}(s'_j)$. Opět ošetříme případy, kdy je tento $\alpha[{}:i-1]$. Stačí položit $s_{j+1} = f_i(s'_j)$. Opět ošetříme případy, kdy je tento
stav roven $q_+$, $q_-$, případně některému z~předchozích stavů v~posloupnosti. stav roven $q_+$, $q_-$, případně některému z~předchozích stavů v~posloupnosti.
\endlist \endlist
Všimněte si, že funkce~$f_i$ je jednoznačně určena funkcí~$f_{i+1}$ a znakem $\alpha[i]$. Všimněme si, že funkce~$f_{i+1}$ je jednoznačně určena funkcí~$f_i$ a znakem $\alpha[i]$.
To nám dává návod na sestrojení konečného automatu, který bude procházet vstupem zprava doleva Můžeme tedy sestrojit konečný automat, který bude procházet vstupem zleva doprava
a postupně přepočítávat funkci~$f_i$. Stavy automatu odpovídají všem funkcím z~$Q\setminus\{q_+,q_-\}$ do~$Q$, a postupně přepočítávat funkci~$f_i$. Stavy automatu odpovídají všem funkcím z~$Q\setminus\{q_+,q_-\}$ do~$Q$
takže jich je konečně mnoho. a~těch je konečně mnoho. Přechody jsou dány konstrukcí~$f_{i+1}$ z~$f_i$.
Po zpracování znaku $\alpha[i]$ se tedy automat nachází ve stavu~$f_{i+1}$.
Zbývá dořešit, jak automat začne a jak skončí. Ještě je potřeba domyslet, jak automat začne.
Zkusme použít naši konstrukci pro funkci~$f_0$ -- chování TFA na prázdném prefixu.
Hlava TFA tedy stojí na levé zarážce~$\|<|$, odkud se nesmí pohnout doleva.
Konstrukce se proto nikdy nezeptá na neexistující~$f_{-1}$.
Funkce~$f_0$ je tudíž nezávislá na vstupu a může posloužit jako počáteční stav automatu.
Použijeme-li naši konstrukci pro funkci~$f_n$, tedy chování výpočtu na pravé zarážce~\|>|, Máme tedy automat, který po přečtení vstupu $\alpha\|>|$ zná funkci~$f_{n+1}$ --
nikdy se nezeptá na neexistující~$f_{n+1}$. To proto, že stroj se na pravé zarážce nemůže chování na celém vstupu, stojíme-li na pravé zarážce~$\|>|$.
pohybovat doprava. Funkce~$f_n$ je tedy nezávislá na vstupu, takže může posloužit jako
počáteční stav automatu.
Až automat přečte levou zarážku~$\|<|$, bude jeho stav roven funkci~$f_{-1}$. Teď se nabízí do této funkce dosadit počáteční stav TFA~$q_0$, a~tím zjistit,
Ta popisuje chování na celém vstupu. Takže do ní chceme dosadit počáteční stav~$q_0$ jaký výsledek TFA vydá. To ale nemůžeme provést: hlava TFA začíná na levém
původního TFA. okraji vstupu, nikoliv na~$\|>|$. Pomoc je naštěstí snadná: TFA upravíme, aby
Je-li $f_{-1}(q_0)$ rovno~$q_+$, vstup přijmeme. začínal na~$\|>|$ v~nějakém novém stavu~$q'_0$. V~něm půjde doleva, dokud nenarazí
Pokud je rovno~$q_-$, tak odmítneme. na~$\|<|$, načež udělá krok doprava a přepne se do původního počátečního stavu~$q_0$.
Nic jiného nemůže funkce vrátit, protože by to znamenalo, že automat z~\|<| odešel doleva, a~to nesmí.
Přijímací stavy tedy odpovídají těm funkcím~$f$, pro něž je $f(q_0)=q_+$.
Tím jsme sestrojili automat dosvědčující regularitu. Ovšem ne původního jazyka~$L$, Je-li tedy $f_{n+1}(q'_0)$ rovno~$q_+$, TFA vstup přijal, takže DFA přijme také.
nýbrž jazyka $L' = L\rev\cdot\{\|<|\}$, v~němž jsou slova pozpátku a ukončená zarážkou. Podobně je-li rovno~$q_-$, tak odmítne.
Nic jiného nemůže funkce vrátit, protože by to znamenalo, že automat z~\|>| odešel doprava, a~to nesmí.
Přijímací stavy tedy odpovídají těm funkcím~$f$, pro něž je $f(q'_0)=q_+$.
Teď si stačí uvědomit, že z~regularity~$L'$ plyne regularita~$L\rev$ a z~ní zase regularita~$L$. Tím jsme sestrojili automat dosvědčující regularitu. Ovšem ne původního jazyka~$L$,
Regularitu $L\rev$ můžeme zdůvodnit cvičením \exref{quotex}, protože $L\rev$ je kvocient $L' / \{\|<|\}$. nýbrž jazyka $L' = L\cdot\{\|>|\}$, v~němž jsou slova ukončená zarážkou.
Uvědomíme si, že z~regularity~$L'$ plyne regularita~$L$.
To můžeme zdůvodnit cvičením \exref{quotex}, protože $L$ je kvocient $L' / \{\|>|\}$.
Nebo to lze provést přímo úpravou koncových stavů: za koncové prohlásíme ty stavy, z~nichž vede přechod Nebo to lze provést přímo úpravou koncových stavů: za koncové prohlásíme ty stavy, z~nichž vede přechod
před znak~$\|<|$ do některého z~původních koncových stavů. přes znak~$\|>|$ do některého z~původních koncových stavů.
Regularitu~$L$ dostaneme z~uzavřenosti regulárních jazyků na otočení (cvičení \exref{regrev}).
\qed \qed
\exercises \exercises
...@@ -997,6 +1002,11 @@ jazykům rozpoznatelným TFA, tedy regulárním. Nezapomeňte na pracovní pásk ...@@ -997,6 +1002,11 @@ jazykům rozpoznatelným TFA, tedy regulárním. Nezapomeňte na pracovní pásk
\ex{Rozšiřte definici TFA o~nedeterminismus. Dokažte, že nedeterministické TFA také rozpoznávají \ex{Rozšiřte definici TFA o~nedeterminismus. Dokažte, že nedeterministické TFA také rozpoznávají
pouze regulární jazyky. Z~toho plyne, že $\cc{NSPACE}(c) = \cc{SPACE}(c) = \Ell_3$.} pouze regulární jazyky. Z~toho plyne, že $\cc{NSPACE}(c) = \cc{SPACE}(c) = \Ell_3$.}
\ex{Pokud jednopáskovému Turingovu stroji omezíme pracovní prostor zarážkami kolem
vstupu, ale nezakážeme mu vstup přepisovat, získáme tzv. \em{lineárně omezený automat.}
Dokažte, že jazyky rozpoznávané lineárně omezenými automaty tvoří třídu
$\cc{SPACE}(n)$. Nezapomeňte na $\O$ v~definici složitostních tříd.}
\endexercises \endexercises
\endchapter \endchapter
Regulární: Regulární:
- Automaty s výstupem -> cvičení
... pak by se dala definovat regulární redukce mezi jazyky
- obrázek ke kongruencím: automat, automatová kongruence, syntaktická kongruence - obrázek ke kongruencím: automat, automatová kongruence, syntaktická kongruence
- cvičení na redukci automatů - cvičení na redukci automatů
...@@ -9,9 +7,7 @@ Bezkontextové: ...@@ -9,9 +7,7 @@ Bezkontextové:
Rekurzivní: Rekurzivní:
- TIME se také někdy značí DTIME - nerozhodnutelnost generování všech slov pomocí CFG (cvičení?)
- uvážit definici složitosti pro vstupy délky _nejvýše_ n
- cvičení na kompresi pásky => SPACE(n) je totéž jako in-place stroj
Rozšíření: Rozšíření:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment