#lang typed-scheme  
(define-type-alias top Any)
(define-type-alias set (top -> top))

(define: (autos [elt : top]) : top (memq elt '(vw saab bmw audi)))

(define: (element-of? [elt : top] [s : set]) : top (s elt))

;; CHANGE - use exact-integer?
(define: (evens [elt : top]) : top (and (exact-integer? elt) (even? elt)))

(define-typed-struct pr ([fst : top] [snd : top]))

#;(define: (length=2? [any : top]) : boolean
(and (pair? any)
     (pair? (cdr any))
     (empty? (cdr (cdr any)))))

(define: (cartesian-product [A : set] [B : set]) : set
  (lambda: ([elt : top])
	   (and (pr? elt)
		(element-of? (pr-fst elt) A)
		(element-of? (pr-snd elt) B))))



(define: evenEuroCars : set (cartesian-product evens autos))
#;(display (element-of? (make-pr 4 'bmw) evenEuroCars)) ; = #t
#;(display (element-of? (make-pr 'bmw 4) evenEuroCars)) ; = #f

