


RuleBase("D",{aVar,aFunc});

Rule("D",2,1,IsList(aVar) And Not(IsList(aFunc)))
	Map("D",{aVar,FillList(aFunc, Length(aVar))});

Rule("D",2,2,IsList(aFunc) And Not(IsList(aVar)))
	Map("D",{FillList(aVar,Length(aFunc)),aFunc});

Rule("D",2,3,True)
[
  MacroLocal(aVar);
  Apply("Deriv",{aVar,aFunc});
];
HoldArg("D",aVar);
HoldArg("D",aFunc);

0 # (Deriv(_var) (_var)) <-- 1;
1 # (Deriv(_var)func_IsAtom) <-- 0;
2 # (Deriv(_var)_x + _y) <--  Deriv(var)x + Deriv(var)y;
2 # (Deriv(_var)- (_x) ) <-- -Deriv(var)x;
2 # (Deriv(_var)_x - _y) <--  (Deriv(var)x) - (Deriv(var)y);
2 # (Deriv(_var)_x * _y) <-- (x*Deriv(var)y) + (Deriv(var)x)*y;
2 # (Deriv(_var)Sin(_x)) <--  (Deriv(var)x)*Cos(x);
2 # (Deriv(_var)Cos(_x)) <-- -(Deriv(var)x)*Sin(x);
2 # (Deriv(_var)Exp(_x)) <--  (Deriv(var)x)*Exp(x);
2 # (Deriv(_var)(_x / _y)) <--
    (y* (Deriv(var) x) - x* (Deriv(var) y))/ (y^2);
2 # (Deriv(_var)Tan(_x)) <-- ((Deriv(var) x) / (Cos(x)^2));
2 # (Deriv(_var)Ln(_x)) <-- ((Deriv(var) x) / x);
2 # (Deriv(_var)(_x ^ n_IsRationalOrNumber)) <--
    n * (Deriv(var) x) * (x ^ (n - 1));
3 # (Deriv(_var)(_x ^ _n)) <-- Deriv(var) Exp(n * Ln(x));
2 # (Deriv(_var)ArcSin(_x)) <-- ((1 -(x ^ 2))^ -(1/2)) * (Deriv(var) x );
2 # (Deriv(_var)ArcCos(_x)) <-- -1*((1 -(x ^ 2))^ -(1/2)) * (Deriv(var)x );
2 # (Deriv(_var)ArcTan(_x)) <-- (1/ (1 + x ^ 2))*(Deriv(var) x);
2 # (Deriv(_var)Sqrt(_x)) <-- ((Deriv(var)x)/(2*Sqrt(x)));
2 # (Deriv(_var)Complex(_r,_i)) <-- Complex(Deriv(var)r,Deriv(var)i);


2 # (Deriv(_var)UniVariate(_var,_first,_coefs)) <--
[
  Local(result,m,i);
  result:=FlatCopy(coefs);
  m:=Length(result);
  For(i:=1,i<=m,i++)
  [
    result[[i]] := result[[i]] * (first+i-1);
  ];
  UniVariate(var,first-1,result);
];


RuleBase("Diverge", {aFunc, aBasis});

Rule("Diverge", 2, 1, IsList(aBasis) And IsList(aFunc) And Length(aBasis) = Length(aFunc))
	Map("D", {aBasis,aFunc});

RuleBase("Curl", {aFunc, aBasis});

Rule("Curl", 2, 1, Length(aBasis)=Length(aFunc))
	{
		Apply("D",{aBasis[[2]],aFunc[[3]]})-Apply("D",{aBasis[[3]],aFunc[[2]]}),
		Apply("D",{aBasis[[3]],aFunc[[1]]})-Apply("D",{aBasis[[1]],aFunc[[3]]}),
		Apply("D",{aBasis[[1]],aFunc[[2]]})-Apply("D",{aBasis[[2]],aFunc[[1]]})
	};


