9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SKIコンビネータ覚書

Last updated at Posted at 2018-12-19

SKIコンビネータについて簡潔にまとまったサイトがみつからなかったので要点だけまとめました。1

ラムダ計算式とは

関数f(x)=x+2をラムダ計算では λx.x+2 と表す。λx.xならf(x)=x、つまり入力値をそのまま返す関数となる。

xy のように2つ並べられている時はxyを引数として適用することを意味する。λx.((xy)z) は単に λx.xyzと書ける。各関数は左結合であり順序が明確な時はこのようにカッコを省略することができる。

λxy.x のように左辺に2つ並べたら、xとyの2つの引数をとる関数を意味する。この場合はyの値を無視してxをそのまま帰す関数f(x,y)=xとなる。

λx.xy にある2つの変数 x yのうち、パラメータとして使われる変数(この場合はx)を束縛変数(bound variable)、それ以外は自由変数(free variable)という。

λリフティング

ラムダ式の中のλを取り除きコンビネータで置き換える。例として下記の式の場合を考える。

  • Y = λf.(λx.f(λv.(xx)v))(λx.f(λv.(xx)v))

まず一番内側のカッコ内にあるλの箇所、λv.(xx)vを対象とする。コンビネータを仮にMと置く。Mのパラメータは自由変数を先に書き、後ろに束縛変数を書く。右辺は元の式のままでMxv=(xx)vとなる。
これを最初の式のλv.(xx)vと置き換える。この時、束縛変数は置く必要がない。2

  • Y = λf.(λx.f(Mx))(λx.f(Mx))

次に(λx.f(Mx))を置き換える。コンビネータ L と置いて Lfx = f(Mx)。これを元の式に適用する。xは束縛変数なので消去されて下記のようになる。

  • Y = λf.(Lf)(Lf)

最後にこの式のλをとる。Yには束縛変数fしかないのでYf = (Lf)(Lf)となる。以上をまとめると元のラムダ式をλリフティングした結果は下記のようになる。

Yf = (Lf)(Lf)
Lfx = f(Mx)
Mxv = (xx)v

SKIコンビネータ

S K I 3つのコンビネータを下記のように定義するとすべてのラムダ式をこれらだけで表すことができる。3

Sfgx = (fx)(gx)
Kxy = x
Ix = x

Iは入力値をそのまま返すだけのコンビネータ。K(x y)の2つのパラメータをとるがyを無視してxを返す。

α-消去

T x y = y xというコンビネータTがあるとする。これはパラメータ x y の適用順を逆にして y x を返す。これは下記のように変形できる。

Txy = yx ... Iy=yなので
 = (Iy)x ... Kxy=xなので
 = (Iy)(Kxy) ... Sfgxのf=I,g=Kx,x=yとおくと(Iy)(Kxy)は(fx)(gx)の形式なので
 = SI(Kx)y
∴Tx = SI(Kx) ... y消去完了

Tx = SI(Kx) ... Kxy=xよりK(SI)x=(SI)となるので
 = (K(SI)x)(Kx) ... Sfgxのf=K(SI),g=K,x=xとおいて
 = S(K(SI))Kx
∴T = S(K(SI))K ... x消去完了

このようにしてパラメータを消去していくことをα-消去という4。これでTをSKIで表現することができた。
オンラインでSKIコンビネータを解釈してくれるサービスに投げると動作を確認できる。
http://ski.aditsu.net/
先程のS(K(SI))Kを入れるRunを押すと(x0->(x1->x1(x0)))となるのでたしかに引数を
x0,x1の順番に取得したのに`x1,x0`の順番で合成していることがわかる。

参考サイト

  1. わかりやすい文章を書こうとしたら面倒くさくなったとも言う

  2. 束縛変数は関数のパラメータとして最終的に渡す必要があり、ここでは引数適用前の関数結合を表してるからかなと思うけどよくわかってません

  3. I = SKK と表せるので SKの2つがあれば良い。本当は一つでもいいらしい

  4. 「α-消去」と高階ことりちゃんのサイトでは書いてあるのだが他のサイトでは見つからなかった、Wikipediaのラムダ計算の項目には「α-変換」「β-簡約」「η-変換」の説明ならある

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?