510 likes | 645 Vues
Teorie vyčíslitelnosti. Na základě Church-Turingovy teze jsme ztotožnili pojem algoritmus s odpovídajícím Turingovým strojem. Díky tomu můžeme nyní zkoumat „meze“ vyčíslitelnosti. Uvidíme, že některé jsou algoritmicky neřešitelné. K čemu je to dobré?
E N D
Teorie vyčíslitelnosti • Na základě Church-Turingovy teze jsme ztotožnili pojem algoritmus s odpovídajícím Turingovým strojem. • Díky tomu můžeme nyní zkoumat „meze“ vyčíslitelnosti. • Uvidíme, že některé jsou algoritmicky neřešitelné. • K čemu je to dobré? • Především je užitečné to vědět, protože pokud nás někdo požádá takový problém vyřešit, víme, že to obecně nejde a musíme problém nejprve zjednodušit. • A navíc fakt, že si uvědomíme, že jsou problémy, které jsou algoritmicky neřešitelné, nám dává zcela odlišný pohled na počítače jako takové.
Rozhodnutelné problémy • Různé problémy budeme definovat pomocí jazyků, přičemž už víme: • Jazyk je rekurzivní, pokud existuje Turingův stroj který příslušný jazyk rozhoduje. • Jazyk je rekurzivně spočetný, pokud existuje Turingův stroj, který jej rozpoznává. (Může se stát, že stroj nedosáhne ani přijímacího ani zamítacího stavu a v takovém případě se zacyklí, neustále provádí příslušné kroky a nikdy se nezastaví) • Problém budeme tedy považovat za algoritmicky rozhodnutelný, pokud příslušný jazyk je rekurzivní (rozhodnutelný Turingovým strojem).
Rozhodnutelné problémy • Příklad 1: Problém přijetí slova deterministickým konečným automatem je algoritmicky rozhodnutelný. • Důkaz: 1.Převedeme problém na jazyk ADKA={B,w| B je KA přijímající slovo w} Ukážeme-li, že tento jazyk je rekurzivní (rozhodnutelný), potom i příslušný problém je rozhodnutelný. Stačí sestrojit TS M, který rozhoduje výše uvedený jazyk: 1. Stroj M simuluje činnost stroje B při zpracování slova w 2. Když simulace skončí B v koncovém stavu, potom accept; pokud skončí v nekoncovém stavu, potom reject
Rozhodnutelné problémy • Příklad 2: Problém přijetí slova nedeterministickým konečným automatem je algoritmicky rozhodnutelný. • Důkaz: 1.Převedeme problém na jazyk ANKA={B,w| B je NKA přijímající slovo w} Tentokrát stačí nedeterministický konečný automat B převést na ekvivalentní deterministický automat B’a potom už vše pokračuje zcela analogicky.
Rozhodnutelné problémy • Příklad 3: Problém prázdnosti jazyka přijímaného deterministickým konečným automatem je algoritmicky rozhodnutelný. • Důkaz: Převedeme problém na jazyk EDKA={A| A je DKA a L(A)=Ø} 1. Věta - stačí vyzkoušet slova s délkou menší než n 2. Stačí si ovšem označit počáteční stav, v dalším kroku vždy označit všechny stavy dostupné z prvního nezpracovaného označeného stavu atd. Pokud na závěr je mezi označenými stavy alespoň jeden koncový, potom accept, jinak reject.
Další rozhodnutelné problémy • P4: Problém ekvivalence jazyků přijímaných deterministickými konečnými automaty A a B je algoritmicky rozhodnutelný. EQDKA={A,B| A a B jsou DKA a L(A)=L(B)} • P5: Problém, zda v bezkontextové gramatice G lze vygenerovat slovo w, je algoritmicky rozhodnutelný. ACFG={G,w| G je bezkontextová gramatika generující w} • Důkaz: Není nutné (ani možné) zkoušet všechny derivace, ale pro slovo délky n stačí posloupnost nejvýše 2n-1 derivací
Další rozhodnutelné problémy • P6: Problém prázdnosti jazyka generovaného bezkontextovou gramatikou je algoritmicky rozhodnutelný. • Ale bohužel například … • P7: Problém ekvivalence jazyků generovaných bezkontextovými gramatikamiG a H je algoritmicky nerozhodnutelný. EQCFG={G,H| G a H jsou bezkont. gramatiky a L(G)=L(H)}
Nerozhodnutelné problémy • Jak vypadají algoritmicky neřešitelné problémy? • Jsou to problémy specielně vykonstruované matematiky, nebo i problémy, se kterými se může setkat „běžný“ programátor? • Konkrétně jde například o problém ekvivalence dvou různých programů, verifikace software (ověření, že se program chová korektně) atd. • Nejde tedy pouze o otázku filozofickou, ale o vážný problém s mnoha praktickými důsledky.
Nerozhodnutelné problémy • Intuitivní důkaz existence problémů, které nejsou řešitelné pomocí počítače: • Uvažujme „první“ program v jazyce C: main() { printf(“hello, world\n”); } • Tento program může být použit samostatně, ale část kódu printf(“hello, world\n”); můžeme použít jako podprogram v jiném programu.
Nerozhodnutelné problémy • Uvažujme nyní, že existuje program D, kterému na vstupu dáme program P a jeho vstup I. Náš program D rozhodne, zda program P na vstup I vypíše hlášku „hello, world“ • Program D je tedy jakýsi detektor toho, zda program P na vstup I tiskne „hello, world“ Program D Ano – pokud program P na vstup I tiskne „hello, world“ Program P Vstup I Ne – pokud program P na vstup I netiskne „hello, world“
Nerozhodnutelné problémy • Program D, lze jistě snadno modifikovat na D1 tak, aby v případě negativního výsledku vypsal jiný text, například „hello, world“ • Pokud program D zjistí, že P na vstup I tiskne „hello, world“, napíše „ano“, jinak vypíše „hello, world“ Program D1 Ano – pokud program P na vstup I tiskne „hello, world“ Program P Vstup I Hello, world – pokud program P na vstup I netiskne „hello, world“
Nerozhodnutelné problémy • Uvažujeme jakýkoliv program P a vstup I, a proto lze uvažovat, že program P dostane jako vstup svůj vlastní kód: • Nyní lze obrázek zjednodušit na: Program D1 Ano – pokud program P na vstup P tiskne „hello, world“ Program P Program P Hello, world – pokud program P na vstup P netiskne „hello, world“ Program D1 Ano – pokud program P na vstup P tiskne „hello, world“ Program P Hello, world – pokud program P na vstup P netiskne „hello, world“
Nerozhodnutelné problémy • Uvažujme nyní situaci, kdy programu D1 předložíme jako vstup jeho vlastní kód, tj. program D1 • Je-li výstupem D1 „ano“, potom program D1 píše „hello, world“, což je v rozporu; je-li výstupem D1 „hello, world“, potom program D1 nepíše „hello, world“, což je opět spor • Ve výsledku dostáváme spor s tím, že existuje D1 a jelikož D1 je pouze jednoduše upravený D, nemůže tedy existovat ani D Program D1 Ano – pokud program D1 na vstup D1 tiskne „hello, world“ Program D1 Hello, world – pokud program D1 na vstup D1 netiskne „hello, world“
Nerozhodnutelné problémy • Je tedy zřejmé, že neexistuje program, který by pro libovolný program P a vstup I uměl rozhodnout, zda jeho výstupem bude „hello, world“ • Máme příklad algoritmicky neřešitelné úlohy • Při konstrukci jsme využili takzvanou diagonalizační metodu (ve chvíli, kdy jsme jako vstup programu využili kód právě tohoto programu) • Pro snazší představu je možné uvažovat například program, který čte vstupní data a poté je tiskne – v našem případě bude tedy vstupními daty vlastní kód programu (program má za úkol vytisknout svůj vlastní kód)
Nerozhodnutelné problémy • Další užitečnou technikou je redukce jednoho problému na problém jiný • Máme-li rozhodnout, zda nějaký problém P je či není rozhodnutelný a víme-li, že problém P1 rozhodnutelný není, potom obvykle postupujeme následovně: • Pokusíme se problém P1 převést na P takto Accept Problém P1 Převod (redukce) TS rozhodující problém P Problém P Reject
Nerozhodnutelné problémy • Pokud se to podařilo, redukovali jsme problém P1 na P • Spojením redukce a TS pro problém P bychom ovšem získali TS rozhodující problém P1, což ale neexistuje • Proto nemůže existovat ani TS rozhodující problém P a tím jsme dokázali, že problém P je nerozhodnutelný • Nyní můžeme začít dokazovat nerozhodnutelnost konkrétních problémů • , zda jeho výstupem bude „hello, world“ • Máme příklad algoritmicky neřešitelné úlohy • Při konstrukci jsme využili takzvanou diagonalizační metodu (ve chvíli, kdy jsme jako vstup programu využili kód právě tohoto programu) • Pro snazší představu je možné uvažovat například program, který čte vstupní data a poté je tiskne – v našem případě bude tedy vstupními daty vlastní kód programu (program má za úkol vytisknout svůj vlastní kód) TS rozhodující problém P1 Accept Problém P1 Převod (redukce) TS rozhodující problém P Problém P Reject
Chybný postup redukce • Redukovat musíme problém, o kterém víme, že není rozhodnutelný na problém, o kterém to chceme dokázat • Podaří-li se nám to opačně, ještě to vůbec neznamená, že náš problém je skutečně nerozhodnutelný • Redukci je třeba vždy dělat ze známého problému na náš: Problém P Převod (redukce) Neexistuje TS rozhodující problém P1 Problém P1 ???? Accept Problém P1 Převod (redukce) TS rozhodující problém P Problém P Reject
Nerozhodnutelné problémy • Věta 1: Problém zastavení Turingova stroje je algoritmicky nerozhodnutelný (Halting problem). HALTTM={M,w| M je TS a M se zastaví na slovo w} • Důkaz: bude následovat později • Věta 2: Problém zastavení Turingova stroje je algoritmicky rozpoznatelný. • Důkaz: Stačí sestrojit TS Q, který rozpoznává výše uvedený jazyk HALTTM : 1. Stroj Q simuluje činnost stroje M při zpracování slova w 2. Když simulace M skončí ve stavu accept, potom accept; pokud skončí ve stavu reject, potom reject; pokud se zacyklí, zacyklí se i Q
Důkaz k problému zastavení • Nutná odbočka: Diagonalizační metoda (Georg Cantor - 1873) • Jak porovnávat velikost množin? • U konečných stačí spočíst prvky a zkontrolovat výsledek. • U nekonečných prvky spočítat neumíme … • Lze to udělat tak, navrhneme funkci f, která každému prvku z množiny A bude přiřazovat prvek z množiny B tak, že pro ab, a,bA platí f(a)f(b). • Potom nutně musí platit, že prvků množiny B je stejně nebo více, než prvků množiny A. • Když to zařídím analogicky i opačně, mohutnost obou množin je nutně stejná.
Diagonalizační metoda • Věta: Množina sudých čísel a množina lichých čísel mají stejnou mohutnost (jsou „spočetné“). • Důkaz: f: každému lichému číslu přiřadím číslo o 1 větší g: každému sudému číslu přiřadím číslo o 1 menší (1-2, 3-4, ….,153-154, …….) Vzhledem k této korespondenci je zřejmé, že mohutnost obou množin je stejná.
Diagonalizační metoda • Věta: Množina sudých čísel a množina přirozených čísel mají stejnou mohutnost (jsou „spočetné“). • Důkaz: f: každému sudému číslu přiřadím číslo „poloviční“ (x div 2) g: každému přirozenému číslu přiřadím číslo dvojnásobné (číslu 2 odpovídá 1, … číslu 30 číslo 15, ….) Odtud je zřejmé, že sudých čísel, lichých čísel i všech přirozených čísel je stejný počet (tj. spočetně).
Diagonalizační metoda • Věta: Množina reálných čísel je nespočetná. • Důkaz: V tomto případě dokážeme sporem, že se korespondenci mezi přirozenými čísly a reálnými čísly vytvořit nepodaří. Pro důkaz sporem předpokládejme, že taková korespondence existuje,tj. existuje tedy nějaká funkce f, která každému přirozenému číslu přiřadí odpovídající číslo reálné
Diagonalizační metoda Předpokládejme například f: Snadno ukážeme, že existuje xR, které v tabulce nikde není. Pomocí diagonalizační metody budeme tvořit číslo x=0.x1x2x3x4…, kde xi se liší od čísla na i-tém řádku právě v i-té pozici za čárkou. V našem případě tedy x17 (tj. např. 5), x22 (tj. např. 3), …
Diagonalizační metoda Námi zkonstruované číslo x=0.5374… se liší od čísla na i-tém řádku právě v i-té pozici a v tabulce tedy určitě není. Odtud je zřejmé, že funkce f není korespondence a jelikož f byla zcela obecná funkce, je zřejmé, že žádnou takovou f zkonstruovat nelze. Odtud tedy plyne, že reálných čísel je nespočetně.
Univerzální Turingův stroj • Věta: Je možné zkonstruovat univerzální Turingův stroj U, který simuluje činnost jakéhokoliv Turingova stroje M, jehož definice slouží jako vstup. L(U)={M#w | wL(M) } Poznámka: Univerzálnímu Turingovu stroji U dáme na pásku definici stroje M a za oddělovačem # potom vstupní slovo w. Univerzální stroj Upotom simuluje činnost stroje M a pokud M slovo w přijme, přijme jej i stroj U.
Univerzální Turingův stroj • Jak se konstrukce UTS provede prakticky? Klíčová je definice stroje M, přičemž jde o vhodné zakódování popisu stroje (máme M=(Q,,,,q0,qacc,qrej)) Zakódování je poměrně snadné: např. 0n10m10k10s10t10r10u10v může reprezentovat stroj s n stavy (očíslované 0 až n-1), m páskovými symboly reprezentovanými čísly 0 až m-1, z nichž prvních k symbolů jsou symboly vstupní abecedy, počáteční stav je s, přijímací stav je t, zamítací stav je r, a zbytek řetězce definuje funkci např. řetězec 0p10a10q10b10 může reprezentovat (p,a)=(q,b,L)
Univerzální Turingův stroj • Příklad konstrukce UTS Nechť přechodová funkce je dána následovně: (q0,0)=(q1,0,R) 01010010100 (q0,1)=(q1,0,L) 01001001010 (q1,0)=(q0,0,L) 0010101010 (q1,1)=(q1,0,R) 0010010010100 Dohromady lze zapsat celý kód jako: 0101001010011010010010101100101010101100100100101001111101 Jednotlivé části definice přechodové funkce od sebe dělí 11, po trojici jedniček (111 – předtím nikde být nemohla) následuje vstupní slovo w=1101
Univerzální Turingův stroj • Jelikož Q je konečná množina, je konečná množina a je rovněž konečná množina, je zřejmé, že každý Turingův stroj mohu tímto způsobem zakódovat. • Takto získaný kód je tzv. Gödelovo číslo Turingova stroje M. (Kurt Gödel – 1906 Brno - 1978 ) • Je zřejmé, že bude existovat mnoho různých kódů pro tentýž Turingův stroj (v našem příkladu například záměnou řádků v definici přechodové funkce lze získat 24 různých kódů).
Univerzální Turingův stroj • Univerzálnímu Turingovu stroji U dáme na pásku Gödelovo číslo Turingova stroje M a za oddělovačem # (111)slovo w. • Univerzální stroj Upotom simuluje činnost stroje M a pokud M slovo w přijme, akceptuje toto slovo i stroj U. - - - - • Ne každý binární řetězec je Gödelovým číslem nějakého Turingova stroje M (101, 0101110, …) • Pro tyto případy lze snadno zajistit, aby Univerzální Turingův stroj S ukončil činnost ve stavu reject
Důkaz k problému zastavení • Uvažujme všechnyTS pracující nad vstupní abecedou {0,1} • Každý z těchto strojů je identifikován svým číslem a pro příslušné vstupní slovo se buď zastaví (H), nebo zacyklí (L) • Zastavení umíme poznat a vyplnit do tabulky: První stroj v tabulce se zastaví po zpracování prázdného slova e, slov 0, 1 atd., ale na vstup 00 se v daném čase odpověď nepodařilo získat atd.
Důkaz k problému zastavení • Předpokládejme, že existuje nějaký Turingův stroj K, který umí rozhodnout problém zastavení. • To znamená, že stroj K pro každý Turingův stroj Mx a vstupní slovo Mx#w se K zastaví ve stavu accept, pokud se Mx zastaví na w a zastaví ve stavu reject, pokud se Mx zacyklí na w • Na základě činnosti stroje K potom můžeme tabulku postupně doplňovat tak, že pro každý stroj a příslušný vstup zapíšeme do tabulky i symboly reprezentující zacyklení stroje (L), vždy, když K skončí ve stavu reject
Důkaz k problému zastavení • Tabulka potom bude vypadat následovně přičemž symbol H v příslušné buňce znamená, že odpovídající Turingův stroj se na daný vstup zastavil (ať už ve stavu accept či reject), zatímco L značí jeho zacyklení
Důkaz k problému zastavení • Diagonalizační metodou snadno sestavíme TS X, který se ode všech strojů v tabulce bude lišit chováním na diagonále. • Takový stroj X potom ovšem v tabulce zdánlivě chybí, ale jelikož zde máme všechny TS, dostáváme spor s předpokladem, že tabulku lze vyplnit s pomocí stroje K, který umí rozhodnout problém zastavení.
Důkaz k problému zastavení • Sporem jsme došli ke zjištění, že takovou tabulku nelze vyplnit a tedy neexistuje ani TS K, který umí rozhodnout problém zastavení. • Platí tedy: Problém zastavení Turingova stroje je algoritmicky nerozhodnutelný. • Poznámka: Vždy můžeme simulovat činnost konkrétního TS při zpracování konkrétního vstupu w. Když se stroj zastaví, máme rozhodnuto a simulaci můžeme ukončit, ale když se nezastavuje, nemáme žádný obecný způsob jak rozhodnout, kdy simulaci zastavit a s jistotou říci, že se stroj zacyklil.
Další nerozhodnutelné problémy Je algoritmicky rozhodnutelné, zda: • TS přijímá prázdné slovo? • TS přijímá alespoň jedno slovo? • TS přijímá každé slovo? • TS přijímá konečnou množinu slov? • Jsou dané dva TS ekvivalentní? • Je jazyk rozpoznatelný daným TS regulární? …. Ve všech výše uvedených případech je odpověď negativní.
Algoritmicky nerozhodnutelný problém • Věta: Problém neprázdnosti jazyka přijímaného Turingovým strojem je algoritmicky nerozhodnutelný. ETM={M1| M1 je TS a L(M1)≠} • Důkaz: Předpokládejme, že existuje TS K, který rozhoduje problém neprázdnosti To znamená, že K se zastaví ve stavu accept, je-li L(M1)≠ a ve stavu reject, jestliže L(M1)= Na základě tohoto předpokladu ukážeme (redukcí), že pomocí takového stroje K bychom uměli rozhodnout halting problem, což ale už víme, že nelze a tím se dostaneme do sporu. Vezměme libovolný Turingův stroj N a slovo w, pro které bychom chtěli zjistit, zda N se zastaví na vstup w.
Algoritmicky nerozhodnutelný problém • Pokračování důkazu: Nyní sestrojíme stroj N1 takový, že na jakýkoliv vstup x udělá následující kroky: 1) smaže vstup x 2) napíše si na pásku slovo w (má jej natvrdo „uložené“ v řídící jednotce) 3) simuluje činnost stroje N na vstupu w (i popis stroje N má natvrdo „uložený“ v řídící jednotce) 4) zastaví se ve stavu accept, jestliže se N zastaví na vstup w Činnost stroje N1 je zřejmá z následujícího obrázku: w x N N1 w smaž x napiš w simuluj N N
Algoritmicky nerozhodnutelný problém • Pokračování důkazu: Stroj N1 pracuje tak, že na libovolný vstup x se zastaví právě tehdy, když se stroj N zastaví na vstup w, tj. L(N1) =∑*pokud se N zastaví na vstup w, nebo = pokud se Nnezastaví na vstup w Za předpokladu, že máme stroj K, který umí rozhodnout problém neprázdnosti jazyka, pustíme nyní tento stroj na jazyk L(N1). Na základě jeho výsledku jsme schopni rozhodnout halting problem pro stroj N a slovo w, což ale nelze a tím se dostáváme do sporu. Tím je věta: Problém neprázdnosti jazyka přijímaného Turingovým strojem je algoritmicky nerozhodnutelný. ETM={M1| M1 je TS a L(M1)≠} dokázána.
Ekvivalence dvou TS • Věta: Problém ekvivalence dvouTuringových strojů je algoritmicky nerozhodnutelný. EQTM={M1,M2| M1 a M2 jsou TS a L(M1)=L(M2)} • Důkaz: Předpokládejme, že existuje TS K, který rozhoduje problém ekvivalence To znamená, že K se zastaví ve stavu accept, jsou-li příslušné jazyky ekvivalentní. Uvažujme TS N, který na jakýkoliv vstup přejde do stavu reject a tedy L(N) = Ø Pokud stroj K rozhoduje problém ekvivalence, použitím tohoto stroje na vstup M1,Njsme schopni rozhodnout problém neprázdnosti jazyka přijímaného Turingovým strojem M1, což ale nelze (viz předchozí věta) a máme tedy spor s předpokladem, že výše uvedený problém je rozhodnutelný.
Další nerozhodnutelný problém Postův korespondenční problém: • Lze ze zadané sady dominových kostek složit posloupnost,ve které je výsledný horní řetězec stejný jako řetězec dolní? Příklad: • Kostky lze používat opakovaně, ne všechny je nutné použít. • Řešením je např. posloupnost: … abcaaabc … abcaaabc
Další nerozhodnutelný problém Postův korespondenční problém: • Jindy je zřetelně vidět neřešitelnost takového úkolu. • Příklad: • Neřešitelnost je zřejmá z tvaru kostek. • Věta: Postův korespondeční problém je algoritmicky nerozhodnutelný.
Turingovsky nerozpoznatelný problém • Již víme, že řada problémů je Turingovsky nerozhodnutelných. • Problém zastavení TS je nerozhodnutelný (příslušný jazyk není rekurzivní), ale určitě je rozpoznatelný (rekurzivně spočetný) • Existují ovšem i problémy Turingovsky nerozpoznatelné. Turingovsky nerozpoznatelné jazyky Rekurzivně spočetné jazyky Rekurzivní jazyky
Turingovsky nerozpoznatelný problém • Věta: Jazyk L je Turingovsky rozhodnutelný, pokud L i jeho doplněk jsou Turingovsky rozpoznatelné. • Důkaz: K jazyku L a k jeho doplňku sestrojím odpovídající TS M1 a M2 a na každé vstupní slovo se jeden z nich zastaví. Potom sestrojím TS M takový, že přijme slovo v, které akceptuje M1 a odmítne slovo w, které přijme M2. Takový M potom rozhoduje jazyk L.
Turingovsky nerozpoznatelný problém • Důsledek: Doplněk jazyka HALTTM={M,w| M je TS a M se zastaví na slovo w} je Turingovsky nerozpoznatelný (to znamená, že není rekurzivně spočetný). Jde o jazyk LOOPTM={M,w| M je TS a M se zacyklí na slovo w} • Důkaz: Problém zastavení je Turingovsky rozpoznatelný. Pokud by byl Turingovsky rozpoznatelný i jeho doplněk, potom by dle předchozí věty byl problém zastavení Turingovsky rozhodnutelný, což ale není pravda.
Algoritmicky nerozpoznatelný problém • Proč má doplněk některých problému jinou obtížnost? • Naše logika vychází z předpokladu, že pokud po vyřešení originálního problému odpoví program ANO, odpověď na doplňkový problém je NE a naopak • Tato logika ale neuvažuje s tím, že program se může zacyklit a potom nemáme možnost změnit odpověď na opačnou
Algoritmicky nerozpoznatelný problém • Věta: Problém neprázdnosti jazyka přijímaného Turingovým strojem je algoritmicky rozpoznatelný. ETM={M1| M1 je TS a L(M1)≠} • Důkaz: Příslušný nedeterministický TS zkouší možná slova a pokud některé wL(M1), stroj M1 se zastaví ve stavu accept, jinak všechny větve skončí v cyklu nebo ve stavu reject • Věta: Problém prázdnosti jazyka přijímaného Turingovým strojem je algoritmicky nerozpoznatelný. nonETM={M1| M1 je TS a L(M1)=} Důkaz: Jelikož doplněk tohoto problému (neprázdnost jazyka) je Turingovsky rozpoznatelný, ale nikoliv rozhodnutelný. Pokud by byl rozpoznatelný tak0 problém prázdnosti jazyka, problém neprázdnosti by byl i rozhodnutelný -> spor.
Teorie vyčíslitelnosti Pokročilé partie: • Nerozhodnutelnost logických teorií (Church, Gödel) Uvažujeme-li například jednoduchou matematickou teorii, která pracuje pouze s přirozenými čísly a operacemi součtu a součinu(Th(N,+,*)), lze dokázat, že neexistuje algoritmus, který by obecně dokázal rozhodnout, zda příslušné tvrzení je či není pravdivé. • Příklady tvrzení v takové teorii: xy [x+x=y] pravdivé tvrzení yx [x+x=y] nepravdivé tvrzení xyz [x=y*z & y≠1 & y≠x] nepravdivé tvrzení qpxy [p>q & (x,y > 1 (xy≠p & xy≠p+2))] ???(existence libovolně velkých párů prvočísel = prvočísla lišící se o 2)
Teorie vyčíslitelnosti • Nekomprimovatelnost určitých řetězců • Uvažujme řetězce 01010101010101010101 10x řetězec 01 111001011010001101111 ??? • Ke komprimaci použijeme Turingův stroj S, komprimovaný řetězec x označíme jako slovo w • Pustíme-li potom Turingův stroj S na slovo w, získáme jako výstup původní slovo x • DEF:Minimálním popisem slova x(značíme d(x)) rozumíme nejkratší řetězec M,w, kde M je Turingův stroj, který na vstup w zapíše na pásku x a zastaví.
Teorie vyčíslitelnosti • DEF: Nechť x je řetězec. Říkáme, že x je c-komprimovatelný, pokud platí d(x)≤|x|-c Jestliže x není komprimovatelný s c=1, potom říkáme, že x je nekomprimovatelný. • Věta: Existují nekomprimovatelné řetězce všech délek. • Důkaz: Počet řetězců délky n je větší, než počet popisů délky n-1. Každý popis popisuje nejvýše jeden řetězec, a proto některé řetězce délky n nemají popis kratší než n.
Turingův stroj s orákulem • Turingův stroj je možné doplnit orákulem, což je externí zařízení, které pro daný jazyk L rozhoduje zda wL a na požádání tuto informaci Turingovu stroji sděluje. • Turingův stroj M s orákulem pro jazyk L značíme ML. • Můžeme uvažovat například Turingův stroj M s orákulem pro jazyk L(M). Nyní jsme schopni rozhodnout problém zastavení stroje M (zeptám se orákula, zda příslušné wL(M) a dle odpovědi přejdu do stavu accept či reject) • Turingův stroj doplněný orákulem je mnohem silnější než obyčejný TS, ale i tak existují problémy, které jsou i tímto strojem nerozhodnutelné.