简化数学表达式的策略
我有一棵结构良好的树,代表数学表达式。例如,给定字符串:"1+2-3*4/5",它将解析为: subtract(add(1,2),divide(multiply(3,4),5)) 表示为这棵树: 我想做的就是拿这棵树并尽可能减少它。在上述情况下,这非常简单,因为所有数字都是常量。但是,一旦我允许未知数(以一个$后跟一个标识符表示),事情就会变得更加棘手: "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)(第a次方为42的a次方)是42? 我知道这个问题涉及面很广,但是我已经对此提出质疑了很长时间,而且还没有提出令人满意的建议。