SKI базис

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

S=λxyz.xz(yz),K=λxy.x,I=λx.x\mathrm{S} = \lambda x\,y\,z.\,x\,z\,(y\,z), \qquad \mathrm{K} = \lambda x\,y.\,x, \qquad \mathrm{I} = \lambda x.\,x
(1.28)

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

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

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

SKKz  β  Kz(Kz)  β  z  =  Iz.\mathrm{S}\,\mathrm{K}\,\mathrm{K}\,z \;\to_\beta\; \mathrm{K}\,z\,(\mathrm{K}\,z) \;\to_\beta\; z \;=\; \mathrm{I}\,z.

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

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

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

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

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

[x](fxx)=S([x](fx))([x]x)=S(S([x]f)([x]x))I=S(S(Kf)I)I\begin{aligned}[x]\,(f\,x\,x) &= \mathrm{S}\,([x]\,(f\,x))\,([x]\,x) \\ &= \mathrm{S}\,\bigl(\mathrm{S}\,([x]\,f)\,([x]\,x)\bigr)\,\mathrm{I} \\ &= \mathrm{S}\,(\mathrm{S}\,(\mathrm{K}\,f)\,\mathrm{I})\,\mathrm{I}\end{aligned}

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