diff --git a/ex-2_77-97.scm b/ex-2_77-97.scm index 8cd5766..9364ceb 100644 --- a/ex-2_77-97.scm +++ b/ex-2_77-97.scm @@ -543,8 +543,130 @@ (display (add cr cr)) (newline) (display (mul cr cr)) (newline) -(display "\n\nexample - symbolic algebra\n") +(display "\nexample - symbolic algebra\n") -(display "\nex-2.87\n") +(define (install-polynomial-package) + ;; internal procedures + ;; representation of poly + (define (make-poly variable term-list) + (cons variable term-list)) + (define (variable p) (car p)) + (define (term-list p) (cdr p)) + + ;; procedures same-variable? and variable? from section 2.3.2 + (define (variable? x) (symbol? x)) + (define (=number? exp num) + (and (number? exp) (= exp num))) + (define (same-variable? v1 v2) + (and (variable? v1) (variable? v2) (eq? v1 v2))) + + ;; representation of terms and term lists + (define (adjoin-term term term-list) + (if (=zero? (coeff term)) + term-list + (cons term term-list))) + (define (the-empty-termlist) '()) + (define (first-term term-list) (car term-list)) + (define (rest-terms term-list) (cdr term-list)) + (define (empty-termlist? term-list) (null? term-list)) + (define (make-term order coeff) (list order coeff)) + (define (order term) (car term)) + (define (coeff term) (cadr term)) + + (define (add-terms L1 L2) + (cond ((empty-termlist? L1) L2) + ((empty-termlist? L2) L1) + (else + (let ((t1 (first-term L1)) (t2 (first-term L2))) + (cond ((> (order t1) (order t2)) + (adjoin-term + t1 (add-terms (rest-terms L1) L2))) + ((< (order t1) (order t2)) + (adjoin-term + t2 (add-terms L1 (rest-terms L2)))) + (else + (adjoin-term + (make-term (order t1) + (add (coeff t1) (coeff t2))) + (add-terms (rest-terms L1) + (rest-terms L2))))))))) + + (define (add-poly p1 p2) + (if (same-variable? (variable p1) (variable p2)) + (make-poly (variable p1) + (add-terms (term-list p1) + (term-list p2))) + (error "Polys not in same var -- ADD-POLY" + (list p1 p2)))) + + (define (mul-terms L1 L2) + (if (empty-termlist? L1) + (the-empty-termlist) + (add-terms (mul-term-by-all-terms (first-term L1) L2) + (mul-terms (rest-terms L1) L2)))) + + (define (mul-term-by-all-terms t1 L) + (if (empty-termlist? L) + (the-empty-termlist) + (let ((t2 (first-term L))) + (adjoin-term + (make-term (+ (order t1) (order t2)) + (mul (coeff t1) (coeff t2))) + (mul-term-by-all-terms t1 (rest-terms L)))))) + + (define (mul-poly p1 p2) + (if (same-variable? (variable p1) (variable p2)) + (make-poly (variable p1) + (mul-terms (term-list p1) + (term-list p2))) + (error "Polys not in same var -- MUL-POLY" + (list p1 p2)))) + + (define (=zero?-poly p) + (define (=zero?-terms terms) + (cond + ((empty-termlist? terms) #t) + ((not (=zero? (coeff (first-term terms)))) #f) + (else (=zero?-terms (rest-terms terms))))) + (=zero?-terms (term-list p))) + + ;; interface to rest of the system + (define (tag p) (attach-tag 'polynomial p)) + (put 'add '(polynomial polynomial) + (lambda (p1 p2) (tag (add-poly p1 p2)))) + (put 'mul '(polynomial polynomial) + (lambda (p1 p2) (tag (mul-poly p1 p2)))) + (put '=zero? '(polynomial) =zero?-poly) + (put 'make 'polynomial + (lambda (var terms) (tag (make-poly var terms)))) + (display "[install-polynomial-package]\n") + 'done) + +(install-polynomial-package) + +(define (make-poly var terms) + ((get 'make 'polynomial) var terms)) + +(define p (make-poly 'x '((100 2) (1 2)))) +;(display p) +(assert (mul p p) + (make-poly 'x '((200 4) (101 8) (2 4)))) + + +(display "\nex-2.87 - =zero?\n") + +(assert (=zero? p) #f) +(assert #t + (=zero? (make-poly 'x (list + (list 10 (make-rational 0 10)) + (list 5 (make-complex-from-real-imag 0 0)) + (list 1 0))))) + +(define px p) +(define py (make-poly 'y (list (list 3 px)))) +(display (add py py)) +(newline) + +(display "\nex-2.88 - sub\n")