(define sameFringe (lambda (tree1 tree2) (let ((gen1 (make-generator tree1)) (gen2 (make-generator tree2))) (driver gen1 gen2)))) (define driver (lambda (gen1 gen2) (let ((leaf1 (gen1)) (leaf2 (gen2))) (if (= leaf1 leaf2) (if (zero? leaf1) #t (driver gen1 gen2)) #f)))) (define make-generator (lambda (tree) (letrec ((caller '*) (generate-leaves (lambda () (letrec ((loop (lambda (tree) (if (leaf? tree) (call/cc (lambda (genrest) (set! generate-leaves (lambda () (genrest '*))) (caller tree))) (begin (loop (car tree)) (loop (cadr tree))))))) (loop tree))))) (lambda () (call/cc (lambda (k) (set! caller k) (generate-leaves) (caller 0))))))) ;; abstract data type for tree (define leaf? number?) (define subtree? pair?) (define tree1 '(((((((((((((1 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14)) (define tree2 '(1 (2 (3 (4 (5 (6 (7 (8 (9 (10 (11 (12 (13 14)))))))))))))) (define tree3 '(2 (1 (3 (4 (5 (6 (7 (8 (9 (10 (11 (12 (13 14))))))))))))))