Пређи на садржај

Ламбда рачун

С Википедије, слободне енциклопедије
(преусмерено са Λ-калкулус)

Ламбда рачун (ознака λ-рачун) је формални систем у математичкој логици за представљање рачунања базираног на апстракцији функција и апликација користећи везивање и супституцију променљиве. Увео га је Алонзо Черч да формулише концепт ефективног рачунања, ламбда рачун је наишо на прве успехе на пољу теорије рачунања, као што је негативан одговор на Хилбертов проблем одлуке. Ламбда рачун је концептуално једноставан универзални модел рачунања (Тјуринг је показао 1937. године[1] да Тјурингова машина једнака ламбда рачуну у експресивности). Име потиче од грчког слова ламбда (λ) коришћеног да означи везивање променљивих у функцији. Слово је само по себи произвољно и нема никакво специјално значење. Ламбда рачун се учи и користи у рачунарству због своје корисности у приказивању функционалног размишљања и итеративне редукције.[2]

Због важности појма везивања променљиве и субституције, не постоји само један систем ламбда рачуна, и у пракси постоје "типске" и "нетипске" варијанте. Историјски гледано, најважнији систем је био нетипски ламбда рачун, у којем функција апликације нема рестрикција (појам домена функције није уграђен у систем. У Черч-Тјуринговој тези, нетипски ламбда рачун је подешен да буде могуће израчунати све ефективно израчуниве функције. Типски ламбда рачун је варијација која има рестрикције за функцију апликације, тако да се функција може применити само ако се прихвати улазни тип података.

Данас, ламбда рачун има улогу у много различитих свера, као нпр. у математици, филозофији,[3] лингвистици,[4][5] и рачунарству. Још увек се користи у области теорије рачунања, као и Тјурингова машина која је врло важан модел за рачунање. Ламбда рачун је одиграо веома важну улоу у развоју теорије програмских језика. Делови бројача, у ламбда рачуну у рачунарству, су функционални програми, који имплементирају ламбда рачун (повећати неке константе и типове података). Поред програмских језика, лабмда рачун игра улогу у теорији доказа. Главни пример тога је Кари-Хауардова кореспонденција, која даје кореспонденцију између различитих система типова ламбда рачуна и система формалне логике.

Историја ламбда рачуна у математици

[уреди | уреди извор]

Ламбда рачун је увео Алонзо Черч у 1930—им годинама као део истраге о основама математике.[6][7] Оригинални систем је показан као логички противречан 1935. године када су Стивен Клин и Ј. Б. Росер развили Клин-Росеров парадокс.

Након тога, у 1936. години, Черч је изоловао и објавио само део битан за рачунање, који се данас зове нетипски ламбда рачун.[8] У 1940. години, он је такође увео рачунски слабији, али логички доследнији систем, знан као једноставни типски ламбда рачун.[9]

Мотивација

[уреди | уреди извор]

Рачунске функције представљају круцијалан концепт у рачунарству и математици. Ламбда рачун даје једноставу семантику за израчунавање, омогућавајући особине израчунавања да буду формално учене. Ламбда рачун укључује два упрошћавања која чине семантику једноставном. Прво поједностављење је то да Ламбда рачун третира функцију "анонимно", без давања експлицитних имена. На пример, функција 

може се поново написати у анонимној форми као

(чита се као "пар x и y је мапиран у "). Слично,

се може написати у анонимној форми , где је улаз једноставно мапиран у самог себе 

Друго поједностављење је то да ламбда рачун користи само функције једног улаза. Обична функција која захтева два улаза , за инстанцу  (збир квадрата) функције, може се написати као једна еквивалентна функција која прима један улаз, а да излаз враћа другу функцију, која заузврат прима један улаз. На пример,

се може написати као

Ова метода, позната и као кариинг, трансформише функцију која узима више аргумената у ланац функција, где свака има један аргумент.

Функционално окружење   функције са аргументима (5, 2), добијено одједном

,

док процена каријеве верзије захтева још један корак

добија се исти резултат.

Ламбда рачун

[уреди | уреди извор]

Ламбда рачун се састоји од програма ламбда услова, који су дефинисани одређеном формалном синтаксом, и сетом трансформацијских правила, који допуштају манипулацију ламбда услова. Ова трансформацијска правила се могу представити као еквивалентна теорија или као операционализам.

Као што је већ описано, све функције у ламбда рачуну су у ствари анонимне функције, тј. немају име. Дозвољавају само једну улазну променљиву, са каријевом верзијом да се убаце функције са неколико променљивих.

Ламбда правила

[уреди | уреди извор]

Синтакса ламбда рачуна дефинише неке изразе као дозвољене изразе ламбда рачуна и неке неважеће, као што су на пример стрингови који се састоје од карактера валидних C програма а неки ипак нису. Дозвољени израз ламбда рачуна се назива ламбда израз.

Следећа три правила дају индуктивну дефиницију која се могу искористити за прављење синтатички исправних ламбда изрази:

  • променљива, , је сам по себи валидан ламбда израз
  • ако је  ламбда израз, а је променљива, онда је  ламбда израз (назива се и  ламбда апстракцијом);
  • ако су  и ламбда изрази, онда је и  ламбда израз (апликација).

Ништа друго није ламбда услов. Ламбда услов је валидан ако и само ако се може добити применом ова три правила. Међутим, неке заграде могу бити изостављене у складу са неким правилима. На пример, спољашње заграде се обично не пишу. 

Ламбда апстракција  је дефиниција анонимне функције која може да узме један улаз  и замени га у израз . На тај начин се дефинишу анонимне функције које узимају x а враћају t. На пример, је ламбда апстракција функције  користећи израз  за . Дефиниција функције са ламбда абрстракцијом само "поставља" функцију али је не уводи. Абрстракција везује променљиву  у израз .

Апликација  представља примену функције  на улаз , који представља чин позива функције у односу на улаз  да би се добио .

Не постоји концепт променљивих декларација у ламбда рачуну. У дефиницији као што је  (i.e. ), ламбда рачун третира  променљиву која још увек није дефинисана. Ламбда абрстракција  је синтатички исправна, и представља функцију која додаје своје уносе за још увек непознату .

Заграде се могу користити тј. могу бити потребне неким изразима. На пример, and означава резиличите изразе (иако се случајно сређивањем добија исти резултат). Ево првог примера дефинисања функције која дефинише функцију и враћа резултат узимајући х из дечије-функције (примени функцију а затим врати), док други пример дефинише функцију која враћа функцију за било који улаз враћа његову вредност узете х (враћа функцију а онда је примени).

Функције које оперишу (врше неку радњу) на друге функције

[уреди | уреди извор]

У ламбда рачуну, функције су узете да буду вредности прве класе, па тако функције могу бити коришћене као улази, или бити враћене као излази из других функција.

На пример, представља идентичну функцију, , а   представља идентичну функцију примењену на  . Дакле,  представља константну функцију , функцију која увек враћа , без обзира на улаз. У ламбда рачуну, апликација функције се сматра лево-асоцијативном, што значи да  значи .

Потоји неколико појмова "еквиваленције" и "редукције" која дозвољава ламбда изразима да буду "поједностављени" својим "еквивалентним" ламбда изразима.

Алфа еквиваленција

[уреди | уреди извор]

Основна форма еквиваленције, дефинисана на основу ламбда услова . Она нам казује да партикулатан избор ограничене променљиве није битан. Инстанце, и су алфа-еквивалентни изрази, и представљају исте функције (идентичне функције). Изрази и нису алфа-еквивалентни, зато што нису ограничене ламбда апстракцијом. У доста случајева, обично се прво индетификују алфа-еквивалентни изрази.

Ове дефиниције су неопходне у одредђивању бета редукције.

Слободне променљиве

[уреди | уреди извор]

Слободне променљиве су оне променљиве које нису ограничене лабда апстракцијом. Низ израза, који је сачињен од слободних променљивих, је дефинисан индуктивно:

  • Слободне променљиве  су само 
  • Скуп слободних променљивих  је скуп од слободних променљивих  , али са брисањем 
  • Скуп слободних променљивих  је унија свих скупова слободних променљивих  и скупова слободних променљивих .

На пример, ламбда израз представљен идентитетом  нема слободне променљиве , али функција  има једну слободну променљиву, .

Избегавање-утврђених измена

[уреди | уреди извор]

Претпоставимо да су , и ламбда изрази а  и  да су променљиве. Ознака  означава замену  за  у  у маниру ухватити-избегнуто. Ово је дефинисано као:

  • ;
  • if ;
  • ;
  • ;
  •  ако је  није у слободној променљивој . За променљиву  се каже да је свежа за r.

На пример, , и .

Услов свежине (захтева да  није у слободној променљивој ) је круцијалан у смислу да осигурава да замена не мења значење функција. На пример, замена је направљена тако да игнорише услов свежине: . Ова замена претвара константну функцију  у идентитет  уз помоћ измене.

Генерално, неуспех у успостављању услова свежине се може исправити уз помоћ алфа-преименовања са одговорајућом свежом променљивом. На пример, враћајући се назад на нашу тачну нотацију замене, у  ламбда апстракција се може преименовати уз помоћ нове променљиве , да се добије , и значење функције је заштићено заменом.

Бета редукција

[уреди | уреди извор]

Правило бета редукције каже да се  редукује на израз . Ознака  се користи да означи да се  бета редукује до . На пример, за свако , . Ово значи да је  стварно идентитет. Слично, , што показује да је  константна функција.

Ламбда рачун се може представити као идеализовани функционални програм, као што је Хаскел или Стандард ML. Према томе, бета редукција одговара математичком кораку. Овај корак може бити поновљен у одговарајућој бета конверзији све док се не истроше све апликације. У нетипском ламбда рачуну, као што је овде показано, ова редукција се можда не би извршила. На пример, посматрати израз . Here . Израз се упрошћава у једној бета редукцији, а самим тим се процес редукције никада неће извршити.

Други аспект нетипског ламбда рачуна је та да не прави разлику између различитих дипова података. На пример, може се тражити да се напише функција која врши одређену операцију само на бројеве. Међутим, у нетипском ламбда рачуну, не постоји начин да се сачува функција од примењивања истинитосних вредонсти, стрингова или других објеката који нису бројеви.

Дефиниција

[уреди | уреди извор]

Ламбда изрази се састоје од

  • променљивих v1, v2, ..., vn, ...
  • апстрактних симбола лабда 'λ' и тачке '.'
  • заграда ( )

Скуп ламбда израза, Λ, могу бити индуктивно дефинисани:

  1. Ако је x променљива, онда x ∈ Λ
  2. Ако је х променљива и М ∈ Λ, онда (λx.M) ∈ Λ
  3. Ако M, N ∈ Λ, онда (M N) ∈ Λ

Инстанце правила 2 су познате као абрстракција а инстанце правила 3 су познате као апликације[10]

Да би се задржала ознака ламбда израза, обично се примењују следеће конвенције.

  • Крајње заграде се одбацују: M N уместо (M N)
  • Претпостављено је ду су апликације асоцијативне: M N P се може написати као ((M N) P)[11]
  • Тело абрстракције се проширује колико год је могуће: λx.M N значи λx.(M N) а не значи (λx.M) N
  • Низ апстракција је повезано: λx.λy.λz.N је скраћено као λxyz.N[12][13]

Слободне и ограничене променљиве

[уреди | уреди извор]

За апстракциони оператор, λ, се каже да везује своје променљиве кад год се појаве у телу апстракције. Променљиве које спадају у апстракцију су ограничене . Све остале су слободне. На пример, у пратећим изразима y је ограничена променљива а x слободна: λy.x x y. Такође се примећује да је променљива ограничена "најближом апстракцијом". У следећим примерима једно појављивање x у изразима је ограничено другим ламбда: λx.yx.z x)

Скуп слободних променљивих ламбда израза, М, је означен као FV(М) и дефинисан је рекурзијом структуре израза, као што је дато:

  1. FV(x) = {x}, где је х променљива
  2. FV(λx.M) = FV(M) \ {x}
  3. FV(M N) = FV(M) ∪ FV(N)[14]

За изразе који не садрже слободне променљиве, каже се да су затворени. Затворени ламбда изрази су такође познати и као комбинације и еквивалентне су изразима у комбинаторичкој логици.

Редукција

[уреди | уреди извор]

Значење ламбда израза је дефинисано према томе како ти изрази могу бити редуковани.[15]

Постоје три типа редукција:

  • α-конверзија: мењање ограничених променљивих (алфа);
  • β-редукција: узимање функција за њихове аргументе (бета);
  • η-конверзија: која обухвата ознаку за екстензије (ета).

Говорили смо такође о насталим једнакостима : два израза су  β-еквивалентна, ако се могу β-конвертовати у исти израз, такође је и α/η-еквиваленција дефинисана слично.

Термин редекс, скраћеница од упростити израз, се односи на подтермине који могу бити редуковани уз помоћ једног редукционог праила. На пример, x.M) N је бета-редекс за изражавање замене N за x in M; ако x није слободно у  M, λx.M x је ета-редекс. Израз где се примењује редекс редукција; користећи претходни пример, упросшћава дате редом дате изразе M[x:=N]и M.

α-конверзија

[уреди | уреди извор]

Алфа-конверзија, позната и као алфа-преименовање,[16] дозвољава промену имена ограниченим променљивим. На пример, алфа-конверзија  λx.x гласи λy.y. Изрази који се разликују само по алфа-конверзији се називају а-еквивалентно. Често, у коришћењу ламбда рачуна, а-еквивалентни изрази се сматрају еквивалентним.

Прецизна правила за алфа-конверзију нису баш једноставна. Прво, када алфа-конвертује апстракцију, једина променљива која се појављује  и која је преименована је та која је огранилена истом апстракцијом. На пример, алфа-конверзија  λxx.x  даје  λyx.x, али не даје λyx.y. Овај други пример даје другачије значење од оригинала.

Друго, алфа-конверзија није могућа ако ће резултат бити променљива која је под контролом друге апстракције . На пример, ако заменимо x са y у λxy.x, добијамо λyy.y, што није исто.

У програмима који имају статичко језгро, алфа-конверзија се може користити да се направи име резолуције једноставније обезбеђујући да име променљиве маскира име у одговарајућем језгру (видети алфа преименовање да се направи тривијална резолуција

У Де Бружиновој индексној ознаци, било која два алфа-еквивалентна израза су идентична.

Замена, написана као E[V := R], је процес замене свих битнијих случајева променљиве V у изразу E са изразом R. Субституција израза λ-рачуна је дефинисана на основу рекурзије структура израза, као што је дато (приметити: x и y су једине променљиве док су M и N било који λ изрази).

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)

Да би се трансформисало у ламбда апстракцију, понекад треба α-конвертовати израз. На пример, није тачно да (λx.y)[y := x] даје (λx.x), зато што је замењена вредност x претпостављена да буде слободна али на крају и ограничена. Исправна замена у овом случају је (λz.x), све до α-еквиваленције. Приметити да је замена дефинисана уникатно до α-еквиваленције.

β-редукција

[уреди | уреди извор]

Бета-редукција памти идеју апликације функције. Бета-редукција је дефинисана у оквирима замене: бета-редукција од((λV.E) E′) је  E[V := E′].

На пример, претпоставимо шивровање  2, 7, ×, имамо следећу β-редукцију: ((λn.n×2) 7) 7×2.

η-конверзија

[уреди | уреди извор]

Ета-конверзија изражава идеју екстензије, која се у овом контексту састоји од две фунције које су исте ако и само ако дају исти резултат за све аргументе . Ета-конверзија конвертује између λx.(f x) и f  кад год се x не појављује слободно у f.

Нормалне форме и ушће

[уреди | уреди извор]

За нетипски ламбда рачун, β-редукција као повратно правило, нити нормализује снажно нити нормализује слабо

Међутим, може се показати да је β-редукција спојена. (Наравно, радимо до α-конверзије, тј. сматрамо да су две нормалне форме једнаке, ако је могуће да се α-конвертује дуално.)

Дакле, оба снажно нормализујућа израза и слабо нормализујућа израза имају уникатну нормалну форму. За снажне нормализујуће системе, било која редукциона стратегија гарантује позивање нормалне форме, док за слабо нормализујуће изразе, неке редукционе стратегије се можда неће извршити.

Шифровање типова података

[уреди | уреди извор]

Основе ламбда рачуна се могу користити за истинитосне вредности, аритметику, структуре података и рекурзију, као што је илустровано у наредним подељцима.

Аритметика у ламбда рачуну

[уреди | уреди извор]

Постоји неколико могућих начина да се дефинишу природни бројеви у ламбда рачуну, али у скоро већини случајева су Черчови бројеви, који се могу дефинисати као:

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

и тако даље. Или користити алтернативну синтаксу:

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

Черчова цифра је функција вишег реда—која узима једну функцију f, а враћа другу функцију. Черчов број n је функција која узима функцију f као аргумент и враћа n-ту композицију f, тј. функција f се позива сама n пута. Ово је означено са f(n) у односу n-ти степен f (сматрати оператором); f(0) је дефинисана да буде идентична функција. Такве поновљене композиције (једне функције f) поштују законе ескпоната, због којег ови бројеви могу бити коришћени у аритметици. (У Черчовом оригиналном ламбда рачуну, формални параметар ламбда израза је био морао да се појављује барем једном у телу функције, што чини ову дефиницију 0 немогућом)

Можемо дефинисати наслеђену функцију , која узима број n и враћа n + 1 додајући другу апликацију f, где '(mf)x' значи да је функција 'f' примењена 'm' пута на 'x':

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

Због m-тог члана f упоређујући га са n-тим чланом f даје m+n-ти члан f, додавања се могу дефинисати на следећи начин:

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

PLUS се може сматрати као функција која узима два природна броја као аргумента а враћа природан број; може се представити на следећи начин

PLUS 2 3

и

5

су β-еквивалентни ламбда изрази. Додавање m броју n се може постићи додавањем 1 m пута, еквивалентна дефиниција је:

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

Слично томе, множење се дефинише као

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

Алтернативно

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

умножавање m и n је исто што и понављање додате n функције m пута и помножено 0. Експонат је чешће једоставан враћајући Черчове бројеве, именоване

POW := λbe.e b

Претходна функција дефинисана PRED n = n − 1 за позитивни цели број n и PRED 0 = 0  је знатно више компликованија. Формула

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

може бити доказана, показујући да ако је T означено gh.h (g f)), онда је T(n)u.x) = (λh.h(f(n−1)(x)))за n > 0. Две постале дефиниције PRED су дате испод, једна користи услове а друга користећи парове. Са претходном функцијом, одузимање је једноставно. Дефинисање

SUB := λmn.n PRED m,

SUB m n позива mn када је m > n и 0 другачије.

Логика и искази

[уреди | уреди извор]

Конвенцијом, следеће две дефиниције (позната и као Черчова истинитосна вредност) које се користе за одређивање истинитосне вредности TRUE(тачно) и FALSE(нетачно):

TRUE := λxy.x
FALSE := λxy.y
(Приметити да  FALSE еквивалентно Черчовом броју нула)

Затим, са ова два λ-израза, можемо дефинисати неке логичке операције (ово су само могуће формулације; остали изрази су еквивалентно тачнии):

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

Сада можемо да изралунамо логичке функције, нпр. :

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

видимо да је AND(и) TRUE(тачно) FALSE(нетачно) еквивалетно  FALSE(нетачном).

Предикат је функција која враћа истинитосну вредност. Најбитнији предикат је ISZERO(је нула), који враћа TRUE(тачно)ако је аргумент Черчов број 0, а FALSE(нетачно)ако је аргумент било који други Черчов број:

ISZERO := λn.nx.FALSE) TRUE

Следећи предикат тестира да ли је први аргумент мањи или једнак другом:

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

и док је m = n, ако LEQ m n и LEQ n m, онда је лако изградити предикат нумеричке једнакости.

Доступност предиката и дефиниције TRUE и FALSE чине га жељеним да се напишу "ако-онда-или" изрази у ламбда рачуну. На пример, претходник функције се може дефинисати као:

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

што се може доказати покзујући индуктивно да је ngk.ISZERO (g 1) k (PLUS (g k) 1)) (λv.0) додата n − 1 функција за n > 0.

Пар (2-заграде) се може дефинисати уз помоћ TRUE and FALSE, користећи Черчово дешифровање за парове. На пример, PAIR енкапсулира пар (x,y), FIRST враа први елемент тог пара, док SECOND враћа други.

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

Линковане листе се могу дефинисати и као NIL за празну листу, или PAIR(пар) елемента и мале листе. Птерпоставимо да NULL тестира за вредност  NIL(нула). (Алтернативно, са NIL := FALSE, конструкција lhtz.deal_with_head_h_and_tail_t) (deal_with_nil) уклања потребу за експлицитним NULL тестом.

Као пример коришћења парова, функције промена и раста које мапирају (m, n) до (n, n + 1) се може дефинисати као

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

Који нам омогућава да добијемо можда и најтранспарентнију верзију претходне функције

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

Рекурзија и фиксне тачке

[уреди | уреди извор]

Рекурзија је дефиница функције која позива себе; ламбда рачун не дозвољава ово (не можемо одредити вредности која тек треба да се дефинише, унутар ламбда израза дефинише се иста вредност, као све анонимне функције у ламбда рачуну). Међутим, овај утисак вара: у x.x x) y  обе x‍ ‍ вредности се односе на исти ламбда израз , y, па је самим тим могућа за ламбда израз –овде је y – направљен тако да позива сопствену вредност, кроз своју апликацију.

Рекурзивна инстанца функције факторијела F(n) је дефинисана као

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

У ламбда изразу који је изабран да представља ту функцију, за параметар (углавном први) се претпоставља да прима свој ламбда израз, а то се назива-примати то као аргумент- што ће бити рекурзија. Овако се достиже рекурзија, намерно као свој референтни аргумент,  (који се овде назива r) и мора увек себе да позива у телу функције, тј. :

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

Сопствена-апликација постиже репликацију овде, пролазећи функцију ламбда израза на следећи позив као вредносни аргумент, чинећи то могућим за реферисање и позив.

Ово решава то али подразумева поновно писање сваког рекурзивног позив као сопствена-апликација. Волели бисмо да имамо генеричко решење, без потребе поновног писања:

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))))

Дати ламбда израз са првим аргументом представља рекурзивни позив ( означено са G),  комбинатор фиксне тачке FIX ће вратити сопствену репликацију ламбда израза представљајући рекурзивну функцију (овде је то F). Функција не мора проћи саму себе по сваку цену, за сопствену репликацију која је направљена у наставку, када се креира, да буде извршена сваки пут када се позове. Оригиналан ламбда израз (FIX G)је поново направљен у самом себи, постижући сопствену референцу

Постоји много различитих дефиниција за FIX оператор, најједноставнији је:

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

У ламбда рачуну , Y g  је фиксирана тачка g, као што је показано:

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)

Сада, да бисмо извели наш рекурзивни позив функције факторијела, једноставно ћемо позвати (Y G) n, где је n број чији факторијел израчунавамо. Доделимо нпр. вредност  n = 4, што даје:

(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

Свака рекурзивно дефинисана функција може бити представљена као фиксирана тачка неке одговарајуће дефинисане функције затварајући рекурзивни позив са екстра аргументом Y, свака рекурзивно дефинисана функција се може изразити као ламбда израз. Практично, ми можемо јасно дефинисати одузимање, множење и поређење предиката природних бројева рекурзивно.

Стандардни изрази

[уреди | уреди извор]

Следећи изрази обично прихватају имена:

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))

Типски ламбда рачун

[уреди | уреди извор]

Типски ламбда рачун је типски формализам који користи ламбда симбол () да означи непознату апстракцију функције. У овом контексту, типови су обично објекти синтетичке природе који су додељени ламбда изразима; егзактна природа типова зависи од израчунавања рачуна (видети врсте у наставку) . Са одређене тачке гледишта, типски ламбда рачун се може представити као усавршавање нетипског ламбда рачуна али са друге тачке гледишта, они они се такође могу сматрати више фундаменталном теоријом и нетипски ламбда рачун је специјални случај са само једним типом.

Типски ламбда рачун је оснивач програмских језика и он представља базу функционалних програмских језика као што су ML и Хаскел и, више индиректни, типски императивни програмски језици. Типски ламбда рачун има веома важну улогу у дизајну типских система за програмске језике; овде одређивање типа обично означава пожељне карактеристике програма, нпр. програм неће наштетити приступ меморији

Типски ламбда рачун је уско повезан са математичком логиком и отпорном теоријом са Кари-Хаурадовим изоморфизмом и они се могу сматрати као интерни програми сачињени од класа категорија, нпр. једноставан типски ламбда рачун је програм Декартове затворене категорије (Дзк).

Израчуниве функције и ламбда рачун

[уреди | уреди извор]

Функција F: NN природних бројева је израчунива ако и сако ако постоји ламбда израз  f такав да за сваки пар x, y у N, F(x)=y и ако и само ако је f x =β y, где су x и y Черчови одговарајући бројеви за x и y, односно и =β представља еквиваленцију за бета редукцију. Ово је један од много начина да се дефинише израчуњивост; видети Черч-Тјурингова теза за дискусију о другим прорачунима и њиховим једнакостима.

Несигурност еквиваленције

[уреди | уреди извор]

Не постоји алгоритам који узима као улазне податке два ламбда израза и враћа TRUE or FALSE у зависности од тога да ли су та два израза еквивалентна или нису. Историјски гледано, ово је први проблем чија се несигурност могла доказати. Као и код доказане несигурности , доказ показује да ни једна рачунива функција не може да одређује еквиваленцију. Черч-Тјурингова теза је уведена да покаже да не постоји алгоритам који ово ради.

Черчов доказ је први упростио проблем одређивања где ламбда израз има нормалну форму. Нормална форма је еквивалентна иразу који се не може упростити испод правила који су условљени правилом. Он сумња да је овај исказ рачунив, и да се мође представити преко ламбда рачуна. Надограђујући се на посао који је одрадио Клин, конструктујући Геделово бројање за ламбда изразем, он је осмислио ламбда израз e који стриктно прати доказ Геделове теореме о непотпуности . Ако се e примењује на сопствени Геделов број, резултат је контрадикција. 

Ламбда рачун и програмски језици

[уреди | уреди извор]

Као што је одређено од стране Питера Ландина 1965. кореспонденција између Алгола 60 и Черчове Ламбда нотације, секвенцијално процедурални програми могу да разумеју изразе ламбда рачуна, који пружају основне механизме за процедуралну апстракцију и процедуру (потпрограм) апликације.

Ламбда рачун чини "функције" повезанијим и чини их објектима прве класе што утиче на пораст комплексности имплементације када буде извршена. 

Анонимна функција

[уреди | уреди извор]

На пример, у Lisp-у квадратна функције се може представити као ламбда рачун, као:

(lambda (x) (* x x))

Дати пример је израз који припада првој класи функција. Симбол lambda креира анонимну функцију, дате листе имена параметра, (x) — само један аргумент у овом случају, и израз који је представљен као тело функције , (* x x). Хаскелов пример је идентичан. Анонимне функције се понекад зову ламбда изразима

На пример, Паскал и много осталих императивних програма је дуго подржавало прелазак преко потпрограма, као аргументе за друге потпрограме кроз механизам извршилаца функције. Међутим, извршиоци програма нису довољан услов за функције да буду типови прве класе, зато што је функција тип података прве класе ако и само ако нова инстанца функције може бити креирана у брзом времену. У овом брзом времену креирање функција је подржано у Smalltalkу, Јаваскрипти, и чешће у Скали, Ајфелу ("агенти", C# ("делегација" и C++11, и многи други.

Стратегија упрошћавања

[уреди | уреди извор]

Без обзира на то да ли се израз нормализује или не, и колико му треба да се изрши у нормализацији тога, израз зависи у великој мери од коришћене стратегије упрошћавања. Разлика између редукционих стратегија зависи од разлике у функционалном програмском језику између пожељне процене и непожељне процене.

Потпуна бета редукција
Било каква редукција се може редуковати било кад. Ово значи да у суштини одсуство било које практичне редукционе стратегије-која је уско повезана са редукцијом , "пада у воду".
Апликативни ред
Сркоз лево, по дубини се прво извршава редукција. Интуитивно ово значи да се увек прво упрошћавају аргументи функције пре саме функције. Апликативни ред увек покушава да прихвати функцију у нормалном облику, чак и када то није могуће. Многи програмски језици (као што су Lisp, ML, и императивни језици као што су C и Јава)су описани као "стриктни", мислећи да су функције примљене од стране не нормализујућих аргумената, не нормализујуће. Ово је урађено користећи апликативни ред, а назива се вредносно упрошћавање, или чешће "жељена еволуција".
Нормални ред
Скроз лево, се прво редукује по крајевима. Кад год је могуће, аргументи се замењују у тело абрстракције пре него што су аргументи упрошћени.
Позив по имену
Као нормални ред, али без редукционих перформанси унутар апстракција. На пример, λx.(λx.x)x је нормална форма према овој стратегији, иако садржи редекс  (λx.x)x.
Позив по вредности
Само крајеви редекса се упрошћавај; редекс је упрошћен само ако је десна страна подложна редукцији (променљива или ламбда апстракција).
Позив по потреби
Као нормални ред, али апликације функција ће удвостручити изразе уместо имена аргумената, који су затим редукују само " када је то потребно". Названо у практичном смислу "лења процена". У имплементацијама ово "име" узима форму извршиоца, са редексом представљеним уз помоћ узвика.

Апликативни израз није нормализовано осмишљен. Чести противпример је: дефинисати Ω = ωω где је ω = λx.xx. Цео овај израз садржи само један редекс, који именује цели израз; редукује се поново Ω. Како је ово једина могућа редукција, Ω нема нормалну форму (испод сваке процене стратегије). Користећи апликативни ред, израз KIΩ = (λxy.x) (λx.x)Ω је редукован од стране прве редукције Ω до нормалне форме (док је редекс скроз десно ), али док Ω нема нормалну форму, апликативни ред не може да нађе нормалну форму за KIΩ.

У супротности, нормални ред се тако назива зато што увек нађе нормализујућу редукцију. У наведеном примеру, KIΩ се редкује из нормалног реда до I, нормалне форме. Недостатак се огледа у томе што редекси у аргументима могу бити коопирани, што доводи до дуплираног израчунавања (нпр. , x.xx) ((λx.x)y) се редукује дп ((λx.x)y) ((λx.x)y) користећи ову стратегију; сада постоје два редекса, па целокупна процена мора да има још два корака, али ако су аргументи прво редуковани, тада ће неће постојати ништа).

Позитивни договор коришћења апликативног израза се огледа у томе што не изазива непотребно рачунањ, ако су сви аргументи коришћени, због тоха што се никада не замењују аргументи који садрже редекс и због тога их не треба никада копирати (што може да дуплира посао). У горњем примеру, у апликационом изразу x.xx) ((λx.x)y) се редукује прво доx.xx)y а затим до нормалног израза yy, узимајући два корака уместо да узме три израза.

Већина чистих функционалних програмских језика (посебно Миранда и његови претходници, укључујући Хаскел), и доказаних програмских језика теореме провере, користе лењу процену пто је у суштини исто ка и позив по потреби. Ове је слично нормалној редукцији, али позив по потреби успева да избегне дуплиање посла инхерентно у нормалној редукцији користећи дељење . У горе наведеном примеру, x.xx) ((λx.x)y) се редукује до ((λx.x)y) ((λx.x)y), што садржи два редекса, али у позиву по потреби они су представљени тако да користе исти објекат чешће него копирани, па када је један редукован, самим тим је и други редукован.

Напомена о сложености

[уреди | уреди извор]

Док је идеја бета редукције изгледала довољно једноставно, она ипак није атомски корак, у смислу да мора да има компликовану структуру при процени рачунарске сложености.[19] Прецизно, једна мора некако да пронађе локацију свих ограничених појава променљиве V  у изразу E, што доводи до трошења времена, или једна мора да води евиденцију локација V у изразу E, што такође доводи до трошења времена. Наивна претрага локације V у изразу E је О(n) у дужини n од E. Ово доводи до проучавања система који користе експлицитну замену. Синотов управљач стринговима [тражи се извор] нуди начин снимања локација слободних варијабли у изразима.

Паралелизам и слагање

[уреди | уреди извор]

Черч-Росерова особина у ламбда рачуну значи да процена (β-редукција) може бити избачена у било ком редоследу, чак и у паралели. Ово значи да је променљива недетерминистичка процена стратегија битна. Међутим, ламбда рачун не нуди било какву експлицитну конструкцију за паралелну обраду. Један може додати конструкцију као карактеристику за ламбда рачун. Други процес рачунања је разби

Семантика

[уреди | уреди извор]

Чињеница, да се изрази ламбда рачуна понашају као функције на остале ламбда изразе, па чак и на саме себе, довела је до питања о семантици ламбда рачуна . Да ли се могу разумна значења доделти изразима ламбда рачуна? Природа семантике је је да нађе скупове D изоморфне функционалном простору DD, функције на саму себе. Међутим, компликовано постојање D, уз помоћ кардиналног ограничења зато што скуп свих функција из  D до D има већу кардиналност него D, осим ако је самостално.

У 1970-им, Дејна Скот је показако да, ако се посматрају само непрекидне функције, скуп или домен D са потребним особинама се може наћи, правећи тако модел ламбда рачуна.

Ово је створило основу за семантику система закона програмских језика.

Референце

[уреди | уреди извор]
  1. ^ Turing, A. M. (December 1937).
  2. ^ Mitchell 2003, стр. 57.
  3. ^ Coquand, Thierry, "Type Theory"[мртва веза], 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 Архивирано на сајту Wayback Machine (23. август 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[мртва веза] (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, стр. 251
  17. ^ Felleisen, Matthias; Flatt, Matthew (2006), Programming Languages and Lambda Calculi (PDF). стр. 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."

Литература

[уреди | уреди извор]