<jupyter_start><jupyter_text>練習問題2.60上の例では、集合は重複のないリストとして表現するよう規定した。  ここで、重複を許す場合について考えてみよう。  その場合、例えば{1,2,3}という集合は(2 3 2 1 3 2 2)というリストとして表現することもできる。  この表現に対して演算を⾏う⼿続きelement-of-set?,adjoin-set,union-set,intersectionsetを設計せよ。  それぞれの効率は、重複なし表現に対する⼿続きでそれに対応するものと⽐べてどうだろうか。  重複なしの表現よりもこの表現のほうが向いているような応⽤はあるだろうか。<jupyter_code>; 変更なし
(define (element-of-set? x set)
  (cond ((null? set) #f)
        ((equal? x (car set)) #t)
        (else (element-of-set? x (cdr set))))
  )

; 変更
(define (adjoin-set x set)
  (cons x set)
  )

; 変更なし
(define (intersection-set set1 set2)
  (cond ((or (null? set1) (null? set2)) '())
        ((element-of-set? (car set1) set2) (cons (car set1) (intersection-set (cdr set1) set2)))
        (else (intersection-set (cdr set1) set2)))
  ) 

; 変更
(define (union-set set1 set2)
  (cond ((and (null? set1) (null? set2)) '())
        ((null? set1) set2)
        ((null? set2) set1)
        ;(else (cons (car set1) (union-set (cdr set1) set2)))
        ;(else (union-set (cdr set1) (adjoin-set (car set1) set2)))
        (else (append set1 set2))
        )
  )
; 動作確認
(define A (list 1 2 3 4))
(define B (list 2 4 5 6))
(define C (list 4 6 7))

(union-set A B)
(union-set (union-set A B) C)
(adjoin-set 3 B)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1685214626391097, 'fraction_numerical': 0.04133545310015898, 'mean_word_length': 3.578181818181818, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '505079', 'license': 'CC0-1.0', 'n_tokens_mistral': 697, 'n_tokens_neox': 662, 'n_words': 135, 'path': 'exercises/2.60.ipynb', 'repo_name': 'tokits/sicp-study', 'size': '1258'}