SKI базис

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

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

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

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

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

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

На любом zz получаем zz — ровно то, что делает I\mathrm{I}, значит SKK\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,[x]M\displaystyle = \mathrm{I}, \qquad [x]\,M =KM    (xFV(M)),[x](MN)\displaystyle = \mathrm{K}\,M \;\;(x \notin \mathrm{FV}(M)), \qquad [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 =KM= \mathrm{K}\,M при xx FV(M)\notin \mathrm{FV}(M): тело от xx не зависит, поэтому переданный аргумент надо просто выбросить.
  • [x](MN)[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.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)\displaystyle [x]\,(f\,x\,x) =S([x](fx))([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(Kf)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.fxx  \lambda x.\,f\,x\,x \;   S(S(Kf)I)I\rightsquigarrow\; \mathrm{S}\,(\mathrm{S}\,(\mathrm{K}\,f)\,\mathrm{I})\,\mathrm{I}.