Lambda račun

S Vikipedije, slobodne enciklopedije

Lambda račun (oznaka λ-račun) je formalni sistem u matematičkoj logici za predstavljanje računanja baziranog na apstrakciji funkcija i aplikacija koristeći vezivanje i supstituciju promenljive. Uveo ga je Alonzo Čerč da formuliše koncept efektivnog računanja, lambda račun je naišo na prve uspehe na polju teorije računanja, kao što je negativan odgovor na Hilbertov problem odluke. Lambda račun je konceptualno jednostavan univerzalni model računanja (Tjuring je pokazao 1937. godine[1] da Tjuringova mašina jednaka lambda računu u ekspresivnosti). Ime potiče od grčkog slova lambda (λ) korišćenog da označi vezivanje promenljivih u funkciji. Slovo je samo po sebi proizvoljno i nema nikakvo specijalno značenje. Lambda račun se uči i koristi u računarstvu zbog svoje korisnosti u prikazivanju funkcionalnog razmišljanja i iterativne redukcije.[2]

Zbog važnosti pojma vezivanja promenljive i substitucije, ne postoji samo jedan sistem lambda računa, i u praksi postoje "tipske" i "netipske" varijante. Istorijski gledano, najvažniji sistem je bio netipski lambda račun, u kojem funkcija aplikacije nema restrikcija (pojam domena funkcije nije ugrađen u sistem. U Čerč-Tjuringovoj tezi, netipski lambda račun je podešen da bude moguće izračunati sve efektivno izračunive funkcije. Tipski lambda račun je varijacija koja ima restrikcije za funkciju aplikacije, tako da se funkcija može primeniti samo ako se prihvati ulazni tip podataka.

Danas, lambda račun ima ulogu u mnogo različitih svera, kao npr. u matematici, filozofiji,[3] lingvistici,[4][5] i računarstvu. Još uvek se koristi u oblasti teorije računanja, kao i Tjuringova mašina koja je vrlo važan model za računanje. Lambda račun je odigrao veoma važnu ulou u razvoju teorije programskih jezika. Delovi brojača, u lambda računu u računarstvu, su funkcionalni programi, koji implementiraju lambda račun (povećati neke konstante i tipove podataka). Pored programskih jezika, labmda račun igra ulogu u teoriji dokaza. Glavni primer toga je Kari-Hauardova korespondencija, koja daje korespondenciju između različitih sistema tipova lambda računa i sistema formalne logike.

Istorija lambda računa u matematici[uredi | uredi izvor]

Lambda račun je uveo Alonzo Čerč u 1930—im godinama kao deo istrage o osnovama matematike.[6][7] Originalni sistem je pokazan kao logički protivrečan 1935. godine kada su Stiven Klin i J. B. Roser razvili Klin-Roserov paradoks.

Nakon toga, u 1936. godini, Čerč je izolovao i objavio samo deo bitan za računanje, koji se danas zove netipski lambda račun.[8] U 1940. godini, on je takođe uveo računski slabiji, ali logički dosledniji sistem, znan kao jednostavni tipski lambda račun.[9]

Motivacija[uredi | uredi izvor]

Računske funkcije predstavljaju krucijalan koncept u računarstvu i matematici. Lambda račun daje jednostavu semantiku za izračunavanje, omogućavajući osobine izračunavanja da budu formalno učene. Lambda račun uključuje dva uprošćavanja koja čine semantiku jednostavnom. Prvo pojednostavljenje je to da Lambda račun tretira funkciju "anonimno", bez davanja eksplicitnih imena. Na primer, funkcija 

može se ponovo napisati u anonimnoj formi kao

(čita se kao "par x i y je mapiran u "). Slično,

se može napisati u anonimnoj formi , gde je ulaz jednostavno mapiran u samog sebe 

Drugo pojednostavljenje je to da lambda račun koristi samo funkcije jednog ulaza. Obična funkcija koja zahteva dva ulaza , za instancu  (zbir kvadrata) funkcije, može se napisati kao jedna ekvivalentna funkcija koja prima jedan ulaz, a da izlaz vraća drugu funkciju, koja zauzvrat prima jedan ulaz. Na primer,

se može napisati kao

Ova metoda, poznata i kao kariing, transformiše funkciju koja uzima više argumenata u lanac funkcija, gde svaka ima jedan argument.

Funkcionalno okruženje   funkcije sa argumentima (5, 2), dobijeno odjednom

,

dok procena karijeve verzije zahteva još jedan korak

dobija se isti rezultat.

Lambda račun[uredi | uredi izvor]

Lambda račun se sastoji od programa lambda uslova, koji su definisani određenom formalnom sintaksom, i setom transformacijskih pravila, koji dopuštaju manipulaciju lambda uslova. Ova transformacijska pravila se mogu predstaviti kao ekvivalentna teorija ili kao operacionalizam.

Kao što je već opisano, sve funkcije u lambda računu su u stvari anonimne funkcije, tj. nemaju ime. Dozvoljavaju samo jednu ulaznu promenljivu, sa karijevom verzijom da se ubace funkcije sa nekoliko promenljivih.

Lambda pravila[uredi | uredi izvor]

Sintaksa lambda računa definiše neke izraze kao dozvoljene izraze lambda računa i neke nevažeće, kao što su na primer stringovi koji se sastoje od karaktera validnih C programa a neki ipak nisu. Dozvoljeni izraz lambda računa se naziva lambda izraz.

Sledeća tri pravila daju induktivnu definiciju koja se mogu iskoristiti za pravljenje sintatički ispravnih lambda izrazi:

  • promenljiva, , je sam po sebi validan lambda izraz
  • ako je  lambda izraz, a je promenljiva, onda je  lambda izraz (naziva se i  lambda apstrakcijom);
  • ako su  i lambda izrazi, onda je i  lambda izraz (aplikacija).

Ništa drugo nije lambda uslov. Lambda uslov je validan ako i samo ako se može dobiti primenom ova tri pravila. Međutim, neke zagrade mogu biti izostavljene u skladu sa nekim pravilima. Na primer, spoljašnje zagrade se obično ne pišu. 

Lambda apstrakcija  je definicija anonimne funkcije koja može da uzme jedan ulaz  i zameni ga u izraz . Na taj način se definišu anonimne funkcije koje uzimaju x a vraćaju t. Na primer, je lambda apstrakcija funkcije  koristeći izraz  za . Definicija funkcije sa lambda abrstrakcijom samo "postavlja" funkciju ali je ne uvodi. Abrstrakcija vezuje promenljivu  u izraz .

Aplikacija  predstavlja primenu funkcije  na ulaz , koji predstavlja čin poziva funkcije u odnosu na ulaz  da bi se dobio .

Ne postoji koncept promenljivih deklaracija u lambda računu. U definiciji kao što je  (i.e. ), lambda račun tretira  promenljivu koja još uvek nije definisana. Lambda abrstrakcija  je sintatički ispravna, i predstavlja funkciju koja dodaje svoje unose za još uvek nepoznatu .

Zagrade se mogu koristiti tj. mogu biti potrebne nekim izrazima. Na primer, and označava reziličite izraze (iako se slučajno sređivanjem dobija isti rezultat). Evo prvog primera definisanja funkcije koja definiše funkciju i vraća rezultat uzimajući h iz dečije-funkcije (primeni funkciju a zatim vrati), dok drugi primer definiše funkciju koja vraća funkciju za bilo koji ulaz vraća njegovu vrednost uzete h (vraća funkciju a onda je primeni).

Funkcije koje operišu (vrše neku radnju) na druge funkcije[uredi | uredi izvor]

U lambda računu, funkcije su uzete da budu vrednosti prve klase, pa tako funkcije mogu biti korišćene kao ulazi, ili biti vraćene kao izlazi iz drugih funkcija.

Na primer, predstavlja identičnu funkciju, , a   predstavlja identičnu funkciju primenjenu na  . Dakle,  predstavlja konstantnu funkciju , funkciju koja uvek vraća , bez obzira na ulaz. U lambda računu, aplikacija funkcije se smatra levo-asocijativnom, što znači da  znači .

Potoji nekoliko pojmova "ekvivalencije" i "redukcije" koja dozvoljava lambda izrazima da budu "pojednostavljeni" svojim "ekvivalentnim" lambda izrazima.

Alfa ekvivalencija[uredi | uredi izvor]

Osnovna forma ekvivalencije, definisana na osnovu lambda uslova . Ona nam kazuje da partikulatan izbor ograničene promenljive nije bitan. Instance, i su alfa-ekvivalentni izrazi, i predstavljaju iste funkcije (identične funkcije). Izrazi i nisu alfa-ekvivalentni, zato što nisu ograničene lambda apstrakcijom. U dosta slučajeva, obično se prvo indetifikuju alfa-ekvivalentni izrazi.

Ove definicije su neophodne u odredđivanju beta redukcije.

Slobodne promenljive[uredi | uredi izvor]

Slobodne promenljive su one promenljive koje nisu ograničene labda apstrakcijom. Niz izraza, koji je sačinjen od slobodnih promenljivih, je definisan induktivno:

  • Slobodne promenljive  su samo 
  • Skup slobodnih promenljivih  je skup od slobodnih promenljivih  , ali sa brisanjem 
  • Skup slobodnih promenljivih  je unija svih skupova slobodnih promenljivih  i skupova slobodnih promenljivih .

Na primer, lambda izraz predstavljen identitetom  nema slobodne promenljive , ali funkcija  ima jednu slobodnu promenljivu, .

Izbegavanje-utvrđenih izmena[uredi | uredi izvor]

Pretpostavimo da su , i lambda izrazi a  i  da su promenljive. Oznaka  označava zamenu  za  u  u maniru uhvatiti-izbegnuto. Ovo je definisano kao:

  • ;
  • if ;
  • ;
  • ;
  •  ako je  nije u slobodnoj promenljivoj . Za promenljivu  se kaže da je sveža za r.

Na primer, , i .

Uslov svežine (zahteva da  nije u slobodnoj promenljivoj ) je krucijalan u smislu da osigurava da zamena ne menja značenje funkcija. Na primer, zamena je napravljena tako da ignoriše uslov svežine: . Ova zamena pretvara konstantnu funkciju  u identitet  uz pomoć izmene.

Generalno, neuspeh u uspostavljanju uslova svežine se može ispraviti uz pomoć alfa-preimenovanja sa odgovorajućom svežom promenljivom. Na primer, vraćajući se nazad na našu tačnu notaciju zamene, u  lambda apstrakcija se može preimenovati uz pomoć nove promenljive , da se dobije , i značenje funkcije je zaštićeno zamenom.

Beta redukcija[uredi | uredi izvor]

Pravilo beta redukcije kaže da se  redukuje na izraz . Oznaka  se koristi da označi da se  beta redukuje do . Na primer, za svako , . Ovo znači da je  stvarno identitet. Slično, , što pokazuje da je  konstantna funkcija.

Lambda račun se može predstaviti kao idealizovani funkcionalni program, kao što je Haskel ili Standard ML. Prema tome, beta redukcija odgovara matematičkom koraku. Ovaj korak može biti ponovljen u odgovarajućoj beta konverziji sve dok se ne istroše sve aplikacije. U netipskom lambda računu, kao što je ovde pokazano, ova redukcija se možda ne bi izvršila. Na primer, posmatrati izraz . Here . Izraz se uprošćava u jednoj beta redukciji, a samim tim se proces redukcije nikada neće izvršiti.

Drugi aspekt netipskog lambda računa je ta da ne pravi razliku između različitih dipova podataka. Na primer, može se tražiti da se napiše funkcija koja vrši određenu operaciju samo na brojeve. Međutim, u netipskom lambda računu, ne postoji način da se sačuva funkcija od primenjivanja istinitosnih vredonsti, stringova ili drugih objekata koji nisu brojevi.

Definicija[uredi | uredi izvor]

Lambda izrazi se sastoje od

  • promenljivih v1, v2, ..., vn, ...
  • apstraktnih simbola labda 'λ' i tačke '.'
  • zagrada ( )

Skup lambda izraza, Λ, mogu biti induktivno definisani:

  1. Ako je x promenljiva, onda x ∈ Λ
  2. Ako je h promenljiva i M ∈ Λ, onda (λx.M) ∈ Λ
  3. Ako M, N ∈ Λ, onda (M N) ∈ Λ

Instance pravila 2 su poznate kao abrstrakcija a instance pravila 3 su poznate kao aplikacije[10]

Oznaka[uredi | uredi izvor]

Da bi se zadržala oznaka lambda izraza, obično se primenjuju sledeće konvencije.

  • Krajnje zagrade se odbacuju: M N umesto (M N)
  • Pretpostavljeno je du su aplikacije asocijativne: M N P se može napisati kao ((M N) P)[11]
  • Telo abrstrakcije se proširuje koliko god je moguće: λx.M N znači λx.(M N) a ne znači (λx.M) N
  • Niz apstrakcija je povezano: λx.λy.λz.N je skraćeno kao λxyz.N[12][13]

Slobodne i ograničene promenljive[uredi | uredi izvor]

Za apstrakcioni operator, λ, se kaže da vezuje svoje promenljive kad god se pojave u telu apstrakcije. Promenljive koje spadaju u apstrakciju su ograničene . Sve ostale su slobodne. Na primer, u pratećim izrazima y je ograničena promenljiva a x slobodna: λy.x x y. Takođe se primećuje da je promenljiva ograničena "najbližom apstrakcijom". U sledećim primerima jedno pojavljivanje x u izrazima je ograničeno drugim lambda: λx.yx.z x)

Skup slobodnih promenljivih lambda izraza, M, je označen kao FV(M) i definisan je rekurzijom strukture izraza, kao što je dato:

  1. FV(x) = {x}, gde je h promenljiva
  2. FV(λx.M) = FV(M) \ {x}
  3. FV(M N) = FV(M) ∪ FV(N)[14]

Za izraze koji ne sadrže slobodne promenljive, kaže se da su zatvoreni. Zatvoreni lambda izrazi su takođe poznati i kao kombinacije i ekvivalentne su izrazima u kombinatoričkoj logici.

Redukcija[uredi | uredi izvor]

Značenje lambda izraza je definisano prema tome kako ti izrazi mogu biti redukovani.[15]

Postoje tri tipa redukcija:

  • α-konverzija: menjanje ograničenih promenljivih (alfa);
  • β-redukcija: uzimanje funkcija za njihove argumente (beta);
  • η-konverzija: koja obuhvata oznaku za ekstenzije (eta).

Govorili smo takođe o nastalim jednakostima : dva izraza su  β-ekvivalentna, ako se mogu β-konvertovati u isti izraz, takođe je i α/η-ekvivalencija definisana slično.

Termin redeks, skraćenica od uprostiti izraz, se odnosi na podtermine koji mogu biti redukovani uz pomoć jednog redukcionog praila. Na primer, x.M) N je beta-redeks za izražavanje zamene N za x in M; ako x nije slobodno u  M, λx.M x je eta-redeks. Izraz gde se primenjuje redeks redukcija; koristeći prethodni primer, uprosšćava date redom date izraze M[x:=N]i M.

α-konverzija[uredi | uredi izvor]

Alfa-konverzija, poznata i kao alfa-preimenovanje,[16] dozvoljava promenu imena ograničenim promenljivim. Na primer, alfa-konverzija  λx.x glasi λy.y. Izrazi koji se razlikuju samo po alfa-konverziji se nazivaju a-ekvivalentno. Često, u korišćenju lambda računa, a-ekvivalentni izrazi se smatraju ekvivalentnim.

Precizna pravila za alfa-konverziju nisu baš jednostavna. Prvo, kada alfa-konvertuje apstrakciju, jedina promenljiva koja se pojavljuje  i koja je preimenovana je ta koja je ogranilena istom apstrakcijom. Na primer, alfa-konverzija  λxx.x  daje  λyx.x, ali ne daje λyx.y. Ovaj drugi primer daje drugačije značenje od originala.

Drugo, alfa-konverzija nije moguća ako će rezultat biti promenljiva koja je pod kontrolom druge apstrakcije . Na primer, ako zamenimo x sa y u λxy.x, dobijamo λyy.y, što nije isto.

U programima koji imaju statičko jezgro, alfa-konverzija se može koristiti da se napravi ime rezolucije jednostavnije obezbeđujući da ime promenljive maskira ime u odgovarajućem jezgru (videti alfa preimenovanje da se napravi trivijalna rezolucija

U De Bružinovoj indeksnoj oznaci, bilo koja dva alfa-ekvivalentna izraza su identična.

Zamena[uredi | uredi izvor]

Zamena, napisana kao E[V := R], je proces zamene svih bitnijih slučajeva promenljive V u izrazu E sa izrazom R. Substitucija izraza λ-računa je definisana na osnovu rekurzije struktura izraza, kao što je dato (primetiti: x i y su jedine promenljive dok su M i N bilo koji λ izrazi).

x[x := N]       ≡ N
y[x := N]       ≡ y, if xy
(M1 M2)[x := N] ≡ (M1[x := N]) (M2[x := N])
(λx.M)[x := N]  ≡ λx.M
(λy.M)[x := N]  ≡ λy.(M[x := N]), if xy, дефинисано y ∉ FV(N)

Da bi se transformisalo u lambda apstrakciju, ponekad treba α-konvertovati izraz. Na primer, nije tačno da (λx.y)[y := x] daje (λx.x), zato što je zamenjena vrednost x pretpostavljena da bude slobodna ali na kraju i ograničena. Ispravna zamena u ovom slučaju je (λz.x), sve do α-ekvivalencije. Primetiti da je zamena definisana unikatno do α-ekvivalencije.

β-redukcija[uredi | uredi izvor]

Beta-redukcija pamti ideju aplikacije funkcije. Beta-redukcija je definisana u okvirima zamene: beta-redukcija od((λV.E) E′) je  E[V := E′].

Na primer, pretpostavimo šivrovanje  2, 7, ×, imamo sledeću β-redukciju: ((λn.n×2) 7) 7×2.

η-konverzija[uredi | uredi izvor]

Eta-konverzija izražava ideju ekstenzije, koja se u ovom kontekstu sastoji od dve funcije koje su iste ako i samo ako daju isti rezultat za sve argumente . Eta-konverzija konvertuje između λx.(f x) i f  kad god se x ne pojavljuje slobodno u f.

Normalne forme i ušće[uredi | uredi izvor]

Za netipski lambda račun, β-redukcija kao povratno pravilo, niti normalizuje snažno niti normalizuje slabo

Međutim, može se pokazati da je β-redukcija spojena. (Naravno, radimo do α-konverzije, tj. smatramo da su dve normalne forme jednake, ako je moguće da se α-konvertuje dualno.)

Dakle, oba snažno normalizujuća izraza i slabo normalizujuća izraza imaju unikatnu normalnu formu. Za snažne normalizujuće sisteme, bilo koja redukciona strategija garantuje pozivanje normalne forme, dok za slabo normalizujuće izraze, neke redukcione strategije se možda neće izvršiti.

Šifrovanje tipova podataka[uredi | uredi izvor]

Osnove lambda računa se mogu koristiti za istinitosne vrednosti, aritmetiku, strukture podataka i rekurziju, kao što je ilustrovano u narednim podeljcima.

Aritmetika u lambda računu[uredi | uredi izvor]

Postoji nekoliko mogućih načina da se definišu prirodni brojevi u lambda računu, ali u skoro većini slučajeva su Čerčovi brojevi, koji se mogu definisati kao:

0 := λfx.x
1 := λfx.f x
2 := λfx.f (f x)
3 := λfx.f (f (f x))

i tako dalje. Ili koristiti alternativnu sintaksu:

0 := λfx.x
1 := λfx.f x
2 := λfx.f (f x)
3 := λfx.f (f (f x))

Čerčova cifra je funkcija višeg reda—koja uzima jednu funkciju f, a vraća drugu funkciju. Čerčov broj n je funkcija koja uzima funkciju f kao argument i vraća n-tu kompoziciju f, tj. funkcija f se poziva sama n puta. Ovo je označeno sa f(n) u odnosu n-ti stepen f (smatrati operatorom); f(0) je definisana da bude identična funkcija. Takve ponovljene kompozicije (jedne funkcije f) poštuju zakone eskponata, zbog kojeg ovi brojevi mogu biti korišćeni u aritmetici. (U Čerčovom originalnom lambda računu, formalni parametar lambda izraza je bio morao da se pojavljuje barem jednom u telu funkcije, što čini ovu definiciju 0 nemogućom)

Možemo definisati nasleđenu funkciju , koja uzima broj n i vraća n + 1 dodajući drugu aplikaciju f, gde '(mf)x' znači da je funkcija 'f' primenjena 'm' puta na 'x':

SUCC := λnfx.f (n f x)

Zbog m-tog člana f upoređujući ga sa n-tim članom f daje m+n-ti član f, dodavanja se mogu definisati na sledeći način:

PLUS := λmnfx.m f (n f x)

PLUS se može smatrati kao funkcija koja uzima dva prirodna broja kao argumenta a vraća prirodan broj; može se predstaviti na sledeći način

PLUS 2 3

i

5

su β-ekvivalentni lambda izrazi. Dodavanje m broju n se može postići dodavanjem 1 m puta, ekvivalentna definicija je:

PLUS := λmn.m SUCC n [17]

Slično tome, množenje se definiše kao

MULT := λmnf.m (n f)[18]

Alternativno

MULT := λmn.m (PLUS n) 0

umnožavanje m i n je isto što i ponavljanje dodate n funkcije m puta i pomnoženo 0. Eksponat je češće jedostavan vraćajući Čerčove brojeve, imenovane

POW := λbe.e b

Prethodna funkcija definisana PRED n = n − 1 za pozitivni celi broj n i PRED 0 = 0  je znatno više komplikovanija. Formula

PRED := λnfx.ngh.h (g f)) (λu.x) (λu.u)

može biti dokazana, pokazujući da ako je T označeno gh.h (g f)), onda je T(n)u.x) = (λh.h(f(n−1)(x)))za n > 0. Dve postale definicije PRED su date ispod, jedna koristi uslove a druga koristeći parove. Sa prethodnom funkcijom, oduzimanje je jednostavno. Definisanje

SUB := λmn.n PRED m,

SUB m n poziva mn kada je m > n i 0 drugačije.

Logika i iskazi[uredi | uredi izvor]

Konvencijom, sledeće dve definicije (poznata i kao Čerčova istinitosna vrednost) koje se koriste za određivanje istinitosne vrednosti TRUE(tačno) i FALSE(netačno):

TRUE := λxy.x
FALSE := λxy.y
(Primetiti da  FALSE ekvivalentno Čerčovom broju nula)

Zatim, sa ova dva λ-izraza, možemo definisati neke logičke operacije (ovo su samo moguće formulacije; ostali izrazi su ekvivalentno tačnii):

AND := λpq.p q p
OR := λpq.p p q
NOT := λpab.p b a
IFTHENELSE := λpab.p a b

Sada možemo da izralunamo logičke funkcije, npr. :

AND TRUE FALSE
≡ (λpq.p q p) TRUE FALSE →β TRUE FALSE TRUE
≡ (λxy.x) FALSE TRUE →β FALSE

vidimo da je AND(i) TRUE(tačno) FALSE(netačno) ekvivaletno  FALSE(netačnom).

Predikat je funkcija koja vraća istinitosnu vrednost. Najbitniji predikat je ISZERO(je nula), koji vraća TRUE(tačno)ako je argument Čerčov broj 0, a FALSE(netačno)ako je argument bilo koji drugi Čerčov broj:

ISZERO := λn.nx.FALSE) TRUE

Sledeći predikat testira da li je prvi argument manji ili jednak drugom:

LEQ := λmn.ISZERO (SUB m n),

i dok je m = n, ako LEQ m n i LEQ n m, onda je lako izgraditi predikat numeričke jednakosti.

Dostupnost predikata i definicije TRUE i FALSE čine ga željenim da se napišu "ako-onda-ili" izrazi u lambda računu. Na primer, prethodnik funkcije se može definisati kao:

PRED := λn.ngk.ISZERO (g 1) k (PLUS (g k) 1)) (λv.0) 0

što se može dokazati pokzujući induktivno da je ngk.ISZERO (g 1) k (PLUS (g k) 1)) (λv.0) dodata n − 1 funkcija za n > 0.

Parovi[uredi | uredi izvor]

Par (2-zagrade) se može definisati uz pomoć TRUE and FALSE, koristeći Čerčovo dešifrovanje za parove. Na primer, PAIR enkapsulira par (x,y), FIRST vraa prvi element tog para, dok SECOND vraća drugi.

PAIR := λxyf.f x y
FIRST := λp.p TRUE
SECOND := λp.p FALSE
NIL := λx.TRUE
NULL := λp.pxy.FALSE)

Linkovane liste se mogu definisati i kao NIL za praznu listu, ili PAIR(par) elementa i male liste. Pterpostavimo da NULL testira za vrednost  NIL(nula). (Alternativno, sa NIL := FALSE, konstrukcija lhtz.deal_with_head_h_and_tail_t) (deal_with_nil) uklanja potrebu za eksplicitnim NULL testom.

Kao primer korišćenja parova, funkcije promena i rasta koje mapiraju (m, n) do (n, n + 1) se može definisati kao

Φ := λx.PAIR (SECOND x) (SUCC (SECOND x))

Koji nam omogućava da dobijemo možda i najtransparentniju verziju prethodne funkcije

PRED := λn.FIRST (n Φ (PAIR 0 0)).

Rekurzija i fiksne tačke[uredi | uredi izvor]

Rekurzija je definica funkcije koja poziva sebe; lambda račun ne dozvoljava ovo (ne možemo odrediti vrednosti koja tek treba da se definiše, unutar lambda izraza definiše se ista vrednost, kao sve anonimne funkcije u lambda računu). Međutim, ovaj utisak vara: u x.x x) y  obe x‍ ‍ vrednosti se odnose na isti lambda izraz , y, pa je samim tim moguća za lambda izraz –ovde je y – napravljen tako da poziva sopstvenu vrednost, kroz svoju aplikaciju.

Rekurzivna instanca funkcije faktorijela F(n) je definisana kao

F(n) = 1, if n = 0; else n × F(n − 1).

U lambda izrazu koji je izabran da predstavlja tu funkciju, za parametar (uglavnom prvi) se pretpostavlja da prima svoj lambda izraz, a to se naziva-primati to kao argument- što će biti rekurzija. Ovako se dostiže rekurzija, namerno kao svoj referentni argument,  (koji se ovde naziva r) i mora uvek sebe da poziva u telu funkcije, tj. :

G := λr. λn.(1, if n = 0; else n × (r r (n−1)))
with  r r x = F x = G r x  to hold, so  r = G  and
F := G G = (λx.x x) G

Sopstvena-aplikacija postiže replikaciju ovde, prolazeći funkciju lambda izraza na sledeći poziv kao vrednosni argument, čineći to mogućim za referisanje i poziv.

Ovo rešava to ali podrazumeva ponovno pisanje svakog rekurzivnog poziv kao sopstvena-aplikacija. Voleli bismo da imamo generičko rešenje, bez potrebe ponovnog pisanja:

G := λr. λn.(1, if n = 0; else n × (r (n−1)))
with  r x = F x = G r x  to hold, so  r = G r =: FIX G  and
F := FIX G  where  FIX g := (r where r = g r) = g (FIX g)
so that  FIX G = G (FIX G) = (λn.(1, if n = 0; else n × ((FIX G) (n−1))))

Dati lambda izraz sa prvim argumentom predstavlja rekurzivni poziv ( označeno sa G),  kombinator fiksne tačke FIX će vratiti sopstvenu replikaciju lambda izraza predstavljajući rekurzivnu funkciju (ovde je to F). Funkcija ne mora proći samu sebe po svaku cenu, za sopstvenu replikaciju koja je napravljena u nastavku, kada se kreira, da bude izvršena svaki put kada se pozove. Originalan lambda izraz (FIX G)je ponovo napravljen u samom sebi, postižući sopstvenu referencu

Postoji mnogo različitih definicija za FIX operator, najjednostavniji je:

Y := λg.(λx.g (x x)) (λx.g (x x))

U lambda računu , Y g  je fiksirana tačka g, kao što je pokazano:

Y g
λh.((λx.h (x x)) (λx.h (x x))) g
x.g (x x)) (λx.g (x x))
g ((λx.g (x x)) (λx.g (x x)))
g (Y g)

Sada, da bismo izveli naš rekurzivni poziv funkcije faktorijela, jednostavno ćemo pozvati (Y G) n, gde je n broj čiji faktorijel izračunavamo. Dodelimo npr. vrednost  n = 4, što daje:

(Y G) 4
G (Y G) 4
rn.(1, if n = 0; else n × (r (n−1)))) (Y G) 4
n.(1, if n = 0; else n × ((Y G) (n−1)))) 4
1, if 4 = 0; else 4 × ((Y G) (4−1))
4 × (G (Y G) (4−1))
4 × ((λn.(1, if n = 0; else n × ((Y G) (n−1)))) (4−1))
4 × (1, if 3 = 0; else 3 × ((Y G) (3−1)))
4 × (3 × (G (Y G) (3−1)))
4 × (3 × ((λn.(1, if n = 0; else n × ((Y G) (n−1)))) (3−1)))
4 × (3 × (1, if 2 = 0; else 2 × ((Y G) (2−1))))
4 × (3 × (2 × (G (Y G) (2−1))))
4 × (3 × (2 × ((λn.(1, if n = 0; else n × ((Y G) (n−1)))) (2−1))))
4 × (3 × (2 × (1, if 1 = 0; else 1 × ((Y G) (1−1)))))
4 × (3 × (2 × (1 × (G (Y G) (1−1)))))
4 × (3 × (2 × (1 × ((λn.(1, if n = 0; else n × ((Y G) (n−1)))) (1−1)))))
4 × (3 × (2 × (1 × (1, if 0 = 0; else 0 × ((Y G) (0−1))))))
4 × (3 × (2 × (1 × (1))))
24

Svaka rekurzivno definisana funkcija može biti predstavljena kao fiksirana tačka neke odgovarajuće definisane funkcije zatvarajući rekurzivni poziv sa ekstra argumentom Y, svaka rekurzivno definisana funkcija se može izraziti kao lambda izraz. Praktično, mi možemo jasno definisati oduzimanje, množenje i poređenje predikata prirodnih brojeva rekurzivno.

Standardni izrazi[uredi | uredi izvor]

Sledeći izrazi obično prihvataju imena:

I := λx.x
K := λxy.x
S := λxyz.x z (y z)
B := λxyz.x (y z)
C := λxyz.x z y
W := λxy.x y y
U := λxy.y (x x y)
ω := λx.x x
Ω := ω ω
Y := λg.(λx.g (x x)) (λx.g (x x))

Tipski lambda račun[uredi | uredi izvor]

Tipski lambda račun je tipski formalizam koji koristi lambda simbol () da označi nepoznatu apstrakciju funkcije. U ovom kontekstu, tipovi su obično objekti sintetičke prirode koji su dodeljeni lambda izrazima; egzaktna priroda tipova zavisi od izračunavanja računa (videti vrste u nastavku) . Sa određene tačke gledišta, tipski lambda račun se može predstaviti kao usavršavanje netipskog lambda računa ali sa druge tačke gledišta, oni oni se takođe mogu smatrati više fundamentalnom teorijom i netipski lambda račun je specijalni slučaj sa samo jednim tipom.

Tipski lambda račun je osnivač programskih jezika i on predstavlja bazu funkcionalnih programskih jezika kao što su ML i Haskel i, više indirektni, tipski imperativni programski jezici. Tipski lambda račun ima veoma važnu ulogu u dizajnu tipskih sistema za programske jezike; ovde određivanje tipa obično označava poželjne karakteristike programa, npr. program neće naštetiti pristup memoriji

Tipski lambda račun je usko povezan sa matematičkom logikom i otpornom teorijom sa Kari-Hauradovim izomorfizmom i oni se mogu smatrati kao interni programi sačinjeni od klasa kategorija, npr. jednostavan tipski lambda račun je program Dekartove zatvorene kategorije (Dzk).

Izračunive funkcije i lambda račun[uredi | uredi izvor]

Funkcija F: NN prirodnih brojeva je izračuniva ako i sako ako postoji lambda izraz  f takav da za svaki par x, y u N, F(x)=y i ako i samo ako je f x =β y, gde su x i y Čerčovi odgovarajući brojevi za xy, odnosno i =β predstavlja ekvivalenciju za beta redukciju. Ovo je jedan od mnogo načina da se definiše izračunjivost; videti Čerč-Tjuringova teza za diskusiju o drugim proračunima i njihovim jednakostima.

Nesigurnost ekvivalencije[uredi | uredi izvor]

Ne postoji algoritam koji uzima kao ulazne podatke dva lambda izraza i vraća TRUE or FALSE u zavisnosti od toga da li su ta dva izraza ekvivalentna ili nisu. Istorijski gledano, ovo je prvi problem čija se nesigurnost mogla dokazati. Kao i kod dokazane nesigurnosti , dokaz pokazuje da ni jedna računiva funkcija ne može da određuje ekvivalenciju. Čerč-Tjuringova teza je uvedena da pokaže da ne postoji algoritam koji ovo radi.

Čerčov dokaz je prvi uprostio problem određivanja gde lambda izraz ima normalnu formu. Normalna forma je ekvivalentna irazu koji se ne može uprostiti ispod pravila koji su uslovljeni pravilom. On sumnja da je ovaj iskaz računiv, i da se mođe predstaviti preko lambda računa. Nadograđujući se na posao koji je odradio Klin, konstruktujući Gedelovo brojanje za lambda izrazem, on je osmislio lambda izraz e koji striktno prati dokaz Gedelove teoreme o nepotpunosti . Ako se e primenjuje na sopstveni Gedelov broj, rezultat je kontradikcija. 

Lambda račun i programski jezici[uredi | uredi izvor]

Kao što je određeno od strane Pitera Landina 1965. korespondencija između Algola 60 i Čerčove Lambda notacije, sekvencijalno proceduralni programi mogu da razumeju izraze lambda računa, koji pružaju osnovne mehanizme za proceduralnu apstrakciju i proceduru (potprogram) aplikacije.

Lambda račun čini "funkcije" povezanijim i čini ih objektima prve klase što utiče na porast kompleksnosti implementacije kada bude izvršena. 

Anonimna funkcija[uredi | uredi izvor]

Na primer, u Lisp-u kvadratna funkcije se može predstaviti kao lambda račun, kao:

(lambda (x) (* x x))

Dati primer je izraz koji pripada prvoj klasi funkcija. Simbol lambda kreira anonimnu funkciju, date liste imena parametra, (x) — samo jedan argument u ovom slučaju, i izraz koji je predstavljen kao telo funkcije , (* x x). Haskelov primer je identičan. Anonimne funkcije se ponekad zovu lambda izrazima

Na primer, Paskal i mnogo ostalih imperativnih programa je dugo podržavalo prelazak preko potprograma, kao argumente za druge potprograme kroz mehanizam izvršilaca funkcije. Međutim, izvršioci programa nisu dovoljan uslov za funkcije da budu tipovi prve klase, zato što je funkcija tip podataka prve klase ako i samo ako nova instanca funkcije može biti kreirana u brzom vremenu. U ovom brzom vremenu kreiranje funkcija je podržano u Smalltalku, Javaskripti, i češće u Skali, Ajfelu ("agenti", C# ("delegacija" i C++11, i mnogi drugi.

Strategija uprošćavanja[uredi | uredi izvor]

Bez obzira na to da li se izraz normalizuje ili ne, i koliko mu treba da se izrši u normalizaciji toga, izraz zavisi u velikoj meri od korišćene strategije uprošćavanja. Razlika između redukcionih strategija zavisi od razlike u funkcionalnom programskom jeziku između poželjne procene i nepoželjne procene.

Potpuna beta redukcija
Bilo kakva redukcija se može redukovati bilo kad. Ovo znači da u suštini odsustvo bilo koje praktične redukcione strategije-koja je usko povezana sa redukcijom , "pada u vodu".
Aplikativni red
Srkoz levo, po dubini se prvo izvršava redukcija. Intuitivno ovo znači da se uvek prvo uprošćavaju argumenti funkcije pre same funkcije. Aplikativni red uvek pokušava da prihvati funkciju u normalnom obliku, čak i kada to nije moguće. Mnogi programski jezici (kao što su Lisp, ML, i imperativni jezici kao što su C i Java)su opisani kao "striktni", misleći da su funkcije primljene od strane ne normalizujućih argumenata, ne normalizujuće. Ovo je urađeno koristeći aplikativni red, a naziva se vrednosno uprošćavanje, ili češće "željena evolucija".
Normalni red
Skroz levo, se prvo redukuje po krajevima. Kad god je moguće, argumenti se zamenjuju u telo abrstrakcije pre nego što su argumenti uprošćeni.
Poziv po imenu
Kao normalni red, ali bez redukcionih performansi unutar apstrakcija. Na primer, λx.(λx.x)x je normalna forma prema ovoj strategiji, iako sadrži redeks  (λx.x)x.
Poziv po vrednosti
Samo krajevi redeksa se uprošćavaj; redeks je uprošćen samo ako je desna strana podložna redukciji (promenljiva ili lambda apstrakcija).
Poziv po potrebi
Kao normalni red, ali aplikacije funkcija će udvostručiti izraze umesto imena argumenata, koji su zatim redukuju samo " kada je to potrebno". Nazvano u praktičnom smislu "lenja procena". U implementacijama ovo "ime" uzima formu izvršioca, sa redeksom predstavljenim uz pomoć uzvika.

Aplikativni izraz nije normalizovano osmišljen. Česti protivprimer je: definisati Ω = ωω gde je ω = λx.xx. Ceo ovaj izraz sadrži samo jedan redeks, koji imenuje celi izraz; redukuje se ponovo Ω. Kako je ovo jedina moguća redukcija, Ω nema normalnu formu (ispod svake procene strategije). Koristeći aplikativni red, izraz KIΩ = (λxy.x) (λx.x)Ω je redukovan od strane prve redukcije Ω do normalne forme (dok je redeks skroz desno ), ali dok Ω nema normalnu formu, aplikativni red ne može da nađe normalnu formu za KIΩ.

U suprotnosti, normalni red se tako naziva zato što uvek nađe normalizujuću redukciju. U navedenom primeru, KIΩ se redkuje iz normalnog reda do I, normalne forme. Nedostatak se ogleda u tome što redeksi u argumentima mogu biti koopirani, što dovodi do dupliranog izračunavanja (npr. , x.xx) ((λx.x)y) se redukuje dp ((λx.x)y) ((λx.x)y) koristeći ovu strategiju; sada postoje dva redeksa, pa celokupna procena mora da ima još dva koraka, ali ako su argumenti prvo redukovani, tada će neće postojati ništa).

Pozitivni dogovor korišćenja aplikativnog izraza se ogleda u tome što ne izaziva nepotrebno računanj, ako su svi argumenti korišćeni, zbog toha što se nikada ne zamenjuju argumenti koji sadrže redeks i zbog toga ih ne treba nikada kopirati (što može da duplira posao). U gornjem primeru, u aplikacionom izrazu x.xx) ((λx.x)y) se redukuje prvo dox.xx)y a zatim do normalnog izraza yy, uzimajući dva koraka umesto da uzme tri izraza.

Većina čistih funkcionalnih programskih jezika (posebno Miranda i njegovi prethodnici, uključujući Haskel), i dokazanih programskih jezika teoreme provere, koriste lenju procenu pto je u suštini isto ka i poziv po potrebi. Ove je slično normalnoj redukciji, ali poziv po potrebi uspeva da izbegne duplianje posla inherentno u normalnoj redukciji koristeći deljenje . U gore navedenom primeru, x.xx) ((λx.x)y) se redukuje do ((λx.x)y) ((λx.x)y), što sadrži dva redeksa, ali u pozivu po potrebi oni su predstavljeni tako da koriste isti objekat češće nego kopirani, pa kada je jedan redukovan, samim tim je i drugi redukovan.

Napomena o složenosti[uredi | uredi izvor]

Dok je ideja beta redukcije izgledala dovoljno jednostavno, ona ipak nije atomski korak, u smislu da mora da ima komplikovanu strukturu pri proceni računarske složenosti.[19] Precizno, jedna mora nekako da pronađe lokaciju svih ograničenih pojava promenljive V  u izrazu E, što dovodi do trošenja vremena, ili jedna mora da vodi evidenciju lokacija V u izrazu E, što takođe dovodi do trošenja vremena. Naivna pretraga lokacije V u izrazu E je O(n) u dužini n od E. Ovo dovodi do proučavanja sistema koji koriste eksplicitnu zamenu. Sinotov upravljač stringovima [traži se izvor] nudi način snimanja lokacija slobodnih varijabli u izrazima.

Paralelizam i slaganje[uredi | uredi izvor]

Čerč-Roserova osobina u lambda računu znači da procena (β-redukcija) može biti izbačena u bilo kom redosledu, čak i u paraleli. Ovo znači da je promenljiva nedeterministička procena strategija bitna. Međutim, lambda račun ne nudi bilo kakvu eksplicitnu konstrukciju za paralelnu obradu. Jedan može dodati konstrukciju kao karakteristiku za lambda račun. Drugi proces računanja je razbi

Semantika[uredi | uredi izvor]

Činjenica, da se izrazi lambda računa ponašaju kao funkcije na ostale lambda izraze, pa čak i na same sebe, dovela je do pitanja o semantici lambda računa . Da li se mogu razumna značenja dodelti izrazima lambda računa? Priroda semantike je je da nađe skupove D izomorfne funkcionalnom prostoru DD, funkcije na samu sebe. Međutim, komplikovano postojanje D, uz pomoć kardinalnog ograničenja zato što skup svih funkcija iz  D do D ima veću kardinalnost nego D, osim ako je samostalno.

U 1970-im, Dejna Skot je pokazako da, ako se posmatraju samo neprekidne funkcije, skup ili domen D sa potrebnim osobinama se može naći, praveći tako model lambda računa.

Ovo je stvorilo osnovu za semantiku sistema zakona programskih jezika.

Reference[uredi | uredi izvor]

  1. ^ Turing, A. M. (December 1937).
  2. ^ Mitchell 2003, str. 57.
  3. ^ Coquand, Thierry, "Type Theory"[mrtva veza], The Stanford Encyclopedia of Philosophy (Summer 2013 Edition), Edward N. Zalta (ed.
  4. ^ Moortgat 1988
  5. ^ Bunt & Muskens 2008
  6. ^ A. Church, "A set of postulates for the foundation of logic", Annals of Mathematics, Series 2, 33:346–366 (1932).
  7. ^ For a full history, see Cardone and Hindley's "History of Lambda-calculus and Combinatory Logic" (2006).
  8. ^ A. Church, "An unsolvable problem of elementary number theory", American Journal of Mathematics, Volume 58, No. 2.
  9. ^ Church, A. "A Formulation of the Simple Theory of Types".
  10. ^ Barendregt, Hendrik Pieter (1984), The Lambda Calculus: Its Syntax and Semantics Arhivirano na sajtu Wayback Machine (23. avgust 2004), Studies in Logic and the Foundations of Mathematics 103 (Revised ed.
  11. ^ "Example for Rules of Associativity".
  12. ^ Selinger, Peter (2008), Lecture Notes on the Lambda Calculus (PDF) 0804 (class: cs.
  13. ^ "Example for Rule of Associativity".
  14. ^ Barendregt, Henk; Barendsen, Erik (March 2000), Introduction to Lambda Calculus[mrtva veza] (PDF)
  15. ^ De Queiroz, Ruy J. G. B. (1988). „A Proof-Theoretic Account of Programming and the Role of Reduction Rules”. Dialectica. 42 (4): 265—282. doi:10.1111/j.1746-8361.1988.tb00919.x. 
  16. ^ Turbak & Gifford 2008, str. 251
  17. ^ Felleisen, Matthias; Flatt, Matthew (2006), Programming Languages and Lambda Calculi (PDF). str. 26.
  18. ^ Selinger, Peter (2008), Lecture Notes on the Lambda Calculus (PDF) 0804 (class: cs.
  19. ^ R. Statman, "The typed λ-calculus is not elementary recursive."

Literatura[uredi | uredi izvor]