問題4.35 – SICP(計算機プログラムの構造と解釈)その209

問題4.35

最初に思いついた解答がこれ。
2つの整数間の数からなるリストを作り、 an-element-of でその内の1つの整数を返す。

(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 (an-integer-between low high)
  (define (make-list start end)
    (if (> start end)
        (error "start is bigger than end -- MAKE-LIST")
        (if (= start end)
            (cons end '())
            (cons start (make-list (+ start 1) end)))))
  (an-element-of (make-list low high)))

実行結果

;;; Amb-Eval input:
(define (require p)
  (if (not p) (amb)))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (an-element-of items)
  (require (not (null? items)))
  (amb (car items) (an-element-of (cdr items))))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (an-integer-between low high)
  (define (make-list start end)
    (if (> start end)
        (error "start is bigger than end -- MAKE-LIST")
        (if (= start end)
            (cons end '())
            (cons start (make-list (+ start 1) end)))))
  (an-element-of (make-list low high)))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (make-list start end)
  (if (> start end)
      (error "start is bigger than end -- MAKE-LIST")
      (if (= start end)
          (cons end '())
          (cons start (make-list (+ start 1) end)))))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (a-pythagorean-triple-between low high)
  (let ((i (an-integer-between low high)))
       (let ((j (an-integer-between i high)))
            (let ((k (an-integer-between j high)))
                 (require (= (+ (* i i) (* j j)) (* k k)))
                 (list i j k)))))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(a-pythagorean-triple-between 5 30)

;;; Starting a new problem
;;; Amb-Eval value:
(5 12 13)

;;; Amb-Eval input:
try-again

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

amb を使った解答。
(< low high) を満たす場合を探索する。

(define (an-integer-between low high)
  (require (< low high))
  (amb low (an-integer-between (+ low 1) high)))

実行結果

;;; Amb-Eval input:
(define (require p)
  (if (not p) (amb)))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (an-element-of items)
  (require (not (null? items)))
  (amb (car items) (an-element-of (cdr items))))

;;; Starting a new problem 
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (an-integer-between low high)
  (require (< low high))
  (amb low (an-integer-between (+ low 1) high)))

;;; Starting a new problem 
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(define (a-pythagorean-triple-between low high)
  (let ((i (an-integer-between low high)))
       (let ((j (an-integer-between i high)))
            (let ((k (an-integer-between j high)))
                 (require (= (+ (* i i) (* j j)) (* k k)))
                 (list i j k)))))

;;; Starting a new problem
;;; Amb-Eval value:
ok

;;; Amb-Eval input:
(a-pythagorean-triple-between 5 30)

;;; Starting a new problem
;;; Amb-Eval value:
(5 12 13)

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(6 8 10)
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»