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の実装は上手いと思った。
一から書けと言われても自分ではこんなに綺麗には書けないよ・・・