我有一个结构良好的树,代表一个数学表达式。例如,给定字符串: "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)
(42的 a这个根的 a这个次方)是 42
?
我知道这个问题很宽泛,但我已经绞尽脑汁想了一段时间了,还没有想出任何令人满意的答案。