;;;;;;;;;;;;;;; ;; Derivada formal (define (derivada exp var) (cond ((numero? exp) 0) ((variable? exp) (if (misma-variable? exp var) 1 0)) ((suma? exp) (cons-suma (derivada (primer-sumando exp) var) (derivada (segundo-sumando exp) var))) ((producto? exp) (cons-suma (cons-producto (derivada (primer-factor exp) var) (segundo-factor exp)) (cons-producto (primer-factor exp) (derivada (segundo-factor exp) var)))) (else (error "derivada: el tipo de la expresion es desconocido: " exp)))) ;;;;;;;;;; ;; Representacion de las expresiones formales (define (numero? x) (number? x)) (define (variable? x) (symbol? x)) (define (misma-variable? x y) (and (variable? x) (variable? y) (eq? x y))) ;;;; sumas ;; constructor (define (cons-suma s1 s2) (list '+ s1 s2)) ;; predicado para reconocer sumas (define (suma? expresion) (and (list? expresion) (eq? (first expresion) '+))) ;; selectores (define (primer-sumando z) (cadr z)) (define (segundo-sumando z) (caddr z)) ;;;; productos ;;constructor (define (cons-producto f1 f2) (list '* f1 f2)) ;; predicado para reconocer productos (define (producto? expresion) (and (list? expresion) (eq? (first expresion) '*))) ;; selectores (define (primer-factor z) (cadr z)) (define (segundo-factor z) (caddr z)) ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; ;; Mejoras #| (define (cons-suma s1 s2) (cond ((and (numero? s1) (numero? s2)) (+ s1 s2)) ((eq? s1 0) s2) ((eq? s2 0) s1) (else (list '+ s1 s2)))) |# #| (define (cons-producto f1 f2) (cond ((or (eq? f1 0) (eq? f2 0)) 0) ((eq? f1 1) f2) ((eq? f2 1) f1) ((and (numero? f1) (numero? f2)) (* f1 f2)) (else (list '* f1 f2)))) |# (derivada '(+ (+ (* -7 (* x x)) (* 3 x)) 9) 'x) '(+ (+ (+ (* 0 (* x x)) (* -7 (+ (* 1 x) (* x 1)))) (+ (* 0 x) (* 3 1))) 0)