Here is a data definition for a set of numbers. Unlike a list of numbers, a set of numbers should not contain any duplicated elements.

;; a set-of-numbers is either
;;   - empty
;;   - (cons number[n] set-of-numbers[l])
;; INVARIANT: the number n is not in the list-of-numbers l

Not all sets have unique representations. For example, the set of numbers [exam2-Z-G-1.gif] can be represented as either

(cons 1 (cons 3 empty))

or

(cons 3 (cons 1 empty))

These should be thought of as equivalent sets.

 

Develop three functions:

;; start : number -> set-of-numbers
;; to build a new set of numbers that contains only n
(define (start n) ...)

;; extend : number set-of-numbers -> set-of-numbers
;; to build a bigger set of numbers, extending son.
(define (extend n son) ...)

;; test : number set-of-numbers -> boolean
;; to determine if n is in son.
(define (test n son) ...)

Solution

;; start : number -> set-of-numbers
;; to build a new set of numbers that contains only n
(define (start n) (list n))
;; extend : number set-of-numbers -> set-of-numbers
;; to build a bigger set of numbers, extending son.
(define (extend n son)
  (cond
    [(test n son) son]
    [else (cons n son)]))
  
;; test : number set-of-numbers -> boolean
;; to determine if n is in son.
(define (test n son)
  (cond
    [(empty? son) false]
    [else (or (= n (first son))
              (test n (rest son)))]))