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\).

Next Section - 3. Množiny v Pythonu