# derivatives.frink

``` // This file contains transformation rules suitable for finding // derivatives of expressions. transformations derivatives {    // This is a simple program that lets you define transformation rules    // and mathematical simplification rules and test them easily.    // Derivative of both sides of an equation.    D[_a === _b, _x]  <->  D[_a, _x] === D[_b, _x]    // Derivative as inverse of integration.    D[Integrate[_f, _x], _x]  <-> _f    // Multiple derivatives    // Bail-out condition for first derivative    D[_n, _x, 1] <-> D[_n, _x]    // Bail-out condition for zeroth derivative    D[_n, _x, 0] <-> _n    // Otherwise take one derivative and decrement.    D[_n, _x, _times is isInteger] <-> D[D[_n,_x], _x, _times-1]        // Degenerate cases    D[_c, _x] :: freeOf[_c, _x]  <->   0    D[_x, _x]                    <->   1    // The following are shortcuts and aren't strictly needed, but they're    // closer to what a human would do and make the transformation path simpler.    // The constraints are necessary to prevent naive evaluation of, say, x^x.    D[(_c:1) _x^(_y:1), _x] :: freeOf[_c, _x] && freeOf[_y, _x]  <-> (_c _y) _x^(_y-1)    //D[_a^_x, _x]       <-> _a^_x ln[_a]    D[sin[_x], _x]    <-> cos[_x]    D[cos[_x], _x]    <-> -sin[_x]    D[tan[_x], _x]    <-> 1/cos[_x]^2    D[arcsin[_x], _x] <->  1/sqrt[1 - _x^2]    D[arccos[_x], _x] <-> -1/sqrt[1 - _x^2]    D[arctan[_x], _x] <-> 1/(1 + _x^2)    D[arccsc[_x], _x] <-> -1/(magnitude[_x] / sqrt[_x^2 - 1])    D[arcsec[_x], _x] <->  1/(magnitude[_x] / sqrt[_x^2 - 1])    D[arccot[_x], _x] <-> -1/(1 + _x^2)    D[sinh[_x], _x]    <-> cosh[_x]    D[cosh[_x], _x]    <-> sinh[_x]    D[tanh[_x], _x]    <-> 1/cosh[_x]^2    D[arcsinh[_x], _x] <->  1/sqrt[_x^2 + 1]    D[arccosh[_x], _x] <-> -1/sqrt[_x^2 - 1]    D[arctanh[_x], _x] <-> 1/(1 - _x^2)    D[ln[_x], _x]     <-> 1/_x    D[e^_x, _x]       <-> e^_x    // Chained derivative rules    D[_a + _b, _x]    <-> D[_a,_x] + D[_b,_x]    // These rules can loop if _u or _v equals _x.    // Prevent that?  Need excluding match?    D[_u _v, _x]      <-> _u D[_v, _x] + _v D[_u, _x]    D[_u^_v, _x]      <-> _v _u^(_v-1) D[_u, _x] + _u^_v ln[_u] D[_v,_x]    // This matches a function that depends on x.  The excluding structureEquals    // test keeps it from looping forever when _u equals _x    D[_f[_u], _x] :: expressionContains[_u, _x] && ! structureEquals[_u, _x] <-> D[_u, _x] D[_f[_u], _u]    // This matches a function that does not depend on x    D[_f[_u], _x] :: freeOf[_u, _x] <-> 0 } ```