Схема - Производная с использованием таблицы - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь получить производную в схеме, используя код ниже. Кто-нибудь сможет сказать мне, где я иду не так? Я уже некоторое время пытаюсь понять это.

(define d3
  (λ (e)
    (cond ((number? e) 0)
      ((equal? e 'x) 1)
      (else
       ;; We handle only BINARY ops here, and only + and *
       (let ((op (car e)) (args (cdr e)))
         (apply (lookup op d-op-table) args))))))


(define d-op-table
  (list(list '+ (λ (u v) (+ (d3 u) (d3 v))))
       (list '+ (λ (u1 v1)
             (list '(* u1 (d v1)))(list '(* (d u1) v1))))))

(define lookup
  (λ (op table)
    (if (equal? op (caar table))
    (cadar table)
    (lookup op (cdr table)))))

Когда я запускаю функцию, я получаю следующую ошибку. Я ввод, (d3 '(* 2 x)).

    caar: contract violation
  expected: (cons/c pair? any/c)
  given: '()

1 Ответ

0 голосов
/ 07 октября 2019

Таблица поиска неверна, иногда вы оцениваете выражения, но другие вы просто цитируете их, не оценивая их. Например, '(* 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 .

...