SKI базис

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

S\displaystyle \mathrm{S} =λxyz.xz(yz),\displaystyle {} = \lambda x\,y\,z.\,x\,z\,(y\,z),K\displaystyle \mathrm{K}=λxy.x,\displaystyle {} = \lambda x\,y.\,x,I\displaystyle \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,\displaystyle {} = \mathrm{I},[x]M\displaystyle [x]\,M=KM    (xFV(M)),\displaystyle {} = \mathrm{K}\,M \;\;(x \notin \mathrm{FV}(M)),[x](MN)\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=KM{} = \mathrm{K}\,M при xxFV(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}.