;; ------------------------------------------------------------------------ ;; | FILE : set-adt.rkt | ;; | AUTHOR : Eugene Wallingford | ;; | CREATION DATE : 2025/03/31 | ;; | DESCRIPTION : These functions implement a set datatype in | ;; | Racket, including a number of common set | ;; | operations. | ;; ------------------------------------------------------------------------ #lang racket (provide (all-defined-out)) ;; ------------------------------------------------------------------------- ;; constructors (define the-empty-set '()) (define (set . args) (if (null? args) the-empty-set (set-add (car args) (apply set (cdr args))))) ;; ------------------------------------------------------------------------- ;; type predicate (define (set? lst) (or (null? lst) (and (not (member (first lst) (rest lst))) (set? (rest lst))))) ;; ------------------------------------------------------------------------- ;; accessors (define set-one-elem car) (define set-rest cdr) ;; ------------------------------------------------------------------------- ;; size and membership (define set-size length) (define set-empty? null?) (define (set-member? e S) (and (not (set-empty? S)) (or (equal? e (set-one-elem S)) (set-member? e (set-rest S))))) (define (set-subset? S1 S2) (or (set-empty? S1) (and (set-member? (set-one-elem S1) S2) (set-subset? (set-rest S1) S2)))) (define (set-equal? S1 S2) (and (set-subset? S1 S2) (set-subset? S2 S1))) ;; ------------------------------------------------------------------------- ;; set operations (define (set-add e S) (if (set-member? e S) S (cons e S))) (define set-remove remove) (define (set-union S1 S2) (if (set-empty? S1) S2 (set-add (set-one-elem S1) (set-union (set-rest S1) S2)))) (define (set-minus S1 S2) (if (set-empty? S2) S1 (set-remove (set-one-elem S2) (set-minus S1 (set-rest S2))))) (define (set-intersect S1 S2) (if (set-empty? S1) the-empty-set (if (set-member? (set-one-elem S1) S2) (set-add (set-one-elem S1) (set-intersect (set-rest S1) S2)) (set-intersect (set-rest S1) S2)))) (define (set-union-all set-list) (if (null? set-list) the-empty-set (set-union (set-one-elem set-list) (set-union-all (set-rest set-list))))) ;; -------------------------------------------------------------------------