Има ли език, който използва система за компютърна алгебра за допълнителни функции и оптимизации?

Например, представете си функция като тази:

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's float с четворна точност, набори, дефинирани от предикат, интегриране върху функции на части. Вероятно може да се направи много повече.

Такова нещо е възможно, нали? Знам, че можете да изпълнявате неща като тези, като използвате функциите на езика за програмиране на 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, който все още е добър език за такива упражнения. Maxima е реализиран в Lisp. Препоръчвам да научите Lisp, можете да научите много за програмирането като цяло от него, дори ако в крайна сметка работите с други езици.

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

person Robert Dodier    schedule 18.05.2013