Scheme 简化求导表达式格式

Scheme 简化求导表达式格式,scheme,Scheme,我正在使用Scheme语言对输入的表达式进行求导,在大多数情况下,我相信我的表驱动函数工作得足够好,但现在我想创建一些表达式来简化输出 例如: (d'(*(+x1)(+x-1)))->'(*2x)而不是->'(+(*(+x1)(+10))(*(+10)(+x-1))) 我对Scheme比较陌生,所以我知道这只是一个能够递归解析列表的问题,但我不知道从哪里开始,知道如何实现吗 这是我的函数代码 (define lookup (lambda (x alist) (cadr (assoc x alis

我正在使用Scheme语言对输入的表达式进行求导,在大多数情况下,我相信我的表驱动函数工作得足够好,但现在我想创建一些表达式来简化输出
例如:
(d'(*(+x1)(+x-1)))->'(*2x)而不是->'(+(*(+x1)(+10))(*(+10)(+x-1)))
我对Scheme比较陌生,所以我知道这只是一个能够递归解析列表的问题,但我不知道从哪里开始,知道如何实现吗

这是我的函数代码

(define lookup (lambda (x alist) (cadr (assoc x alist))))


;-----------------------------------------------------

(define d
  (lambda (e)
    (cond ((number? e) 0)
      ((equal? e 'x) 1)
      (else
       (let ((op (car e)) (args (cdr e)))
         (apply (lookup op d-op-table) args))))))


(define d-op-table
  (list(list '+   (lambda (u v)(list '+ (d u) (d v))))
       (list '-   (lambda (u v)(list '- (d u) (d v))))
       (list '*   (lambda (u v)(list '+ (list '* u (d v))(list '* (d u) v))))
       (list 'sin (lambda (u)(list '*( list 'cos (d u)))))
       (list 'cos (lambda (u)(list '*( list '-sin (d u)))))
       (list 'log (lambda (u)(list '* (list '/ 1 u) (d u))))
       (list 'exp (lambda (u)(list '* (d u)(list 'exp u))))
       (list 'expt (lambda (u v) (list 'expt (list '* v  u) (- v 1))))))

简化表达式与计算导数完全无关。它基本上是一个模式匹配和替换过程,例如,
(+anything 0)
简化为
anything
。我想将导数的输出简化为上面所说的,而不是得到“(+(*(+x1)(+10))(*(+10))(+x-1)))从(*(+x-1)(+x-1)))的导数开始,我尝试将其简化为(*2 x)作为Scheme的新手,我不确定如何轻松解析列表以简化它,因为一般简化可能是一项相当困难的任务,我理解您的要求。就像我说的,这是一个完全独立的手术<代码>(定义simplify…然后执行
(simplify(d'(…)
您也可以从
d
自动调用它:
(simplify(应用(查找op d-op-table)参数))
简化表达式完全独立于导数的计算,与导数的计算无关。它基本上是一个模式匹配和替换过程,例如,
(+anything 0)
简化为
anything
。我想将导数的输出简化为上面所说的,而不是得到“(*(+x1)(+10))(*(+10))(+x-1)))从(*(+x-1)(+x-1)))的导数开始,我尝试将其简化为(*2 x)作为Scheme的新手,我不确定如何轻松解析列表以简化它,因为一般简化可能是一项相当困难的任务,我理解您的要求。就像我说的,这是一个完全独立的手术
(定义simplify…
然后执行
(simplify(d'(…)
您也可以从
d
自动调用它:
(simplify(应用(查找op d-op-table)参数))