SICP 연습문제 2.54 친절한 풀이

문제

두 리스트의 원소들이 차례대로 모두 같다면, 두 리스트가 equal? 하다고 정의한다. 보기를 들어, 아래 식의 값은 참이다.

(equal? '(this is a list) '(this is a list))

하지만, 다음 식은 거짓이다.

(equal? '(this is a list) '(this (is a) list))

더 정확히 설명하면, equal?은 eq?를 써서 되돌기 프로시저로 정의내릴 수 있다. 즉, 인자로 받은 a와 b가 서로 eq?한 글자거나, 두 인자가 (car a)와 (car b)가 equal?하고 (cdr a)와 (cdr b)도 equal?한 리스트라면, a와 b는 equal?하다고 볼 수 있다. 이런 생각을 바탕으로 equal? 프로시저를 구현하라.

문제로 부터 얻은 것

잃어버릴 뻔 했던 되돌면서 검사하는 프로시저의 감을 잃지 않게 해주었습니다.
eq?와 equal? 프로시저의 존재를 알게 되었습니다. 앞으로의 문제들에 많이 쓰일 것 같습니다.

문제풀이

eqaul? 프로시저의 인자 x, y는 둘다 리스트거나, 둘다 리스트의 마지막이거나, 서로 같거나, 다릅니다. 이를 cond의 술어로 생각하고 프로시저를 짜면 다음과 같습니다.

(define (equal? x y)
(define (both proc x y) (and (proc x) (proc y)))
(cond ((both null? x y) #t)
((both pair? x y) (and (equal? (car x) (car y))
(equal? (cdr x) (cdr y))))
((eq? x y) #t)
(else #f)))



문제의 테스트 코드를 실행해 보겠습니다.

(equal? '(this is a list) '(this is a list))
(equal? '(this is a list) '(this (is a) list))



문제의 테스트 코드를 잘 판단하는 모습



읽어주셔서 감사합니다.