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

TFA: Korektury

parent 7d9f5b72
No related branches found
No related tags found
No related merge requests found
...@@ -901,36 +901,51 @@ narazili jsme na \em{obousměrný konečný automat} neboli TFA \em{(two-way fin ...@@ -901,36 +901,51 @@ narazili jsme na \em{obousměrný konečný automat} neboli TFA \em{(two-way fin
Nebyl by to výstižnější model výpočtů v~konstantním prostoru než konečný automat? Nebyl by to výstižnější model výpočtů v~konstantním prostoru než konečný automat?
Nyní dokážeme, že to vyjde nastejno -- každý jazyk přijímaný obousměrným automatem je regulární. Nyní dokážeme, že to vyjde nastejno -- každý jazyk přijímaný obousměrným automatem je regulární.
Připomeňme definici: TFA je Turingův stroj, který dostane vstup $\|<|\alpha\|>|$ \theorem{Obousměrné konečné automaty přijímají právě regulární jazyky.}
\proof
Připomeňme definici TFA: je to 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. Aby byl TFA podobnější konečným automatům,
výpočet začíná s~hlavou na prvním znaku slova~$\alpha$. To je ale detail: TFA můžeme snadno upravit, 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 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. hlavou doprava a přejdeme do původního počátečního stavu.
Uvažme TFA rozpoznávající nějaký jazyk~$L$. Každý regulární jazyk je určitě přijímán nějakým TFA, který vznikne přímočarým
Nechť $\alpha$ značí vstup automatu a $n$ jeho délku. překladem příslušného DFA. Opačná implikace je méně triviální.
Dodefinujme $\alpha[-1] = \|<|$ a $\alpha[n] = \|>|$. 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] = \|>|$.
Představme si, že jsme někde uvnitř výpočtu, hlava stojí na $i$-tém políčku slova~$\alpha$, Potřebujeme se nějak vyrovnat s~tím, že automat se může během výpočtu na jedno
stroj se právě přepíná ze stavu~$s$ do~$s'$ a chystá se odejít doprava do nějakého suffixu $\alpha[i+1:{}]$. políčko vracet opakovaně. Představme si, že se díváme dovnitř výpočtu, hlava zrovna stojí
na $i$-tém políčku slova~$\alpha$, stroj se právě přepíná ze stavu~$s$ do~$s'$ a chystá se
odejít doprava do nějakého suffixu $\alpha[i+1:{}]$.
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, 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). přičemž nic kromě stavu stroje se nezměnilo (na pásku nemůžeme zapisovat).
Nebo se předtím stroj stihl zastavit a přijmout/odmítnout. Nebo se předtím stroj stihl zastavit a přijmout/odmítnout.
Případně se stroj zacyklil v~nekonečné smyčce, což rovněž odpovídá odmítnutí vstupu. Případně se stroj zacyklil v~nekonečné smyčce, což rovněž odpovídá odmítnutí vstupu.
Formálně můžeme chování stroje na suffixu vstupu $\alpha[i:{}]$ popsat nějakou funkcí~$f_i(s)$, Z~této úvahy plyne, že kdybychom znali chování stroje na suffixu $\alpha[i+1:{}]$
která počátečnímu stavu~$s\in Q\setminus\{q_+, q_-\}$ přiřadí stav~$s'\in Q$, v~němž stroj odchází (jakému vstupnímu stavu odpovídá jaký výstupní), mohli bychom pomocí něj určit,
ze suffixu doleva. Pokud je $s=q_+$, stroj se místo odejití doleva zastavil a přijal. co bude stroj dělat na políčku~$\alpha[i]$, aniž bychom se dívali na následující
Pokud $s=q_-$, stroj odmítl zastavením nebo zacyklením se. znaky. Z~toho bychom mohli určit chování na suffixu $\alpha[i:{}]$ a tak dále.
Zkusme to provést.
Chování stroje na suffixu vstupu $\alpha[i:{}]$ popíšeme nějakou funkcí~$f_i(s)$.
Ta dostane počáteční stav~$s\in Q\setminus\{q_+, q_-\}$, v~němž stroj vstoupí
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.
Pokud $s'=q_-$, stroj odmítl zastavením nebo zacyklením se.
Ukážeme, jak sestrojit funkci~$f_i$, pokud už známe~$f_{i+1}$. Ukážeme, jak sestrojit funkci~$f_i$, pokud už známe~$f_{i+1}$.
Chceme-li stanovit $f(s)$, budeme konstruovat posloupnost stavů $s_0$, $s_1$, $s_2$, \dots. Chceme-li stanovit $f(s)$, budeme konstruovat posloupnost stavů $s_0$, $s_1$, $s_2$, \dots{}
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$.
Nechť známe~$s_j$. Podíváme se, co stroj provede, přečte-li ve stavu~$s_j$ znak~$\alpha[i]$. 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]$.
Vyhodnotíme tedy přechodovou funkci $\delta(s_j, \alpha[i])$, čímž získáme instrukci, která Vyhodnotíme tedy přechodovou funkci $\delta(s_j, \alpha[i])$, čímž získáme instrukci, která
přechází do 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í doleva, položíme $f_i(s) = s'_j$ a jsme hotovi.
...@@ -945,7 +960,7 @@ stav roven $q_+$, $q_-$, případně některému z~předchozích stavů v~poslou ...@@ -945,7 +960,7 @@ stav roven $q_+$, $q_-$, případně některému z~předchozích stavů v~poslou
Všimněte si, že funkce~$f_i$ je jednoznačně určena funkcí~$f_{i+1}$ a znakem $\alpha[i]$. Všimněte si, že funkce~$f_i$ je jednoznačně určena funkcí~$f_{i+1}$ a znakem $\alpha[i]$.
To nám dává návod na sestrojení konečného automatu, který bude procházet vstupem zprava doleva To nám dává návod na sestrojení konečného automatu, který bude procházet vstupem zprava doleva
a postupně přepočítávat funkci~$f_i$. Stavy automaty 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. takže jich je konečně mnoho.
Zbývá dořešit, jak automat začne a jak skončí. Zbývá dořešit, jak automat začne a jak skončí.
...@@ -956,8 +971,12 @@ pohybovat doprava. Funkce~$f_n$ je tedy nezávislá na vstupu, takže může pos ...@@ -956,8 +971,12 @@ pohybovat doprava. Funkce~$f_n$ je tedy nezávislá na vstupu, takže může pos
počáteční stav automatu. počáteční stav automatu.
Až automat přečte levou zarážku~$\|<|$, bude jeho stav roven funkci~$f_{-1}$. Až automat přečte levou zarážku~$\|<|$, bude jeho stav roven funkci~$f_{-1}$.
Nyní do této funkce dosadíme počáteční stav~$q_0$ původního TFA. Ta popisuje chování na celém vstupu. Takže do ní chceme dosadit počáteční stav~$q_0$
Je-li $f_{-1}(q_0)$ rovno~$q_+$, vstup přijmeme, jinak odmítneme. původního TFA.
Je-li $f_{-1}(q_0)$ rovno~$q_+$, vstup přijmeme.
Pokud je rovno~$q_-$, tak odmítneme.
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$, Tím jsme sestrojili automat dosvědčující regularitu. Ovšem ne původního jazyka~$L$,
nýbrž jazyka $L' = L\rev\cdot\{\|<|\}$, v~němž jsou slova pozpátku a ukončená zarážkou. nýbrž jazyka $L' = L\rev\cdot\{\|<|\}$, v~němž jsou slova pozpátku a ukončená zarážkou.
...@@ -966,7 +985,9 @@ Teď si stačí uvědomit, že z~regularity~$L'$ plyne regularita~$L\rev$ a z~n ...@@ -966,7 +985,9 @@ Teď si stačí uvědomit, že z~regularity~$L'$ plyne regularita~$L\rev$ a z~n
Regularitu $L\rev$ můžeme zdůvodnit cvičením \exref{quotex}, protože $L\rev$ je kvocient $L' / \{\|<|\}$. Regularitu $L\rev$ můžeme zdůvodnit cvičením \exref{quotex}, protože $L\rev$ 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řed znak~$\|<|$ do některého z~původních koncových stavů.
Regularitu~$L$ dostaneme z~uzavřenosti regulárních výrazů na otočení (cvičení \exref{regrev}). Regularitu~$L$ dostaneme z~uzavřenosti regulárních jazyků na otočení (cvičení \exref{regrev}).
\qed
\exercises \exercises
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment