Problem 6. Your roommate, Chris, works weekends as a bouncer for a local nightclub, and is responsible for checking ids at the door. Help your roommate out by designing a function to check birth-dates from drivers licenses to ensure that the license holder is over twenty-one.
Suppose we represent a date with the following data definition:
(define-struct date (year month day)) ;;; A Date is (make-date Number Number Number)
Design a function @noligs(over-21? birthdate today) that returns true if someone born on date @noligsbirthdate is twenty-one years old or older on date @noligstoday. Hint: First design a function that adds twenty-one years to a date.
;;; Grader: Olin
;;; over-21? : Date Date -> Boolean [1pt]
;;; Is someone born on date BIRTHDATE 21 or older on date TODAY? [1pt]
(define (over-21? birthdate today) ; [1pt]
(date<= (add-21 birthdate) today))
;;; Tests: [1pt]
(over-21? (make-date 2006 10 9) (make-date 2027 10 9))
(over-21? (make-date 2006 10 9) (make-date 2027 10 10))
(not (over-21? (make-date 2006 10 9) (make-date 2027 10 8)))
;;; [Allocate same 4pts if code is inlined.]
;;; add-21 : Date -> Date [1pt]
;;; Add 21 years to the input date. [1pt]
;;; [1pt]
(define (add-21 d)
(make-date (+ 21 (date-year d))
(date-month d)
(date-day d)))
;;; Test
(equal? (make-date 1972 9 29) [1pt]
(add-21 (make-date 1961 9 29)))
;;; [Allocate same 5pts if code is inlined.]
;;; date<= : Date Date -> Boolean [1pt]
;;; Compare two dates for <=. [1pt]
(define (date<= d1 d2) ; [2pt]
(or (< (date-year d1) (date-year d2))
(and (= (date-year d1) (date-year d2))
(or (< (date-month d1) (date-month d2))
(and (= (date-month d1) (date-month d2))
(<= (date-day d1) (date-day d2)))))))
;;; Tests: [1pt]
(date<= (make-date 1995 10 5) (make-date 1995 10 5))
(date<= (make-date 1995 10 5) (make-date 1995 10 6))
(not (date<= (make-date 1995 10 6) (make-date 1995 10 5)))
(date<= (make-date 1995 9 3) (make-date 1995 10 2))
(not (date<= (make-date 1995 10 2) (make-date 1995 9 3)))
(date<= (make-date 1994 11 3) (make-date 1995 10 2))
(not (date<= (make-date 1995 10 2) (make-date 1994 11 3)))