简化符号表达式

问题描述 投票:0回答:1

我是Lisp的新手,我需要一些帮助。我需要简化下一个表达式:从(+ (+ A B) C)(+ A B C)并从(- (- A B) C)(- A B C)

如果您可以帮助其中之一,我将理解我需要如何处理下一个。

非常感谢。

lisp clisp
1个回答
0
投票

[假设您有一个与此模式(+ e1 ... en)匹配的输入,您要递归地将所有e1简化为en,从而得到s1,...,sn,然后提取所有以si开头的+将其参数上移一个级别,到您要构建的简化表达式。

  • 如果e,则表达式(and (consp e) (eq '+ (car e)))与上述模式匹配。
  • 然后,所有ei只是由(cdr e)的列表给出。
  • 考虑(+)的情况,如何简化?
  • 要将函数f应用于值列表,请调用(mapcar #'f list)
  • 根据谓词p将一个列表分为两个列表,您可以使用循环:

    (let ((sat nil) (unsat nil))
      (dolist (x list (values sat unsat))
        (if (funcall predicate x) 
            (push x sat) 
            (push x unsat))))
    

    有一种纯粹的功能编写方式,您能弄清楚吗?

© www.soinside.com 2019 - 2024. All rights reserved.