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