Neřešitelnost a nerozhodnutelnost

Podobné dokumenty
Složitost Filip Hlásek

Výroková a predikátová logika - XIII

Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...

Matematická logika. Miroslav Kolařík

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

Matematická analýza pro informatiky I. Limita funkce

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

Kapitola Základní množinové pojmy Princip rovnosti. Dvě množiny S a T jsou si rovny (píšeme S = T ) prvek T je také prvkem S.

Základní pojmy matematické logiky

Místo pojmu výroková formule budeme používat zkráceně jen formule. Při jejich zápisu

Výroková a predikátová logika - XII

Greenova funkce pro dvoubodové okrajové úlohy pro obyčejné diferenciální rovnice

Základy teorie množin

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1

1 Lineární prostory a podprostory

Matematická analýza pro informatiky I. Limita posloupnosti (I)

0.1 Úvod do matematické analýzy

Přednáška 3: Limita a spojitost

Výroková a predikátová logika - II

Vlastnosti regulárních jazyků

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Úvod do informatiky. Miroslav Kolařík

Pomocný text. Polynomy

PŘEDNÁŠKA 2 POSLOUPNOSTI

Polynomy. Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1.1 Teorie Zavedení polynomů Operace s polynomy...

1 Linearní prostory nad komplexními čísly

Výroková a predikátová logika - II

Matematika III. Miroslava Dubcová, Daniel Turzík, Drahoslava Janovská. Ústav matematiky

Principy indukce a rekursivní algoritmy

Třída PTIME a třída NPTIME. NP-úplnost.

NP-úplnost problému SAT

Základy matematické analýzy

Matematická analýza 1

Principy indukce a rekurentní rovnice

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

FIT ČVUT MI-LOM Lineární optimalizace a metody. Dualita. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Dnešní látka Variačně formulované okrajové úlohy zúplnění prostoru funkcí. Lineární zobrazení.

9 Kolmost vektorových podprostorů

Výroková a predikátová logika - III

Matematická logika. Miroslav Kolařík

FREDHOLMOVA ALTERNATIVA

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Pro každé formule α, β, γ, δ platí: Pro každé formule α, β, γ platí: Poznámka: Platí právě tehdy, když je tautologie.

Lineární algebra : Polynomy

Pojem binární relace patří mezi nejzákladnější matematické pojmy. Binární relace

Definice 13.1 Kvadratická forma v n proměnných s koeficienty z tělesa T je výraz tvaru. Kvadratická forma v n proměnných je tak polynom n proměnných s

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady.

PRIMITIVNÍ FUNKCE. Primitivní funkce primitivní funkce. geometrický popis integrály 1 integrály 2 spojité funkce konstrukce prim.

Je založen na pojmu derivace funkce a její užití. Z předchozího studia je třeba si zopakovat a orientovat se v pojmech: funkce, D(f), g 2 : y =

PRIMITIVNÍ FUNKCE DEFINICE A MOTIVACE

Příklad z učebnice matematiky pro základní školu:

Algebraické struktury s jednou binární operací

5. Lokální, vázané a globální extrémy

Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují

Matematika (KMI/PMATE)

Výroková logika II. Negace. Již víme, že negace je změna pravdivostní hodnoty výroku (0 1; 1 0).

Okruh č.3: Sémantický výklad predikátové logiky

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Formální systém výrokové logiky

Těleso racionálních funkcí

Výroková a predikátová logika - IV

Rovnice se separovanými proměnnými

Operace s maticemi. 19. února 2018

Riemannův určitý integrál

Výroková a predikátová logika - IX

1 Mnohočleny a algebraické rovnice

5.3. Implicitní funkce a její derivace

1 Pravdivost formulí v interpretaci a daném ohodnocení

Limita a spojitost funkce

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice

1 Řešení soustav lineárních rovnic

Predikátová logika. Teoretická informatika Tomáš Foltýnek

Limita a spojitost funkce. 3.1 Úvod. Definice: [MA1-18:P3.1]

Výroková a predikátová logika - XIV

Výroková a predikátová logika - XII

p 2 q , tj. 2q 2 = p 2. Tedy p 2 je sudé číslo, což ale znamená, že

1. MATEMATICKÁ LOGIKA A MNOŽINY

5 Orientované grafy, Toky v sítích

Diskrétní matematika 1. týden

Limita a spojitost funkce a zobrazení jedné reálné proměnné

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

Kongruence na množině celých čísel

TOPOLOGIE A TEORIE KATEGORIÍ (2017/2018) 4. PREDNÁŠKA - SOUČIN PROSTORŮ A TICHONOVOVA VĚTA.

1 Mnohočleny a algebraické rovnice

Zavedení a vlastnosti reálných čísel

Modely Herbrandovské interpretace

Cvičení ke kursu Vyčíslitelnost

[1] Definice 1: Polynom je komplexní funkce p : C C, pro kterou. pro všechna x C. Čísla a 0, a 1,..., a n nazýváme koeficienty polynomu.

15. Moduly. a platí (p + q)(x) = p(x) + q(x), 1(X) = id. Vzniká tak struktura P [x]-modulu na V.

Třídy složitosti P a NP, NP-úplnost

Dijkstrův algoritmus

Obyčejnými diferenciálními rovnicemi (ODR) budeme nazývat rovnice, ve kterých

Pravděpodobnost a statistika

13. přednáška 13. ledna k B(z k) = lim. A(z) = M(z) m 1. z m.

Výroková a predikátová logika - II

Báze a dimenze vektorových prostorů

Naproti tomu gramatika je vlastně soupis pravidel, jak

Transkript:

Neřešitelnost a nerozhodnutelnost Studijní materiál, M.Č. 0. Úvod 0.1. V tomto textu se pokusíme ukázat, že řada problémů, které jsou na první pohled velice jednoduché, není principiálně možné řešit pomocí algoritmů. Pokusíme se ukázat argument, že neexistuje algoritmus, který by danou úlohu vždy uspokojivě vyřešil. Prokázat, že nějaký problém algoritmicky řešitelný je, lze například tak, že napíšeme příslušný program. Důkaz neexistence je však mnohem obtížnější; není totiž možné přímo projít všechny možné programy (těch je samozřejmě nekonečně mnoho), a ověřit, že každý z nich naši úlohu aspoň v jednom případě vyřeší chybně. Proto budeme při našich úvahách většinou postupovat tak, že z předpokladu, že nějaký problém je algoritmicky řešitelný, odvodíme logický rozpor. Ukážeme tak, že předpoklad řešitelnosti daného problému je díky tomuto rozporu neudržitelný a učiníme závěr, že tento problém není možné algoritmicky řešit. 0.2. Churchova tese. Pracujeme s intuitivním výrazem, že nějaký problém je (ne)řešitelný algoritmicky. To však není přesné: přijmeme-li jako výpočetní model Turingův stroj, ukážeme pouze, že neexistuje žádný Turinguv stroj, který by měl požadované vlastnosti. Pak už se implicitně odvoláváme na tzv. Churchovu tesi, která říká, že principiálně všechny rozumné modely algoritmu jsou Turingovu stroji ekvivalentní. Tato tese je filosofická; dosud se však nepodařilo sestavit rozumný model algoritmu, který by uměl řešit i problémy, které nelze řešit pomocí Turingových strojů. Není znám žádný programovací jazyk, kterým by bylo možno řešit problémy, které nejsou řešitelné Turingovými stroji. 0.3. V této kapitole používáme slovo efektivnost jako synonymum pro algoritmickou řešitelnost. Nebudeme zkoumat, zdali některý problém lze vyřešit algoritmem rychle či pomalu; jediným kriteriem je, zdali zkoumaný problém lze vůbec pomocí algoritmu (Turingova stroje) řešit, či zda to principiálně není možné. 0.4. Implicitně přijmeme předpoklad potenciální neomezenosti, tedy, že ne- 1

budeme uvažovat žádné omezení na velikost zpracovávaných dat a možnou délku výpočtu programu. Lze jistě namítat, že v současné době mají počítače jen omezenou kapacitu paměti a omezený výpočetní čas, a tak že potenciálně libovolně velký problém nelze technicky zvládnout (i když z teoretického hlediska to možné je). Přijetí předpokladu, že počítač s potenciálně neomezenou pamětí a neomezeným výpočetním časem je možný (což odpovídá přijetí výpočetního modelu Turingových strojů, na které neklademe žádná omezení na délku pásky či délku výpočtu), nám umožní vybudovat myšlenkový aparát, pomocí kterého ukážeme, že řada problému je principiálně neřešitelných, a to i v situaci, kdybychom měli k disposici počítač se sebevětší pamětí či sebelepším výkonem. 1. Algoritmy a funkce 1.1. Zápisem f : N N míníme, že f(x) 1 je funkce, jejímž argumentem je přirozené číslo, které funkce f nějak přetransformuje na jiné přirozené číslo, obvykle označované y (přicemž pro některá x nemusí být hodnota f(x) definována). Odtud také zápis f(x) = y. Na funkci můžeme nahlížet jako na černou skříňku, která dostane na vstup číslo x, chvíli nějak počítá a pak vydá výstup y. 1.2. Poznámka. Čtenář je možná zvyklý pracovat spíše s funkcemi typu f : R R. S reálnými čísly je však velký problém: zatímco přirozených či racionálních čísel je pouze spočetně mnoho, reálných je nespočetně. Algoritmy pracují ne s čísly, nýbrž s jejich popisy. Popisem rozumíme nějakou konečně dlouhou posloupnost symbolů konečně dlouhých posloupností symbolů je však též jen spočetně mnoho. Reálná čísla jsou proto pro nás příliš složité objekty; většinu z nich nedokážeme žádným konečným způsobem vůbec popsat. Proto budeme pracovat výhradně s funkcemi, které počítají s přirozenými nebo racionálními čísly. 1 Někdy bývají takové funkce nazývány posloupnosti přirozených čísel. V tomto textu však budeme užívat termínu funkce. 2

1.3. Abychom mohli nahlédnou dovnitř intuitivního výrazu, že funkce nějak počítá, je třeba zodpovědět dvě otázky: jak jsou zadána vstupní data x, jaký má být formát výstupu y a jak popsat algoritmus, podle kterého výpočet probíhá. 1.4. Jak popsat x a y. Přirozená čísla jsou nám přístupná prostřednictvím jejich popisů. Čísla obvykle popisujeme pomocí konečných posloupností (tzv. slov), jejichž prvky pocházejí z množiny konečně mnoha symbolů (tzv. abecedy). Tak je přirozené číslo přístupné člověku i (abstraktnímu) výpočetnímu stroji. Číslo tak muže být zadáno např. jako konečná posloupnost symbolů (slovo) z abecedy {0, 1} ve svém dvojkovém zápisu či z abecedy {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ve svém desítkovém zápisu. 1.5. Jak popsat algoritmus. V případě mnoha funkcí dokážeme algoritmus výpočtu popsat velmi jednoduše. Je-li dána např. funkce f(x) = x 2, je možné jej intuitivně popsat třeba takto: napsat si číslo x (které je zapsané např. v desítkové soustavě jako slovo nad abecedou {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) dvakrát pod sebe a vysvětlit princip násobení, stejně jako jsme se v první třídě učili násobit na papíře. Výstupem y pak bude to, co nám vyšlo na posledním řádku : 123 123 369 246 123 15129 Tento příklad ukázal, že na některé funkce a možná, že na většinu funkcí, se kterými se čtenář setkává lze nahlížet jako na algoritmy; vždyť i např. vzorečky, kterými se zapisují elementární funkce, lze chápat coby algoritmus, jak počítat y, je-li na vstupu dáno konkrétní x. V našem případě je naprosto přirozené, abychom za výpočetní model přijali Turingův stroj (nebo jeho ekvivalentní modely, jako např. rekursivně spočetné gramatiky, Random Access Machines či jiné). Veškeré závěry o neřešitelnosti problémů je pak třeba chápat v kontextu Churchovy tese (0.2.). 3

2. Kódování konečných posloupností přirozenými čísly 2.1. Představme si tento model algoritmu: algoritmus dostane na vstup data, která jsou zapsána jako slovo z nějaké konečné abecedy Σ. Výstup je taktéž ve formě slova z abecedy Σ. Snadno nahlédneme, že lze jednoduchým způsobem nalézt korespondenci (tzv. kódování) mezi slovy nad abecedou Σ a přirozenými čísly splňující jednoznačnost v tomto smyslu: 1. různým slovům odpovídají různá přirozená čísla a naopak, různým přirozeným číslům odpovídají různá slova, 2. ze zápisu slova lze efektivně (tj. algoritmicky) nalézt odpovídající přirozené číslo a naopak, z přirozeného čísla lze efektivně nalézt slovo, které je v něm zakódováno. 2.2. Uvažme jednoduchý příklad. Je-li σ slovo nad abecedou {0, 1}, pak jeho kódem je číslo n, jehož dvojkový zápis je 1σ (tj. konkatenace symbolu 1 a slova σ). To znamená, že kódování by odpovídalo tabulce 0 2 11 7 1 3 000 8 00 4 001 9 01 5 010 10 10 6 atd. 2.3. Díky této možnosti kódování je možné tvrzení program dostane na vstup slovo z abecedy {0, 1} a jeho výstupem je slovo z abecedy {0, 1} nahradit tvrzením program dostane na vstup přirozené číslo a jeho výstupem je přirozené číslo. Na program tak lze nahlížet jako na jistou funkci f : N N. 2.4. Je snadné též nahlédnout, že podobně lze uvažovat i v případě abeced, které mají více než dva symboly; rovněž se snadno zkonstruuje efektivní kódování slov přirozenými čísly. 2.5. Někdy je výhodné na program nahlížet např. jako na funkci f : N 2 N, tedy jako na program, který dostává na vstup dva argumenty (což může 4

být třeba program, který dvě vstupní čísla sčítá). Není to žádné omezení; vzhledem k tomu, že de facto program pracuje se zápisy čísel, je lhostejno, zdali dostane na vstup dvě slova σ a τ nad abecedou {0, 1} nebo jedno slovo σ τ nad abecedou {0, 1, }. Mnohá tvrzení budeme formulovat pro funkce jedné proměnné; bude-li třeba, zobecníme je i na funkce více proměnných. Pokud nějaký vztah platí pro funkce jedné proměnné, obvykle není těžké zformulovat i příslušné zobecnění na funkce více proměnných, i když ne vždy tak explicitně učiníme. Symbolem f(x) označíme funkci, která má jeden argument (tedy f : N N), symbolem f(x 1, x 2 ) funkci, která má dva argumenty (f : N 2 N) atd. Pokud se jedná o funkce, které počítají programy (Turingovy stroje), budeme stejné značení používat i pro tyto programy. 2.6. Obdobně lze pracovat i s funkcemi, které počítají nad racionálními čísly, neboť racionální číslo lze popsat pomocí znaménka a dvojice přirozených čísel. Bez další formalisace snadno nahlédneme, že např. číslo 1.125 je možné popsat posloupností symbolů nad abecedou {0, 1,, } 1001 1000, kde je symbol pro záporné číslo, 1001 je dvojkový zápis čísla 9, 1000 je dvojkový zápis čísla 8 a je oddělovač ( 1.125 = 9 8 ). 2.7. V dalším textu budeme pracovat jen s funkcemi typu f : N n N. Budeme považovat kódování vstupů a výstupů za dané a nebudeme se jím již dále zabývat. 3. Ne vždy se výpočet zastaví 3.1. Snadno si lze představit program, který by v pascalovském kódu mohl vypadat repeat until false. Tento program je po spuštení ponekud autistický počítá do nekonečna. To se může stát nejen tomuto programu, ale i v případě jiných výpočtů. 3.2. Donedávna byla například otevřená slavná otázka o platnosti Fermatovy věty: existuje čtveřice přirozených čísel a, b, c a n, kde a, b, c 1, n 3, 5

splňující a n + b n = c n? Jak je možné se pokusit tento problém vyřešit pomocí algoritmu? Třeba tak, že se budou postupně generovat všechny čtveřice přirozených čísel [a, b, c, n] s a, b, c 1, n 3, např. v pořadí [1 1 1 3]; [1 1 2 3], [1 2 1 3], [2 1 1 3], [1 1 1 4]; [1 2 2 3], [2 1 2 3], [2 2 1 3] atd., a pro každou se otestuje, zdali uvedená rovnost platí. 2 Výsledek je však nejistý: pokud taková čtveřice existuje (což nevíme), program skončí a dá na výstupu nalezenou čtveřici, zatímco pokud neexistuje, algoritmus bude počítat do nekonečna, tedy nikdy se nezastaví. 3.3. Poznámka. Fermatova věta je slavný problém. Pierre de Fermat ( 1665) si do svých zápisků udělal poznámku, že žádná přirozená čísla a, b, c 1, n 3 splňující rovnici a n + b n = c n neexistují a že našel hezký důkaz tohoto tvrzení, avšak okraj sešitu je příliš malý na to, aby jej zde zapsal. Více se v jeho pozůstalosti nenašlo. Tento problém trápil matematiky až do 90. let dvacátého století; důkaz neexistence těchto čísel dal až Wiles v roce 1993. Fermatova věta vstoupila do všeobecného povědomí. V díle HOMER 3 seriálu Simpsonovi se Homer Simpson propadl do trojrozměrného světa, kde kolem něj létala rovnost 1782 12 + 1841 12 = 1922 12. Ta ovšem platí jen přibližně, shoda je pouze na devět číslic. V tomto díle kolem Homera létají i další zajímavé vztahy: např. P = NP, E = mc 2, Heisenbergova neurčitost a další. 3.4. Terminologie. Pokud se výpočet programu P nad vstupem x nezastaví, říkáme, že hodnota P (x) není definována, jinak také P (x) diverguje a píšeme P (x). Pokud naopak výpočet skončí (a na výstupu tedy bude nějaká 2 Všimněme si, že lze generovat postupně tyto čtveřice tak, že v uvedené posloupnosti se vyskytne každá čtveřice. Je to možné relisovat např. následujícím programem: (1) i := 6; (2) vygeneruj všechny čtveřice [a, b, c, n] s a, b, c 1 a n 3 takové, že a + b + c + n = i; (těch je jen konečně mnoho) (3) i := i + 1; (4) jdi na (2). V našem příkladu je čtveřice [1 1 1 3] vygenerována řádkem (2) s i = 6, následující čtyři čtveřice řádkem (2) s i = 7 a následující tři čtveřice představují část výstupu řádku (2) s i = 8. 6

odpoveď y), pak říkáme, že P (x) konverguje a píšeme P (x). Pokud P (x) konverguje pro každé x, řekneme, že je totální. 3.5. Zápisem P (x) Q(x) se míní tvrzení: P (x) konverguje právě tehdy, když konverguje Q(x), a konvergujíli, potom se jejich hodnoty rovnají (tzv. podmíněná rovnost). Jinými slovy: buď jsou oba výrazy definovány a označují totéž číslo, anebo není definován ani jeden z nich. 3.6. Všimněme si též podstatné věci: jednu funkci lze počítat pomocí více programů. Například program program a program y := 2*x, y := 2*x + 1-1 y := x + x počítá tutéž funkci, vždy f(x) = 2x. Pokaždé je však program zapsán jinak; zápis programu představuje jinou posloupnost symbolů a formálně tedy jde o tři různé Turignovy stroje. Není těžké nahlédnout, že libovolnou funkci lze počítat pomocí nekonečně mnoha různých programů. Máme-li dva Turingovy stroje, které počítají funkce f a g, řekneme, že oba stroje počítají stejnou funkci, platí-li pro libovolné x f(x) g(x). 4. Kódování programů 4.1. Každý program je konečný objekt. Je-li napsán v nějakém programovacím jazyce, je jeho text konečně dlouhý. Taktéž Turingův stroj je konečný objekt: má konečnou abecedu, konečně mnoho stavů, konečně velkou tabulkou popsatelnou přechodovou funkci atd. Proto lze libovolný Turinguv stroj zapsat jako konečně dlouhou posloupnost symbolů z nějaké abecedy. A přesně podle idejí z kapitoly 2 lze posloupnosti popisující Turingovy stroje taktéž 7

efektivně kódovat pomocí přirozených čísel. Číslo, do kterého je zakódován Turingův stroj, nazveme Gödelovým číslem tohoto stroje. 3 5. Universální Turingův stroj 5.1. V praxi se často setkáváme s programy, které jako svá vstupní data dostávají zápisy jiných programů. Může jít o překladače, kompilátory, simulátory apod. Přesne takto pracuje universální Turinguv stroj U(e, x). Je-li e Gödelovým číslem nějakého Turingova stroje T, pak universální stroj U nejprve z čísla e rozkóduje slovo, které popisuje stroj T (tedy jeho abecedu, stavový prostor, přechodovou funkci atd.) a poté simuluje jeho výpočet nad vstupem x. Proto pro libovolné číslo x platí U(e, x) T (x). 6. Rekursivní a částečné rekursivní funkce 6.1 Zastavme se nyní nad pojmem funkce a způsobem jejího zadání detailněji. Funkci typu f : N N lze popsat jako jistou množinu F sestávající z dvojic přirozených čísel splňující, že neobsahuje žádné dvě dvojice [x 1, y 1 ], [x 2, y 2 ] s x 1 = x 2 a y 1 y 2. (Množině F se také někdy říká graf funkce f). Je-li [x, y] F, píšeme f(x) = y a říkáme: funkce f je pro vstup (argument) x definována a její funkční hodnota je y. Pokud pro dané x množina F neobsahuje žádnou dvojici tvaru [x, ], říkáme, že funkce f pro vstup (argument) x není definována. Definičním oborem funkce f rozumíme množinu dom(f) = {x : množina F obsahuje dvojici [x, ]}. Jestliže dom(f) = N, říkáme, že funkce f je totální. 3 Toto kódování musí splňovat podmínku, že každému Turingově stroji je jednoznečně přiřazeno přirozené číslo (tedy žádné dva různé Turingovy stroje nemají stejné Gödelovo číslo). Při konkrétní konstrukci kódování se však může stát, že některým přirozeným číslům nebude odpovídat žádný Turingův stroj principiálně v tom není žádný problém; těmto číslům stačí přiřadit např. nějaký triviální stroj (třeba takový, který vůbec nečte vstup a na výstup dává nulu). 8

6.2 Množina F může obsahovat nekonečně mnoho dvojic. Takovou nekonečnou množinu F nemůžeme napsat do konečné tabulky. Proto je přirozený jiný konečný popis množiny F : popíšeme algoritmus, který k danému x zkonstruuje y takové, že [x, y] F (z definice máme zaručeno, že existuje nanejvýš jedno takové y). Například: zápis y = x + 1 již dostatečně jasně popisuje algoritmus, který k danému x zkonstruuje y. 6.3. Otázkou je, zdali lze zkonstruovat algoritmus vždy, ať je množina F jakákoliv; uvidíme záhy, že to možné není. 6.4. Zavedeme proto několik užitečných pojmů. Všechny funkce, jejichž výpočet lze realisovat pomocí Turingova stroje, nazveme částečnými rekursivními funkcemi. Přesněji: funkce f je částečná rekursivní, jestliže existuje program (Turingův stroj) P (x) takový, že 1. kdykoliv je y = f(x) definováno, program P (x) skončí a na výstup zapíše y, 2. není-li f(x) definováno, program P (x) neskončí (počítá do nekonečna). Přirozeně přebereme již zavedenou terminologii: pro dané x symbol f(x) označuje, že hodnota funkce f(x) není definována a říkáme, že f(x) diverguje. Symbol f(x) naopak značí, že hodnota f(x) je definována a říkáme, že f(x) konverguje. 6.5. Poznámka. Slovo rekursivní zde znamená, že funkce je vyčíslitelná Turingovým strojem; slovo částečná označuje, že nemusí být definována pro všechna přirozená čísla, tj. že může pro některé vstupy divergovat. 6.6. Jestliže výpočet částečné rekursivní funce f(x) pro libovolné x skončí, znamená to, že definičním oborem funkce f je celá množina přirozených čísel. Tyto funkce nazveme totálně rekursivní funkce nebo jen krátce rekursivní funkce. 6.7. Příklad. Všechny běžné funkce nad přirozenými čísly jsou rekursivní: např. sčítání, násobení, mocniny. Rekursivní je i tzv. věžičková (též Ackermannova) funkce A: A(1) = 2, A(2) = 2 2 2, A(3) = 2 22, A(4) = 2 222, A(5) = 2 222, atd. Jiným příkladem může být funkce splňující f(x) = 0, je-li x sudé, a f(x) = 1, je-li x liché. 9

6.8. Rekursivní funkce mají jednu podstatnou vlastnost: máme zaručeno, že výpočet nad libovolným vstupem někdy skončí. Zatímco v případě částečných rekursivních funkcí tuto jistotu nemáme, neboť při zadání x na vstup nevíme, zdali nebude Turingův stroj počítat do nekonečna. 6.9. Pro Turingovy stroje jsme zavedli pojem Gödelova čísla je to přirozené číslo, které je danému stroji jednoznačně přiřazeno a z nějž lze Turingův stroj (program) efektivně dekódovat. Protože rekursivní i částečné rekursivní funkce jsou zavedeny pomocí Turingových strojů, budeme hovořit i o Gödelových číslech rekursivních a částečných rekursivních funkcí. 6.10. Přirozeně budeme také hovořit o rekursivních a částečných rekursivních funkcích více promenných. Zobecnění je přímočaré: jedná se o funkce, které vyčíslují Turingovy stroje, které dostávají na vstup více proměnných, jak jsme diskutovali v části 2.5. Budeme přirozeně hovořit i o jejich Gödelových číslech. 6.11. Fuknce, které jsou rekursivní nebo částecné rekursivní, jsou hezké v tomto smyslu: jsou popsatelné pomocí algoritmů (tak, jak jsme částečné rekursivní a rekursivní funkce zavedli). Již na tomto místě je vidět, že naprostou většinu funkcí prostřednictvím algoritmu nelze popsat: všech funkcí typu f : N N je nespočetně mnoho, zatímco algoritmů (tedy: konečných popisů) je pouze spočetně mnoho. V dalším textu uvidíme, že existují i na první pohled velice jednoduché funkce, které nelze vyčíslovat pomocí algoritmů. I přesto, že většina funkcí, se kterými se v životě setkáme, je rekursivní, ukážeme, že ve skutečnosti jsou možnosti algoritmů velice omezené. 7. Universální funkce 7.1. Následující tvrzení je jednoduché, avšak velmi užitečné. Přímo plyne z existence universálních Turingových strojů: Tvrzení o universálních funkcích. Existuje universální částečná rekursivní funkce ψ 1 (e, x) pro třídu částečných rekursivních funkcí jedné proměnné. Tedy, je-li e Gödelovo číslo částečné rekursivní funkce f(x), pak pro všechna x platí ψ 1 (e, x) f(x). 10

Funkce ψ 1 (e, x) je vlastně universální Turingův stroj z čísla e rozkóduje stroj, který je v něm zakódován, a simuluje jeho výpočet nad číslem x. 7.2. Podobně lze toto tvrzení rozšířit i na universální funkce pro třídu částečných rekursivních funkcí dvou, tří, čtyř či více proměnných: Existují universální částečné rekursivní funkce pro třídu částečných rekursivních funkcí n proměnných. Tedy, je-li e Gödelovo číslo částečné rekursivní funkce f(x 1, x 2,..., x n ), pak pro všechna x 1, x 2,..., x n platí ψ n (e, x 1, x 2,..., x n ) f(x 1, x 2,..., x n ). 7.3. Zdůrazněme podstatný fakt: protože funkce ψ n počítají Turingovy stroje, jsou tyto funkce samy částečné rekursivní. Mimo jiné to znamená, že tyto funkce mají svá Gödelova čísla. 8. Efektivní a neefektivní popis funkcí 8.1. Příklad. V části 6.11. jsme uvedli, že možnosti algoritmů při vyčíslování funkcí jsou velmi omezené. Uveďme zde jednoduchý příklad. Uvažme funkci f, která je popsána množinou dvojic přirozených čísel { ψ1 (x, x) + 1, je-li ψ F = {[x, y] : x N a y = 1 (x, x), 0 jinak 4 }. To je korektní popis funkce f. Z definice je tato funkce totální. Snadno však ukážeme, že nemůže být rekursivní. Kdyby byla rekursivní, mohli bychom vzít její Gödelovo číslo e a dostali bychom, že f(e) ψ 1 (e, e) f(e) + 1, což není možné. (Tato podmíněná rovnost by měla smysl pouze tehdy, pokud by výraz f(e) nebyl definován. Funkce f však byla zavedena jako totální.). Rovněž bychom mohli argumentovat takto: funkce f se od každé částečné 4 Hodnoty 0 funkce nabývá, jestliže (a) x není číslem žádné částečné rekursivní funkce anebo (b) x je číslem částečné rekursivní funkce a tato funkce na vstupu x diverguje. 11

rekursivní funkce liší. Pokud částečná rekursivní funkce s Gödelovým číslem x na vstupu x diverguje, musí být odlišná od f, neboť pro toto x je f(x) = 0. Pokud funkce s číslem x na vstupu x konverguje, musí být také odlišná od f, neboť pro toto x se jejich funkční hodnoty f(x) a ψ 1 (x, x) liší o jedničku. Proto se funkce f liší od všech částečných rekursivních funkcí. (Tato funkce bývá někdy nazývána jako tzv. diagonálně nerekursivní funkce). 8.2. Podali jsme tzv. neefektivní popis funkce f. Ačkoliv jsme funkci f zadali pomocí množiny F, je tento popis z výpočetního hlediska natolik složitý, že žádný algoritmus nedokáže k danému x spočítat f(x). (Kdyby takový algoritmus existoval, byla by f rekursivní funkcí, což není.) Námi daný popis množiny není algoritmického typu; nedává návod, jak k danému x zkonstruovat f(x). 8.3. Metoda, kterou jsme v tomto příkladu prokázali neexistenci jistého objektu, se obvykle nazývá diagonalisace. Uvidíme, že diagonalisace je podstatou mnohých výsledků o neřešitelnosti a nerozhodnutelnosti. 9. Kleeneho normální forma 9.1. Následující úvaha nám ukáže, že v jistém kontextu neexistuje rozdíl mezi vstupními daty a vlastním programem. Již víme, že jak program (Turingův stroj), tak i jeho vstupní data lze zapsat jako slovo v nějaké abecedě, a toto slovo lze zakódovat do přirozeného čísla. Proč by tedy měl mezi nimi být nějaký významný rozdíl? Tvrzení o substituci. Existuje rekursivní funkce s 1 (e, x) taková, že pro libovolná e, x 1 a x 2 platí ψ 1 (s 1 (e, x 1 ), x 2 ) ψ 2 (e, x 1, x 2 ). 9.2. Uvědomme si, co funkce s 1 vlastně počítá. Předně si všimněme, že e zde vystupuje jako Gödelovo číslo částečné rekursivní funkce se dvěma proměnnými x 1 a x 2. Kdybychom si příslušný program, který počítá funkci s číslem e, představili v pascalském tvaru, mohl by mít například následující podobu: 12

function e(x1, x2: natural number) : natural number;... begin... z := x1 + x2 +... p := -x2 * x1 +...... end; Je-li y = s 1 (e, x 1 ), pak y je Gödelovým číslem programu, který vznikne z programu s Gödelovým číslem e tak, aby platilo ψ 1 (s 1 (e, x 1 ), x 2 ) ψ 2 (e, x 1, x 2 ). Toho lze dosáhnout třeba tak, že se všechny odkazy na vstupní proměnnou x 1 v programu e nahradí její aktuální hodnotou. Takže například program s Gödelovým číslem y = s 1 (e, 9) by přibližně mohl vypadat takto: function y(x2: natural number) : natural number;... begin... z := 9 + x2 +... p := -x2 * 9 +...... end; Zhruba lze říci, že funkce s 1 (e, x 1 ) počítá tak, že nejprve vezme program s číslem e, rozkóduje jej, a všechny symbolické odkazy na vstupní parametr x 1 nahradí aktuální hodnotou x 1 jako konstantou. Výsledný program zpět zakóduje do přirozeného čísla. Odtud také označení funkce s funkce substituční. 9.3. Že je funkce s 1 rekursivní, je evidentní: např. v části 9.2. jsme podali neformální návod, jak funkci s 1 spočítat. Čtenář nechť jako cvičení funkci s 1 naprogramuje. 9.4. Nyní už snadno nahlédneme jednoduché zobecnění substitučního principu. 13

Existují rekursivní funkce s m (e, x 1, x 2,..., x m ) takové, že pro libovolná e, x 1, x 2,..., x m a 1 m < n platí ψ n m (s m (e, x 1, x 2,..., x m ), x m+1, x m+2,..., x n ) ψ n (e, x 1, x 2,..., x n ). Uvedené tvrzení o existenci substitučních funkcí bývá nazýváno jako Kleeneho věta o normální formě nebo též tzv. s-m-n věta (podle původního Kleeneho značení). 10. Problém zastavení (problém ukončení, halting problem) 10.1. Uvažme, že máme daný program (Turingův stroj) počítající funkci f, jejíž Gödelovo číslo je e, a jeho vstup x. Máme rozhodnout, zdali f(x) nebo f(x), tedy, zdali výpočet funkce f nad vstupem x skončí nebo nikoliv. Máme možnost program spustit ale počítá-li již dlouho, jak máme usoudit, že už neskončí nikdy? Ukazuje se, že tento problém je obecně algoritmicky neřešitelný. Halting problem. Neexistuje žádný algoritmus 5, který by na svůj vstup dostal číslo programu e, jeho vstupní data x a po konečně mnoha krocích výpočtu rozhodl, zdali program s číslem e nad vstupem x svůj výpočet skončí či nikoliv. 10.2. Halting problem bychom také mohli formulovat takto: neexistuje žádná rekursivní funkce g definovaná předpisem (i) g(e, x) 1, je-li ψ 1 (e, x), a (ii) g(e, x) 0, je-li ψ 1 (e, x). 10.3. Než ukážeme, proč je halting problem algoritmicky neřešitelný, všimněme si následujícího faktu. 5 Připomeňme: slova neexistuje žádný algoritmus je třeba chápat jako neexistuje Turingův stroj a odvolat se na Churchovu tesi. 14

Můžeme sestavit jednoduchou částečnou rekursivní funkci t: function t(e, x:natural number) : natural number; begin (1) rozkóduj Turingův stroj e; (2) simuluj jeho výpočet nad vstupem x; (3) odpověz 1; end; Tato částečná rekursivní funkce odpoví 1, jestliže stroj s číslem e skončí; pokud neskončí, řádek (2) bude trvat do nekonečna a řádek (3) se nikdy neprovede. Znamená to, že funkce t dá správnou odpověď (interpretujemeli odpověď 1 jako ano, program se zastaví ), jestliže program s číslem e nad vstupem x skončí. Tato jednoduchá funkce tak splňuje podmínku (i) z definice g. To nám napovídá, že problém bude ve splnění podmínky (ii). Bližší náhled nám dá kapitola 15. 10.4. Abychom nahlédli, proč halting problém není algoritmicky řešitelný, předpokládejme, že se podaří sestavit rekursivní funkci (program) g(e, x) takovou, že g(e, x) 1, jestliže ψ 1 (e, x), a g(e, x) 0, jestliže ψ 1 (e, x). Pak také snadno sestavíme funkci (program) h takovou, že platí h(e, x), právě když ψ 1 (e, x). Program h počítá tak, že volá funkci g a ptá se, zdali ψ 1 (e, x) konverguje. Protože funkce g je podle předpokladu rekursivní, její volání skončí po konečně mnoha krocích. Pokud bude odpověď 1, program h přejde do nekonečného cyklu (typu repeat until false) a tedy nikdy neskončí. Pokud naopak obdrží odpověď 0, skončí (nyní pro nás není podstatné, co dá na výstup). Protože poslední ekvivalence platí pro libovolná e a x, musí platit též pro e = x: h(x, x), právě když ψ 1 (x, x). Funkce h(x, x) je částečnou rekursivní funkcí jedné proměnné; nechť její Gödelovo číslo je x 0. Platí proto h(x, x) ψ 1 (x 0, x). 15

Potom by pro volbu x = x 0 platilo což je jinými slovy h(x 0, x 0 ), právě když ψ 1 (x 0, x 0 ), ψ 1 (x 0, x 0 ), právě když ψ 1 (x 0, x 0 ). To samozřejmě není možné program nemůže konvergovat, právě když diverguje. Náš předpoklad, že je možné sestavit rekursivní funkci g(e, x), vede k logickému sporu. 10.5. V části 10.3. jsme sestavili částečnou rekursivní funkci t, která je zúžením 6 funkce g. Uvedený spor nás však vede k závěru, že funkce g nemůže být rekursivní, a tudíž částečnou rekursivní funkci t nelze rozšířit 7 na rekursivní funkci g. Pokud tedy budeme mít program, který počítá nějaké rozšíření funkce t, nutně existuje nějaký vstup, na kterém musí divergovat. 10.6. Z uvedené úvahy 10.4. plyne závěr, který často budeme využívat v dalším textu: neexistuje algoritmus, který by rozhodoval, zdali ψ 1 (x, x) konverguje či diverguje. Funkce jedné proměnné g (x) = g(x, x) není rekursivní. Zopakujme znovu argument z 10.3. Kdyby g byla rekursivní, sestavíme snadno program h(x) takový, že h(x) právě když ψ 1 (x, x). Vezmeme-li Gödelovo číslo x 0 funkce h, máme h(x) ψ 1 (x 0, x). Protože h(x), právě když ψ 1 (x, x), platí také: ψ 1 (x 0, x) právě když ψ 1 (x, x). Protože tato ekvivalence platí pro libovolné x, musí platit i pro x = x 0, a tak dostáváme spor: ψ 1 (x 0, x 0 ) právě když ψ 1 (x 0, x 0 ). 10.7. Lze ukázat i více: je-li G(x) libovolné rozšírení funkce g (x), pak lze efektivně (tj. pomocí algoritmu) najít vstup x 0 takový, pro který G(x 0 ). Našli jsme tedy příklad částečné rekursivní funkce, kterou nelze rozšířit na funkci rekursivní, a dokonce lze algoritmicky hledat body, na kterých rozšiřování selhává. 10.8. V dalším textu uvidíme, že některé další problémy jsou algoritmicky neřešitelné. Patří mezi ně mimo jiné i následující: rozhodnout, zdali dva programy (Turingovy stroje) počítají stejnou funkci, 6 To znamená: dom(t) dom(g) a kdykoliv je t(e, x) definováno, platí t(e, x) = g(e, x). 7 Rozšíření je opakem zúžení: g je rozšířením t, je-li t zúžením g. 16

rozhodnout, zdali se daný program (Turingův stroj) zastaví nad konečně mnoha vstupy, rozhodnout, zdali daná funkce je rekursivní, rozhodnout, zdali daná formule jazyka aritmetiky je dokazatelná (např. v Peanově aritmetice), rozhodnout, zdali daná rovnice tvaru p(x 1, x 2,..., x n ) = 0, kde p je polynom s celočíselnými koeficienty, má řešení v oboru celých čísel, rozhodnout, zdali daná množina přirozených čísel je prázdná, rozhodnout, zdali daná bezkontextová gramatika je LL gramatikou, rozhodnout, zdali průnik jazyků generovaných dvěma bezkontextovými gramatikami je prázdný, rozhodnout, zdali daná kontextová gramatika generuje prázdný jazyk, rozhodnout, zdali daná bezkontextová gramatika generuje jazyk obsahující všechna slova příslušné abecedy, rozhodnout, zdali jazyk generovaný bezkontextovou gramatikou je regulární. 11. Rekursivní množiny 11.1. Množinu přirozených čísel A nazveme rekursivní množinou, je-li její chakakteristická funkce rekursivní. Připomeňme, že charakteristická funkce množiny je funkce χ A (x) = 1, je-li x A, a χ A (x) = 0, je-li x A. Přeloženo do jazyka algoritmů to znamená, že o příslušnosti do množiny dokážeme rozhodovat pomocí algoritmu. Přesněji: existuje algoritmus takový, že pro libovolné x skončí a na výstup zapíše, zdali x je či není prvkem množiny. 17

11.2. Příklad. Množina sudých čísel je rekursivní. Množina prvočísel je rekursivní. Prázdná množina je rekursivní. Každá konečná množina je rekursivní, neboť lze napsat konečný seznam jejích prvků. 11.3. Již mnohokrát jsme nahlédli, že veškeré konečné objekty je možné kódovat přirozenými čísly. V případě množin čísel objektů, které mají jistou vlastnost, též můžeme zkoumat, jsou-li rekursivní či nikoliv. Například množina čísel, které jsou kódy tautologií výrokové logiky, je rekursivní: snadno si představíme algoritmus, který o dané formuli výrokové logiky rozhodne, je-li tautologií či nikoliv (například tak, že zkusí dosadit všechna možná ohodnocení výrokových promenných důležité je, že v každé formuli se těchto proměnných vyskytuje jen konečně mnoho). 11.4. Příklad. Množina K = {x : ψ 1 (x, x) } není rekursivní. Kdyby byla rekursivní, musel by existovat algoritmus, který rozhoduje o tom, zdali dané číslo x do množiny patří; to by však byl algoritmus, který by řešil halting problem, a takový algoritmus neexistuje. Podobně například množina dvojic přirozených čísel ze stejného důvodu není rekursivní. K = {[e, x] : ψ 1 (e, x) } 12. Rekursivně spočetné množiny 12.1. Množinu přirozených čísel A nazveme rekursivně spočetnou, jestliže je definičním oborem nějaké částečné rekursivní funkce. Rekursivně spočetné množiny jsou tedy množiny čísel, na kterých konvergují částečné rekursivní funkce. Například množina čísel K = {x : ψ 1 (x, x) } je rekursivně spočetná, neboť funkce ψ 1 (x, x) je částečná rekursivní (ale víme, že K není rekursivní). 12.2. Každá rekursivní množina je samozřejmě i rekursivně spočetná. Je-li totiž W rekursivní množina, máme její rekursivní charakteristickou funkci 18

χ W (x). Snadno pak sestavíme částečnou rekursivní funkci (program) f takovou, že platí f(x), jestliže x W, a f(x), jestliže x W (na příslušnost x W se stačí zeptat rekursivní funkce χ W (x) a program případně poslat do nekonečného cyklu). Je zřejmé, že množina W je definičním oborem částecné rekursivní funkce f, a proto je rekursivně spočetná. Dostali jsme tak: třída rekursivních množin třída rekursivně spočetných množin. 12.3. Rekursivně spočetné množiny jsou z algoritmického hlediska složitejší než množiny rekursivní: zatímco v případě rekursivní množiny jsme schopni efektivně rozhodovat o každém x, zdali do množiny patří nebo ne, v případě rekursivně spočetných množin je tento problém obtížnější. Máme například rozhodnout, zdali číslo x patří do množiny K. Množina K je zadána jako definiční obor částečné rekursivní funkce ψ 1 (x, x) a je tedy rekursivně spočetná. Máme-li rozhodnout, zdali dané x patří do K, můžeme spustit program ψ 1 (x, x) a čekat: pokud se zastaví, víme, že x K. Program se však zastavit nemusí. V konečném čase (tj. po konečném počtu kroků) tak neobdržíme informaci, že x K. Protože však K není rekursivní, principiálně neexistuje žádná chytřejší metoda, jak informaci x K získat. 12.4. Poznámka. Intuitivně bychom mohli například očekávat, že na základě popisu algoritmu (částečné rekursivní funkce s číslem e) je možné nějak určit, jak dlouho bude nad daným vstupem x počítat; nebo alespoň najít rekursivní horní mez h takovou, že jestliže ψ 1 (e, x) konverguje, pak konverguje nanejvýš za h(e, x) kroků 8. To ovšem není možné kdyby taková funkce h byla rekursivní, mohli bychom opět řešit halting problem tak, že spustíme výpočet ψ 1 (e, x), počkáme nanejvýš h(e, x) kroků, a pokud do té doby výpočet neskončí, prohlásíme, že ψ 1 (e, x) diverguje. To by byl rekursivní postup, který by řešil halting problem. 8 Krokem zde myslíme přechod z jedné konfigurace Turingova stroje do konfigurace následující. 19

Někdy bývá tento výsledek formulován tak, že neexistují rekursivní majoranty (horní odhady) na počet kroků výpočtu částečných rekursivních funkcí. Znamená to, že u některých programů principiálně nedokážeme ani odhadnout, jak dlouho budou nad daným vstupem počítat. 12.5. Je přirozené zavést Gödelova čísla rekursivně spočetných množin. Je-li množina W definičním oborem částečné rekursivní funkce s číslem e, nazveme ji e-tou rekursivně spočetnou množinou a označíme symbolem W e. 12.6. Halting problem je pak možné reformulovat jako problém rozhodnout, zdali pro dané e platí e W e nebo e W e. Množina W e je definována jako definiční obor funkce s číslem e, a tak platí A tedy Je též vidět, že x W e, právě když ψ 1 (e, x). e W e, právě když ψ 1 (e, e). e W e, právě když e K. Halting problem je proto možné ekvivalentne formulovat jako problém rozhodnout, zdali pro dané e platí ψ 1 (e, e), zdali e W e či je-li e K. Všechny tyto formulace jsou rovnocenné. 13. Enumerovatelnost rekursivně spočetných množin 13.1. Již víme, že v případě rekursivně spočetné množiny obecně nelze rozhodnout, zdali dané x je jejím prvkem. Je však možné vytvořit algoritmickou proceduru, která bude na výstup postupně psát všechny prvky dané rekursivně spočetné množiny. Takový postup se někdy nazývá exhaustace hledáme-li prvek množiny, postupně probíráme všechny její prvky a čekáme, zdali se hledaný prvek objeví na výstupu. Bohužel se opět může stát, že v případě, kdy hledaný prvek do množiny nepatří, budeme čekat nekonečně dlouho. 20

13.2. Nechť W je rekursivně spočetná množina, která je definičním oborem částečné rekursivní funkce, kterou počítá Turingův stroj T. Následující procedura postupně generuje všechny prvky množiny W : (1) i := 0; (2) for j := 0 to i do (3) simuluj výpočet T nad vstupem j po dobu i kroků (pokud konverguje po méně než i krocích, jdi na řádek (4)); (4) if výpočet T konverguje nanejvýš po i krocích then napiš číslo j na výstup; (5) end for (6) i := i + 1; (7) jdi na (2). 13.3. Poznámka. Samozřejmě lze namítnout, že tato procedura bude dávat některé prvky množiny W opakovaně; není však težké si představit, že všechna doposud nalezená čísla se zapamatují v nějakém seznamu (po konečně mnoha krocích je vždy nalezeno jen konečně mnoho čísel) a na výstup se číslo zapíše pouze tehdy, není-li obsaženo v tomto seznamu. 13.4. Procedura počítá takto: například pro i = 2 zkouší, zdali po dvou (nebo méně) krocích konverguje stroj T nad vstupy 0, 1, 2. Pro i = 3 zkouší, zdali po třech (nebo méně) krocích konverguje stroj T nad vstupy 0, 1, 2, 3. Pro i = 4 zkouší, zdali po čtyřech (nebo méně) krocích konverguje stroj T nad vstupy 0, 1, 2, 3, 4. A tak dále. Je zřejmé, že je-li dané x prvkem W, musí stroj T nad vstupem x skončit po nějakém počtu kroků, řekněme s. Potom naše procedura číslo x zapíše na výstup nejpozději v cyklu odpovídajícímu i = max(x, s). 13.5. Tato vlastnost, že prvky rekursivně spočetných množin lze postupně generovat, se nazývá enumerovatelnost. Lze ukázat, že všechny množiny, které lze popsaným způsobem enumerovat, jsou rekursivně spočetné. Uvažujme takto: mějme proceduru P, která enumeruje prvky nějaké množiny W. Napišme program (částečnou rekursivní funkci) f(x) takovou, že spustí program P a čeká, až se na jeho výstupu objeví číslo x. Jakmile se objeví, program f ukončí enumeraci P a skončí (na výstup dá třeba nulu). Množina W je definičním oborem částečné rekursivní funkce f, a proto je rekursivně spočetná. 13.6. Poznámka. Objev nerekursivních rekursivně spočetných množin vzbudil ve své době velký ohlas. Jsou to množiny, jejichž prvky dokážeme pomocí 21

algoritmu enumerovat, avšak neexistuje žádný algoritmus, který by rozhodoval o příslušnosti daného prvku do množiny. 13.7. Na druhou stranu je evidentní, že rekursivně spočetné množiny obecně nelze enumerovat rostoucím způsobem, tj. nejprve zapsat na výstup nejmenší prvek, pak druhý nejmenší atd. Vezměme například množinu K. Ta je rekursivně spočetná a je nekonečná 9. Kdyby bylo možné její prvky enumerovat rostoucím způsobem, musela by množina K být rekursivní. Uvažme: kdybychom se ptali, zda dané x je prvkem množiny K, stačilo by spustit hypotetický algoritmus, který enumeruje prvky K rostoucím způsobem. Jakmile by se na výstupu ocitlo nějaké y > x (a to se určitě ocitne, neboť K je nekonečná), mohli bychom enumeraci ukončit a měli bychom jistotu, že x K. Takovým způsobem bychom opět mohli řešit halting problem popsaný postup je rekursivní. Proto nexistuje algoritmus, který by dokázal prvky rekursivně spočetných množin enumerovat jako rostoucí posloupnost. 14. Obsahuje rekursivní množina jedničku? 14.1. Rekursivní množiny jsou (velice) jednoduché. Máme-li k disposici Gödelovo číslo charakteristické funkce množiny A, dokážeme o libovolném x rozhodnout, je-li prvkem A či nikoliv. Ukážeme však, že rekursivní množiny lze zadat i způsobem, který nám do značné míry komplikuje život: rekursivní množinu lze zadat tak, že nedokážeme algoritmicky rozpoznat či zkonstruovat její charakteristickou funkci. 14.2. Příklad. Uvažme částečnou rekursivní funkci f takovou, že f(t, x), právě když t K a zároveň x = 1. Program, který vyčísluje funkci f, je velmi jednoduchý: procedure f(t, x : natural number); begin if x 1 then přejdi do nekonečného cyklu else enumeruj prvky K a nalezneš-li číslo t, ukonči enumeraci a skonči; end; 9 Množina K musí být nekonečná. Kdyby byla konečná, byla by rekursivní, což není. 22

Funkce f je částečná rekursivní funkce dvou proměnných. Označme e její Gödelovo číslo. Platí t K a zároveň x = 1 f(t, x) ψ 2 (e, t, x) ψ 1 (s 1 (e, t), x). právě když právě když právě když Na t nahlížejme jako na parametr. Jak vypadá rekursivně spočetná množina s číslem s 1 (e, t)? W s1 (e,t) = {x : ψ 1 (s 1 (e, t), x) } = {x : t K a zároveň x = 1} = = { {1}, je-li t K,, je-li t K. Ať je hodnota parametru t libovolná, je množina W s1 (e,t) rekursivní buď je prázdná, anebo obsahuje jediný prvek, jedničku. Vidíme však, že rozhodnout, zdali 1 W s1 (e,t), nelze algoritmicky. Kdyby totiž existovala procedura, která rozhoduje o náležení 1 do množiny W s1 (e,t), mohli bychom ji volat pro různé hodnoty parametru t a měli bychom tak rekursivní algoritmický postup řešící halting problem. Takový ovšem neexistuje. 14.3. Ukázali jsme příklad, kdy máme zadánu rekursivní množinu, avšak nemáme k disposici její charakteristickou funkci. Tato charakteristická funkce bezpochyby existuje; neexistuje však algoritmus, který by ji (její Gödelovo číslo) nalezl. (Přesněji: neexistuje algoritmus, který by rozhodoval, zdali dané číslo d je charakteristickou funkcí rekursivní množiny W s1 (e,t)). A tudíž, ačkoliv je množina W s1 (e,t) rekursivní, neexistuje algoritmus, který by rozhodl, zdali 1 je jejím prvkem. 15. Postův princip 15.1. Postův princip dává do vztahu rekursivní a rekursivně spočetné množiny: 23

Množina je W rekursivní, právě když obě množiny W a co-w jsou rekursivně spočetné. (Množinu co-w nazýváme doplňkem množiny W ; obsahuje všechna přirozená čísla, která nepatří do množiny W ). 15.2. Rozeberme obě implikace. Je-li množina W rekursivní, dokážeme o náležení i nenáležení prvku do této množiny rozhodovat algoritmicky. Je proto samozřejmě ona sama i její doplněk rekursivní, tím spíše rekursivně spočetné. Je-li množina W i její doplněk co-w rekursivně spočetný, znamená to, že je možné prvky W i jejího doplňku enumerovat. Abychom ukázali, že množina W je rekursivní, je třeba popsat algoritmus, který o libovolném x v konečném čase rozhodne, zdali x W nebo nikoliv. To je však snadné: spusťme vedle sebe 10 dvě procedury, jedna bude enumerovat prvky W a druhá prvky co-w. Je zřejmé, že po konečně mnoha krocích výpočtu se číslo x musí objevit na výstupu jedné z procedur (protože jinam než do W nebo co-w číslo x patřit nemůže). Podle toho lze odpovědět, zdali x W (jestliže se x objevilo na výstupu procedury enumerující prvky W ) nebo x W (jestliže se x objevilo na výstupu procedury enumerující co-w ). Tak jsme popsali rekursivní charakteristickou funkci množiny W. 15.3. Již víme, že množina K = {x : ψ 1 (x, x) } je rekursivně spočetná, avšak není rekursivní. Díky Postově principu můžeme nyní ukázat: Doplněk K, tedy množina není rekursivně spočetná. co-k = {x : ψ 1 (x, x) } Kdyby co-k byla rekursivně spočetná, pak by podle Postova principu musela být množina K rekursivní (neboť by K i co-k byly rekursivně spočetné), což není. Vidíme tedy příklad množiny, která je v jistém smyslu algoritmicky dosti neuchopitelná. Lze například ukázat, že prvky množiny co-k nelze enumerovat. 15.4. Postův princip lze reformulovat i takto: není-li množina co-w rekur- 10 Slova spustit dvě procedury vedle sebe lze nahlédnout třeba tak, že oba programy budou pracovat střídavě: sudé kroky výpočetního času se přidělí první proceduře, liché kroky druhé proceduře. 24

sivně spočetná, pak W nemůže být rekursivní. 15.5. Podobně se chovají i další množiny: například množina (kódů) formulí, které nejsou dokazatelné v aritmetice, není rekursivně spočetná. 16. Pevné body částečných rekursivních funkcí 16.1. O pevných bodech funkcí se hovoří zejména v základních kursech matematické analýzy. Jednoduchou motivací je následující Fakt. Libovolná funkce f : R R, která je spojitá a která zobrazuje interval 0, 1 na interval 0, 1, má pevný bod. (Pevný bod je x 0 takové, že f(x 0 ) = x 0 ). Různé modifikace této myšlenky se uplatňují např. při řešení soustav diferenciálních rovnic. V teorii algoritmů lze také ukázat, že částečné rekursivní funkce mají své pevné body. 16.2. Pevným bodem částečné rekursivní funkce f rozumíme číslo x 0 takové, že pro libovolné x platí ψ 1 (x 0, x) ψ 1 (f(x 0 ), x). To znamená, že program s číslem x 0 a program s číslem f(x 0 ) počítá stejnou funkci. (Ačkoliv se může jednat o dva různé programy v části 3.5. jsme upozornili, že jednu funkci lze počítat nekonečne mnoha různými programy. To, že jsou dva programy různé, zde znamená, že se jedná o dva formálně odlišné Turingovy stroje). 16.3. Tvrzení o pevném bodě (nazýváno též tvrzením o rekursi) pro funkce jedné promenné říká: Každá částečná rekursivní funkce jedné proměnné má pevný bod. 16.4. Abychom nahlédli toto tvrzení, vezměme libovolnou částečnou rekursivní funkci f; popíšeme konstrukci jejího pevného bodu. Uvažme funkci f(s 1 (z, z)). Připomeňme, že s 1 je substituční funkce z kapitoly 9; víme již, že je rekursivní. Funkce f(s 1 (z, z)) je částecná rekursivní funkce (neboť vznikla složením částečné rekursivní funkce s funkcí rekursivní) jedné proměnné z. Nechť nyní je e Gödelovo číslo částečné rekursivní funkce dvou 25

proměnných ψ 1 (f(s 1 (z, z)), x) 11. Proto pro libovolné x platí ψ 1 (f(s 1 (z, z)), x) ψ 2 (e, z, x). Opětovným použitím substituční funkce dostaneme ψ 2 (e, z, x) ψ 1 (s 1 (e, z), x). Spojením obou podmíněných rovností máme ψ 1 (f(s 1 (z, z)), x) ψ 1 (s 1 (e, z), x). Uvedená podmíněná rovnost platí pro libovolné z. Platí tedy i pro konkrétní volbu z = e: ψ 1 (f(s 1 (e, e)), x) ψ 1 (s 1 (e, e), x) a odtud již vidíme, že pevným bodem je číslo x 0 = s 1 (e, e), neboť pak pro libovolné x platí ψ 1 (f(x 0 ), x) ψ 1 (x 0, x). 16.5. Dokonce vidíme více, než tvrdí věta o rekursi: nejen, že pevný bod existuje, ale je možné jej i algoritmicky najít. Jinými slovy: z kódu funkce f je možné algoritmicky sestrojit číslo x 0 = s 1 (e, e), neboť algoritmicky lze najít číslo e, které je kódem funkce dvou promenných ψ 1 (f(s 1 (z, z)), x), a dosadit jej do rekursivní funkce s 1. 17. Aplikace pevných bodů: Riceho princip 17.1. V tomto odstavci ukážeme, že algoritmicky rozhodovat, zdali dva programy počítají stejnou funkci, není možné. Tento výsledek bývá nazýván jako Riceho princip. 17.2. Připomeňme opět, že jednu částečnou rekursivní funkci lze počítat pomocí nekonečně mnoha programů (formálně odlišných Turingových strojů). Je-li f libovolná částečná rekursivní funkce, pak množina F = {e : f(x) ψ 1 (e, x)} 11 To je funkce, která simuluje výpočet funkce s číslem f(s 1 (z, z)) nad vstupem x. 26

je množina všech Gödelových čísel Turingových stroju, které počítají funkci f. Protože každou částečnou rekursivní funkci lze počítat pomocí nekonečně mnoha programů (formálně odlišných Turingových strojů, viz 3.6.), je množina F nekonečná. 17.3. Riceho princip tvrdí, že množina F není rekursivní. Tedy, není možno algoritmicky rozhodovat, zdali dva Turingovy stroje počítají stejnou funkci. Jinými slovy, ze zápisu dvou programu není možné algoritmicky rozhodnout, zdali oba se chovají nad libovolným vstupem stejně. 17.4. Abychom nahlédli, že množina F není rekursivní, pokusme se odvodit z předpokladu její rekursivity logický rozpor. Zvolme dvě čísla a a b taková, že a F a b F. Kdyby množina F byla rekursivní, snadno sestavíme program (rekursivní funkci) g(x) takový, že g(x) b, kdykoliv x F a g(x) a, kdykoliv x F. Protože uvažujeme, že F je rekursivní, bude funkce g rekursivní. Funkce g však má svůj pevný bod x 0, a tedy funkce s čísly x 0 i g(x 0 ) jsou stejné; proto buď obě čísla x 0 i g(x 0 ) musí patřit do množiny F, anebo ani jedno z nich. Uvažme: (1) Jestliže x 0 F, pak g(x 0 ) = b. Číslo b bylo zvoleno tak, že b F. Tedy z předpokladu, že x 0 F plyne, že g(x 0 ) F. Avšak obě čísla, x 0 i g(x 0 ), jsou čísla stejné funkce, a proto by musela obě ležet uvitř F nebo obě mimo F. (2) Jestliže x 0 F, pak g(x 0 ) = a. Číslo a bylo zvoleno tak, že a F. Tedy z předpokladu, že x 0 F plyne, že g(x 0 ) F. Opět dostáváme stejný rozpor: obě čísla, x 0 i g(x 0 ), jsou čísla stejné funkce, a proto by musela obě ležet uvitř F nebo obě mimo F. Vidíme, že předpoklad rekursivity množiny F a z ní vyplývající možnost zkonstruovat funkci g vede ke sporu. Musíme tedy učinit závěr, že množina F není rekursivní. 17.5. Kdyby množina F rekursivní byla, mohli bychom učinit následující úvahu: máme dva programy fa g a ptáme se, zdali oba počítají stejnou 27

funkci, zda tedy pro libovolné x platí f(x) g(x). Můžeme zkonstruovat množinu F kódů funkce f a ptát se, zdali číslo funkce g patří do množiny F. Pokud by množina F byla rekursivní, měli bychom zaručeno, že od její charakteristické funkce obdržíme odpověď. Dokázali bychom tak rozhodovat o ekvivalenci programů. Díky tomu, že F není rekursivní, však vidíme, že to principiálně není možné. 18. Nerozlišitelnost rekursivních a částečných rekursivních funkcí 18.1. V této kapitole ukážeme, že neexistuje algoritmus, který by rozhodoval, zdali daná částečná rekursivní funkce s Gödelovým číslem e má za definiční obor množinu všech přirozených čísel (tj. zdali je totální). Jinými slovy: neexistuje algoritmus, který by o programu rozhodl, zdali se pro každý vstup zastaví. Ješte jinak: neexistuje algoritmus, který by o dané částečné rekursivní funkci rozhodl, je-li rekursivní. V tomto smyslu jsou rekursivní a částečné rekursivní funkce od sebe nerozlišitelné. (V kapitole 25 uvidíme o tomto problému více.) 18.2. Kdybychom uměli rozhodovat, zdali daný program s číslem e se zastaví pro každý vstup, pak by množina byla rekursivní. T ot = {e : funkce ψ 1 (e, x) je totální} Zvolme číslo a T ot a číslo b T ot (tedy b co-t ot). Protože předpokládáme, že množina T ot je rekursivní, můžeme sestavit rekursivní funkci g(x) b, kdykoliv x T ot a g(x) a, kdykoliv x T ot. (Program g(x) počítá tak, že volá χ T ot (x) a obdrží-li odpověď 1, skončí a na výstup dá b; obdrží-li odpověď 0, skončí a na výstup dá a). Označme x 0 pevný bod funkce g(x). To znamená, že programy s číslem x 0 a g(x 0 ) počítají stejnou funkci; proto musí obě tato čísla patřit do množiny T ot anebo obě patřit do množiny co-t ot. 28

(1) Jestliže x 0 T ot, pak g(x 0 ) = b. Číslo b však bylo záměrně zvoleno tak, že b co-t ot. Proto dostáváme, že z x 0 T ot plyne g(x 0 ) T ot, což není možné, protože se nemůže stát, že by jedno z čísel x 0 a g(x 0 ) = b patřilo do množiny T ot a druhé nikoliv. (2) Jestliže x 0 T ot, pak g(x 0 ) = a. Číslo a však bylo záměrně zvoleno tak, že a T ot. Proto dostáváme, že z x 0 T ot plyne g(x 0 ) T ot, což není možné, protože stejně jako v prvním případě se nemůže stát, že by jedno z čísel x 0 a g(x 0 ) = a patřilo do množiny T ot a druhé nikoliv. Předpoklad rekursivity množiny T ot vede k logickému sporu. Proto množina T ot není rekursivní. Není tudíž možné algoritmicky rozhodnout, zdali daný program skončí nad libovolným vstupem, či naopak nad některým vstupem bude počítat věčně. 19. Aritmetika 19.1. Nahlédli jsme, že konečné objekty v našem případě konečné posloupnosti symbolů a algoritmy je možné kódovat pomocí přirozených čísel. Lze proto očekávat, že i teorie algoritmů bude úzce souviset s tou partií matematiky a formální logiky, která se zabývá přirozenými čísly: s aritmetikou. 19.2. Aritmetikou budeme obecně rozumět teorii, která svá tvrzení formuluje v predikátové logice pomocí výrokových spojek (, &,,, ), predikátů rovnosti = a nerovnosti, kvantifikátorů a, obsahuje symbol pro konstantu 0 a symbol s pro následující číslo (např. s(0) je jednička) a dále pak symboly pro dvě základní operace nad přirozenými čísly: + pro sčítání a pro násobení (a příp. další symboly, jako např. závorky). Pokud bude třeba, obohatíme jazyk aritmetiky o symboly pro další predikáty. 19.3. Budeme předpokládat, že aritmetika obsahuje základní axiomy, které určují obvyklé chování sčítání a násobení. Takovým teoriím se říká teorie základní aritmetické síly. Z kursu predikátové logiky připomeňme nejznámější příklady: Robinsonovu aritmetiku RA a Peanovu aritmetiku PA 12. 12 Připomeňme též, že Peanova aritmetika vznikne z Robinosovy aritmetiky přidáním schematu indukce pro všechny typy formulí s jednou volnou proměnnou. 29