В середине 80-х лучшим языком для символьного дифференцирования
считался Рефал.
Diff {
(e.t) e.1 '+' e.2 = <Diff (e.t) e.1> '+' <Diff (e.t) e.2>;
(e.t) e.1 '-' e.2 = <Diff (e.t) e.1> '-' <Diff (e.t) e.2>;
(e.t) e.1 '*' e.2 = (e1 '*' <Diff (e.t) e.2>
'+' <Diff (e.t) e.1> '*' e.2);
(e.t) (e.1) = ( <Diff (e.t) e.1> );
(e.t) e.t = '1';
(e.t) e.1 = '0';
}
Нынче
Хаскель поинтереснее будет:
Dif a = D a (Dif a)
dConst :: Num a => a -> Dif a
dConst x0 = D x0 dZero
dZero :: Num a => Dif a
dZero = D 0 dZero
instance Num a => Num (Dif a) where
fromInteger = dConst . fromInteger
D x0 x’ + D y0 y’ = D (x0 + y0) (x’ + y’)
D x0 x’ - D y0 y’ = D (x0 - y0) (x’ - y’)
x@(D x0 x’) * y@(D y0 y’) = D (x0 * y0) (x’ * y + x * y’)