問題4.53 – SICP(計算機プログラムの構造と解釈)その225
2009年07月22日
問題4.53
(amb)
があるために、if-fail
の第1引数はバックトラックを繰り返して prime-sum-pair
により全ての組み合わせを探索する。
また、permanent-set!
で pairs
にセットした値はバックトラックしても元の値に戻されないため、成功した組み合わせは pairs
に追加されていく。
全ての組み合わせを探索し、選択を使い切った時、if-fail
の第1引数の失敗継続が呼び出され、第2引数が実行される。
わかりやすくするために prime-sum-pair
と if-fail
第1引数の (amb)
の直前に print
文を追加して動作を確認する。
(define (require p) (if (not p) (amb))) (define (an-element-of items) (require (not (null? items))) (amb (car items) (an-element-of (cdr items)))) (define (prime-sum-pair list1 list2) (let ((a (an-element-of list1)) (b (an-element-of list2))) (print "(" a " " b ")") (require (prime? (+ a b))) (list a b))) (define (square n) (* n n)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-divisor 1))))) (define (divides? a b) (= (remainder b a) 0)) (define (prime? n) (= n (smallest-divisor n))) (let ((pairs '())) (if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35 110)))) (permanent-set! pairs (cons p pairs)) (print "permanent-set! : " pairs) (amb)) pairs))
実行結果
;;; Amb-Eval input: (let ((pairs '())) (if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35 110)))) (permanent-set! pairs (cons p pairs)) (print "permanent-set! : " pairs) (amb)) pairs)) ;;; Starting a new problem (1 20) (1 35) (1 110) (3 20) permanent-set! : ((3 20)) (3 35) (3 110) permanent-set! : ((3 110) (3 20)) (5 20) (5 35) (5 110) (8 20) (8 35) permanent-set! : ((8 35) (3 110) (3 20)) (8 110) ;;; Amb-Eval value: ((8 35) (3 110) (3 20))
permanent-set!
の代わりに set!
を使った場合の実行結果
;;; Amb-Eval input: (let ((pairs '())) (if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35)))) (set! pairs (cons p pairs)) (print "set! : " pairs) (amb)) pairs)) ;;; Starting a new problem (1 20) (1 35) (3 20) set! : ((3 20)) (3 35) (5 20) (5 35) (8 20) (8 35) set! : ((8 35)) ;;; Amb-Eval value: ()
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542