Skip to content

2.05

; Show that we can represent pairs of nonnegative integers 
; using only numbers and arithmetic operations if we represent 
; the pair a and b as the integer that is the product 2^a * 3^b. 
; Give the corresponding definitions of the procedures cons, car, 
; and cdr.

; Answer
; -----------------
; Let's take two numbers (a,b) => (5, 8)
; If n = 2^5 * 3^8,
;  => we can retrieve "5" from n by counting the number of times
;     n/2 yeilds zero remainder
;  Similarly, we cna retrieve "8" from n by counting the number of
; times n/3 yields zero remainder

; Let's define a procedure to extact a or b (say x) from n
(define (extract-exp n x)
    (define (iter n count)
        (if (= (remainder n x) 0)
            (iter (/ n x) (+ count 1))
            count))
    (iter n 0))

; Let's write corresponding `cons`, `car` and `cdr`
(define (cons a b)
    (* (expt 2 a) (expt 3 b)))

(define (car x) (extract-exp x 2))
(define (cdr x) (extract-exp x 3))

; Testing
(define pair1 (cons 5 8))
(car pair1) ;Value: 5
(cdr pair1) ;Value: 8