Tyto zápisky jsou z přednášek Ing. Petra Ambrože, Ph.D.
Příklad Mějme Turingův stroj na rozeznávání jazykakterý jsme si sestrojili na JAU. Fungování tohoto stroje sestává z kroků:
Čti vstup a zamítni, pokud najdeš nulu napravo od jedničky (neboli zkontroluj, zda vstup odpovídá regulárnímu výrazu ).
Dokud jsou na pásce nuly a jedničky, škrtni jednu nulu a jednu jedničku.
Zkontroluj, jestli na pásce nic nezůstalo.
Zajímalo by nás, jak dlouho stroj poběží v závislosti na délce vstupu.Definice Nechť je jednopáskový totální deterministický Turingův stroj. Potom časová složitost je funkce , která číslu přiřadí maximální počet kroků výpočtu přes všechny možné vstupy délky . Říkáme, že počítá v čase .Definice Nechť . Řekneme, že je třídy , pokud existují konstanty takové, že pro každé je , nebo ekvivalentněPíšeme , což je trochu nekorektní zápis.Definice Nechť . Řekneme, že je třídy , pokudPíšeme .Příklad Časová složitost našeho Turingova stroje je , protože při druhém kroku musí -krát přeběhnout tam a zpátky.Příklad K rozeznání jazyka můžeme použít i jiný algoritmus:
Čti vstup a zamítni, pokud najdeš nulu napravo od jedničky.
Dokud jsou na pásce nuly a jedničky, zkontroluj, jestli mají stejnou paritu, následně smaž každou druhou nulu a každou druhou jedničku.
Zkontroluj, jestli na pásce nic nezůstalo.
Tento algoritmus má složitost .Definice Nechť . Potom je třída všech jazyků, které jsou rozhodnutelné na jednopáskovém deterministickém Turingově stroji v čase .LemmaKobayashi, Hennie Nechť je třídy . Potom .Příklad Omezení na jednopáskové stroje je důležité. Pokud povolíme dvě pásky, dokážeme sestrojit pro náš jazyk algoritmus.
Čti vstup a zamítni, pokud najdeš nulu napravo od jedničky.
Překopíruj všechny nuly z první pásky na druhou pásku.
Postupně škrtej jedničky z první pásky a nuly z druhé pásky.
Zkontroluj, jestli na páskách nezůstalo.
Věta Nechť je funkce taková, že . Potom pro každý vícepáskový Turingův stroj se složitostí existuje jednopáskový Turingův stroj se složitostí .Důkaz Velmi neformálně: Budeme simulovat vícepáskový Turingův stroj pomocí jednopáskového. TBDDefinice Nechť je totální nedeterministický Turingův stroj. Potom jeho časová složitost je funkce , která číslu přiřadí maximální počet kroků v libovolné větvi přes všechny vstupy délky .Věta Nechť je funkce s . Potom pro každý jednopáskový nedeterministický Turingův stroj s časovou složitostí existuje ekvivalentní jednopáskový deterministický Turingův stroj s časovou složitostí .Definice Třída je třída všech jazyků, které jsou na jednopáskovém deterministickém Turingově stroji rozhodnutelné v polynomiálním čase. Jinými slovy:Poznámka U třídy na rozdíl od tříd nezáleží na tom, který model deterministického Turingova stroje používáme.Poznámka V praxi třída celkem dobře odpovídá třídě problémů, které jdou v rozumném čase řešit na počítači.Příklad Mějme problém, jestli v orientovaném grafu existuje cesta mezi vrcholy . Budeme-li analogicky jako v JAU používat špičaté závorky pro nějaké zakódování dat, můžeme formálně uvažovat rozeznávání jazykaTento jazyk je třídy , protože můžeme použít například prohledávání do šířky.Příklad Mějme problém, jestli je dané slovo rozeznávané danou bezkontextovou gramatikou. Gramatiku nejdřív převedeme do Chomského normální formy. Poté můžeme použít dynamický algoritmus, který pro každý podřetězec najde, ze kterých nonterminálů jde vygenerovat. Tento algoritmus bude mít složitost , takže problém je v .Definice Turingův stroj je verifikační algoritmus pro jazyk , pokud je množina všech slov takových, že přijme pro nějaké . Slovu říkáme certifikát.Definice Třída je třída všech jazyků, pro které existuje verifikační algoritmus s polynomiální časovou složitostí.Příklad Problém hledání hamiltonovské cesty v grafu je třídy , protože pokud dostaneme graf a cestu (ta bude náš certifikát), můžeme v polynomiálním čase zjistit, jestli se jedná o hamiltonovskou cestu.Věta Jazyk je třídy , právě když je přijímaný v polynomiálním čase na nedeterministickém Turingově stroji.Poznámka Název je motivovaný právě touto ekvivalentní definicí.Důkaz
(⇒)
Nechť existuje verifikační algoritmus s polynomiální složitostí . Vezmeme nedeterministický Turingův stroj, který nedeterministicky vybere certifikát délky nanejvýš a pustí původní Turingův stroj s tímto certifikátem.
(⇐)
Nechť existuje nedeterministický řešící algoritmus. Vezmeme deterministický Turingův stroj, který dostane slovo a certifikát , přičemž po certifikátu budeme požadovat, aby nám říkal, jak se v průběhu výpočtu máme nedeterministicky rozhodovat.
Definice Nechť . Potom je třída všech jazyků, které jsou rozhodnutelné na nedeterministickém Turingově stroji v čase .PoznámkaDefinice Jazyk patří do třídy , pokud patří do třídy .Poznámka Zjevně platí . Ale jinak o třídě skoro nic nevíme, například jestli se rovná nebo jestli .Definice Definujeme třídu složitostiPoznámka Platí .Definice Funkce je polynomiálně vyčíslitelná, pokud je turingovsky vyčíslitelná Turingovým strojem s polynomiální časovou složitostí.Definice Jazyk je polynomiálně redukovatelný na jazyk , pokud existuje polynomiálně vyčíslitelná funkce taková, že . Značíme .Poznámka Pokud a , potom .Definice Jazyk je -těžký, pokud je na něj každý jazyk z polynomiálně redukovatelný. Jazyk je -úplný (třídy ), pokud je třídy a zároveň -těžký.Důsledek Je-li jazyk , potom .Příklad Příkladem -úplného problému je problém booleovské splnitelnosti (SAT): máme danou výrokovou formuli a chceme zjistit, jestli je splnitelná, tedy jestli existuje nastavení logických proměnných, pro které je složený výrok pravdivý. Snadno dokážeme, že problém patří do – stačí vzít jako certifikát hodnoty proměnných, pro které je formule splněna. Zbývá dokázat, že je -těžký. K tomu si nejdřív zavedeme několik pojmů.Definice Literál je booleovská proměnná nebo její negace. Klauzule je několik literálů spojených disjunkcemi. Booleovská formule je v konjunktivní normální formě (CNF), pokud je to několik klauzulí spojených konjunkcemi. Speciálně pokud každá klauzule má právě tři literály, jde o 3-konjunktivní normální formu. Problém 3SAT je SAT omezený na formule v 3-konjunktivní normální formě.Věta Problém 3SAT je polynomiálně redukovatelný na problém CLIQUE – zjištění, jestli v grafu je klika dané velikosti.Důkaz Nechť daná formule je konjunkce klauzulí. Vyrobíme -partitní graf s vrcholy ohodnocenými příslušnými literály, kde propojíme všechny dvojice vrcholů, které jsou mezi různými klauzulemi a nejde o proměnnou a její negaci. Snadno nahlédneme, že tento graf obsahuje -kliku, právě když formule je splnitelná.Příklad Méjme formuliTé odpovídá následující graf:
Formule je splnitelná, zvolíme-li . To odpovídá například zeleně vyznačené klice v grafu.VětaCookova–Levinova, 1971 Problém SAT je -úplný.Důkaz Mějme nějaký jazyk přijímaný nedeterministickým Turingovým strojem v čase . Pro daný vstup délky uvažujeme tabulku velikosti . V prvním a posledním sloupci bude speciální symbol, který se nikde jinde nevyskytuje. Na -tém řádku (číslováno od nuly) bude zakódovaný stav automatu po provedení kroků (kde uvažujeme jednu konkrétní větev výpočtu). Tabulku nazveme akceptující, pokud nějaký její řádek odpovídá přijímající konfiguraci. Nyní podle tohoto schématu sestrojíme booleovskou formuli, která bude splněna, právě když existuje akceptující tabulka. Vytvoříme proměnné reprezentující, jestli v buňce s indexem je symbol . Formule se bude skládat ze čtyř kusů spojených konjunkcí :
První část zajistí, aby hodnota každé buňky byla jednoznačně určena:
Druhá část zajistí, že první řádek odpovídá počátečnímu stavu:
Třetí část zajistí, že automat se dostane do přijímajícího stavu:
Čtvrtá část zajistí, že každá dvojice sousedních řádků odpovídá přechodu . Její tvar sem nebudu explicitně vypisovat, protože je pochopitelně pěkně nechutný. Princip je takový, že okno (podtabulku) velikosti nazveme legální, pokud neodporuje tvaru přechodové funkce. Do formule potom dáme konjunkci přes všechna okna, že jsou legální.
Důsledek Dá-li se SAT polynomiálně redukovat na nějaký problém, potom tento problém je -těžký.Věta Problém 3SAT je -úplný.Důkaz Nejprve dokážeme, že SAT v konjunktivní normální formě se dá převést na 3SAT. Převedeme každou klauzuli v závislosti na dělce podle následujícího algoritmu (kde jsou čerstvé proměnné pro každou klauzuli):a tak dále. Zbývá tedy vyřešit, jak převést každou formuli do konjunktivní normální formy. Mohli bychom zkusit prostě všechno vyjádřit pomocí konjunkce a disjunkce a postupně aplikovat distributivní zákon. Problém je v tom, že by tím mohlo dojít k exponenciálnímu nárůstu. Například formuleby se tím změnila naExistuje algoritmus, který to umí převést s nejvýše polynomiálním nárůstem, ale ten si ukazovat nebudeme. Místo toho stačí do konjunktivní normální formy převést formule z důkazu předchozí věty. Vidíme, že už v ní jsou. je konjunkce přes všechna okna, takže stačí kontrolu každého okna dostat do konjunktivní normální formy. Ta vypadá nějak následovně:Sice není v konjunktivní normální formě, ale snadno ji tam pomocí distributivity můžeme převést. Velikost sice bude exponenciální v počtu oken, ale to je konstanta nezávislá na vstupu.Důsledek Dá-li se 3SAT polynomiálně redukovat na nějaký problém, potom tento problém je -těžký.Příklad Mějme problém VERTEXCOVER, kde máme zjistit, jestli daný graf obsahuje vrcholové pokrytí dané velikosti. Dokážeme, že tento problém je -úplný. Snadno vidíme, že je , takže zbývá ukázat, že se na něj dá převést 3SAT. Vezměme nějakou 3CNF formuli. Pro každou proměnnou vytvoříme udělátko proměnné: dva vrcholy propojené hranou. Pro každou klauzuli vytvoříme udělátko klauzule – trojúhelník – a každý vrchol v něm spojíme s odpovídajícím vrcholem v udělátku proměnné. Následně se zeptáme, jestli tento graf má pokrytí velikosti , kde je počet vrcholů a je počet klauzulí. Dokážeme, že formule je splnitelná, právě když takové pokrytí existuje.
(⇒)
Vytvoříme pokrytí, kde v každém udělátku proměnné vybereme vrchol odpovídající její hodnotě a v každém udělátku klauzule vybereme dva nesplněné vrcholy (ty jsou nanejvýš dva).
(⇐)
Každé pokrytí musí nutně obsahovat jeden vrchol z každého udělátka proměnné a dva vrcholy z každého udělátka klauzule. Poté stačí přiřadit proměnné podle toho, které vrcholy v udělátcích proměnných byly vybrány.
Příklad Dokážeme -úplnost problému zjištění, zda v orientovaném grafu existuje hamiltonovská cesta (HAMPATH). Příslušnost to opět ověříme snadno, takže jdeme převádět 3SAT. Tentokrát udělátko každé klauzule bude jen jeden vrchol. Označíme-li počet klauzulí, potom udělátko každé proměnné bude vypadat následovně, kde v prostřední vrstvě je vrcholů:
Tato udělátka naskládáme nad sebe. TBDPříklad Dokážeme -úplnost problému zjištění, zda v neorientovaném grafu existuje hamiltonovská cesta (UHAMPATH). Tentokrát to uděláme tak, že na to převedeme HAMPATH. Vezměme orientovaný graf , kde chceme najít hamiltonovskou cestu z do . Za každý vrchol vytvoříme tři vrcholy , až na to, že bude mít jen a bude mít jen . Přitom a budou spojené hranou. Dále pro každou hranu propojíme . Snadno dokážeme, že v původním grafu existuje hamiltonovská cesta z do , právě když v novém grafu existuje hamiltonovská cesta z do .Definice Prostorová složitost Turingova stroje je funkce , která číslu přiřadí maximální počet polí pásky, jež může stroj navštívit během výpočtu se vstupem délky . (U nedeterministického stroje bereme maximum přes všechny možné větve výpočtu.)Definice Pro danou funkci značíme
množinu všech jazyků rozeznatelných deterministickým Turingovým strojem s prostorovou složitostí ,
množinu všech jazyků rozeznatelných nedeterministickým Turingovým strojem s prostorovou složitostí .
Příklad Problém SAT je ve , protože při zkoušení hrubou silou použijeme jen lineární množství paměti.Věta Označme množinu slov kódujících všechny nedeterministické konečné automaty, které přijímají všechna slova. Potom .Důkaz Na vstupu dostaneme automat. Umístíme žetony na počáteční stavy. Následně nedeterministicky tipneme slovo a budeme podle něj posouvat žetony. Pokud tím odhalíme, že by automat slovo odmítl, vrátíme kladnou odpověď. Přitom stačí provést kroků, kde je počet stavů, protože jinak se musí nějaká konfigurace zopakovat.VětaSavitch Nechť je funkce taková, že . PotomDůkaz Vyřešíme obecnější problém. Máme daný nedeterministický automat a chceme zjistit, jestli se může dostat z konfigurace do konigurace v čase s použitím prostoru . To budeme dělat rekurzivně. Pokud , je to jednoduché. Pokud , pro všechny možné konfigurace se podíváme, jestli se jde dostat z do v krocích a z do v krocích. Pro jednoduchost si nedeterministický automat upravíme, aby přijímal jen jednou možnou konfigurací: přidáme mazací stav, ve kterém smaže celou pásku a až poté přejde do koncového. Označíme konstantu takovou, že má maximálně konfigurací. Poté zbývá rekurzivně zjistit, jestli se z počáteční konfigurace dostaneme do koncové konfigurace v krocích.Definice Třídu všech problémů rozhodnutelných deterministickým Turingovým strojem v polynomiálním prostoru značíme .AnalogickyPoznámka Díky předchozí větě je .
Když máme danou prostorovou složitost stroje, co můžeme říct o jeho časové složitosti? Možných konfigurací (včetně polohy hlavy) je , takže pokud se stroj nezacyklí, jeho časová složitost bude nejvýše tohle. Z toho máme
U žádné z nerovností nevíme, jestli jde o rovnost. Akorát si později ukážeme, že , takže alespoň jedna nerovnost je vlastní. Většina odborníků se domnívá, že všechny nerovnosti jsou vlastní.
Definice Jazyk je -úplný, pokud je v a každý problém z je na něj převoditelný.Příklad Mějme problém TQBF (Totally Qualified Boolean Formula). Uvažujeme booleovské formule, které mohou navíc obsahovat existenční a všeobecný kvantifikátor, přičemž každá proměnná musí být kvantifikovaná. Například formuleje pravdivá, ale formulenení pravdivá. Cílem je určit, jestli daná formule je pravdivá.VětaMeyerova–Stockmeyerova Problém TQBF je -úplný.Poznámka Pokud bychom se to pokusili dokázat stejným způsobem jako Cookovu–Levinovu větu, narazili bychom na problém, že tabulka by mohle mít nadpolynomiální výšku, takže by vzniklá formule nebyla polynomiálně velká.Důkaz Nejdřív dokážeme, že problém je v , a to konstrukcí rekurzivního algoritmu. Dostaneme na vstupu nějakou formuli . Pokud nemá žádné proměnné, prostě ji vyhodnotíme. Pokud , zavoláme algoritmus rekurzivně s tím, že v nahradíme postupně nulou a jedničkou a podíváme se, jestli to pro alespoň jednu hodnotu vyjde. Analogicky pro . Jelikož formule je plně kvantifikovaná, tím jsme vyčerpali všechny možnosti. Hloubka rekurze je jistě omezená počtem proměnných.
Nyní mějme libovolný deterministický Turingův stroj a chceme ho v polynomiálním prostoru redukovat na TQBF, tedy pro daný vstup vyprodukovat plně kvantifikovanou booleovskou formuli, která je pravdivá, právě když náš stroj přijímá náš vstup. Pro jednoduchost si automat upravíme, aby měl jedinou přijímacící konfiguraci. Nechť je konstanta taková, že má při výpočtu se vstupem délky maximálně konfigurací. Pro dané budeme řešit úlohu, jestli se dokáže dostat z konfigurace do konfigurace v maximálně krocích. Pro nebo to uděláme analogicky jako v Cookově–Levinově důkazu. Pro vyšší bychom mohli zkusit použít formuli
To by ale vedlo k tomu, že délka formule by mohla být lineární v , což nechceme. Místo toho použijeme formuliZápisem ve skutečnosti myslíme, že konfigurace je nějak zakódovaná do logických proměnných jako v Cookově–Levinově důkazu.Příklad Formulová hra je logická formule ve tvarukde neobsahuje žádné kvantifikátory. První hráč (Eva) vybírá hodnoty kvantifikátorů a vyhraje, pokud výsledná formule bude pravdivá. Druhý hráč (Adam) vybírá hodnoty a vyhraje, pokud výsledná formule je nepravdivá. Zjevně pravdivost původní kvantifikované formule odpovídá tomu, který hráč má výherní strategii. Snadno ukážeme, že problém zjištění, který hráč má výherní strategii, je -úplný.Příklad Mějme hru, kde je daný graf s počátečním vrcholem . Hráč táhne po hraně do ještě nenavštíveného vrcholu. Kdo nemůže táhnout, prohrál. Dokážeme, že tato hra je -úplná. Nejprve zkonstruujeme rekurzivní algoritmus, abychom dokázali, že je v . Pokud , vstup zamítneme. Jinak pro všechny vrcholy z rekurzivně zavoláme algoritmus s .
Nyní chceme převést formulovou hru na tuto hru, abychom dokázali -úplnost. Část formule za kvantifikátory si převedeme do konjunktivní normální formy. Udělátko každé proměnné bude diamant:
Udělátka proměnných pospojujeme hranami, z posledního povedeme hranu do dalšího vrcholu a z něj do všech udělátek klauzulí, která vypadají následovně:
Posléze z každého z konečných tří vrcholů v udělátku klauzule přidáme hranu do vrcholu 0 nebo 1 v udělátku odpovídající proměnné, podle toho, jestli je v klauzuli znegovaná. Celkově graf vypadá nějak takto:
Poznámka Je-li -úplný problém a , potom .Definice Mějme dvoupáskový Turingův stroj, kde na první pásce je vstup, smí se z ní pouze číst a hlava nesmí opustit prostor vymezený vstupem. Druhá páska je pracovní a začíná prázdná. Třída je třída jazyků rozhodnutelných na tomto stroji s logaritmickou prostorovou složitostí, přičemž počítáme jen pracovní pásku (jinak by složitost nemohla být lepší než lineární). Nedeterministická verze je třída .Příklad Jazyk je třídy , protože můžeme prostě spočítat písmena.Příklad Ukážeme, že problém PATH je třídy . (Nikdo neví, jestli je třídy ). Vyrazíme z počátečního vrcholu a vždy si nedeterministicky vybereme, kam jít. Zároveň si budeme počítat, kolik kroků jsme udělali, a skončíme, pokud jich bude stejně jako počet vrcholů.Věta Nechť stroj s vstupní a pracovní páskou pracuje s prostorovou složitostí . Potom jeho časová složitost je . Speciálně pokud , potom časová složitost je .Důkaz Konfigurace stroje je jednoznačně určena stavem, obsahem pracovní pásky a pozicí dvou hlav.Důsledek .Poznámka Modifikací lze dokázat, že to platí i pro klasický jednopáskový Turingův stroj.Definice Log-space převodník je Turingův stroj s vstupní, pracovní a výstupní páskou, kde:
vstupní páska jde pouze číst,
na pracovní pásce smí být maximálně symbolů,
na výstupní pásku jde pouze psát a její hlava se smí hýbat pouze doprava.
Log-space převodník vyčísluje funkci , pokud po spuštění se vstupem zůstane na výstupní pásce . Jazyk je log-space převoditelný na jazyk , pokud existuje log-space vyčíslitelná funkce taková, že . Značíme .Definice Jazyk je
-těžký, pokud na něj jdou logaritmicky převést všechny problémy;
-úplný, pokud je a -těžký.
Věta Je-li a , potom .Důkaz Důkaz není tak přímočarý jako u , protože převodní algoritmus může vyprodukovat výstup s větší než logaritmickou velikostí. Místo toho budeme počítat „líně“: spustíme algoritmus pro řešení s virtuální páskou, která pokaždé, když se z ní má něco přečíst, spustí převodní algoritmus a zastaví ho v okamžiku, kdy dostane znak na správné pozici.Důsledek Je-li nějaký problém -úplný a zároveň v , potom .Věta Problém PATH je -úplný.Důkaz Stačí dokázat, že je -těžký. Mějme nějaký log-space nedeterministický stroj pro nějaký problém, který bez újmy na obecnosti má jedinou přijímající konfiguraci. Sestrojíme graf, jehož vrcholy budou konfigurace stroje a hrany budou možné přechody. Tím jsme problém převedli na hledání cesty z počáteční do koncové konfigurace. Snadno dokážeme, že převod je log-space.Důsledek .Důkaz Log-space převodník pracuje v polynomiálním čase, takže jakýkoli problém z dokážeme polynomiálně převést na problém PATH, který je v .
Již máme posloupnost nerovností:
Definice Nedeterministický Turingův stroj počítá funkci , pokud pro každý vstup platí, že každá větev výpočtu buď přijme a na pásce zbyde , nebo vstup zamítne, přičemž alespoň jedna větev ho přijme.Věta .Důkaz Mějme funkci , která vrací , pokud v existuje cesta z do , a jinak. Zkonstruujeme nedeterministický Turingův stroj, který počítá tuto funkci. Definujme dvě další funkce: je množina vrcholů, do kterých se dá dostat z , a .Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Důkaz Postupně projdeme všechna možná a spočítáme je.Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Důkaz Spočteme si, kolik existuje dosažitelných vrcholů. Poté si nedeterministicky tipneme, které to jsou, a nedeterministicky otestujeme, jestli jsou skutečně dosažitelné. Pokud zarhnují , potom vrátíme , jinak vrátíme . Tipneme-li špatně, vstup zamítneme.Nyní analogicky definujeme funkce , které uvažují pouze cesty délky .Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Důkaz Analogicky.Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Důkaz Analogicky.Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Důkaz Podobně, ale místo abychom kontrolovali, jestli jeden z vybraných vrcholů je , zkontrolujeme, jestli z nějakého vybraného vrcholu vede hrana do .Lemma Existuje-li log-space nedeterministický Turingův stroj počítající funkci , potom také existuje stroj počítající funkci .Nyní již konečně můžeme sestavit kýžený algoritmus. Víme . Pro každé spočteme na základě . Poté pomocí spočteme .Důsledek , kde je definována analogicky jako .Definice Funkce splňující je prostorově konstruovatelná, pokud funkce, která pro vstup vrátí binární reprezentaci , je vyčíslitelná s prostorovou složitostí .Větao prostorové hierarchii Pro libovolnou prostorově konstruovatelnou funkci existuje jazyk , který je rozhodnutelný s prostorovou složitostí a není rozhodnutelný s prostorovou složitostí .Důkaz Sestrojíme automat , který dostane nějaké slovo . Napřed si na pásce vyznačí políček. Pokud následně někdy překročí tuto hranici, vstup zamítne. Následně se podívá, jestli kóduje nějaký Turingův stroj . Pokud ne, tak ho zamítne. Pokud ano, podívá se, jestli přijímá , a odpověď zneguje. Tento přístup má několik problémů:
Co když se nezastaví? To vyřešíme tím, že simulaci ukončíme po krocích.
Co když nebude schopen rozlišit nějaký jazyk s prostorovou složitostí pro malá kvůli velké multiplikativní konstantě? To vyřešíme tím, že zahájíme simulaci, i pokud pro nějaké .
Zřejmě platí, že má prostorovou složitost . Zároveň z konstrukce plyne, že nemůže rozeznávat stejný jazyk jako nějaký automat s prostorovou složitostí .Důsledek Jsou-li funkce takové, že a je prostorově konstruovatelná, potom .Důsledek .Důkaz Podle Savitchovy věty je . Podle věty o prostorové hierarchii je .Důsledek .Definice Funkce splňující je časově konstruovatelná, pokud funkce, která pro vstup vrátí binární reprezentaci , je vyčíslitelná s časovou složitostí .Větao časové hierarchii Pro libovolnou prostorově konstruovatelnou funkci existuje jazyk , který je rozhodnutelný s časovou složitostí a není rozhodnutelný s časovou složitostí .Důkaz Opět sestrojíme automat , který dostane nějaké slovo . Napřed si spočte hodnotu a uloží ji do čítače. Následně se podívá, jestli kóduje pro nějaký Turingův stroj . Pokud ne, tak ho zamítne. Pokud ano, odsimuluje stroj s omezeným počtem kroků podle čítače. Pokud skončí a zamítne vstup, potom ho přijme, jinak ho odmítne.
Nyní již nebude úplně triviální dokázat, že simulaci dokážeme provést v čase . Budeme si muset všechny potřebné informace „držet blízko sebe“. Simulace bude probíhat tak, že
na první pásce bude obsah pásky simulovaného ,
na druhé pásce bude kód a aktivní stav ,
na třetí pásce bude hodnota čítače.
Problém je, že ve skutečnosti máme jen jednu hlavu, takže její pohyb mezi páskami by mohl zabrat hodně času. To vyřešíme tak, že při každém pohybu hlavy na první pásce posunume celý obsah druhé a třetí pásky k ní. To nás může stát času, proto je ve znění věty nutné dělit .
Podívejme se opět na naši posloupnost nerovností:
přičemž víme , a , ale jinak toho nevíme moc.
Definice Problém je -úplný, pokud a pro každý je . Analogicky definujeme -úplnost.Definice Regulární výrazy jsou ekvivalentní, pokud . Značíme . Dále označíme problémVěta .Důkaz Dokážeme, že . Z toho to už plyne, protože podle nějaké věty je .
Dané dva regulární výrazy převedeme na nedeterministické konečné automaty. Poté si nedeterministicky tipneme slovo a posouváním žetonků budeme simulovat všechny možné výpočty s tímto slovem. Pokud se pro nějaké slovo dostaneme do stavu, kde v jednom automatu budou všechny žetonky v nekoncových stavech a ve druhém bude nějaký v koncovém stavu, potom . Pokud takové slovo nenajdeme, potom .
Tím jsme zatím nedostali příklad -úplného problému. Co když ale v regulárních výrazech povolíme mocniny?
Definice Regulární výraz s mocninou je regulární výraz, kde navíc povolujeme operaci pro . Pro regulární výrazy s mocninami označíme problémVěta Problém je -úplný.Důkaz Snadno dokážeme, že : stačí natvrdo rozepsat mocniny z definice (což způsobí exponenciální nárůst) a použít algoritmus z předchozí věty. Nyní se na to pokusíme převést libovolný problém z . Nechť problém je rozhodnutelný deterministickým Turingovým strojem v čase . Stroj používá nějakou abecedu . Myšlenka algoritmu bude taková, že pro dané slovo sestrojíme regulární výraz představující všechno kromě posloupnosti konfigurací, pomocí kterých přijímá . Poté se stačí podívat, jestli je tento regulární výraz ekvivalentní . Výraz se bude skládat z částí:Pro jednoduchost si pro dané označmeBudeme mítDefinice Turingův stroj s orákulem pro problém je hypotetický Turingův stroj, který navíc dokáže magicky vyřešit libovolnou instanci problému v konstantním čase. Pro takové stroje můžeme označit třídy problémů , , apod.Věta Existuje orákulum takové, že , a orákulum takové, že .Důkaz Nestihli jsme ☹ Konkrétně se jako jedno z orákulí dá použít TQBF, protožeDůsledek Není možné dokázat jen pomocí diagonalizace, že nebo (protože potom by stačilo do takového důkazu přidat orákulum a měli bychom spor).