Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

Rachunek lambda

Z Wikipedii, wolnej encyklopedii
Ten artykuł od 2021-03 zawiera treści, przy którychbrakuje odnośników do źródeł.
Należy dodaćprzypisy do treści niemających odnośników do źródeł. Dodanie listyźródeł bibliograficznych jest problematyczne, ponieważ nie wiadomo, które treści one uźródławiają.
Sprawdź w źródłach:Encyklopedia PWN •Google Books • Google Scholar •BazHum •BazTech •RCIN • Internet Archive (texts /inlibrary)
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się wdyskusji tego artykułu.
Po wyeliminowaniu niedoskonałości należy usunąć szablon{{Dopracować}} z tego artykułu.

Rachunek lambdasystem formalny używany do badania zagadnień związanych z podstawamimatematyki jakrekurencja, definiowalność funkcji, obliczalność, podstawy matematyki np.definicjaliczb naturalnych, wartości logicznych itd. Rachunek lambda został wprowadzony przezAlonzo Churcha w 1930 roku. Jest uniwersalną reprezentacją obliczeń i równoznacznymaszynie Turinga, tzn. dowolne wyrażenie w rachunku lambda można przedstawić jako program na maszynie Turinga i odwrotnie. Został użyty do udowodnienia hipotezy, nazwanej późniejhipotezą Churcha-Turinga.

Rachunek lambda jest przydatny do badaniaalgorytmów. Wszystkie algorytmy, które dadzą się zapisać w rachunku lambda, dadzą się zaimplementować namaszynie Turinga i odwrotnie.

Istnieje wiele rodzajów rachunku lambda, z czego najprostszym jestrachunek lambda bez typów, stanowiący pierwotną inspirację dla powstaniaprogramowania funkcyjnego (Lisp).Rachunek lambda z typami jest podstawą dzisiejszychsystemów typów wjęzykach programowania.

Opis nieformalny

[edytuj |edytuj kod]

W rachunku lambda każde wyrażenie określafunkcję jednoargumentową. Z kolei argumentem tej funkcji jest również funkcja jednoargumentowa, wartością funkcji jest znów funkcja jednoargumentowa. Funkcja jest definiowana anonimowo przez wyrażenie lambda, które opisuje, co funkcja robi ze swoim argumentem.

Funkcjaf{\displaystyle f} zwracająca argument powiększony o dwa, którą można by matematycznie zdefiniować jakof(x)=x+2,{\displaystyle f(x)=x+2,} w rachunku lambda ma postaćλ x.x+2{\displaystyle \lambda \ x\,.\,x+2} (nazwa parametru formalnego jest dowolna, więcx{\displaystyle x} można zastąpić inną zmienną). Z kolei wartość funkcji w punkcie, np.f(3){\displaystyle f(3)} ma zapis(λx.x+2)3.{\displaystyle (\lambda \,x\,.\,x+2)\,3.} Warto wspomnieć o tym, że funkcja jestłączna lewostronnie względem argumentu, tzn.fxy=(fx)y.{\displaystyle f\,x\,y=(f\,x)\,y.}

Ponieważ wszystko jest funkcją jednoargumentową, możemy zdefiniowaćzmienną o zadanej wartości – nazwijmy jąa.{\displaystyle a.} Funkcjaa{\displaystyle a} jest oczywiściestała, choć nic nie stoi na przeszkodzie, aby była to dowolna inna funkcja. W rachunku lambdaa{\displaystyle a} jest dane wzoremλa.a3.{\displaystyle \lambda \,a\,.\,a\,3.}

Teraz jesteśmy w stanie dokonać klasycznego otrzymania wartości w punkcie lub też lepiej rzecz ujmując, wykonaćzłożenie funkcji, mianowiciefa=f(a).{\displaystyle f\circ a=f(a).} Niechf{\displaystyle f} będzie dana jak poprzednio, wtedy:(λf.f3)(λx.x+2){\displaystyle (\lambda \,f\,.\,f\,3)(\lambda \,x\,.\,x+2)} i dalej(λx.x+2)3,{\displaystyle (\lambda \,x\,.\,x+2)\,3,} a więc otrzymujemy po prostu3+2.{\displaystyle 3+2.}

Funkcję dwuargumentową można zdefiniować za pomocą techniki zwanejcurryingiem, mianowicie jako funkcję jednoargumentową, której wynikiem jest znowu funkcja jednoargumentowa. Rozpatrzmy funkcjęf(x,y)=xy,{\displaystyle f(x,y)=x-y,} której zapis w rachunku lambda ma postaćλx.λy.xy.{\displaystyle \lambda \,x\,.\,\lambda \,y\,.\,x-y.} Aby uprościć zapis stosuje się powszechnie konwencję, aby funkcje „curried” zapisywać według wzoruλxy.xy.{\displaystyle \lambda \,x\,y\,.\,x-y.}

Wyrażenia lambda

[edytuj |edytuj kod]

NiechX{\displaystyle X} będzie nieskończonym,przeliczalnym zbiorem zmiennych. Wyrażenie lambda definiuje się następująco:

Zbiór wszystkich wyrażeń lambda oznacza sięΛ.{\displaystyle \Lambda .}

Wyrażenia lambda rozpatruje się najczęściej jakoklasy abstrakcji relacjialfa-konwersji.

Zmienne wolne

[edytuj |edytuj kod]

Zbiór zmiennych wolnych definiuje się następująco:

Logika

[edytuj |edytuj kod]

Użycie wartości liczbowych do oznaczania wartości logicznych może prowadzić do nieścisłości przy operowaniu relacjami na liczbach, dlatego też należy wyraźnie oddzielić logikę od obiektów, na których ona operuje. Z tego powodu oczywistym staje się fakt, żewartości logiczne prawdy i fałszu muszą być elementami skonstruowanymi z wyrażeń tego rachunku.

Wartościami logicznymi nazwiemy funkcje dwuargumentowe, z których jedna zawsze będzie zwracać pierwszy argument, a druga – drugi:

Teraz chcąc ukonstytuować operacje logiczne stosuje się nasze ustalone wartości tak, by wyniki tych operacji były zgodne z naszymi oczekiwaniami, mamy:

Rozwiniętąimplikację „jeśliA,{\displaystyle A,} toB,{\displaystyle B,} w przeciwnym razieC{\displaystyle C}” zapisać można jakoABC,{\displaystyle A\;B\;C,} czyli(AB)C.{\displaystyle (A\;B)\;C.}

Przykład

[edytuj |edytuj kod]

Obliczmy wartość wyrażenia „prawda i fałsz”, czyli w rachunku lambda

and true false=(λxy.xyfalse)true false=true false false=(λxy.x)false false=false,{\displaystyle {\mbox{and true false}}=(\lambda xy.xy\;{\mbox{false}})\;{\mbox{true false}}={\mbox{true false false}}=(\lambda xy.x)\;{\mbox{false false}}={\mbox{false}},}

czyli „fałsz” zgodnie z oczekiwaniami.

Struktury danych

[edytuj |edytuj kod]

Parap{\displaystyle p} złożona z elementówx{\displaystyle x} iy{\displaystyle y} toλz.zxy{\displaystyle \lambda z.zxy}Pierwszy element wyciąga się za pomocąptrue,{\displaystyle p\;{\mbox{true}},} natomiast drugi przezpfalse.{\displaystyle p\;{\mbox{false}}.}

Listy można konstruować następującym sposobem:

Następująca funkcja zwracatrue,{\displaystyle {\mbox{true}},} jeśli argumentem jest NIL, orazfalse,{\displaystyle {\mbox{false}},} jeśli to CONS:λx.x(λab.false){\displaystyle \lambda x.x(\lambda ab.{\mbox{false}})}

Rekurencja w rachunku lambda

[edytuj |edytuj kod]

Rachunek lambda z pozoru nie ma żadnego mechanizmu, który umożliwiałbyrekurencję – nie można odwoływać się w definicji do samej funkcji. A jednak rekurencję można osiągnąć poprzezoperator paradoksalny Y.

Paradoks polega na tym że dlakażdego F zachodzi:

Y F = F (Y F)

Tak więc np. funkcja negacji nie jest możliwa do zaimplementowania w postaci ogólnej, gdyż:

(Y nie) = nie (Y nie)

Funkcja rekurencyjna musi pobrać siebie samą jako wartość.

Działa to w następujący sposób:

(Y f) n
f (Y f) n
λ f. λ n. ciało_f

gdzie ciało_f może się odwoływać do siebie samej

Np.:

silnia = Y (λ f. λ n. if_then_else (is_zero n) 1 (mult n (f (pred n))))

Zobacz też

[edytuj |edytuj kod]

Linki zewnętrzne

[edytuj |edytuj kod]
Źródło: „https://pl.wikipedia.org/w/index.php?title=Rachunek_lambda&oldid=78117519
Kategoria:
Ukryta kategoria:

[8]ページ先頭

©2009-2026 Movatter.jp