У меня есть хорошо сформированное дерево, представляющее математическое выражение. Например, учитывая строку: «1 + 2-3 * 4/5»
, это разбирается в:
subtract(add(1,2),divide(multiply(3,4),5))
Что выражается в виде этого дерева:
Кем бы я хотел быть в состоянии взять это дерево и уменьшить его насколько возможно. В приведенном выше случае это довольно просто, потому что все числа являются константами. Однако все становится сложнее, когда я разрешаю неизвестные (обозначается $
, за которым следует идентификатор):
«3 * $ a / $ a»
становится делением ( 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 в степени) равен 42
?
Я понимаю, что это довольно общий вопрос, но я уже давно бился над ним и не нашел ничего удовлетворительного.