Implement till 2.87
This commit is contained in:
126
ex-2_77-97.scm
126
ex-2_77-97.scm
@@ -543,8 +543,130 @@
|
|||||||
(display (add cr cr)) (newline)
|
(display (add cr cr)) (newline)
|
||||||
(display (mul 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")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user