Таблица поиска неверна, иногда вы оцениваете выражения, но другие вы просто цитируете их, не оценивая их. Например, '(* u1 (d v1))
будет просто равно '(* u1 (d v1))
, производное фактически не вычисляется! Случай умножения выглядит особенно плохо, у него даже нет правильного ключа поиска *
.
Это ближе к тому, что вы намеревались, обратите внимание, что вам нужно больше работы, чтобы реально определить, какие выражения можно упростить -например: (* 0 x)
- это 0
, но этого должно быть достаточно для начала работы:
(define d-op-table
(list (list '+ (λ (u v) (list '+ (d3 u) (d3 v))))
(list '* (λ (u v)
(list '+
(list '* u (d3 v))
(list '* (d3 u) v))))))
Теперь ваш пример работает:
(d3 '(* 2 x))
=> '(+ (* 2 1) (* 0 x))
Если вы хотите написатьдействительно полезная процедура дифференциации, лучше взгляните на SICP .