sig
  type environment
  type tconstraint = Constraint.tconstraint
  type solving_step =
      Init of Solver.tconstraint
    | Solve of Solver.tconstraint
    | Solved of Solver.tconstraint
    | UnifyTerms of Constraint.crterm * Constraint.crterm
    | UnifyVars of Constraint.variable * Constraint.variable
    | Generalize of int * Constraint.variable list
  val solve :
    ?tracer:(Solver.solving_step -> unit) ->
    Solver.tconstraint -> Solver.environment
  val environment_as_list :
    Solver.environment -> (string * Constraint.variable) list
  module type SolverException =
    sig
      exception TypingError of Positions.position
      exception UnboundIdentifier of Positions.position * string
      exception CannotGeneralize of Positions.position * Constraint.variable
      exception NonDistinctVariables of Positions.position *
                  Constraint.variable list
    end
  exception TypingError of Positions.position
  exception UnboundIdentifier of Positions.position * string
  exception CannotGeneralize of Positions.position * Constraint.variable
  exception NonDistinctVariables of Positions.position *
              Constraint.variable list
end