#lang racket (require "set-adt.rkt") ; The motivation for my new SECOND function comes from: ; https://blog.plover.com/math/wiener-pairs-3.html ; ; set, set-union-all, and set-intersect-all are variable arity functions. ; set-minus is binary. (define MAKE-PAIR (lambda (a b) (set (set a) (set a b)))) (define FIRST (lambda (aSet) (set-one-elem (apply set-intersect-all aSet)))) (define SECOND (lambda (aSet) (let ((union-minus-intersection (set-minus (apply set-union-all aSet) (apply set-intersect-all aSet)))) (if (not (set-empty? union-minus-intersection)) (set-one-elem union-minus-intersection) (set-one-elem (apply set-intersect-all aSet)))))) ; FIRST ; ---------------------------------------------------------------- ; Using pairs, regardless of implementation. ; ---------------------------------------------------------------- (require rackunit) (define pair1 (MAKE-PAIR 2 3)) (define pair2 (MAKE-PAIR 1 pair1)) (check-equal? (FIRST pair2) 1) (check-equal? (FIRST (SECOND pair2)) 2) (check-equal? (SECOND (SECOND pair2)) 3) ; ---------------------------------------------------------------- ; The hard case for sets: when (eq? (FIRST p) (SECOND p)) ; ---------------------------------------------------------------- (define pair3 (MAKE-PAIR 'a 'a)) (check-equal? (FIRST pair3) 'a) (check-equal? (SECOND pair3) 'a) ; ----------------------------------------------------------------