{{TOC float}}

{{Sources| Tohle je poněkud obšírnější výcuc ke <Státnice> z <Státnice_-Informatika-Vyčíslitelnost> pro obory <Státnice-Informatika-_I3:Matematická_lingvistika> a <Státnice-Informatika-_I2:_Softwarové_systémy>, pocházející ze Strojilových skript, papírových zápisků A. Kazdy a zápisků z předmětu Vyčíslitelnost I ze <Studnice%20vědomostí> -- User:Tuetschek 14:01, 17 Aug 2010 (CEST)

}}

Věty o rekurzi

Věta (O rekurzi, o pevném bodě, self-reference)

Jestliže f ⁣ f\,\! je ORF{{ref|1}} jedné proměnné, potom existuje a ⁣ a\,\! takové, že φf(a)(x)φa(x) ⁣ \varphi_{f(a)}(x)\simeq \varphi_a(x)\,\! pro všechna x ⁣ x\,\! (kde φa(x) ⁣ \varphi_a(x)\,\! značí a ⁣ a\,\!-tou funkci, tedy odpovídá Ψ1(a,x) ⁣ \Psi_1(a,x)\,\!).

Důkaz

Zjevně platí následující -- první výraz je ČRF, má tedy své číslo e ⁣ e\,\!, druhá rovnost plyne ze S-m-n věty:

:λz, ⁣x(φf(s1(z,z))(x))Ψ2(e,z,x)φs1(e,z)(x) \lambda z,\!x (\varphi_{f(s_1(z,z))}(x)) \simeq \Psi_2(e,z,x) \simeq \varphi_{s_1(e,z)}(x) Dosadíme z=e ⁣ z=e\,\! a dostáváme hledané a=s1(e,e) ⁣ a=s_1(e,e)\,\!. Platí totiž φf(s1(e,e))(x)Ψ2(e,e,x)φs1(e,e)(x). \varphi_{f(s_1(e,e))}(x) \simeq \Psi_2(e,e,x) \simeq \varphi_{s_1(e,e)}(x).

Vlastnosti programů aa a f(a)f(a)

Funkce f ⁣ f\,\! zobrazuje program na program. Bod a ⁣ a\,\! je pevným bodem zobrazení f ⁣ f\,\!. Jak vypadají programy a ⁣ a\,\! a f(a) ⁣ f(a)\,\!? Který z nich počítá déle? Uvidíme, že program a ⁣ a\,\! počítá déle než f(a) ⁣ f(a)\,\!.

Co dělá program e ⁣ e\,\! na datech (z,x) ⁣ (z,x)\,\!? Počítá φf(s1(z,z)) ⁣ \varphi_{f(s_1(z,z))}\,\!, tj. vezme z ⁣ z\,\! a spočítá neprve s1(z,z) ⁣ s_1(z,z)\,\!, potom f(s1(z,z)) ⁣ f(s_1(z,z))\,\!, který ale nemusí konvergovat. Jestliže f(s1(z,z)) ⁣ ⁣ ⁣ f(s_1(z,z))\!\!\downarrow\,\!, spustí se na vstup x ⁣ x\,\!.

Co dělá program a ⁣ a\,\!? Program a ⁣ a\,\! vznikne jako s1(e,e) ⁣ s_1(e,e)\,\!. Mějme na vstupu x ⁣ x\,\!. Program a ⁣ a\,\! vezme e ⁣ e\,\! a přidá ho k x ⁣ x\,\! a spustí program e ⁣ e\,\! na (e,x) ⁣ (e,x)\,\!. Co udělá program e ⁣ e\,\! na těchto datech? Spočítá s1(e,e) ⁣ s_1(e,e)\,\! (tedy spočítá a ⁣ a\,\!), potom f(s1(e,e))=f(a) ⁣ f(s_1(e,e))=f(a)\,\! a spustí program f(a) ⁣ f(a)\,\! na x ⁣ x\,\!.

Program a ⁣ a\,\! tedy neprve spočítá a ⁣ a\,\!, potom spočítá f(a) ⁣ f(a)\,\! (pokud konverguje) a ten simuluje na vstupu x ⁣ x\,\!. Program a ⁣ a\,\! je tedy složitější než f(a) ⁣ f(a)\,\! a počítá déle.

Poznámka z λ\lambdakalkulu

V λ\lambdakalkule sa ekvivalentné tvrdenie ukazuje trošku jednoduchšie. Pre každý λ\lambdaterm FF (program FF) existuje λ\lambdaterm XX taký, že X=FXX = FX (program FF aplikovaný na XX sa rovná XX).

Dôkaz je nasledovný *Majme FF, pre ktoré chceme nájsť jeho pevný bod X.

*Nech W=λx.F(xx)W = \lambda x.F(xx) (to je funkcia, ktorá xx priradí F(xx)F(xx)). *X=WWX = WW (to môžeme chápať ako program/funkciu WW aplikovaný na WW)

*X=WW=(λx.F(xx))W=F(WW)=F(X)X = WW = (\lambda x.F(xx)) W = F(WW) = F(X) (tretia rovnosť je β\betapravidlo λ\lambdakalkulu. Ak si ale (λx.F(xx))W(\lambda x.F(xx)) W predstavíme ako funkciu, ktorá xx priradí F(xx)F(xx) aplikovanú na WW, rovnosť je (snáď) jasnejšia).

Věta (O generování pevných bodů)

Pro každou ORF{{ref|1}} ff existuje prostá rostoucí PRF g ⁣ g\,\! taková, že platí:

:φf(g(j))(x)φg(j)(x) ⁣\varphi_{f(g(j))}(x)\simeq\varphi_{g(j)}(x)\,\!

Tedy g ⁣ g\,\! rostoucím způsobem generuje nekonečně mnoho pevných bodů funkce f ⁣ f\,\!.

Důkaz

Postupujeme stejně jako v důkazu předchozí věty, jen máme o proměnnou (parametr j ⁣ j\,\! funkce g ⁣ g\,\!) navíc, tj. platí φf(s2(z,z,j))(x)Ψ3(e,z,j,x)φs2(e,z,j)(x) ⁣ \varphi_{f(s_2(z,z,j))}(x)\simeq\Psi_3(e,z,j,x)\simeq\varphi_{s_2(e,z,j)}(x)\,\!. Zvolme g(j)=s2(e,e,j) ⁣ g(j)=s_2(e,e,j)\,\!.

Věta (O rekurzi pro více proměnných)

Nechť f ⁣ f\,\! je ČRF n+1 ⁣ n+1\,\! proměnných. Potom existuje číslo a ⁣ a\,\! takové, že platí φa(x1,,xn)f(a,x1,,xn) ⁣ \varphi_a(x_1,\ldots,x_n)\simeq f(a,x_1,\ldots,x_n)\,\! (tj. a ⁣ a\,\! je indexem funkce λx1,,xnf(a,x1,,xn) ⁣ \lambda{x_1,\ldots,x_n} f(a,x_1,\ldots,x_n)\,\!).

Důkaz

f(y,x1,,xn)Ψn+1(e,y,x1,,xn)φs1(e,y)(x1,,xn)f(y,x_1,\ldots,x_n)\simeq \Psi_{n+1}(e,y,x_1,\ldots,x_n)\simeq \varphi_{s_1(e,y)}(x_1,\ldots,x_n)

Následně aplikujeme větu o rekurzi na s1(e,y) ⁣ s_1(e,y)\,\! v proměnné y ⁣ y\,\! a dostáváme hledané a ⁣ a\,\! (podle VR platí: a:φs1(e,a)φa ⁣ \exists a: \varphi_{s_1(e,a)}\simeq \varphi_{a}\,\!).

Věta (O rekurzi v závislosti na parametrech)

Jestliže f ⁣ f\,\! je ČRF n+1 ⁣ n+1\,\! proměnných, potom existuje PRF g ⁣ g\,\! o n ⁣ n\,\! proměnných taková, že platí:

:φf(g(y1,,yn),y1,,yn)(x)φg(y1,,yn)(x) ⁣\varphi_{f(g(y_1,\ldots,y_n),y_1,\ldots,y_n)}(x)\simeq \varphi_{g(y_1,\ldots,y_n)}(x)\,\!

Důkaz

Pro n=0 ⁣ n=0\,\! je to totéž jako verze bez parametrů. g ⁣ g\,\! nachází pevné body v závislosti na parametrech. Podobně jako v předchozích větách platí: φf(sn+1(z,z,y1,,yn),y1,,yn)(x)Ψn+2(e,z,y1,,yn,x)φsn+1(e,z,y1,,yn)(x) ⁣ \varphi_{f(s_{n+1}(z,z,y_1,\ldots,y_n),y_1,\ldots,y_n)}(x) \simeq \Psi_{n+2}(e,z,y_1,\ldots,y_n,x) \simeq \varphi_{s_{n+1}(e,z,y_1,\ldots,y_n)}(x)\,\!. Zvolme g(y1,,yn)=sn+1(e,e,y1,,yn) ⁣ g(y_1,\ldots,y_n)=s_{n+1}(e,e,y_1,\ldots,y_n)\,\!.

Riceova věta

Věta (Rice)

Jestliže A ⁣ \mathcal{A}\,\! je třída ČRF (jedné proměnné), která je netriviální (nejsou to všechny funkce a není prázdná), potom indexová množina AA={x:φxA} ⁣ A_{\mathcal{A}} = \{ x : \varphi_x \in \mathcal{A}\}\,\! (indexy programů, které vyčíslují funkce z A\mathcal{A}) je nerekurzivní.

Důkaz

Sporem. Nechť AA ⁣ A_{\mathcal{A}}\,\! je rekurzivní. Potom lze vytvořit ORF f ⁣ f\,\! takovou, že všechny prvky z AA ⁣ A_{\mathcal{A}}\,\! zobrazí na nějaký prvek bAA ⁣ b \notin A_{\mathcal{A}}\,\! a všechny prvky mimo AA ⁣ A_{\mathcal{A}}\,\! zobrazí na nějaký prvek aAA ⁣ a \in A_{\mathcal{A}}\,\!. Podle věty o rekurzi existuje pevný bod f ⁣ f\,\! -- u0 ⁣ u_0\,\!, tedy platí:

:φu0=φf(u0) ⁣ \varphi_{u_0}=\varphi_{f(u_0)} \,\!

Takže:

:u0AAf(u0)=bAA u_0 \in A_{\mathcal{A}} \Rightarrow f(u_0)=b \notin A_{\mathcal{A}} :u0AAf(u0)=aAAu_0 \notin A_{\mathcal{A}} \Rightarrow f(u_0)=a \in A_{\mathcal{A}}

To je ovšem spor, protože u0 ⁣ u_0\,\! a f(u0) ⁣ f(u_0)\,\! jsou indexy stejné funkce, a tedy buď obě čísla v AA ⁣ A_{\mathcal{A}}\,\! leží, nebo obě neleží.

Důsledky

Pozor, nejedná se o třídu programů, ale třídu funkcí. Tedy i pro jednoprvkovou A ⁣ \mathcal{A}\,\! bude AA ⁣ A_{\mathcal A}\,\! nekonečná a nerekurzivní (každá funkce je vyčíslovaná nekonečně mnoha programy a rozhodnout o jejich ekvivalenci nelze efektivně).

Proto platí:

  • Nechť A={φe} ⁣ \mathcal{A}=\{\varphi_e\}\,\!, potom AA={x:φx=φe} ⁣ A_{\mathcal{A}}=\{x:\varphi_x=\varphi_e\}\,\! je nerekurzivní.

  • Rozhodnout o rovnosti funkcí vyčíslovaných dvěma programy nelze algoritmicky.


{{note|1|Věta platí i pro ČRF, s využitím toho, že ani jedna ze stran \simeq nemusí dávat smysl, aby výraz platil.}}

{{Statnice I3}}