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

では実験。


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>
OKでしょう。