Стратегии упрощения математических выражений

У меня есть хорошо сформированное дерево, представляющее математическое выражение. Например, учитывая строку: «1 + 2-3 * 4/5» , это разбирается в:

subtract(add(1,2),divide(multiply(3,4),5))

Что выражается в виде этого дерева:

"1+2-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 ?

Я понимаю, что это довольно общий вопрос, но я уже давно бился над ним и не нашел ничего удовлетворительного.

65
задан Dave DeLong 24 September 2011 в 16:31
поделиться