(define-struct pr (fst snd)) ;; pairs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; INTERFACE Set ;; lst->set : [Listof X] -> [Set X] ;; create a set from the given list of objects ;; contains? : [Set X] X -> Boolean ;; is elt a member of set? ;; add-elt : [Set X] X -> [Set X] ;; create a set from the given set and object ;; union : [Set X] [Set X] -> [Set X] ;; create the set that contains the elements of both ;; intersect : [Set X] [Set X] -> [Set X] ;; create the set that contains the elements ;; that the two sets share ;; cartesian : [Set X] [Set Y] -> [Set (make-pr X Y)] ;; create all possible (make-pr .. ..) of elements from ;; set1 and set2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; A [Set X] is [List-of X] ;; where order does not matter and duplicates ARE allowed #| Alternate data definition for [Set X]: [Set X] = [List-of X] where order does not matter and duplicates are NOT allowed |# ;; lst->set : [Listof X] -> [Set X] ;; create a set from the given list of objects (define (lst->set lox) lox) ;; contains? : [Set X] X -> Boolean ;; is elt a member of set? (define (contains? s elt) (ormap (lambda (x) (equal? x elt)) s)) (define evens0-4 (lst->set '(0 2 4))) (define sprimes (lst->set '(2 3 5 7 11 13))) (check-expect (contains? sprimes 6) false) (check-expect (contains? sprimes 13) true) ;; add-elt : [Set X] X -> [Set X] ;; create a set from the given set and object (define (add-elt s elt) (cons elt s)) (check-expect (contains? (add-elt sprimes 17) 6) false) (check-expect (contains? (add-elt sprimes 17) 17) true) (check-expect (contains? (add-elt sprimes 17) 5) true) ;; union : [Set X] [Set X] -> [Set X] ;; create the set that contains the elements of both (define (union s1 s2) (append s1 s2)) (check-expect (contains? (union sprimes evens0-4) 10) false) (check-expect (contains? (union sprimes evens0-4) 9) false) (check-expect (contains? (union sprimes evens0-4) 0) true) (check-expect (contains? (union sprimes evens0-4) 2) true) (check-expect (contains? (union sprimes evens0-4) 7) true) ;; intersect : [Set X] [Set X] -> [Set X] ;; create the set that contains the elements ;; that the two sets share (define (intersect s1 s2) (filter (lambda (x) (contains? s2 x)) s1)) (check-expect (contains? (intersect sprimes evens0-4) 3) false) (check-expect (contains? (intersect sprimes evens0-4) 11) false) (check-expect (contains? (intersect sprimes evens0-4) 2) true) ;; cartesian : [Set X] [Set Y] -> [Set (make-pr X Y)] ;; create all possible (make-pr .. ..) of elements from ;; set1 and set2 (define (cartesian s1 s2) (apply append (map (lambda (x1) (map (lambda (x2) (make-pr x1 x2)) s2)) s1))) (define s1 (cartesian sprimes (lst->set '(4 2 0)))) (check-expect (contains? s1 (make-pr 11 0)) true) (check-expect (contains? s1 (make-pr 4 2)) false) (check-expect (contains? s1 (make-pr 2 2)) true)