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

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

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

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

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++, которые не имеют смысла без обращения к внешнему коду. Блокнот по математике. Я хотел бы иметь возможность быть математиком и программистом на одном языке, в одной среде. Существует ли такая вещь?


comment
Смотрели ли вы на помощники проверки, такие как Cog с извлечение кода или Isabelle с извлечение кода?   -  person Guy Coder    schedule 14.04.2013


Ответы (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, из него можно многое узнать о программировании в целом, даже если в конечном итоге вы будете работать с другими языками.

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

person Robert Dodier    schedule 18.05.2013