;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-intermediate-lambda-reader.ss" "lang")((modname week7_m_full) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ()))) ;Descendant trees: ;+-----------+ +--------------+ ;|Carl (1926)| |Bettina (1926)| ;|Eyes: Green| |Eyes: Green | ;+-----------+ +--------------+ ; ;+------------+ +-----------+ +-----------+ +-----------+ ;|Adam (1950) | |Dave (1955)| |Eva (1965)| |Fred (1966)| ;|Eyes: Yellow| |Eyes: Black| |Eyes: Blue | |Eyes: Pink | ;+------------+ +-----------+ +-----------+ +-----------+ ; ; +---------------+ ; | Gustav (1988) | ; | Eyes: brown | ; +---------------+ ;Gustav <- Eva ;Gustav <- Fred ;Eva <- Carl ;Eva <- Bettina ;Dave <- Carl ;Dave <- Bettina ;Adam <- Carl ;Adam <- Bettina ; a family-tree is: ; (make-parent list-of-family-tree symbol number symbol) (define-struct parent (children name date eyes)) ; template: ; (define (fun-for-ft ft) ; (fun-for-lft (parent-children ft)) ; (parent-name ft) ; (parent-date ft) ; (parent-eyes ft)) ; a list-of-family-tree ; - empty ; - (cons family-tree list-of-family-tree) ; (define (fun-for-lft lft) ; (cond [(empty? lft) ...] ; [else ...(fun-for-ft (first lft))...(fun-for-lft (rest lft))...])) (define gustav (make-parent empty 'gustav 1988 'brown)) (define adam (make-parent empty 'adam 1950 'yellow)) (define dave (make-parent empty 'dave 1965 'black)) (define eva (make-parent (list gustav) 'eva 1965 'blue)) (define fred (make-parent (list gustav) 'fred 1966 'pink)) (define carl (make-parent (list adam dave eva) 'carl 1926 'green)) (define bettina (make-parent (list adam dave eva) 'bettina 1926 'green)) ; ft-blue-eyed-descendant : family-tree -> boolean ; return whether the family tree has a blue-eyed member (define (ft-blue-eyed-descendant ft) (or (symbol=? (parent-eyes ft) 'blue) (lft-blue-eyed-descendant (parent-children ft)))) ; ft-descendant-born-after-1980 : family-tree -> boolean ; returns whether there's a descendant born after 1980 in tree (define (ft-descendant-born-after-1980 ft) (or (> (parent-date ft) 1980) (lft-descendant-born-after-1980 (parent-children ft)))) (check-expect (ft-blue-eyed-descendant bettina) true) (check-expect (ft-blue-eyed-descendant gustav) false) ; lft-blue-eyed-descendant : list-of-family-tree -> boolean ; returns whether any of the list of family trees has a blue-eyed member (define (lft-blue-eyed-descendant lft) (cond [(empty? lft) false] [else (or (ft-blue-eyed-descendant (first lft)) (lft-blue-eyed-descendant (rest lft)))])) (check-expect (lft-blue-eyed-descendant (list gustav)) false) (check-expect (lft-blue-eyed-descendant (list eva fred)) true) (check-expect (ft-descendant-born-after-1980 bettina) true) (check-expect (ft-descendant-born-after-1980 adam) false) ; lft-descendant-born-after-1980: list-of-family-trees -> boolean ; returns whether there's a descendant born after 1980 in list of trees (define (lft-descendant-born-after-1980 lft) (cond [(empty? lft) false] [else (or (ft-descendant-born-after-1980 (first lft)) (lft-descendant-born-after-1980 (rest lft)))])) (check-expect (lft-descendant-born-after-1980 (list bettina adam)) true) (check-expect (lft-descendant-born-after-1980 empty) false) ; ft-satisfies : family-tree (family-tree -> boolean) -> boolean ; returns whether family tree has member satisfying condition (define (ft-satisfies ft p?) (or (p? ft) (lft-satisfies (parent-children ft) p?))) (check-expect (ft-satisfies bettina (lambda (p) (> (parent-date p) 1980))) true) (check-expect (ft-satisfies bettina (lambda (p) (< (parent-date p) 1800))) false) ; lft-satisfies : list-of-family-trees (family-tree -> boolean) -> boolean ; returns whether any of the list of family trees contains an element satisfying condition (define (lft-satisfies lft p?) (cond [(empty? lft) false] [else (or (ft-satisfies (first lft) p?) (lft-satisfies (rest lft) p?))])) (check-expect (lft-satisfies (list bettina carl) (lambda (p) (> (parent-date p) 1980))) true) (check-expect (lft-satisfies (list bettina) (lambda (p) (symbol=? (parent-name p) 'george))) false)