;; 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 ((lib "image.ss" "teachpack" "2htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "image.ss" "teachpack" "2htdp"))))) ;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)) ; a list-of-family-tree is either: ; - empty ; - (cons family-tree list-of-family-tree) (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 fred) 'carl 1926 'green)) (define bettina (make-parent (list adam dave eva fred) 'bettina 1926 'green)) ;ft-blue-eyed-descendant : family-tree -> boolean ;returns whether the family tree has a blue-eyed member (define (ft-blue-eyed-descendant ft) (or (symbol=? 'blue (parent-eyes ft)) (lft-blue-eyed-descendant (parent-children ft)))) ; decendant-born-after-1980 : family-tree -> boolean ; returns whether anyone in tree was born after 1980 (define (decendant-born-after-1980 ft) (or (> (parent-date ft) 1980) (decendant-born-after-1980-list (parent-children ft)) )) ; ft-satisfies : family-tree (family-tree -> boolean) -> boolean ; returns whether anyone in tree meets given condition (define (ft-satisfies ft p?) (or (p? ft) (lft-satisfies (parent-children ft) p?) )) ;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)))])) ; decendant-born-after-1980-list : list-of-family-tree -> boolean ; returns whether anyone in list has decendent born after 1980 (define (decendant-born-after-1980-list lft) (cond [(empty? lft) false] [else (or (decendant-born-after-1980 (first lft)) (decendant-born-after-1980-list (rest lft)))] ) ) ; lft-satisfies : list-of-family-tree (family-tree -> boolean) -> boolean ; returns whether any tree in list meets criteria (define (lft-satisfies lft p?) (cond [(empty? lft) false] [else (or (ft-satisfies (first lft) p?) (lft-satisfies (rest lft) p?))] )) (check-expect (ft-blue-eyed-descendant bettina) true) (check-expect (ft-blue-eyed-descendant gustav) false) (check-expect (decendant-born-after-1980 bettina) true) (check-expect (decendant-born-after-1980 (make-parent empty 'steve 1970 'blue)) false) (check-expect (decendant-born-after-1980-list (list bettina)) true)