Úvodní stránka | Tato stránka v originále

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é.

Tabulka s obsahem
1 historie
2 neformální popis
3 formální definice
4 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
5 f y, my máme a lambda; x . f x
6 aritmetiky v počtu lambda
7 logiky a predikáty
8 rekurze
9 vypočitatelnosti a lambda počet
10 Undecidability rovnocennosti
11 Lambda počtu a programovací jazyky
12 odkazů
13 externích spojení

Historie

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.

Neformální popis

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
být rovnocenný. Funkce dvou proměnných je vyjádřena v počtu lambda jako funkce jednoho argumentu, který vrátí funkci jednoho argumentu (vidět Currying). Například, funkce f(x, y) = x - y by byl psán jak a lambda; x. a lambda; y. x - y. Tři výrazy
(a lambda; x. a lambda; y. x - y) 7 2 a (a lambda; y. 7 - y) 2 a 7 - 2
být rovnocenný. Je to tato rovnocennost lambda výrazů, které obecně nemohou být rozhodnuty algoritmem.

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)
nebo
(a lambda; x. x x x) (a lambda; x. x x x)
a pokus si představit co se stane, zatímco vy začnete aplikovat první funkci na jeho argument. (( a lambda; x. x x) je také známý jak a omega; combinator; (( a lambda; x. x x) (a lambda; x. x x)) je znán jak a omega;, (a lambda; x. x x x) (a lambda; x. x x x) jak a omega;2, etc.)

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)

Jestliže jeden jen formuje ponětí o aplikaci funkce a nedovolí lambda výrazy, jeden dostane combinatory logiku.

Formální definice

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:

  1. expr > a rarr; identifikátor >
  2. expr > a rarr; (a lambda; identifikátor >. expr >)
  3. expr > a rarr; ( expr > expr >)

První dvě pravidla tvoří funkce, zatímco třetina popisuje použití funkce k argumentu. Obvykle hranaté závorky pro lambda abstrakci (pravidlo 2) a aplikace funkce (pravidlo 3) být vynechán jestliže není tam žádná dvojznačnost pod předpoklady, že (1) funkce aplikace je vlevo-asociativní, a (2) lambda váže k celému výrazu po tom. Například, výraz (( a lambda; x. (x x)) (a lambda; y. y)) moci být jednoduše psán jak (a lambda; x. x x) a lambda; y.y.

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:

  1. Ve výrazu formy V kde V je proměnná toto V je jeden volný výskyt.
  2. 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.
  3. V expresssion formy (E E ' ) volné výskyty jsou volné výskyty v E a E ' .

Přes soubor lambda výrazů vztah rovnocennosti (tady označil jak = =) je definován to zachytí intuici že dva výrazy naznačují stejnou funkci. Tento vztah rovnocennosti je definován takzvaný alpha-konverzní pravidlo a beta-pravidlo redukce.

a alpha; - konverze

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]
jestliže W nevypadá volně v E a W je ne spojený a lambda; v E kdykoli to nahradí V. Toto pravidlo řekne nám například to a lambda; x. (a lambda; x. x) x je stejný jak a lambda; y. (a lambda; x. x) y.

a beta; - redukce

Beta-pravidlo redukce vyjádří myšlenku aplikace funkce. To říká to

(( a lambda; V. E) E ') = = E[V/E ']
jestliže všichni uvolní výskyty v E ' zůstat volný v 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í.

a eta; - konverze

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ý.

Aritmetika v počtu lambda

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))
a tak dále. Intuitivně, číslo n v lambda počet je funkce, která vezme funkci f jako argument a návraty n- síla th f. (poznámka, která v kostele je originál lambda počet, formální parametr lambda výrazu byl vyžadován nastat přinejmenším jakmile ve funkčním těle, který vyráběl nad definicí 0 nemožný.) daný tato definice celých čísel kostela, my můžeme určit nástupní funkci, který odečte číslo n a návraty n + 1:
SUCC = a lambda; n. a lambda; ' \ ' f. a lambda; x. f (n f x ' ')
Sčítání je definováno takto:
Plus = a lambda; m. a lambda; n. a lambda; f. a lambda; x. m f (n f x)
Plus může být myšlenka jako funkce brát dvě přirozená čísla jako argumenty a vracet přirozené číslo; to je legrace potvrdit to
Plus 2 3 a 5
jsou rovnocenné lambda výrazy. Násobení může pak být definováno jak
MULT = a lambda; m. a lambda; n. m (plus n) 0,
bytí nápadu to násobit m a n je stejný jak m měří připočítání n k nula. Alternativně
MULT = a lambda; m. a lambda; n. a lambda; f. m (n f)
Predecessesor PRED n = n - 1 pozitivního celého čísla n je těžší:
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)
nebo jinak
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
Si všimnout triku (g 1) (a lambda; u. Plus (g k) 1) k který ocení k k jestliže g(1) je nulový a k g(k) + 1 jinak.

Logika a predikáty

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
predikát je funkce, která vrátí booleovskou hodnotu. Nejvíce základní predikát je ISZERO které návraty pravdivý jestliže a jediný jestliže jeho argument je nulový:
ISZERO = a lambda; n. n (a lambda; x. Falešný) pravdivý
Dostupnost predikátů a nad definicí Truea a falešný dělat to vhodný psát “jestliže-pak-jinde” sdělení v počtu lambda.

Rekurze

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.

Jeden může prohlížet si pravou stranu této definice jako funkce g který vezme funkci f jako argument a návraty další funkce g(f). Používat ISZERO predikát, funkce g moci být definován v počtu lambda. Faktoriálová funkce je pak fixovaný-bod g:
f = g(f).
Ve skutečnosti, každý rekurzívně určená funkce může být viděna jako fixovaný bod nějaké vhodné jiné funkce. Toto dovolí definici rekurzivních funkcí v počtu lambda, protože každá funkce v počtu lambda má pevná čárka a pevná čárka mohou být snadno popisováni: fixovaný bod funkce g je dáván
(a lambda; x. g (x x)) (a lambda; x. g (x x))
a jestliže my vymezíme Y combinator jak
Y = a lambda; g. (a lambda; x. g (x x)) (a lambda; x. g (x x))
pak Y g je pevná čárka g, znamenat to dva výrazy
Y g   a   g (Y g)
být rovnocenný. Používání Y, každý rekurzívně určená funkce může být vyjádřena jako výraz lambda. Zvláště, my můžeme nyní čistě definovat odčítání, násobení a srovnávací predikát přirozených čísel rekurzívně.

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.

Undecidability rovnocennosti

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.

Odkazy

Externí odkazy


Některé části tohoto článku jsou založené na materiálu od FOLDOC, použitý se svolením.