Часто в отчётах требуется представить расчёт какой-нибудь величины в виде формулы с подставленными значениями аргументов. Ищу подходящую для этого дела готовую библиотеку, которая бы позволяла выполнять вычисление и в тот же момент генерировать соответствующую выполненному вычислению математическую нотацию.
Прошу подсказать, имеются ли в природе и как называются свободные библиотеки, решающие эту задачу.
Объясняю подробнее, как я вижу эту библиотеку в идеале.
«Математическая нотация» — класс, который объединяет вычисленное значение и формулу. Он может формироваться в результате вычислений или конструироваться из числа. Метод (разумеется, далее все имена методов и свойств условны) «getValue()» выдаёт числовое значение; метод «getExpression()» выдаёт математическое выражение с подстановкой аргументов, в виде строки, в виде какой-нибудь стандартной нотации (TeX, MathML или AsciiMath; метод «getFormula()» — то же самое, но в виде уравнения с отображением результата.
Пример использования библиотеки (для простоты рассмотрим случай, когда выражения формируются в нотации AsciiMath):
// Сформируем компоненты выражения из исходных чисел
Notation number1 = Notation.of( 2 );
Notation number2 = Notation.of( 6 );
Notation number3 = Notation.of( 1.5 );
// Cложим два числа
Notation resultSum = number1.add( number2 );
Number sumNum = resultSum.getValue(); // результат - число 8
String sumExpr = resultSum.getExpression(); // результат - строка "2 + 6"
String sumForm = resultSum.getFormula(); // результат - строка "2 + 6 = 8"
// В идеале, библиотека должна учитывать приоритет операций и расставлять скобки.
Notation resultComp1 = number1.multiply( number2 ).add( number3 );
Number comp1Num = resultComp1.getValue(); // результат - число 13.5
String comp1Expr = resultComp1.getExpression(); // результат - строка "2 * 6 + 1.5"
String comp1Form = resultComp1.getFormula(); // результат - строка "2 * 6 + 1.5 = 13.5"
Notation resultComp2 = number1.multiply( number2.add( number3 ) );
Number comp2Num = resultComp2.getValue(); // результат - число 15
String comp2Expr = resultComp2.getExpression(); // результат - строка "2 * ( 6 + 1.5 )"
String comp2Form = resultComp2.getFormula(); // результат - строка "2 * ( 6 + 1.5 ) = 15"
Notation resultComp3 = number2.add( number3 ).multiply( number1 );
Number comp3Num = resultComp3.getValue(); // результат - число 15
String comp3Expr = resultComp3.getExpression(); // результат - строка "( 6 + 1.5 ) * 2"
String comp3Form = resultComp3.getFormula(); // результат - строка "( 6 + 1.5 ) * 2 = 15"
// Случай с использованием хитрых обозначений
Notation resultRP = number1.add( number2 ).sqrt().pow( number3 );
Number rpNum = resultRP.getValue(); // результат - число 4.75682846001
String rpExpr = resultRP.getExpression(); // результат - строка "sqrt(2+6)^1.5"
String rpForm = resultRP.getFormula(); // результат - строка "sqrt(2+6)^1.5 = 4.75682846001"
Из языков программирования, на котором написана библиотека, предпочтительны те, которые умеют встраиваться в PostgreSQL и на которых могут быть написаны хранимые функции. Годятся Python, Ruby, но на худой конец подойдет и Java.