(define (linear-combination a b x y)
  (add (mul a x) (mul b y)))


(define (rat+ x y)
  (make-rat (+ (* (numer x) (denom y))
               (* (denom x) (numer y)))
            (* (denom x) (denom y))))
(define (rat- x y)
  (make-rat (- (* (numer x) (denom y))
               (* (denom x) (numer y)))
            (* (denom x) (denom y))))
(define (rat* x y)
  (make-rat (* (numer x) (numer y))
            (* (denom x) (denom y))))
(define (rat/ x y)
  (make-rat (* (numer x) (denom y))
            (* (denom x) (numer y))))
(define (rat=? x y)
  (= (* (numer x) (denom y))
     (* (denom x) (numer y))))
(define (print-rat x)
  (newline)
  (display (numer x))
  (display "/")
  (display (denom x))
  #T)


(define (make-rat n d)
  (cons n d))
(define (numer x)
  (car x))
(define (denom x)
  (cdr x))


(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))


(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Wrong message!"))))
  dispatch)
(define (car z)
  (z 0))
(define (cdr z)
  (z 1))


(define (cons x y)
  (lambda (m) (m x y)))
(define (car z)
  (z (lambda (p q) p)))
(define (cdr z)
  (z (lambda (p q) q)))


(define (nth n zoz)
  (cond ((null? zoz) ())
        ((= n 0) (car zoz))
        (else (nth (1- n) (cdr zoz)))))
(define (length zoz)
  (if (null? zoz)
      0
      (1+ (length (cdr zoz)))))


(define (countatoms x)
  (cond ((null? x) 0)
        ((atom? x) 1)
        (else (+ (countatoms (car x)) (countatoms (cdr x))))))