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.
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.
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 ).
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 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:
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:
( 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:
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.
Alternativně lze seznamy definovat následovně: [2]
kde poslední definice je speciální případ obecnější funkce:
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)).
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í .