;;;DERIV-SIMPLIFY-RULES.SCM Oct. 23, 1998 ;;; REWRITE RULES FOR SIMPLIFYING ARITHMETIC EXPRESSIONS WITH DERIVATIVES ;; ::= | | ( + ) | ( * ) | (deriv ) ;;Evaluate (load "match.scm") -- the pattern matching code -- before ;;evaluating the definitions below. ;RULES FOR DERIVATIVES (define deriv+-rule (make-simple-rule '(deriv (?addend + ?augend) ?var) '((deriv ?addend ?var) + (deriv ?augend ?var)))) (define deriv*-rule (make-simple-rule '(deriv (?plier * ?plicand) ?var) '((?plicand * (deriv ?plier ?var)) + (?plier * (deriv ?plicand ?var))))) (define derivnum-rule (make-simple-rule '(deriv ?%num ?) 0)) (define derivsamevar-rule (make-simple-rule '(deriv ?var ?var) 1)) (define derivothervar-rule (make-general-rule '(deriv ?%var1 ?var) (lambda (v1 v) (if (eq? v1 v) (fail) 0)))) (define deriv-rules (list deriv+-rule deriv*-rule derivnum-rule derivsamevar-rule derivothervar-rule)) ;;SIMPLIFICATION RULES ;converts any aritmetic expression into a standard-form sorted sum of ;sorted monomials (define rule:prim+ (make-general-rule '(?%num1 + ?%num2) +)) (define rule:prim* (make-general-rule '(?%num1 * ?%num2) *)) (define rule:+0 (make-simple-rule '(?ad + 0) '?ad)) (define rule:0+ ;redundant with +nums-right (make-simple-rule '(0 + ?au) '?au)) (define rule:0* (make-simple-rule '(0 * ?plicand) 0)) (define rule:*0 ;redundant with *nums-left (make-simple-rule '(?plier * 0) 0)) (define rule:1* (make-simple-rule '(1 * ?plicand) '?plicand)) (define rule:*1 ;redundant with *nums-left (make-simple-rule '(?plier * 1) '?plier)) (define rule:left-distrib (make-simple-rule '(?plier * (?ad + ?au)) '((?plier * ?ad) + (?plier * ?au)))) (define rule:right-distrib (make-simple-rule '((?ad + ?au) * ?plier) '((?plier * ?au) + (?plier * ?ad)))) (define rule:+assoc ;right (make-simple-rule '((?e + ?f) + ?g) '(?e + (?f + ?g)))) (define rule:*assoc ;right (make-simple-rule '((?e * ?%not-num) * ?g) '(?e * (?%not-num * ?g)))) (define rule:+nums-right (make-simple-rule '(?%num + ?%not-num) '(?%not-num + ?%num))) (define rule:*nums-left1 (make-simple-rule '(?%var * ?%num) '(?%num * ?%var))) (define rule:*nums-left2 (make-simple-rule '(?%var * (?%num * ?e)) '(?%num * (?%var * ?e)))) (define rule:*nums-left3 (make-simple-rule '(?%num1 * (?%num2 * ?e)) '((?%num1 * ?%num2) * ?e))) (define rule:varsort1 (make-general-rule '(?%var2 * ?%var1) (lambda (v2 v1) (if (symbol 1 ((symbol? m2) #f) ;degree(m2) = 1 < degree(m1) (else (error "MONOMIALstring symbol1) (symbol->string symbol2))) (define (symbol<=? symbol1 symbol2) (or (eq? symbol1 symbol2) (symbol