SICP 読み (202) 4.3.1 amb と探索

連休なのに天気悪い。だらだら本を読んでおります。最初 amb ってランダムな選択な云々というナニなのかと誤解してました。でもバックトラックをどうやって実装しているのか、は興味深いッス。
あと、amb だの require だのというナニが微妙にイメージできてなかったんで最後らへんまで軽く先読みしています。

問題 4.35

ざくっと以下。

(define (an-integer-between l h)
  (require (<= l h))
  (amb l (an-integer-between (+ l 1) h)))

ビンゴかどうかは不明。別途試験は必要。これまでの実績でも一発ツモは少ないし。

問題 4.36

これは前問の計算手順を確認する事で答えが出る、という書き方で良いのかな。
(a-pythagorean-triple-between 1 10) は (3 4 5) を戻した後は解を見つけきる事ができずに処理が終わるはず。
an-integer-between が上記でビンゴなのを前提としたら require に渡るナニと評価は以下のようになるはず。(ダウトかもしれません

(= (+ (* 1 1) (* 1 1)) (* 1 1)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 2 2)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 3 3)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 4 4)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 5 5)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 6 6)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 7 7)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 8 8)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 9 9)) ;; #f
(= (+ (* 1 1) (* 1 1)) (* 10 10)) ;; #f

(= (+ (* 1 1) (* 2 2)) (* 1 1)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 2 2)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 3 3)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 4 4)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 5 5)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 6 6)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 7 7)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 8 8)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 9 9)) ;; #f
(= (+ (* 1 1) (* 2 2)) (* 10 10)) ;; #f

歯止めがあるから良いのであって、これが an-integer-starting-from に置き換えられたソレだといつまでたっても j が 2 にならないのでは、と。
これを途中で停止させるためには (+ (* i i) (* j j)) が (* k k) より小さくなった時点 (でいいんだよな) で処理を終了してあげれば良いのでしょうか。む、違うな。このままだと j も終了しないし、なんか違う。良い例が出せれば良いのですが、とりあえずトライ。

(= (+ (* 5 5) (* 5 5)) (* 5 5)) ;; (= (+ 25 25) 25)
(= (+ (* 5 5) (* 5 5)) (* 6 6)) ;; (= (+ 25 25) 36)
(= (+ (* 5 5) (* 5 5)) (* 7 7)) ;; (= (+ 25 25) 49)
(= (+ (* 5 5) (* 5 5)) (* 8 8)) ;; (= (+ 25 25) 64)

ここで、= になる期待はゼロになる。とゆー事は j は 1 加算すりゃ良いの? なんか違う気がしてきたなぁ。i はいつ 1 加算なんだろうか。なんとなくイメージできてるんですが、そろそろ休憩。