1 Cvičenie 3 Keď už máme zavedené čo to znamená niečo počítat (while programy) a predstavu o tom čo všetko sa dá a nedá spočítat (vyčíslitelné a nevyčíslitelné funkcie), môžeme sa zaoberat ďalšou dôležitou otázkou: Čo je to riešitelný problém, prípadne či existujú rôzne druhy "riešitelnosti" ktoré by nás mohli zaujímat. Na to si najskôr musíme samozrejme připomenut čo to vôbec je problém. Obecne budeme předpokládat že problém A je lubovolná podmnožina prirodzených čísel ACN. Teda problém môže byt napr. množina A\ = {x \ x je dělitelné 13} alebo A'2 = {x \ tpx{X) = 42} (indexy funkcií ktoré pre vstup 1 vracajú 42). Samozrejme, v informatike často pracujeme aj s inými typmi objektov ako sú prirodzené čísla, napr. grafy alebo logické formule. Takéto objekty sa ale dajú kódovat pomocou prirodzených čísel (graf môže byt reprezentovaný ako matica susednosti, zoznam hrán a vrcholov, atď.) a teda sa môžeme často střetnut aj s takto definovanými problémami: A$ = { graf G \ G obsahuje cyklus dĺžky 4} alebo A4 = { výroková formula ip \ ip je tautológia }. 1.1 Rozhodnutelné problémy Prirodzená otázka je potom čo to znamená "rozhodnut problém?". Za týmto účelom definujeme triedu rozhodnutelných (rekurzívnych) problémov (množín): Množina A je rekurzívna práve vtedy keď existuje totálne vyčíslitelná funkcia f a t.ž. JaÍx) = 1 x G A. Teda f a pre každý vstup vždy skončí a vracia jednotku len ak vstup patrí do A. Teda podlá výsledku funkcie f a vieme presne určit či prvok x patrí alebo nepatrí do množiny A. (Existuje aj ekvivalentná definícia ktorá ešte navyše tvrdí že f a vracia 0 ak x do A nepatrí) Ako ukázat že množina A je rekurzívna? (problém je rozhodnutelný) Najjednoduchší spôsob je samozrejme nájst totálnu funkciu f a ktorá náš problém rozhoduje. Pokial toto riešime pre konkrétny problém, znamená to vyriešit daný problém (opát nás nezaujíma zložitost daného riešenia, iba že je totálne). Napr. množina A\ je rekurzívna, keďže stačí zistit zbytok po delení x číslom 13 a otestovat či je výsledok nula. Príklad: Nech B\ a B2 sú rekurzívně množiny. Dokážte že Bjj = B\ U B2, Bj = B\ n B'i a Bc = B\ (doplnok) sú rekurzívně množiny. Tu nám z predpokladu rekurzívnosti plynie existencia rozhodovacích funkcií fBl a fB2. Pomocou týchto funkcií potom potrebujeme vytvořit rozhodovacie funkcie pre or r tt - • t í \ Í1 ÍBlix) = 1^ ÍbAX) = l f 1 x Bv, Bj a BG- Uvazujme fBu{x) = < , fBl{x) = I U mak 1 fBl (x) = 1 a fB2 (x) = 1 a r 1 fBl (x) ŕ 1 _ tieto tri funkcie bú 0 inak I 0 inak zjavne vyčíslitelné (ako jednoduché cvičenie si ich môžete skúsit naprogramovat vo while programoch) a sú taktiež totálne (za predpokladu že fBl a fB2 sú totálne a vyčíslitelné, čo vieme že sú). Ich korektnost potom pomerne triviálne plynie z definície prieniku, zjednotenia a doplnku. Ako ukážku dokážeme korektnost fBu: 1 [fBu (x) = 1] & [fBl (x) = 1 V fB2 (i) = 1]o[i£BiVi€ B2] [x e B\ yjB'2] [a; G -By] - Prvá ekvivalencia plynie z definície fBu, druhá z definície rekurzívnej množiny, tretia je definícia zjednotenia a štvrtá je len definícia Bjj. Ako ukázat že množina nie je rekurzívna? Rekurzívně množiny by zrejme nemali velký význam keby všetky množiny boli rekurzívně. Aby sme našli nejaké množiny ktoré nie sú rekurzívně, môžeme sa zamerat na iné objekty o ktorých " neexistencií" už vieme - nevyčíslitelné funkcie: Uvažujme množinu K = {x tpx(x) 7^ _l} (ipx zastaví pre vstup x). Množinu K budeme nazývat problém zastavenia. Množina K nie je rekurzívna. Dôkaz: Pre spor predpokladajme že K je rekurzívna, teda existuje funkcia fK ktorá ju rozhoduje. Potom si ale môžeme všimnut že halt = f k, teda ak f k je vyčíslitelná, je vyčíslitelná aj funkcia halt o ktorej sme na minulom cvičení dokázali opak, čo je spor. K teda nemôže byt rekurzívna. Keď už teda vieme že existuje nerekurzívna množina K, môžeme jej existenciu použit pri argumentácií o iných podobných množinách: Príklad: Dokážte že množina A2 = {x <4>X{X) = 42} nie je rekurzívna: Pre spor predpokladajme že A2 rekurzívna je, a teda existuje jej rozhodovacia funkcia /^2. Uvažujme ďalej funkciu g(x, y) = < ^v^V) ^ (teda jej výstup I _l inak vôbec nezáleží na x). Táto funkcia je vyčíslitelná (spustíme ipy(y) pomocou univerzálnej funkcie, ak skončí, vrátime 42) a teda má nejaký index, napr. e (teda g = ipe). Podia vety o parametrizácií existuje funkcia s pre ktorú platí V s (i,y) (x) = fiix, y)- Pomocou týchto pozorovaní môžeme zostavit rozhodovaciu funkciu pre problém zastavenia: Funkcia f x pre vstup y spočíta hodnotu a = s(e,y) a následne vráti fA2(a) (teda zistí či a patrí do A2 alebo nie). Ak ipy(y) zastaví, tak funkcia daná indexom a zastaví a vráti 42, teda patrí do A2. Ak