(define (prime? x)
(define (inner i)
(cond ((> i (sqrt x)) #t)
((= (remainder x i) 0) #f)
(else (inner (+ i 1)))))
(inner 2))
(define (factor x)
(define (times x i)
(define (inner x n)
(if (= (remainder x i) 0)
(inner (/ x i) (+ n 1))
n))
(inner x 0))
(define (inner x i l)
(cond ((= 1 x) l)
((not (prime? i)) (inner x (+ i 1) l))
((not (= (times x i) 0)) (inner (/ x (expt i (times x i))) (+ i 1) (cons (list i (times x i)) l)))
(else (inner x (+ i 1) l))))
(inner x 2 '()))