(没)→書き直し
継続を使ったambの実装
(つづき・・・)
【4】
次に amb 式を合成関数にする方法を考える。
無意味なプログラムであるが、
amb(1 2 3) f(0)
という例を考えてみる。これを実行したときの動作は、
1. amb実行。1を返す 2. f(0)実行 3. ambに戻る。2を返す 4. f(0)実行 5. ambに戻る。3を返す 6. f(0)実行 7. 終了
となる。これを合成関数に置き換えるには、簡単に1~7を単なる複文と思って合成関数にすればよい。
もう少し工夫するなら、forループにすればよい。amb式を
for(i=1 to 3) f(0)
と置き換えるのだ。forループは再帰関数で表現できるはず。
F(x, n) := end (n>3の場合) F(f(0), n+1) (n<=3の場合)
適当に x=0、n=1、f(0)=1 として実行してみる。
F(0,1) = F(f(0), 1+1) ・・・ここでf(0)実行 = F(1,2) = F(f(0), 2+1) ・・・ここでf(0)実行 = F(1,3) = F(f(0), 3+1) ・・・ここでf(0)実行 = F(1,4) = end
となる。普通に再帰関数化できる。amb式は本質的に単なるforループなのだと思う。
次に継続渡しを使って再帰関数化できないか考えてみる。
R(s) := s(f(0)) T(s,n) := T(s, n+1)
次に amb を2段にした例を考える。
amb(1 2) ① f(0) amb(10 11 12) ② g(0)
これも上と同じく
for(i=1,2) f(0) for(j=10,12) g(0)
と置き換えればOKだ。