(define (filter f lis)
  (cond ((null? lis) nil)
	((f (car lis)) (cons (car lis) (filter f (cdr lis))))
	(else (filter f (cdr lis))) ))

(define (accumulate f start lis)
  (if (null? lis)
      start
      (f (car lis) (accumulate f start (cdr lis))) ))

(define (range a b)
  (if (> a b)
      nil
      (cons a (range (1+ a) b)) ))

(define (perfect? n)
  (= n (accumulate +
		   0
		   (filter (lambda (x) (= 0 (remainder n x)))
			   (range 1 (-1+ n)) ) )))