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)))