(define (blad? boom)
  (eq? boom 'blad))

(define (appel? boom)
  (and (pair? boom) (eq? (car boom) 'appel)))
(define (type appel)
  (cdr appel))

(define (unie v1 v2)
  (cond ((null? v1) v2)
        ((member (car v1) v2) (unie (cdr v1) v2))
        (cons (car v1) (unie (cdr v1) v2))))

(define (bewerk-boom boom doe-blad doe-appel combiner init)
  (cond ((null? boom) init)
        ((blad? boom) (doe-blad boom))
        ((appel? boom) (doe-appel (type boom)))
        (else (combiner (bewerk-boom (car boom)
                                     doe-blad
                                     doe-appel
                                     combiner
                                     init)
                        (bewerk-boom (cdr boom)
                                     doe-blad
                                     doe-appel
                                     combiner
                                     init)))))

(define (apple-types-dmv-bewerk boom)
  (bewerk-boom boom (lambda (blad) '()) list unie '()))