我有一个结构良好的树,代表一个mathexpression式。 例如,给定string: "1+2-3*4/5" 4/5 "1+2-3*4/5" ,将其parsing为: subtract(add(1,2),divide(multiply(3,4),5)) 这是表示为这棵树: 我想要做的就是拿走这棵树,尽可能减less它。 在上面的例子中,这很简单,因为所有的数字都是常量。 然而,一旦我允许未知数(用$表示,后跟一个标识符),情况就会变得更加复杂: "3*$a/$a"变成divide(multiply(3,$a), $a) 这应该简化为3 ,因为$a条款应该互相取消。 问题是,“我怎样才能以通用的方式认识到这一点?” 我如何认识到min(3, sin($x))总会是sin($x) ? 如何识别sqrt(pow($a, 2))是否是abs($a) ? 我怎样才能认识到nthroot(pow(42, $a), $a) (42 次方的根)是42 ? 我意识到这个问题是相当广泛的,但是我一直在反对这个问题一段时间,还没有拿出足够满意的东西。