ex 2.61, 2.62 順序つけられたリストとしての集合

;; 順序づけられたリストとしての集合
(define (element-of-set? x set)
  (cond ((null? set) #f)
        ((= x (car set)) #t)
        ((< x (car set)) #f)
        (else (element-of-set x (cdr set)))))

(define (intersection-set set1 set2)
  (if (or (null? set1) (null? set1))
      '()
      (let ((x1 (car set1))
            (x2 (car set2)))
        (cond ((= x1 x2)
               (cons x1
                     (intersection-set (cdr set1)
                                       (cdr set2))))
              ((< x1 x2)
               (intersection-set (cdr set1) set2))
              ((< x2 x1)
               (intersection-set set1 (cdr set2)))))))

以下、問題。

;; sicp ex 2.61
(define (adjoin-set x set)
  (define (iter item rest ahead)
    (cond ((null? rest) ahead)
          ((= item (car rest)) (append ahead rest))
          ((< item (car rest)) (append ahead (cons item rest)))
          (else (iter item (cdr rest) (append ahead (list (car rest)))))))
  (iter x set '()))
;; 順序の利点を、追加する要素が走査している値と等しい、もしくは小さくなった時点で
;; 処理を終了するようにしている
;; sicp ex 2.62
;; intersection-setを参考に
(define (union-set set1 set2)
  (cond ((null? set1) set2)
        ((null? set2) set1)
        (else (let ((x1 (car set1))
                    (x2 (car set2)))
                (cond ((< x1 x2)
                       (cons x1 (union-set (cdr set1) set2)))
                      ((< x2 x1)
                       (cons x2 (union-set set1 (cdr set2))))
                      ((= x1 x2)
                       (union-set (cdr set1) set2)))))))

特に問題なし。