SICP 問題 2.54(リストの比較?)
問題
二つのリストは、同じ順に並んだ同じ要素を含むとき、equal? であるという。例えば、
(equal? '(this is a list) '(this is a list))
は真である。しかし、
(equal? '(this is a list) '(this (is a) list))
は偽である。より正確には、基本となる eq? 等価を使い、a と b が記号であって両者が eq? であるか、あるいは両者が、 (car a) が (car b) に equal? であり、(cdr a) が (cdr b) に equal? であるようなリストであると、equal? を再帰的に定義できる。この考えを使い、equal? を実装せよ。
解答
普通に実装。
(define (my-equal? a b) (cond ((and (null? a) (null? b)) #t) ((and (not (null? a)) (not (null? b))) (if (eq? (car a) (car b)) (equal? (cdr a) (cdr b)) #f)) (else #f)))
では実験。
OKでしょう。
gosh> (my-equal? '(this is a list) '(this (is a) list))
#f
gosh> (my-equal? '(this is a list) '(this is a list))
#t
gosh> (my-equal? '(this is a list) '(this is a))
#f
gosh> (my-equal? '(this is a list !) '(this is a list))
#f
gosh> (my-equal? '(this is a list) '(this is a list))
#t
gosh>