SICP問題2.29

二進モービル
ここまで出てる定義

(define (make-mobile left right)
  (list left right))
(define (make-branch length structure)
  (list length structure))

a.(モービルの枝を返す) left-branch と right-branch, (枝の部品を返す) branch-length と branch-structure

(define (left-branch mobile)
  (car mobile))
(define (right-branch mobile)
  (car (cdr mobile)))
(define (branch-length branch)
  (car branch))
(define (branch-structure branch)
  (car (cdr branch)))

b.モービルの全重量を返す手続き total-weight

(define (total-weight mobile)
  (define (iter-branch branch result)
    (if (pair? (branch-structure branch))
    (+ (iter-branch (left-branch (branch-structure branch)) result)
       (iter-branch (right-branch (branch-structure branch)) result))
    (+ (branch-structure branch) result)))
  (+ (iter-branch (left-branch mobile) 0)
     (iter-branch (right-branch mobile) 0)))

c.モービルが釣合っているかどうかをテストする述語 balanced

(define (balanced? mobile)
  (define (br-torque br)
    (if (pair? (branch-structure br))
    (* (branch-length br) (total-weight (branch-structure br)))
    (* (branch-length br) (branch-structure br))))
  (define (mb-balanced? mb)
    (= (br-torque (left-branch mb))
       (br-torque (right-branch mb))))
  (define (iter-balanced? mb)
    (cond ((and (pair? (branch-structure (left-branch mb)))
        (pair? (branch-structure (right-branch mb))))
       (and (mb-balanced? (branch-structure (left-branch mb)))
        (mb-balanced? (branch-structure (right-branch mb)))
        (mb-balanced? mb)))
      ((and (pair? (branch-structure (left-branch mb)))
        (not (pair? (branch-structure (right-branch mb)))))
       (and (mb-balanced? (branch-structure (left-branch mb)))
        (mb-balanced? mb)))
      ((and (not (pair? (branch-structure (left-branch mb))))
        (pair? (branch-structure (right-branch mb))))
       (and (mb-balanced? (branch-structure (right-branch mb)))
        (mb-balanced? mb)))
      (else (and (mb-balanced? mb)))))
  (mb-balanced? mobile))

d.構成子を

(define (make-mobile left right)
  (cons left right))
(define (make-branch length structure)
  (cons length structure))

に変更した場合、プログラムの変更が必要な部分。

(define (right-branch mobile)
  (cdr mobile))
(define (branch-structure branch)
  (cdr branch))