LISP中表达式的简化与求值

LISP中表达式的简化与求值,lisp,common-lisp,multiplication,simplify,Lisp,Common Lisp,Multiplication,Simplify,我正在尝试创建一个lisp函数,用于计算和简化乘法和加法运算。 函数的工作方式应确保当用户调用函数时 简化Mult'*12它只打印2或 简化Mult'*037只打印0 到目前为止,我有这个 (defun simplify-multiplication (lis) (if (not (null lis)) (if (member '0 lis) 0 (if (member '1 lis) cdr lis (if (listp

我正在尝试创建一个lisp函数,用于计算和简化乘法和加法运算。 函数的工作方式应确保当用户调用函数时 简化Mult'*12它只打印2或 简化Mult'*037只打印0

到目前为止,我有这个

(defun simplify-multiplication (lis)
    (if (not (null lis))
        (if (member '0 lis) 0
        (if (member '1 lis) cdr lis
                (if (listp (car lis))
                    (cons(simplify(car lis)))
                    (if (numberp (car lis))
                        (if (null (cdr lis))
                            lis
                            (cons (car lis) (simplify-multiplication (cdr lis)))
                        )
                        (if (eq (car lis) '+)
                            (cons (car lis) (simplify-multiplication (cdr lis)))
                            (if (eq (car lis) '*)
                                (cons (car lis) (simplify-multiplication (cdr lis)))
                                lis
                            )
                        )
                    )
                )

            )
        )
    )
)

您可以编写一个函数simplify,它将简化规则应用于乘法和加法。如果要递归地简化表达式,首先必须简化每个参数,然后为相应的操作应用简化规则。 以下可能是一个起点:

(defun simplify (lis)
  (if (atom lis)
    lis
    (let ((args (mapcar #'simplify (cdr lis))))
      (cond
        ((eql (car lis) '+)
          (setq args (remove 0 args))
          (case (length args)
            (0 0)
            (1 (car args))
            (otherwise (cons '+ args)) ))
        ((eql (car lis) '*)
          (if (member 0 args)
              0
              (progn
                (setq args (remove 1 args))
                (case (length args)
                  (0 1)
                  (1 (car args))
                  (otherwise (cons '* args)) ))))
        (T (cons (car lis) args)) ))))

您可能需要添加其他简化规则,例如*2*3 4=>*2 3 4等。。除了检测错误表达式,如简化++.P/>,请考虑投资几分钟来了解正确的。