SKI базис

Само λ-исчисление можно построить всего на трёх из них — S, K, I. В комбинаторной логике их берут за примитивы:

S\displaystyle \mathrm{S} =λx y z. x z (y z),\displaystyle {} = \lambda x\,y\,z.\,x\,z\,(y\,z),​K\displaystyle \mathrm{K}​=λx y. x,\displaystyle {} = \lambda x\,y.\,x,​I\displaystyle \mathrm{I}​=λx. x\displaystyle {} = \lambda x.\,x
(1.28)

Причём I даже не обязателен как примитив — он выражается через S и K:

S K K\displaystyle \mathrm{S}\,\mathrm{K}\,\mathrm{K} =I\displaystyle {} = \mathrm{I}
(1.29)

Давайте подставим и докажем формулу — раскроем S K K\mathrm{S}\,\mathrm{K}\,\mathrm{K} на произвольном аргументе zz по определениям (1.28):

S K K z  \displaystyle \mathrm{S}\,\mathrm{K}\,\mathrm{K}\,z \; →β  K z (K z)  \displaystyle {} \to_\beta\; \mathrm{K}\,z\,(\mathrm{K}\,z) \;​→β  z  \displaystyle {} \to_\beta\; z \;​=  I z.\displaystyle {} =\; \mathrm{I}\,z.

На любом zz получаем zz — ровно то, что делает I\mathrm{I}, значит S K K\mathrm{S}\,\mathrm{K}\,\mathrm{K}​=I{} = \mathrm{I}.

Любой λ-терм механически переводится в комбинаторы. Терм строится тремя способами — переменная, применение и абстракция; переменные и применение в комбинаторной логике уже есть, а вот абстракцию нужно устранить. Это делает bracket abstraction — операция [x] M[x]\,M, «вынести переменную xx из терма MM». Её результат — комбинаторный терм, в котором xx уже не встречается, но который, если подать ему xx обратно, снова сводится к MM. Определяется она по виду тела MM:

[x] x\displaystyle [x]\,x =I,\displaystyle {} = \mathrm{I},​[x] M\displaystyle [x]\,M​=K M    (x∉FV(M)),\displaystyle {} = \mathrm{K}\,M \;\;(x \notin \mathrm{FV}(M)),​[x] (M N)\displaystyle [x]\,(M\,N)​=S ([x] M) ([x] N)\displaystyle {} = \mathrm{S}\,([x]\,M)\,([x]\,N)
(1.30)
  • [x] x[x]\,x​=I{} = \mathrm{I}: тело — это сама xx; вернуть аргумент как есть умеет I\mathrm{I}.
  • [x] M[x]\,M​=K M{} = \mathrm{K}\,M при xx​∉FV(M){} \notin \mathrm{FV}(M): тело от xx не зависит, поэтому переданный аргумент надо просто выбросить.
  • [x] (M N)[x]\,(M\,N)​=S ([x] M) ([x] N){} = \mathrm{S}\,([x]\,M)\,([x]\,N): в применении xx может прятаться и в MM, и в NN, поэтому аргумент нужно раздать обоим — этим и занимается S\mathrm{S}.

Если же тело само — абстракция λy. M\lambda y.\,M, сперва убирают внутреннюю переменную, а потом внешнюю: [x] (λy. M)[x]\,(\lambda y.\,M)​=[x] ([y] M){} = [x]\,([y]\,M); так вложенные λ\lambda снимаются изнутри наружу, пока не останутся только переменные и применения.

Разберём λx. f x x\lambda x.\,f\,x\,x. Тело f x xf\,x\,x — это применение (f x) x(f\,x)\,x, так что раскручиваем правилом для применения, сводя всё к S\mathrm{S}, K\mathrm{K}, I\mathrm{I}:

[x] (f x x)\displaystyle [x]\,(f\,x\,x) =S ([x] (f x)) ([x] x)\displaystyle {} = \mathrm{S}\,([x]\,(f\,x))\,([x]\,x)​=S (S ([x] f) ([x] x)) I\displaystyle {} = \mathrm{S}\,\bigl(\mathrm{S}\,([x]\,f)\,([x]\,x)\bigr)\,\mathrm{I}​=S (S (K f) I) I\displaystyle {} = \mathrm{S}\,(\mathrm{S}\,(\mathrm{K}\,f)\,\mathrm{I})\,\mathrm{I}

Переменных в ответе нет — только S\mathrm{S}, K\mathrm{K}, I\mathrm{I} и свободная ff: λx. f x x  \lambda x.\,f\,x\,x \;​⇝  S (S (K f) I) I{} \rightsquigarrow\; \mathrm{S}\,(\mathrm{S}\,(\mathrm{K}\,f)\,\mathrm{I})\,\mathrm{I}.