exercise 4.35~37

ambの実装に対しての理解も進んだ(はず)なので問題に戻る。

exercise 4.35
(define (an-integer-between a b)
  (require (not (> a b)))
  (amb a (an-integer-between (+ a 1) b)))

実行してみると、

;;; Amb-Eval input:
(a-pythagorean-triple-between 1 15)

;;; Starting a new problem 
;;; Amb-Eval value:
(3 4 5)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(5 12 13)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(6 8 10)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(9 12 15)

;;; Amb-Eval input:
try-again

;;; There are no more values of
(a-pythagorean-triple-between 1 15)
exercise 4.36
(define (a-pythagorean-triple-from n)
  (let ((i (an-integer-starting-from n)))
    (let ((j (an-integer-between 1 i)))
      (let ((k (an-integer-between j (- i j))))
        (let ((l (- i j k)))
          (require (= (+ (* j j) (* k k)) (* l l)))
          (list j k l))))))

これって実際は単なる4重ループなんだよなぁ。
そういう中身は気にしちゃいけないんだろうけど、多分。

;;; Amb-Eval input:
(a-pythagorean-triple-from 1)

;;; Starting a new problem 
;;; Amb-Eval value:
(3 4 5)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(6 8 10)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(5 12 13)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(9 12 15)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(8 15 17)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(12 16 20)

実行遅いなぁw。って結果書いてるだけでは伝わらないけど。

exercise 4.37

確かにBenの方が試している枝の本数は少ない。
(と言っても具体的に数値だすのめんどそうだな。)
個人的に気になるのはsqrtを使っている点。
このせいでむしろ遅くなってたりしないのだろうか。


それはそうとambの実装の所だが、継続を渡していくことを強く意識したらス
ラスラと頭に入った(気がする)。call/ccとかを用いた実装が気になるところ。
あとこれは余談だが、get-argsの実装は上手いと思った。
一から書けと言われても自分ではこんなに綺麗には書けないよ・・・