Lambda počet
lambda počet je formální systém navržený vyšetřovat funkční definici, aplikaci funkce a rekurzi. To bylo představeno Alonzem Churchem a Stephen Kleene ve třicátých létech; kostel používal lambda počet v 1936 dávat zápornou odpověď k Entscheidungsproblem. Počet může být používán čistě definovat co “vypočitatelná funkce” je. Otázka zda dva lambda početní výrazy jsou ekvivalent nemůže být řešen algoritmem generála a toto byla první otázka, dokonce před váhavým problémem, pro kterého undecidability mohly být dokázané. Lambda počet velmi ovlivňoval funkční programovací jazyky, obzvláště LISP.
Tento článek se zabývá “untyped lambda počtem” jak původně zkoncipovaný kostelem. Od té doby, některé napsané lambda calculi byly rozvinuté.
Původně, kostel pokusil se vytvořit kompletní formální systém pro založení matematiky; když systém dopadal být susceptible k analogový Russellova paradoxu, on odděloval lambda počet a používal to, aby studoval vypočitatelnost, kulminovat jeho zápornou odpovědí k Entscheidungsproblem.
V počtu lambda, každý výraz kandiduje na funkci s jediným argumentem; argument funkce je podle pořadí funkce s jediným argumentem a hodnotou funkce je další funkce s jediným argumentem. Funkce jsou anonymně definované lambda výrazem, který vyjadřuje funkční akci na jeho argumentu. Například, “sčítat-dva” fungovat f(x) = x + 2 by byl vyjádřen v počtu lambda jak a lambda; x. x + 2 (nebo equivalently jak a lambda; y. y + 2; jméno formálního argumentu je bezvýznamné) a číslo f(3) by byl psán jak (a lambda; x. x + 2) 3. Aplikace funkce je vlevo asociativní: f x y = (f x) y. Zvažovat funkci, která vezme funkci jako argument a použije to na argument 3: a lambda; x. x 3. Tato druhá funkce mohla být žádána naše dříve “sčítat-2” fungovat takto: (a lambda; x. x 3) (a lambda; x. x+ 2). To je jasné, že tři výrazy
- (a lambda; x. x 3) (a lambda; x. x+ 2) a (a lambda; x. x + 2) 3 a 3 + 2
- (a lambda; x. a lambda; y. x - y) 7 2 a (a lambda; y. 7 - y) 2 a 7 - 2
Ne každý lambda výraz může být zredukovaný na konečnou hodnotu jako ones nahoře; zvážit to například
- (a lambda; x. x x) (a lambda; x. x x)
- (a lambda; x. x x x) (a lambda; x. x x x)
Zatímco lambda počet sám neobsahuje symboly pro celá čísla nebo sčítání, tito mohou být definováni jako zkratky uvnitř počet a aritmetika mohou být vyjadřováni, zatímco my budeme vidět dolů.
Lambda početní výrazy mohou obsahovat volné proměnné, tj. proměnné ne spojený některý a lambda;. Například, proměnná y je volný ve výrazu (a lambda; x. y), reprezentovat funkci, která vždy přinese výsledek y. Občas, toto vyžaduje přejmenovávat formálních argumentů, například aby se snížil
- (a lambda; x. a lambda; y. y x) (a lambda; x. y) k a lambda; z. z (a lambda; x. y)
Formálně, my začínáme countably nekonečný soubor identifikátorů, říkat {, b, c,..., x, y, z, x1, x2,...}. Soubor všech výrazů lambda může pak být popsaný pokračováním kontext-uvolnit gramatiku v BNF:
- expr > a rarr; identifikátor >
- expr > a rarr; (a lambda; identifikátor >. expr >)
- expr > a rarr; ( expr > expr >)
Lambda výrazy takový jak a lambda; x. (x y) neurčí funkci protože výskyt proměnné y je volný, tj., to není spojené některý a lambda; ve výrazu. Vázání výskytů proměnných je (s přerušením na struktuře lambda výrazu) definovaný chápáním pravidel:
- Ve výrazu formy V kde V je proměnná toto V je jeden volný výskyt.
- Ve výrazu formy a lambda; V. E volné výskyty jsou volné výskyty v E kromě těch V. V tomto případě výskyty V v E být řekl, aby byl svázán a lambda; dříve V.
- V expresssion formy (E E ' ) volné výskyty jsou volné výskyty v E a E ' .
Alpha-konverzní pravidlo je zamýšlel vyjádřit myšlenku že jména vázaných proměnných jsou nedůležitá; například to a lambda;x.x a a lambda;y.y být stejná funkce. Nicméně, pravidlo není jak jednoduchý jak to nejprve se objeví. Tam být množství omezení na když jedna vázaná proměnná může být nahrazená jiným.
Alpha-konverzní pravidlo říká, že jestliže V a W jsou proměnné, E je výraz lambda a E[V/W] znamená výraz E s každým volným výskytem V v E nahradil s W pak
- a lambda; V. E = = a lambda; \W. E[V/W]
Beta-pravidlo redukce vyjádří myšlenku aplikace funkce. To říká to
- (( a lambda; V. E) E ') = = E[V/E ']
Vztah = = je pak definován jako nejmenší rovnocennost vztah, který vyhoví těmto dvěma pravidlům.
Více operační definice vztahu rovnocennosti může být dána použitím pravidel jen od odešel spravit. Lambda výraz, který nedovolí nějakou redukci bety, tj., má žádné subexpression formy (( a lambda; V. E) E ' ), je nazýván normální formou. Ne každý výraz lambda je ekvivalentní k normální formě, ale jestliže to je, pak normální forma je jedinečná nahoru k jmenovat formálních argumentů. Dále, tam je algoritmus pro počítačové normální formy: držet narazení první (odešel-nejvíce) formální hádka s jeho korespondenčním betonovým argumentem, až do žádné další redukce je možný. Tento algoritmus se zastaví jestliže a jediný jestliže lambda výraz má normální tvar. Kostel-Rosser teorém pak říká, že dva výrazy vyústí ve stejnou normální formu nahoru k přejmenovávat formálních argumentů jestliže a jediný jestliže oni jsou rovnocenní.
Tam je třetí pravidlo, eta-konverze, který může být přidán k těm dva tvořit novou rovnocennost vztah. Eta-konverze vyjádří myšlenku extensionality, který v tomto kontext je že dvě funkce jsou stejné iff oni dávají stejný výsledek pro všechny argumenty. Eta-konverze konvertuje mezitím a lambda; x . f x a f, kdykoli x nevypadá volný v f. Toto může být viděno být ekvivalentní k extensionality takto:
Jestliže f a g být ekvivalent extensionally, tj. jestliže f g pro všechny výrazy lambda , pak zvláště tím, že bere být proměnná x ne vypadat volný v f my máme f x
g x a od této doby a lambda; x . f x a lambda; x . g x, a tak eta-konverze f
g. Tak jestliže my vezmeme eta-konverze být platný, my najdeme extensionality je platný.
Naopak jestliže extensionality je vzat být platný, pak protože betou-sleva pro všechny y my máme (a lambda; x . f x) y f y, my máme a lambda; x . f x
f - tj. eta-konverze se nalézá být platný.
Tam je několik možných způsobů, jak definovat přirozená čísla v počtu lambda, ale zdaleka nejvíce obyčejný být celá čísla kostela, který může být definován takto:
- 0 = a lambda; f. a lambda; x. x
- 1 = a lambda; f. a lambda; x. f x
- 2 = a lambda; f. a lambda; x. f (f x)
- 3 = a lambda; f. a lambda; x. f (f (f x))
- SUCC = a lambda; n. a lambda; ' \ ' f. a lambda; x. f (n f x ' ')
- Plus = a lambda; m. a lambda; n. a lambda; f. a lambda; x. m f (n f x)
- Plus 2 3 a 5
- MULT = a lambda; m. a lambda; n. m (plus n) 0,
- MULT = a lambda; m. a lambda; n. a lambda; f. m (n f)
- PRED = a lambda; n. a lambda; f. a lambda; x. n (a lambda; g. a lambda; h. h (g f)) (a lambda; u. x) (a lambda; u. u)
- PRED = a lambda; n. n (a lambda; g. a lambda; k. (g 1) (a lambda; u. Plus (g k) 1) k) (a lambda; l. 0) 0
Konvencí, pokračování dvě definice jsou užité na booleovské hodnoty pravdivý a nepravdivý:
- Pravdivý = a lambda; u. a lambda; v. u
- Falešný = a lambda; u. a lambda; v. v
- ISZERO = a lambda; n. n (a lambda; x. Falešný) pravdivý
Rekurze definice funkce používá funkci sám; na obličeji toho, lambda počet nedovolí toto. Nicméně, tento dojem je klamný. Zvážit to například faktoriálová funkce f(n) rekurzívně definovaný
- f(n) = 1, jestliže n = 0; a n·f(n- 1), jestliže n> 0.
- f = g(f).
- (a lambda; x. g (x x)) (a lambda; x. g (x x))
- Y = a lambda; g. (a lambda; x. g (x x)) (a lambda; x. g (x x))
- Y g a g (Y g)
Vypočitatelnost a počet lambda
Funkce F : N a rarr; N přirozených čísel je definován být vypočitatelný jestliže tam existuje lambda výraz f takový to pro každý pár x, y v N, F(x) = y jestliže a jediný jestliže výrazy f x a y být rovnocenný. Toto je jedno mnoho způsobů, jak definovat vypočitatelnost; vidět Kostel-Turing teze pro diskuzi o ostatních přístupech a jejich rovnocennost.
Není tam žádný algoritmus, který bere jako vstup dva lambda výrazy a výstup “ano” nebo “ne” spoléhat se na zda nebo ne dva výrazy jsou rovnocenné. Toto bylo historicky první problém pro kterého unsolvability mohly být dokázané. Samozřejmě, aby dělal tak, ponětí o “algoritmu” musí být čistě definovaný; kostel používal definici přes rekurzivní funkce, který je nyní známý být ekvivalentní ke všem jiným rozumným definicím pojmu.
Důkaz kostela nejprve redukuje problém k určovat zda daný lambda výraz má normální formu. Normální forma je rovnocenný výraz, který nemůže být redukoval některého dále. Pak on předpokládá, že tento predikát je vypočitatelný, a moci od této doby být vyjádřen v počtu lambda. Stavět na časnější práci Kleene a využívat Gödel proceduru Gödel čísla pro lambda výrazy, on buduje lambda výraz e který silně následuje důkaz Gödel je první incompleteness teorém. Jestliže e je žádán jeho vlastní Gödel číslo, rozpor vyplývá.
Lambda počet a programovací jazyky
Nejvíce funkční programovací jazyky jsou ekvivalentní k počtu lambda rozšířenému s konstantami a datatypes. LISP používá variantu lambda notace pro určení funkcí, ale jen jeho čistě funkční podmnožina je opravdu ekvivalentní k počtu lambda.
- Stephen Kleene, Teorie pozitivních celých čísel ve formální logice, americký žurnál matematiky, 57 (1935), pp 153 - 173 a 219 - 244. Obsahuje lambda početní definice několika známých funkcí.
- Alonzo Church, Neřešitelný problém základní teorie čísel, americký žurnál matematiky, 58 (1936), pp 345 - 363. Tento papír obsahuje důkaz, že rovnocennost lambda výrazů je obecně ne decidable.
- Jim Larson, Úvod do Lambda počtu a schéma. Jemný úvod pro programátory.
- Martin Henz, Lambda počet. Formálně správný vývoj Lambda počtu.
- Henk Barendregt, Lambda počet, jeho syntax a sémantika, Na sever-Holland (1984), je úplný odkaz na (untyped) lambda počet.
- Amit Gupta a Ashutosh Agte, Untyped lambda-počet, alpha -, beta - a eta - redukce a rekurze
Externí odkazy
- L. Allison, Někteří spustitelný a lambda; - příklady počtu
- Georg P. Loczewski, ' ' Lambda počet a + +
Některé části tohoto článku jsou založené na materiálu od FOLDOC, použitý se svolením.