vi-boolをki-boolに変換

Unlambdaの勉強にと,自力で考えてみた.もっといい方法あったら教えて下さい.
参考URL:http://hw001.gate01.com/eggplant/tcf/unlambda/boolean.html
バッククォート記法とS式が混ざってるのは(俺が)見やすいように.あとでいろいろ書き直す.考えた時と書いた時で,考える順番とかいろいろ違うが気にしないことにする.


bを真偽値(vまたはi)とする.
まず,vに何を適用してもvにしかならないので,継続を使って

  1. vのときは(v cont)で継続消滅
  2. iのときは(i cont)でこれを引数kで呼び出してkを得る

とすることを考える.
これでも,結局vは残ってしまうが,このvを定数関数`k`kiに渡すことで`kiを得られるので,これは継続でなんとかなると信じて,後で考える.
今やりたいのは,*1なので,((b cont) (`kk cont))と変形すると,
関数``sb`kkにcontを渡して呼び出せばいいことが解る.とりあえずG=``sb`kkとする.
これで,b=iのときはcontが引数kで呼ばれ,b=vのときはvが返る.このvを`k`kiに渡して,外側を継続で包む.
(`k`ki (G cont))がしたいので,またsが使えそうだなぁと思う.そこで,
((`k`k`ki cont) (G cont))と変形して,とりあえずF=`k`k`kiとおく.すると,
``sFGにcontを渡すと万事解決しそうに思えてくるので,
`c``sFGとする.FとGを代入して,
`c``s`k`k`ki``sb`kk
できたかな?

*1:b cont) k). s f g h = ((f h) (g h