# Module `Simplify`

Term simplifier

Simplify a term by evaluating operations with constants.

Integer and real terms are converted to polynomials, terms in that cannot be reduced to addition or linear multiplication become new variables in the polynomials.

Boolean terms are converted to negation normal form, such that only the operators conjunction, disjunction and negation occur.

Relations between polynomials such as `c + a*x > d + b*y` are converted to `c - d + a*x - b*y > 0` where `c-d > 0` or `c-d = 0` and `a>0` if term `x` is ordered before term `y`m otherwise `b>0`.

Let bindings are unfolded. In order to evaluate a term with a partial model for its variables, bind each variable in the model to its value or use the convenience function `simplify_term_model`. To make a model total, give a function in the optional argument `~default_of_var` that returns the value to assign to the variable given as parameter.

author
Christoph Sticksel, Adrien Champion, Alain Mebsout, Arjun Viswanathan
`val has_division_by_zero_happened : unit -> bool`

Returns true iff a division by zero happened in a simplification since this function was last called.

`val simplify_term : (UfSymbol.t * (Var.t list * Term.t)) list -> Term.t -> Term.t`

Simplify a term

`val simplify_term_model : ?⁠default_of_var:(Var.t -> Term.t) -> (UfSymbol.t * (Var.t list * Term.t)) list -> Model.t -> Term.t -> Term.t`

Simplify a term given an assignment to variables

The optional parameter `default_of_var` may be a function that assigns a default value per variable, for example, to smooth a partially defined model. The defaults for variables must not be circular, otherwise the simplification will cycle.