2. Numerace a parametrizace¶
2.1. Numerace v Pythonu¶
Abychom se vyhnuli obtížnému počítání a dekódování indexů funkcí, využijeme faktu, že v Pythonu jsou funkce hodnoty první kategorie (angl. first-class citizens), lze s nimi tedy pracovat stejně jako s jinými hodnotami, např. mohou být předávány jako parametry jiným funkcím a také mohou být funkcemi vraceny.
Místo indexů funkcí budeme tedy využívat prostě jejich identifikátory (tedy odkazy na funkce). Funkce vracející funkci tedy v podstatě “počítají index” dané funkce.
2.2. Univerzální funkce¶
Výpočetní univerzální funkce by pro pro vstup f, x měla vypočítat f(x), a protože místo indexů pracujeme přímo s identifikátory funkcí, stačí nám opravdu pouze zavolat funkci f na vstupu x (čímž samozřejmě pouze delegujeme výpočet univerzální funkce na interpret Pythonu). Výpočetní univerzální funkce pro unární výpočetní funkce by tedy vypadala takto:
Pro třídu binárních výpočetních funkcí by univerzální výpočetní funkce vypadala následovně:
S využitím speciální syntaxe Pythonu pro označení libovolné posloupnosti parametrů můžeme dokonce napsat univerzální funkci pro libovolnou aritu:
Protože víme, že volání funkce odpovídá výpočtu univerzální funkce,
budeme již dále psát pouze f(x)
místo univerzalni_funkce(f, x)
.
2.3. Uzávěry¶
Uzávěry jsou vnořené funkce, které dědí proměnné z rodičovské funkce. Funkce si pamatují hodnoty proměnných z rodičovské funkce (tzv. kontext), i když jsou volány vně rodičovské funkce.
2.4. Parametrizace v Pythonu¶
V této sekci si ukážeme dva konstrukční důkazy tvrzení, že funkce \(g(f_1, f_2)\) taková, že \(g(f_1, f_2)(x) = f_1(x) + f_2(x)\), je totálně vyčíslitelná.
První možnost je takovou funkci napsat přímo – s využitím uzávěru je to snadné.
Můžeme však postupovat obecněji a využít parametrizující \(s_{2, 1}\) funkce, která fixuje první dva parametry funkce, která dohoromady přebírá 3 parametry (výsledkem je tedy funkce, která přebírá pouze jediný parametr).
2.4.1. Parametrizující s13 funkce¶
Napište parametrizující \(s_{1, 3}\) funkci.
2.4.2. Součin hodnot funkcí¶
Napište výpočetní funkci \(g(f_1, f_2)\) takovou, že \(g(f_1, f_2)(x) = f_1(x) \cdot f_2(x)\), a to jak s, tak bez použití parametrizující \(s_{2, 1}\) funkce. Srovnejte s formálním důkazem totální vyčíslitelnosti příslušné funkce pomocí while programů.
2.4.3. Kompozice funkcí¶
Napište výpočetní funkci \(compose(f, g)\), která vrací funkci počítající \(f \circ g\).