Solution for exercise 2.29 of SICP:

(define (make-mobile left right) (list left right)) (define (make-branch length structure) (list length structure)) ;a. Write the corresponding selectors ; * left-branch and ; * right-branch, ; which return the branches of a mobile, (define (left-branch mobile) (car mobile)) (define (right-branch mobile) (car (cdr mobile))) ; * branch-length and ; * branch-structure, ; which return the components of a branch. (define (branch-length branch) (car branch)) (define (branch-structure branch) (car (cdr branch))) ;;;; tests (define b5 (make-branch 10 6)) (define b6 (make-branch 10 7)) (define m3 (make-mobile b5 b6)) (define b3 (make-branch 10 m3)) (define b4 (make-branch 10 5)) (define m2 (make-mobile b3 b4)) (define b1 (make-branch 10 3)) (define b2 (make-branch 10 m2)) (define m1 (make-mobile b1 b2)) ;b. Using your selectors, define a procedure total-weight ; that returns the total weight of a mobile. (define (total-weight structure) (if (pair? structure) (+ (total-weight (branch-structure (left-branch structure))) (total-weight (branch-structure (right-branch structure)))) structure)) ;;;; tests (total-weight m1) (total-weight m2) (total-weight m3) ;c. A mobile is said to be balanced if the torque applied by its top-left ;branch is equal to that applied by its top-right branch (that is, if the ;length of the left rod multiplied by the weight hanging from that rod is ;equal to the corresponding product for the right side) and if each of the ;submobiles hanging off its branches is balanced. Design a predicate that ;tests whether a binary mobile is balanced. (define (torque branch) (* (branch-length branch) (total-weight (branch-structure branch)))) ;;;; tests (torque b1) (torque b2) (define (balanced? structure) (if (pair? structure) (and (equal? (torque (left-branch structure)) (torque (right-branch structure))) (balanced? (branch-structure (left-branch structure))) (balanced? (branch-structure (right-branch structure)))) #t)) (define m4 (make-mobile (make-branch 1 30) (make-branch 2 (make-mobile (make-branch 3 5) (make-branch 2 10))))) m4 (balanced? m4) (define m5 (make-mobile (make-branch 2 (make-mobile (make-branch 6 5) (make-branch 3 10))) (make-branch 3 (make-mobile (make-branch 2 5) (make-branch 2 5))))) m5 (balanced? m5) ;d. Suppose we change the representation of mobiles so that the constructors are ;(define (make-mobile left right) ; (cons left right)) ;(define (make-branch length structure) ; (cons length structure)) ;How much do you need to change your programs to convert to the new representation? ;Answer: the implementation of right-branch and branch-structure must change