



RuleBase("IsFreeOf",{expr,var});

Rule("IsFreeOf",2,1,var={}) True;
Rule("IsFreeOf",2,2,IsList(var))
[
  IsFreeOf(expr,var[[1]]) And IsFreeOf(expr,Tail(var));
];

/* Accept any variable. */
Rule("IsFreeOf",2,10,expr = var) False;

/* Otherwise check all leafs of a function. */
Rule("IsFreeOf",2,11,IsFunction(expr))
[
  Local(item,result, flatlist);
  flatlist:=Tail(Listify(expr));
  result:=True;
  ForEach(item,flatlist)
    result:=(result And IsFreeOf(item,var));
  result;
];

/* Else it doesn't depend on any variable. */
Rule("IsFreeOf",2,12,True) True;





Function("IsZeroVector",{aList}) aList = ZeroVector(Length(aList));

Function("WithValue",{expr,var,val})
[
  MacroLocal(var);
  MacroSet(var,val);
  Eval(expr);
];

RuleBase("Limit",{var,lim,func});
Rule("Limit",3,1,
    IsRational(func) And
   IsZero(WithValue(Numer(func),var,lim)) And
   IsZero(WithValue(Denom(func),var,lim))
   )
[
  Limit(var,lim)
      (Apply("D",{var,Numer(func)})/
       Apply("D",{var,Denom(func)}));
];


/* Final rule: no special limit (evaluate func) */
Rule("Limit",3,1000,True) WithValue(func,var,lim);


Function("CharacteristicEquation",{matrix,var})
   Determinant(matrix-var*Identity(Length(matrix)));
HoldArg("CharacteristicEquation",var);


Function("RationalizeNumber",{x})
[
  Check(IsNumber(x),"Not a number");
  Local(n);
  n:=1;
  While(Not(IsInteger(x)))  [ n:=n*10; x:=x*10; ];
  x/n;
];

Function("Rationalize",{a})
  Substitute(a,{{x},IsNumber(x) And Not(IsInteger(x))},"RationalizeNumber");


