ラムダ項を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
である.
18行目のKは,普通Sコンビネータのことだよね
KとSを間違えてこの記事かいたのかな
プログラムの方では間違えてないといいけれど