let rec string_of_funct_novar = function
| Id(x) -> ""
| Lambda(l) -> sprint "%g" l
| Sin(Id(_)) -> "sin"
| Cos(Id(_)) -> "cos"
| Exp(Id(_)) -> "exp"
| Ln(Id(_)) -> "ln"
| Sin(f) -> sprint "sin(%s)" (string_of_funct_novar f)
| Cos(f) -> sprint "cos(%s)" (string_of_funct_novar f)
| Exp(f) -> sprint "exp(%s)" (string_of_funct_novar f)
| Ln(f) -> sprint "ln(%s)" (string_of_funct_novar f)
| Prod(Lambda(0.), g) -> "0"
| Prod(Lambda(1.), g) -> (string_of_funct_novar g)
| Prod(Lambda(-1.), g) -> sprint "-(%s)" (string_of_funct_novar g)
| Prod(Lambda(l), g) -> sprint "%g(%s)" l (string_of_funct_novar g)
| Prod(f,g) -> sprint "(%s).(%s)" (string_of_funct_novar f) (string_of_funct_novar g)
| Inv(f) -> sprint "(1/(%s))" (string_of_funct_novar f)
| Sum(f,g) -> sprint "(%s) + (%s)" (string_of_funct_novar f) (string_of_funct_novar g)
| Power(f,0) -> "1"
| Power(f,1) -> (string_of_funct_novar f)
| Power(f,-1) -> sprint "(1/(%s))" (string_of_funct_novar f)
| Power(f,n) when n<0 -> sprint "(%s)^(%i)" (string_of_funct_novar f) n
| Power(f,n) -> sprint "(%s)^%i" (string_of_funct_novar f) n
| Comp(f,g) -> sprint "%s(%s)" (string_of_funct_novar f) (string_of_funct_novar g)
| Unknown(s) -> s