Církevní kódování

V matematice znamená církevní kódování reprezentaci (nebo proceduru reprezentace) dat a operátorů v proceduře lambda počtu. Nezbytnost postupu je dána tím, že v čistém lambda kalkulu jsou mezi členy pouze proměnné a neexistují žádné konstanty. Aby bylo možné získat objekty, které se chovají stejně jako čísla, používá se církevní kódování. Samotný postup je pojmenován po Alonzovi Churchovi , který vyvinul lambda kalkul a byl průkopníkem této metody kódování dat. Podobně jako čísla lze kódování Church použít také k reprezentaci jiných typů objektů, které se chovají jako konstanty.

Termíny, které jsou obvykle primitivní v jiných zápisech (jako jsou celá čísla, booleovské hodnoty, páry, seznamy a označené svazky), jsou v Churchově kódu reprezentovány pomocí funkcí vyššího řádu . Turing-Churchova teze v jedné ze svých formulací uvádí, že v Churchově kódování může být reprezentován jakýkoli vyčíslitelný operátor (a jeho operandy). V netypovém lambda kalkulu jsou funkce jediným primitivním datovým typem a všechny ostatní entity jsou konstruovány pomocí Church kódování.

Církevní kódování se obecně nepoužívá pro praktickou implementaci primitivních datových typů. Používá se za účelem přesvědčivého prokázání toho, že k provádění výpočtů nejsou vyžadovány jiné primitivní datové typy.

Kostelní čísla

Církevní čísla jsou reprezentace přirozených čísel v církevním kódování. Funkce vyššího řádu , která představuje přirozené číslo n, je funkce, která mapuje jakoukoli funkci na její n-násobné složení . Jednoduše řečeno, „hodnota“ číslice je ekvivalentní tomu, kolikrát funkce zapouzdří svůj argument.

Všechna církevní čísla jsou funkce se dvěma parametry. Církevní čísla '0' , '1' , '2' , …, jsou definována v lambda kalkulu takto:

znamená „nepoužít funkci vůbec “, znamená „použít funkci jednou“ atd.:

Číslo Definice číslic lambda výraz
0
jeden
2
3

Churchova číslice 3 představuje proces aplikace libovolné použité funkce f třikrát. Tato funkce je postupně aplikována nejprve na parametr, který jí byl předán, a poté na výsledek získaný v důsledku předchozí aplikace.


Výpočty s církevními číslicemi

Aritmetické operace s čísly mohou být reprezentovány funkcemi na církevních číslicích. Tyto funkce mohou být definovány v lambda kalkulu nebo implementovány ve většině funkčních programovacích jazyků (viz Převod lambda výrazů na funkce ).

Kódování Booleans

Church booleans jsou výsledkem kódování Church aplikovaného na reprezentaci booleovských hodnot true a false. Některé programovací jazyky je používají jako implementační model pro booleovskou aritmetiku. Příklady takových jazyků jsou Smalltalk a Pico .

Booleovskou logiku lze považovat za volbu. Kódování církve pro booleovské hodnoty je funkcí dvou parametrů:

Tyto dvě definice jsou známé jako Church Booleans:

Tato definice umožňuje predikátům (tj. funkcím, které vracejí boolean ) pracovat přímo jako podmínky:

Funkce, která vrací booleovskou hodnotu, která je poté aplikována na dva parametry, vrací buď první nebo druhý parametr:

vyhodnotí se jako klauzule potom, pokud se x vyhodnotí jako pravda, a klauzule else, pokud se x vyhodnotí jako nepravda.

Protože true a false odpovídají volbě prvního nebo druhého parametru této funkce, lze tento formalismus použít k implementaci standardních logických operátorů. Všimněte si, že existují dvě verze implementace operátoru not, v závislosti na zvolené strategii rozlišení výrazu .

Několik příkladů:

Predikáty

Predikáty  jsou funkce, které vracejí booleovskou hodnotu.

Nejzákladnějším predikátem je , který vrací (true), pokud je jeho argumentem církevní číslo , a (false), pokud je jeho argumentem jakákoli jiná církevní číslovka:

Tento predikát kontroluje, zda je jeho první argument menší nebo roven druhému:

,

V souvislosti s identitou

Kontrola rovnosti může být provedena následujícím způsobem:

Církevní páry

Viz také: nevýhody

Církevní páry jsou církevně kódovanou reprezentací párového typu, tedy n-tice dvou hodnot. Pár je reprezentován jako funkce, která má jinou funkci jako argument. Výsledkem této funkce je použití argumentu na dvě složky dvojice. Definice v lambda kalkulu :

Příklad:

Seznam kódování

( neměnný ) seznam se skládá z uzlů. Níže jsou uvedeny základní operace se seznamy:

Funkce Popis
nula Vrátí prázdný seznam.
isnil Zkontroluje, zda je seznam prázdný.
nevýhody Připojí danou hodnotu na začátek (případně prázdného) seznamu.
hlava Vrátí první prvek ze seznamu.
ocas Vrátí celý seznam kromě prvního prvku.

Níže jsou čtyři různá zobrazení seznamu:

Reprezentace jako dva páry

Neprázdný seznam může být implementován dvojicí Church;

Tímto způsobem však není možné vyjádřit prázdný seznam, protože nemáme definovanou reprezentaci prázdné hodnoty (null). Pro reprezentaci a možnost kódování prázdných seznamů lze pár zabalit do jiného páru.

Pomocí této myšlenky lze základní operace se seznamy vyjádřit následovně: [1]

výraz Popis
První prvek z dvojice je true , což znamená, že seznam je prázdný.
Kontrola, zda je seznam prázdný.
vytvořte neprázdný uzel seznamu a předejte mu první prvek (hlavu seznamu) h a konec t .
druhý . první  je hlava seznamu.
druhý.druhý  je konec seznamu.

V prázdném seznamu se přístup k druhému prvku ( Second ) nikdy nepoužívá, pokud se koncepty záhlaví a konce seznamu vztahují pouze na neprázdné seznamy.

Reprezentace jako jeden pár

Alternativně lze seznamy definovat následovně: [2]

kde poslední definice je speciální případ obecnější funkce:

Reprezentace seznamu pomocí funkce pravého skládání

Alternativně ke kódování pomocí Church párů lze seznam zakódovat jeho identifikací pomocí funkce pravého asociativního skládání. Například seznam tří prvků x, y a z lze zakódovat funkcí vyššího řádu, která po aplikaci na kombinátor c a hodnotu n vrátí cx(cy(czn)).

Reprezentace seznamu pomocí Scottova kódování

Další alternativní reprezentací je Scottova kódová reprezentace seznamů, která využívá myšlenku pokračování a může vést ke zjednodušení kódu [3] . (viz také kódování Mogensen–Scott ). V tomto přístupu využíváme skutečnosti, že seznamy lze zpracovat pomocí vzorového párování .

Literatura

Viz také

Poznámky

  1. Pierce, Benjamin C. Typy a programovací jazyky . - MIT Press , 2002. - S. 500. - ISBN 978-0-262-16209-8 .
  2. Tromp, John. 14. Binární lambda kalkul a kombinační logika // Náhodnost a složitost, od Leibnize k Chaitinu  (anglicky) / Calude, Cristian S.. - World Scientific , 2007. - S. 237-262. — ISBN 978-981-4474-39-9 .
    Jako PDF: Tromp, John Binary Lambda Calculus and Combinatory Logic (PDF) (14. května 2014). Získáno 24. listopadu 2017. Archivováno z originálu 1. června 2018.
  3. Jansen, Jan Martin. Programování v λ-Calculus: From Church to Scott and Back  //  LNCS : deník. - 2013. - Sv. 8106 . - S. 168-180 . - doi : 10.1007/978-3-642-40355-2_12 .