Fri Feb 22 13:56:48 JST 2013

node.js - socket.io の練習


Fri Feb 22 17:49:25 JST 2013

ラムダ項をSKIで表す変換器を書いた.

/scheme/SKI.scm.txt

私がテスト前に地下でホワイトボードに向かって黙々とflip関数をSKに変換してたのが 一瞬で出る.

(S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K I)))))
   (K (S (K K) I)))

これが、

flip f y x = f x y

であるらしい.本当かな? うん.だれか確かめてください.私はSKIをSchemeで書こうとしたけど、lambda-caseで 定義したけど、なんかうまくいきませんでした.flipに渡す3つの値も上手く調整しないと いけないだろうね.

そして

K x y z = x z (y z)

というKを、SKIに変換したのが次

(S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K I)))))
   (K (S (S (K S) (S (K K) I)) (K I))))

まあ、その変換器は、とにかくあまさず、ラムダ項をSKIに変換する為のものだから、 別に短い式にするのが目的じゃないし、ね.

:s/I/(SKK)/g

とすることで、SKIの式はSKのみの式になる.

:s/K/(XXX)/g
:s/S/(X(XX))/g

とすることで、Xのみの式になる.ここで

X x = x K S K

である.

追記 (Sun Jun 9 11:13:14 JST 2013)

18行目のKは,普通Sコンビネータのことだよね
KとSを間違えてこの記事かいたのかな
プログラムの方では間違えてないといいけれど