====== IN13 Vyčíslitelnost ======
===== Zadání =====
(rekurzivní a rekurzivně spočetné množiny. První Riceova věta. Redukce a její vlastnosti. Uzávěrové vlastnosti rekurzívních a rekurzivně spočetných množin. Příklady rekurzivních a rekurzivně spočetných množin.)
===== Vypracování =====
==== Zkratky a termíny ====
* **VF** -- vyčíslitelná funkce
* **TVF** -- totálně vyčíslitelná funkce
* **TS** -- Turingův stroj
* //**dom(f)**// -- definiční obor funkce **f**
* //**range(f)**// -- obor hodnot funkce **f**
* **rek.** -- rekurzivní
* **r.e.** -- rekurzivně spočetná (//recursively enumarable//)
==== Základy ====
V zadání sice tyto znalosti nejsou požadovány, ale myslím, že jsou nezbytné pro pochopení dalšího textu.
**Vyčíslitelnost** nám poskytuje základní klasifikaci problémů z hlediska jejich **řešitelnosti**.
V teorii vyčíslitelnosti uvažujeme 3 základní výpočetní modely: Turingovy stroje, RAM stroje a while programy. Nejčastěji se setkáme s problémy: //Je funkce vyčíslitelná? Patří prvek do dané množiny?//
Každá částečná funkce nad přirozenými čísly je **intuitivně vyčíslitelná** (v jakémkoliv akceptovatelném smyslu) tehdy a jen tehdy když je vyčíslitelná (while-programem, TS, RAM prog.)Je důležité si uvědomit, že nejde o matematické tvrzení, tudíž nelze dokázat. Obecně se má za to, že platí, a proto některé důkazy vyčíslitelnosti problému se odkazují na tuto tezi (formálně to ale není správně!).
Poskytneme si nyní formálnější definice vyčíslitelnosti
Nechť //**P**// je while-program s proměnnými //**x1,...,xn, j >= 0**//. Definujeme funkci takto:
kde je stav takový, že
Funkce se nazývá **sémantická funkce** programu //**P**// (arity //**j**//).Sémantická funkce je jak vidmo z definice taková funkce, která vyjadřuje chování programu, obsahuje v sobě výpočet algoritmu(abychom byly úplně přesní, tak by bylo třeba uvést definici kroku výpočtu algoritmu a další definice, ale pro základní pochopení to snad stačí).
Funkce se nazývá **(efektivně) vyčíslitelná**, právě když existuje while-program //**P**// takový, že .
Jeli funkce totální a vyčíslitelná, pak se nazývá **totálně vyčíslitelná**.
Dále je důležitá **numerace funkcí**, jde o způsob, jakým očíslovat všechny sémantické funkce a tím pádem i všechny programy.
K tomu používáme funkci //**code: P->N**// ((definici naleznete v Luboš Brim, Vyčíslitelnost - poznámky k přednášce, 2002, str. 21-22)) //**code(P)**// často nazýváme indexem programu //**P**//.
Další nástroj je **standardní numerace programů a funkcí** ((definici naleznete v Luboš Brim, Vyčíslitelnost - poznámky k přednášce, 2002, str. 22)) použitím numerace získáme index programu/funkce.
Ke každému existuje vyčíslitelná funkce která je univerzální pro standardní numeraci j-árních vyčíslitelných funkcí, t.j. pro každé platí:
Jak už sama věta říká, jde o univerzální funkci, této funkci když předložíme index funkce a vstupní parametry, tak vypočítá totéž, co by vypočítala funkce, jejíž index jsme zadali.
==== Rekurzivní a rekurzivně spočetné množiny ====
* rekurzivní množina = rozhodnutelná množina = řešitelná množina (alternativní názvy)
* rekurzívně spočetná = částečně rozhodnutelná = rekurzívně vyčíslitelná = r.e.
* o problému budeme říkat, že je rozhodnutelný, respektive částečně rozhodnutelný
Rekurzivní a r.e. množiny popisují vyčíslitelné vlastnosti z pohledu množin. Důležitou vlastností množin je to, zda mají totálně vyčíslitelnou (rekurzivní) charakteristickou funkci (tak nazýváme funkci, která rozhoduje, zda prvek patří, nebo nepatří do množiny), množiny s totálně vyčíslitelnou charakteristickou funkcí nazýváme rekurzivní.
Další vlastnost je to, zda je množina definičním oborem vyčíslitelné funkce. Tuto vlastnost mají vyčíslitelně spočetné množiny(r.e. množiny).
Rekurzivní množiny jsou rozhodnutelné v tom smyslu, že existuje algoritmus pro rozhodování, zda prvek patří nebo nepatří do množiny. Naproti tomu pro r.e. existuje pouze algoritmus, který vytváří seznam prvků množiny.
Nechť .
- Množina //**A**// je **rekurzivní** **TVF** taková, že . Pak //**f**// se nazývá **rozhodovací funkce pro //A//**.
- Množina //**B**// je **rekurzívně spočetná** **TVF** taková, že //**B = range(f)**//. Pak //**f**// se nazývá **numerující funkce pro //B//**.
V definici používáme //**f -1**//, rozumíme tím
Existují ekvivalentní definice
rekurzívní spočetnosti (r.e.)** ((Luboš Brim, Vyčíslitelnost -- poznámky k přednášce, 2002, str 44))>Nechť .
- Množina //**B**// je r.e. **VF** taková, že //**B = range(f)**//.
- Množina //**B**// je r.e. **VF** taková, že //**B = dom(f)**//.
- Množina //**B**// je r.e. **TS**, který **akceptuje** každý prvek z //**B**// (na prvku, který z b není, buď neakceptuje, nebo cyklí).
- Množina //**B**// je r.e. (while) **program**, který množinu //**B**// **generuje**.
- Relace //**B**// je r.e. právě když je projekcí rekurzivní relace.
Třídy rekurzivních množin a r.e. množin jsou různé. Každá rekurzivní množina je rekurzívně spočetná (pokud dokážeme rozhodnout, zda prvek patří do množiny, dokážeme i generovat prvky množiny), ale opak obecně neplatí. Důležitou roli hrají r.e. množiny, které nejsou rekurzivní(například problém zastavení, viz. příklady).
==== První Riceova věta ====
Riceova věta říká, že rozhodnutelnost je výjimkou, která potvrzuje pravidlo.
Nechť a nechť //**I**// je rekurzivní. Pak existují a tak, že .
Tvrzení dokážeme sporem. Předpokládejme, že pro všechna a platí . Předpokládejme, že //**I**// obsahuje index nějaké vyčíslitelné funkce (a tím i všechny její indexy), která je různá od prázdné funkce , a že obsahuje všechny indexy .
Nechť //**Pf(i)**// je program ( je index programu P):
Program P je tedy vyčíslitelný. Je zřejmé, že
Tedy pro všechna platí právě, když je definováno, t.j. .
Dále, je-li , pak (jakožto index funkce ).
Jestliže tedy , pak a proto .
Obráceně pak, jestliže , pak (jakožto index funkce ). Nechť je charakteristická funkce množiny //**I**//. Pak pro všechna platí:
Protože je totálně vyčíslitelná, je //**K**// rekurzivní, což je spor.
//poznámka: jako index funkce používáme f(i) z toho důvodu, že f(i) nám říká, že máme funkci(totálně vyčíslitelnou) s jejíž pomocí jsme schopni vždy index programu P vypočítat(bude pro každé i jiný), stejně tak použijeme tuto funkci při dokazování problému zastavení v příkladech//
Často se věta formuluje obráceně s využitím následující definice:
Říkáme, že množina respektuje funkce, jestliže platí:
((Luboš Brim, Vyčíslitelnost - poznámky k přednášce, 2002, str 51))
* Bezprostředně z definice plyne, že pokud //**I**// respektuje funkce, pak i //**co-I**// respektuje funkce.
* Množiny , kde je prázdná funkce, jsou příklady množin, které respektují funkce
* Množina //**K**// nerespektuje funkce, důkaz viz příklady
Důsledek:
Netriviální (t.j. neprázdná a vlastní) podmnožina množiny //**N**//, která respektuje funkce, není rekurzivní.Existují další 2 Riceovy věty, to sice není to v zadání, ale může se hodit vědět, že složí k dokázání, že množina není //**r.e**//
==== Redukce a její vlastnosti ====
Redukci jsme již použili v první Riecově větě, konkrétně v důkazu 1. R.v, kdy jsme využili sporu s rekurzivností //**K**// (množinu //**K**// jsme redukovali na //**I**// ).
Nechť .
- Říkáme, že //**A**// se **redukuje** na //**B**//(píšeme ) právě když existuje totálně vyčíslitelná funkce taková, že .
- Říkáme, že //**A**// a //**B**// jsou **m-ekvivalentní** (píšeme ) právě když a
Index //m// v označení relace znamená, že fce //**f**// nemusí být prostá (může být //many-to-one//)
Redukce je reflexivní, transitivní, tj. je kvaziuspořádání.
Redukce se používá k dokazování, že je množina rekurzivní, respektive r.e.
Nechť pak:
- Je-li //**B**// rekurzivní, pak i //**A**// je rekurzívní.
- Je-li //**B**// rekurzívně spočetná, pak i //**A**// je rekurzívně spočetná
-
\\
**Důsledek**:
- Jestliže //**A**// není rekurzivní, pak //**B**// není rekurzivní.
- Jestliže //**A**// není r.e., pak //**B**// není r.e.
Redukce poskytuje nástroj na porovnání množin.
Jeli množina r.e., pak
Důkaz viz skripta
Tato věta nám říká, že problém příslušnosti do //**K**// je alespoň tak **těžký** jako jakýkoliv jiný r.e. problém. Tj. pokud by existoval algoritmus pro rozhodování //**K**//, pak by existoval i algoritmus pro rozhodování libovolného r.e. problému. Protože je //**K**// r.e, říkáme, že //**K**// je nejtěžší množina mezi r.e. množinami, tj. je úplná na množině r.e.
Nechť //**C**// je třída podmnožin množiny //**N**// a . Řekneme, že množina //**A**// je //**C-těžká**//, právě když pro každou množinu platí . Jeli navíc , pak //**A**// se nazývá //**C-úplná**//(úplná v třídě //**C**//)
==== Uzávěrové vlastnosti ====
Nechť je rekurzívní množina.
Pak množina //**co-A**// je rekurzivní množina
Množina je rekurzívní právě když //**A**// a //**co-A**// jsou r.e.
Nechť jsou rekurzívní množiny a //**f:N->N**// je totálně vyčíslitelná funkce.
Pak množiny
jsou rekurzivní.
Existují totálně vyčíslitelné funkce //**h,g:N2->N**// takové, že pro libovolné dvě r.e. množiny platí:
-
-
Jde o svým způsobem vyslovenou uzavřenost r.e. množin vůči průniku a sjednocení. Wi značí množinu vyčíslenou i-tým programem.
* Kartézký součin dvou r.e. množin je r.e. množina
* Libovolný řez rekurzivní množiny je rekurzivní množina
* Libovolný řez r.e. množiny je r.e. množina
* Libovolná projekce r.e. množiny je r.e. množina.
==== Příklady r.e. a rekurzivních množin ====
//Ač si nemyslím, že je v silách kohokoliv demonstrovat tyto příklady u SZZ včetně jejich řešení, uvádím tu i jejich řešení pro úplnost.//
==== Základní příklady ====
Problém zastavení //**K**// není rekurzivní, ale je r.e.
Problém verifikace: dokázat, kde //**g**// je pevná vyčíslitelná funkce není rekurzivní. (praktický důsledek: neumíme obecně sestrojit program, který zjistí, zda námi vytvořený program počítá co má.)
Problém ekvivalence: dokázat, není rekurzivní(praktický důsledek - program nezjistí, zda 2 programy počítají totéž)
Problém nezastavení //**co-K**// není r.e.
=== Problém zastavení ===
Asi nejdůležitějším příkladem této kapitoly je tzv. problém zastavení
Funkce //**f:N->N**// taková, že
**není vyčíslitelná**
Důkaz:
Tvrzení dokážeme sporem. Předpokládejme, že funkce //**f**// je vyčíslitelná, nechť //**halt**// je program, který počítá funkci //**f**//. Uvažujme funkci takovou, že
program //**confuse**//, který počítá funkci //**g**//, vypadá následovně:
begin
while halt(x1) = 1 do x1 = x1;
x1 = 1
end;
Nechť //**e**// je index programu //**confuse**//. Pak pro všechna //**i**//. Z definice funkcí //**g**// a //**f**// pak dostáváme pro //**i = e**//
.
Dostáváme tím spor: je definováno, právě když není definováno. Funkce //**f**// proto nemůže být vyčíslitelná.
**Důkaz, že //**K**// nerespektuje funkce:**
Existuje index tak, že ((důkaz viz skripta str. 61 a dále)). Tedy . Máme-li takové, že , pak
//Slovně: máme W, který vypíše svůj index((aspoň tak to chápu já)), které má index e, pokud máme program s indexem e', jehož funkce je stejná, tj. vypíše program e, pak nepatří do K.//
Množinově můžeme problém zastavení popsat následovně:
Množina //**K**// není rekurziní jelikož její charakteristická funkce není totálně vyčíslitelná, ale je r.e.
Proč je tento problém tak důležitý?
* využívá se k důkazům, že něco není vyčíslitelné (přes redukci, uzávěrové vlastnosti atd.)
* je to úplný problém pro množinu r.e. problémů
**Problém nezastavení**, tj. **//co-K//** **není r.e.** dokážeme triviálně přes uzávěrové vlastnosti - Lema 6.5 A a co-A jsou r.e. => A je rekurzivní, takže pokud by byla **//co-K//** r.e. byla by //**K**// rekurzivní, což jsme dokázali, že není.
=== Příklad na použití Riceovy věty ===
není rekurzivní.
Dle důsledku r.v. stačí ukázat, že //**A1**// respektuje funkce a je netriviální.
Respektování funkcí:
Zřejmě index identické funkce do množiny patří a index prázdné ne, funkce je tedy netriviální (není prázdná a není vlastní podmnožinou //**N**//)
=== Redukce ===
není rekurzivní. Můžeme to sice dokázat triviálně přes 1. r.v., ale použijeme redukci.
Nechť //**f(i)**// je index programu
zřejmě
Tedy právě když je definováno pro všechna //**x**// a to je právě když je totální. Funkce //**f**// je totálně vyčíslitelná, není rekurzivní a , tedy //**B**// **není rekurzivní**.
===== Vypracuje =====
Marek Babák ICQ: 67179550) 99%, z mé strany hotovo, byl bych rád, kdyby to někdo prošel a napsal co si o tom myslí, nebylo to zcela triviální.
FIXME Je potřeba ještě zapracovat [[http://statnice.dqd.cz/tmp/vycislitelnost.pdf|poznámky od Jitky Pospíšilové]].
~~DISCUSSION~~