;adt voor knoop:
(define (maak-knoop naam eigenschappen)
(list 'knoop naam eigenschappen))
(define (naam knoop) (cadr knoop))
(define (eigenschappen knoop) (caddr knoop))
(define (knoop? x) (and (pair? x) (eq? (car x) 'knoop)))

;adt voor boom:
(define (maak-boom knoop deelbomen)
(list 'boom knoop deelbomen))
(define (knoop boom) (cadr boom))
(define (deelbomen boom) (caddr boom))
(define (boom? x) (and (pair? x) (eq? (car x) 'boom)))
(define (leeg? boom) (null? boom))

(define (all-kinds cboom)
(define (all-kinds cboom)
(if (leeg? cboom)
'()
(cons (naam (knoop cboom)) (all-kinds-in (deelbomen cboom)))))
(define (all-kinds-in takken)
(if (leeg? takken)
'()
(append (all-kinds (car takken)) (all-kinds-in (cdr takken)))))
(all-kinds cboom))
; ik kan dit niet testen, dus volgens u correct?

(define (ask? cboom soort eigenschap)
(define (ask? cboom soort eigenschap geziene-eigenschappen)
(cond ((eq? (naam (knoop cboom)) soort) (if (or (member eigenschap (eigenschappen (knoop cboom))) (member eigenschap geziene-eigenschappen))
#t
#f))
(else (ask?-in (deelbomen cboom) soort eigenschap (append (eigenschappen (knoop cboom)) geziene-eigenschappen)))))
(define (ask?-in takken soort eigenschap geziene-eigenschappen)
(if (null? takken)
#f
(or (ask? (car takken) soort eigenschap geziene-eigenschappen) (ask?-in (cdr takken) soort eigenschap geziene-eigenschappen))))
(ask? cboom soort eigenschap '()))