```⍝   M a t h e m a t i c a l   d e f i n i t i o n s

← ∆()                       ⍝ derivative wrt ⍵

sin(1∘○) cos(2∘○) tan(3∘○)  ⍝ sin, cos, tan
ln(⍟)    exp(*)             ⍝ natural log, exp

-(-)                      ⍝ neg (unary minus)
→ ∧(*)                      ⍝ pow
← *(×) /(÷)                 ⍝ mul div
← +(+) -(-)                 ⍝ add sub

← =()  ≡()                  ⍝ reduction equivalence
← ,()                       ⍝ argument separator

⍝    R  e  d  u  c  t  i  o  n     R  u  l  e  s

⍝ Pattern matching variables    See →notes.Expression_simplification←

i  j  k :: ← 0 →            ⍝ literal numbers.
¯i ¯j ¯k :: ←                ⍝ negative literal numbers.
x  y  z :: ∊ ⍺              ⍝ non-simple expressions or variables.
a  b  c ::   ⍺              ⍝ var names for differentiation.
p  q  r ::                  ⍝ any values.

i+x  =  x+i             ⍝ move constant to right.
x+0  =  x
x-0  =  x
0-x  = -x
x-x  =  0
-x+y  =  y-x
x+-y  =  x-y
-(x-y)  =  y-x
-x-y  = -(x+y)
--y  =  y
x--y  =  x+y
x+¯j  =  x--¯j           ⍝ reclaim negative literal.
¯i+y  =  y--¯i
x-¯j  =  x+-¯j

(x+i)+j  =  x+(i+j)         ⍝ + associative: collect literals.
(x-i)-j  =  x-(i+j)
(x+i)-j  =  x+(i-j)
(x-i)+j  =  x-(i-j)

(i-x)+j  =  i+j-x
(i-x)-j  =  i-j-x

i-(x+j)  =  i-j-x
i-(x-j)  =  i+j-x

i-(j-x)  =  i-j+x

(x+i)+y  =  x+y+i
(x+i)-y  =  x-y+i
(x-i)+y  =  x+y-i
(x-i)-y  =  x-y-i

(i-x)+y  =  y-x+i
(i-x)-y  =  -x-y+i

x-(y+i)  =  x-y-i
x-(y-i)  =  x-y+i
x-(i-y)  =  x+y-i

x+(y+i)  =  x+y+i
x+(y-i)  =  x+y-i
x+(i-y)  =  x-y+i

⍝ Mul / Div

x*i  =  i*x             ⍝ move constant to left.
0*x  =  0
1*x  =  x
¯1*x  = -x

0/x  =  0
x/x  =  1
x/1  =  x

-x*y  = -(x*y)
x*-y  = -(x*y)

-(i*x) = -i*x
i*-x  = -i*x

i*(j*x)  =  (i*j)*x
i*(j/x)  =  (i*j)/x
i/(j*x)  =  (i/j)/x
i/(j/x)  =  (i/j)*x

i*(x/j)  =  (i/j)*x
i/(x/j)  =  (i*j)/x

(i/x)/j  =  (i/j)/x
(i*x)/j  =  (i/j)*x

(x/i)/j  =  x/(i*j)

x*(i*y)  =  i*(x*y)
x*(i/y)  =  i*(x/y)
x/(i*y)  =  (x/y)/i
x/(i/y)  =  (x*y)/i

x*(y/i)  =  (x*y)/i
x/(y/i)  =  i*(x/y)

(i*x)*y  =  i*(x*y)
(i*x)/y  =  i*(x/y)
(i/x)*y  =  i*(y/x)
(i/x)/y  =  i/(x*y)

(x/i)/y  =  (x/y)/i
(x/i)*y  =  (x*y)/i

⍝ Power

x∧0  =  1
x∧1  =  x
x*x  =  x∧2

x∧p*x  =  x∧(p+1)
x*x∧p  =  x∧(p+1)
x/x∧p  =  x∧(1-p)
x∧p/x  =  x∧(p-1)
(x∧p)∧q  =  x∧(p*q)
x∧p/x∧q  =  x∧(p-q)

(p∧q)*(p∧r)  =  p∧(q+r)
(p∧q)/(p∧r)  =  p∧(q-r)
x*y/y∧i  =  x/y∧(i-1)

p/q∧-r  = p*q∧r
p*q∧-r  = p/q∧r
p/q∧¯i  = p*q∧-¯i      ⍝ reclaim literal -ive.
p*q∧¯i  = p/q∧-¯i

⍝ Factoring / distribution

p+p  =   2*p

(p*q)+q  =  (p+1)*q
p+(q*p)  =  (q+1)*p
(p*q)-q  =  (p-1)*q
p-(q*p)  =  (1-q)*p

(p*q)+(p*r)  =  p*(q+r)
(p*r)+(q*r)  =  (p+q)*r
(p*q)-(p*r)  =  p*(q-r)
(q*r)-(q*r)  =  (p-q)*r
(p/r)+(q/r)  =  (p+q)/r
(p/r)-(q/r)  =  (p-q)/r

⍝ Collect common terms

q+p+p  =  q+2*p
p+(p+q)  =  2*p+q
p+(q+p)  =  2*p+q

p+q-p  =  q
q+p-p  =  q
p+(p-q)  =  2*p-q
p+(q-p)  =  q

p-q+p  =  2*p-q
q-p+p  =  q
p-(p+q)  = -q
p-(q+p)  = -q

p-q-p  = -q
q-p-p  =  q-2*p
p-(p-q)  =  q
p-(q-p)  =  2*p-q

p*q*p  =  q*p∧2           ⍝ mul/div
q*p*p  =  q*p∧2
p*(p*q)  =  q*p∧2
p*(q*p)  =  q*p∧2

p*q/p  =  q
q*p/p  =  q
p*(p/q)  =  q*p∧2
p*(q/p)  =  q

p/q*p  =  p∧2/q
q/p*p  =  q
p/(p*q)  =  1/q
p/(q*p)  =  1/q

p/q/p  =  1/q
q/p/p  =  q/p∧2
p/(p/q)  =  q
p/(q/p)  =  p∧2/q

⍝ Cosmetics: remove redundant ()s

p+(q+r)  =  p+q+r       ⍝ + associative
x*(q*r)  =  x*q*r       ⍝ * associative

⍝ Trig

cos(q)*sin(p) = sin(p)*cos(q)   ⍝ allows sin*cos - cos*sin => 0
sin(x)/cos(x) = tan(x)

⍝   D  i  f  f  e  r  e  n  t  i  a  t  i  o  n    See →notes.Differentiation←

⍝ Base Cases

(i)∆a  =  0
(a)∆a  =  1

⍝ Arithmetic

(p+q)∆a  =  p∆a + q∆a
(p-q)∆a  =  p∆a - q∆a
(-p)∆a  = -p∆a

(p*q)∆a  =  p∆a * q  +  p * q∆a
(p/q)∆a  =  p∆a / q  -  p * q∆a / q∧2

(p∧q)∆a  =  p∆a * q * p∧(q-1)  +  q∆a * (ln p) * p∧q

⍝ Log / Exp

(ln  p)∆a  =  p∆a / p
(exp p)∆a  =  p∆a * (exp p)

⍝ Trig

(sin p)∆a  =  p∆a * (cos p)
(cos p)∆a  = -p∆a * (sin p)
(tan p)∆a =   p∆a * 1/(cos p)∧2

⍝ Test cases:
⍝
⍝   1+x+2                               -> x+3              ⍝ collect constants
⍝   -----x                              -> -x
⍝   1+x+y+z+x+y+z+2                     -> x+y+z+x+y+z+3    ⍝ (not optimal,
⍝   2*x*y*z*x*y*z*3                     -> 6*(x*y*z*x*y*z)  ⍝  see notes.Bugs)
⍝   x∧x+y*x∧x                           -> (y+1)*x∧x
⍝   x+x+x+x*x*x                         -> 3*x+x∧3
⍝   2*x + x*3                           -> 5*x
⍝   x∧2 * x∧3                           -> x∧5
⍝   (x∧y)∧z                             -> x∧(y*z)
⍝   (x+3-x)+(x*4/x)                     -> 7
⍝   x+y+z, x=y+y, y=z+z, z=3            -> 21
⍝   (2∧x+x∧2)∆x                         -> 0.69315*2∧x+2*x
⍝   (ln(x∧x))∆x, x=2                    -> 1+⍟2
⍝   (4*x∧3 + 3*x∧2 + 2*x∧1 + 1*x∧0)∆x   -> 12*x∧2+6*x+2
⍝    sin(x)∧2 + cos(x)∧2,   x=42        ->  1
⍝   (sin(x)∧2 + cos(x)∧2)∆x             ->  0           ⍝ 1st differential
⍝   (ln x)∆x∆x                          -> -1/x∧2       ⍝ 2nd       ..
⍝   (ln x)∆x∆x∆x                        -> 2/x∧3        ⍝ 3rd       ..
⍝   (ln x)∆x∆x∆x∆x∆x, x=1               -> 24           ⍝ 5th       ..
⍝   (ln x)∆x∆x∆x∆x∆x∆x                  -> -120/x∧6     ⍝ 6th       ..
⍝   ln exp ln exp 99                    -> 99
⍝   (x/exp(x))∆x                        -> (1-x)/exp(x)
⍝   x+-3                                -> x-3
⍝   x/y∧-2                              -> x*y∧2
⍝   2∆3                                 -> 2∆3
⍝   a+(b+(c+d))                         -> a+b+c+d      ⍝ + associative
⍝   a*(b*(c*d))                         -> a*b*c*d      ⍝ * associative
⍝
⍝   Back to: Contents
```