(define element-of? (lambda (elem ls) (and (not (null? ls)) (or (set-equal? elem (car ls)) (element-of? elem (cdr ls)))))) (define add-element (lambda (elem ls) (if (element-of? elem ls) ls (cons elem ls)))) (define set-union (lambda (ls1 ls2) (if (null? ls1) ls2 (add-element (car ls1) (set-union (cdr ls1) ls2))))) (define delete-element (lambda (elem ls) (cond ((null? ls) ()) ((set-equal? (car ls) elem) (cdr ls)) (else (cons (car ls) (delete-element elem (cdr ls))))))) (define set-equal? (lambda (ls1 ls2) (cond ((null? ls1) (null? ls2)) ((not (pair? ls1)) (eq? ls1 ls2)) (else (and (element-of? (car ls1) ls2) (set-equal? (cdr ls1) (delete-element (car ls1) ls2))))))) (define powerset (lambda (ls) (if (null? ls) '(()) (let ((p (powerset (cdr ls)))) (set-union (map (lambda (subset) (add-element (car ls) subset)) p) p))))) (define largest (lambda (ls) (letrec ((loop (lambda (subset m ls) (if (null? ls) subset (let ((n (length (car ls)))) (if (> n m) (loop (car ls) n (cdr ls)) (loop subset m (cdr ls)))))))) (loop () 0 ls)))) (define contest (lambda (ls) (if (set-equal? ls (powerset (largest ls))) 'good 'bad)))