let rec canonic = function
    | Sin(Lambda(0.)) -> Lambda(0.)
    | Cos(Lambda(0.)) -> Lambda(1.)
    | Ln(Lambda(x)) when x<=0. -> raise Not_defined
    | Ln(Lambda(1.)) -> Lambda(0.)
    | Prod(Lambda(0.), g) -> Lambda(0.)
    | Prod(Lambda(1.), g) -> (canonic g)
    | Prod(Lambda(-1.), Prod(Lambda(-1.), g)) -> g
    | Prod(g, Lambda(x)) -> canonic (Prod(Lambda(x), (canonic g)))
    | Prod(Lambda(l), g) -> Prod(Lambda(l), (canonic g))
    | Prod(f,g) -> Prod((canonic f), (canonic g))
    | Inv(Inv(f)) -> f
    | Inv(Lambda(0.)) -> raise Not_defined
    | Inv(Lambda(x)) -> Lambda(1. /. x)
    | Inv(f) -> Inv((canonic f))
    | Power(f,0) -> Lambda(1.)
    | Power(f,1) -> canonic f
    | Power(f,-1) -> canonic (Inv(f))
    | Power(f,n) when n<0 -> canonic (Inv(Power(f, -n)))
    | Power(f,n) -> Power((canonic f), n)
    | Sum(f, Prod(Lambda(-1.), g) ) when f=g -> Lambda(0.)
    | Sum(f,g) -> Sum((canonic f), (canonic g))
    | Comp(Exp(Id(_)),Ln(f)) -> f
    | Comp(Ln(f),Exp(Id(_))) -> f
    | Comp(f,g) -> Comp((canonic f), (canonic g))
    | u -> u
GA|Analytics