У меня есть хорошо сформированное дерево, которое представляет собой математическое выражение. Например, с учетом строки: "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 th из 42 в силу a th) является 42
?
Я понимаю, что этот вопрос довольно широк, но я некоторое время бил головой об этом и не придумывал ничего удовлетворительного.