@@ -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\ge0$.
\:$\cc{P}$ je sjednocení tříd $\cc{TIME}(n^k)$ přes všechna $k\ge0$.
\:$\cc{NP}$ je sjednocení tříd $\cc{NTIME}(n^k)$ přes všechna $k\ge0$.
\:$\cc{NP}$ je sjednocení tříd $\cc{NTIME}(n^k)$ přes všechna $k\ge0$.
\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$.