Rachunek kombinatorów (ang. Combinatory Calculi) to jeden z najprostszych możliwych uniwersalnych systemów formalnych.
Na język rachunku kombinatorów składają się kombinator stały K, kombinator rozdzielonej aplikacji S, oraz kombinatory aplikacji złożone z pary dowolnych kombinatorów - funkcji i argumentu:
- σ = S | K | (σ σ)
Derywacją rządzą dwie reguły:
- ((K α) β) → α
- (((S α) β) γ) → ((α γ) (β γ))
Gdzie α, β i γ to dowolne kombinatory.
Tak prosty system jest w stanie wyrazić wszystko, co jest w stanie wyrazić rachunek lambda, dowolna maszyna Turinga czy w ogóle dowolny algorytm.
Kombinatory mają prostą interpretację w rachunku lambda:
- K = λ x . λ y . x
- S = λ x . λ y . λ z . (x z) (y z)
Często wprowadza się też kombinator identyczności I z regułą:
- (I α) → α
Ponieważ system SK już jest kompletny, kombinator ten można przepisać jako (SK)K:
- (((S K) K) α) → ((K α) (K α)) → α
Podobnie jak w rachunku lambda zwykle pomija się nadmiarowe nawiasy, zakładając wiązanie w lewo: α β γ to więc ((α β) γ).
Ponieważ każdy kombinator ma bardzo prostą interpretację w rachunku lambda, badania rachunku kombinatorów są zwykle częścią badań nad rachunkiem lambda.
Z zupełności systemu SK wynika, że każde λ wyrażenie bez zmiennych wolnych (w terminologii rachunku lambda również zwane kombinatorem) można zapisać za pomocą S i K, jednak ze względu na uboższy język, takie wyrażenia mają tendencję do przybierania bardzo dużych rozmiarów.
Przykłady
- Prawda - K
- Fałsz - KI = K(SKK)
- 0 - KI
- 1 - I = SKK
- Następnik - S(S(KS)K)
- Operator paradoksalny - S(S(S(KS)K)(K(SII)))(S(S(KS)K)(K(SII))) = S(S(S(KS)K)(K(S(SKK)(SKK))))(S(S(KS)K)(K(S(SKK)(SKK)))) − Jak widać po przykładzie operatora paradoksalnego, rachunek kombinatorów może być i jest prostszy, jest jednak o wiele mniej czytelny od rachunku lambda.