The difference between Infix.printStrict and Infix.print


What is the difference between Infix.printStrict and Infix.print?


/// Strict formatting, prints an exact representation of the expression tree



/// Nicer human readable but slightly denormalized output

I learned that the difference will be in the following example:

open MathNet.Symbolics

let some = "tan(z)/sin(y)"
let expr = some |> Infix.parseOrUndefined

|> Infix.printStrict
|> printfn “Infix.printStrict: %s”

|> Infix.print
|> printfn “Infix.print: %s”


Infix.printStrict: sin(y)^(-1)*tan(z)
Infix.print: tan(z)/sin(y)

But I would like to know what else operations lead to the difference in the output string.

(Christoph Rüegg) #2

The reason for this distinction is that expressions are always represented in a simplified/normalized form which does not know about subtraction and division (since they are redundant).

For example, a - b is actually represented as sum(a, (-1)*b).

Since this is very relevant when writing algebraic algorithms on top of symbolics, printStrict allows to print the expression very closely to the actual data structure so you can understand what is really happening.

However, using subtraction and division is much more readable for humans, so print tries to revert this simplification, by transforming negative coefficients and powers back to negations, subtractions and divisions (and also prints some symbols like pi and infinity with proper Unicode characters).


Thanks for the detailed answer