(没)SICP 4.3.3 amb評価器の実装(2)

  • 投稿日:
  • カテゴリ:

(没)→書き直し

継続を使った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だ。