Существует ли язык, в котором используется система компьютерной алгебры для дополнительных функций и оптимизации?

Например, представьте себе такую ​​функцию:

int solveSomeEquation(int y)
{
    y = (int x) * 2;
    return x;
}

Используя символьную алгебру, компилятор определит, что x = y / 2. Более того, он будет жаловаться на то, что int недостаточно для сохранения результата y / 2. Представьте, что эта функциональность распространяется на решение ODE с ограничениями и / или граничными условиями, и интеграция с использованием символических или числовых методов (во время выполнения), где это необходимо. Я, например, хотел бы увидеть что-то вроде этого:

int areaOfUnitSemiCircle()
{
    auto semiCircleFunc = [](double x){ return abs((1 - x^2)^0.5); };
    semiCircleFunc = (auto semiCircleIntegralFunc)'; // single quote means derivative
    return semiCircleIntegralFunc(1) - semiCircleIntegralFunc(-1);
}

упрощено до:

int areaOfUnitSemiCircle()
{
    return Pi/2;
}

Кроме того, он сможет не только упростить выражения локально внутри функции, но и выполнить целую оптимизацию программы. Он может переставлять выражения, чтобы улучшить числовую стабильность (уменьшить влияние ошибки с плавающей запятой) или даже полностью исключить их, используя другое представление. BigInt, число с плавающей запятой IEEE1394, задает предикат, интегрирует по кусочным функциям. Вероятно, можно сделать еще больше.

Такое возможно, нет? Я знаю, что вы можете выполнять такие вещи, используя функции языка программирования Mathematica или MatLab, но они называются ПО исходным кодом. Я хочу, чтобы он применял компилятор к исходному коду. (У этих языков есть такие вещи? Я не знаю.) Мне нравится использовать Mathematica на работе, когда у меня есть оправдание, но потом я получаю магически выглядящие функции в C++, которые не имеют смысла, не обращаясь к внешней Тетрадь Mathematica. Я бы хотел быть математиком и программистом на одном языке, в одной среде. Существует ли такая вещь?

1 ответ

Что ж, Maxima [1], безусловно, способен создавать выражения и манипулировать ими, а также создавать из них функции. Функции также являются просто выражениями, поэтому довольно просто взять какое-либо выражение, манипулировать им, создать функцию и вызвать функцию и выполнять все эти вещи с переменными вместо конкретных значений. Например, вот ваша функция площади круга:

(%i1) display2d : false $
(%i2) a(r) := ''(4 * integrate (sqrt (r^2 - x^2), x, 0, r));
Is r positive, negative or zero?
p;
(%o2) a(r):=%pi*r^2
(%i3) a(10);
(%o3) 100*%pi
(%i4) a(h);
(%o4) %pi*h^2

Общая идея о том, что язык программирования способен работать над собой, возник в Lisp, который до сих пор является хорошим языком для таких упражнений. Максима реализована в Лиспе. Я рекомендую изучать Lisp, вы можете многое узнать о программировании в целом, даже если вы в конечном итоге будете работать с другими языками.

[1] http://maxima.sourceforge.net/

Другие вопросы по тегам