Arytmetyka w rachunku lambda

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

Następnik edytuj

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

 

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 edytuj

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

 

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

Mnożenie edytuj

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

 

Obliczając według tej funkcji iloczyn    -krotnie powielamy term   po czym podstawiając   przy każdym  -owym powieleniu, dostajemy   wywołań – w sumie  

Poprzednik edytuj

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

 
 

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

Tworzymy funkcję   która z pary   tworzy parę  

 

Funkcja poprzednika   liczby   jest zdefiniowana jako  -krotna aplikacja funkcji   do pary   a potem pobranie drugiego jej elementu:

 

Odejmowanie edytuj

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

 

Potęgowanie edytuj

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

 

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

 

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ę   i zwraca parę  

 

Więc aplikując  -krotnie funkcję   do pary   i zabierając jej pierwszy element otrzymamy