1

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

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

Использование символической алгебры, то компилятор определяет, что х = у/2. Еще лучше, если он будет жаловаться, что Int не является достаточным для сохранения результата у/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

Вы смотрели на [взрывозащищенные ассистенты] (http://en.wikipedia.org/wiki/Proof_assistant), такие как [Cog] (http://en.wikipedia.org/ wiki/Coq) с [извлечением кода] (http://coq.inria.fr/refman/Reference-Manual027.html) или [Изабель] (http://en.wikipedia.org/wiki/Isabelle_ (theor_prover)) с [извлечением кода] (http://wwwbroy.in.tum.de/~berghofe/papers/TYPES2002_slides.pdf)? –

ответ

0

Ну, 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 

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

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