Arytmetyka w rachunku lambda

Z testwiki
Wersja z dnia 22:00, 24 sie 2024 autorstwa imported>Micpol (drobne redakcyjne)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

Szablon:Dopracować Arytmetyka w rachunku lambda – rodzaj arytmetyki związanej z rachunkiem lambda, opierającej się na liczbach naturalnych Churcha.

Następnik

Funkcja S następnika jest zdefiniowana następująco:

Sλxyz.y(xyz).

Procedura ta nie robi nic innego jak „dodaje” jeszcze jedno wywołanie funkcji do pewnej liczby, przez co staje się ona liczbą o jeden większą.

Dodawanie

Aby dodać dwie liczby naturalne Churcha K i L należy K-krotnie zastosować funkcję następnika do liczby L (lub na odwrót, dodawanie jest przemienne):

λxy.xSy.

Z definicji liczb naturalnych Churcha wiemy, że wywołując funkcję pewnej liczby K na dwóch argumentach – funkcji f i zmiennej x, stosujemy funkcję f K-krotnie do zmiennej x.

Mnożenie

Mnożenie w rachunku lambda zdefiniowane jest następująco:

λxyz.x(yz).

Obliczając według tej funkcji iloczyn xy, x-krotnie powielamy term (yz), po czym podstawiając y przy każdym x-owym powieleniu, dostajemy y wywołań – w sumie x×y.

Poprzednik

Poprzednikiem liczby K nazywamy taką liczbę L, że następnikiem liczby L jest K (liczba 0 nie ma poprzednika, przez co jest ona poprzednikiem siebie samej). W zapisie matematycznym:

P(K)=LS(L)=K,
P(0)=0.

W rachunku lambda stworzenie takiej funkcji nie jest tak łatwe jak stworzenie funkcji następnika S. Do tego posługujemy się strukturami danych opisanymi w artykule rachunek lambda.

Tworzymy funkcję Ψ, która z pary (a,b) tworzy parę (a+1,a):

Ψλpz.z(S(pT))(pT).

Funkcja poprzednika P liczby K jest zdefiniowana jako K-krotna aplikacja funkcji Ψ do pary λz.z00, a potem pobranie drugiego jej elementu:

Pλn.(nΨ(λz.z00))F.

Odejmowanie

Odejmowanie, podobnie jak w przypadku dodawania, jest zdefiniowane jako wielokrotna aplikacja funkcji poprzednika (w tym wypadku pamiętając o przemienności – odejmowanie przemienne nie jest):

λxy.yPx.

Potęgowanie

Aby policzyć potęgę xy należy wykorzystać to, że y jest naturalne. Wiadomo, że:

xy=x*x*x**xy-razy.

Tak więc na przykład x3 w rachunku lambda będzie zapisane jako:

((x)x)x.

Widzimy, że jest to parokrotna aplikacja funkcji – można by posłużyć się podobnym algorytmem jak przy dodawaniu lub odejmowaniu, gdyby nie to, że jest funkcją dwuargumentową. W takim wypadku możemy zdefiniować funkcję Ξ, która pobiera parę (a,x) i zwraca parę (a*x,x):

Ξλpz.z((pT)(pF))(pF).

Więc aplikując y-krotnie funkcję Ξ do pary (1,x) i zabierając jej pierwszy element otrzymamy xy:

powλxy.(yΞ(λz.z1x))T.