sig
  type term = Libzipperposition.FOTerm.t
  type 'a t
  type 'a monome = 'Monome.t
  val eq : 'Monome.t -> 'Monome.t -> bool
  val compare : 'Monome.t -> 'Monome.t -> int
  val hash : 'Monome.t -> int
  val hash_fun : 'Monome.t CCHash.hash_fun
  val ty : 'Monome.t -> Libzipperposition.Type.t
  val const : 'Monome.t -> 'a
  val coeffs : 'Monome.t -> ('a * Monome.term) list
  val find : 'Monome.t -> Monome.term -> 'a option
  val find_exn : 'Monome.t -> Monome.term -> 'a
  val mem : 'Monome.t -> Monome.term -> bool
  val add : 'Monome.t -> '-> Monome.term -> 'Monome.t
  val add_const : 'Monome.t -> '-> 'Monome.t
  val remove : 'Monome.t -> Monome.term -> 'Monome.t
  val remove_const : 'Monome.t -> 'Monome.t
  val add_list : 'Monome.t -> ('a * Monome.term) list -> 'Monome.t
  val map : (Monome.term -> Monome.term) -> 'Monome.t -> 'Monome.t
  val map_num : ('-> 'a) -> 'Monome.t -> 'Monome.t
  module Seq :
    sig
      val terms : 'Monome.t -> Monome.term Sequence.t
      val vars : 'Monome.t -> Libzipperposition.FOTerm.var Sequence.t
      val coeffs : 'Monome.t -> ('a * Monome.term) Sequence.t
      val coeffs_swap : 'Monome.t -> (Monome.term * 'a) Sequence.t
    end
  val is_const : 'Monome.t -> bool
  val is_zero : 'Monome.t -> bool
  val sign : 'Monome.t -> int
  val size : 'Monome.t -> int
  val terms : 'Monome.t -> Monome.term list
  val var_occurs : var:Libzipperposition.FOTerm.var -> 'Monome.t -> bool
  val sum : 'Monome.t -> 'Monome.t -> 'Monome.t
  val difference : 'Monome.t -> 'Monome.t -> 'Monome.t
  val uminus : 'Monome.t -> 'Monome.t
  val product : 'Monome.t -> '-> 'Monome.t
  val succ : 'Monome.t -> 'Monome.t
  val pred : 'Monome.t -> 'Monome.t
  val sum_list : 'Monome.t list -> 'Monome.t
  val comparison :
    'Monome.t -> 'Monome.t -> Libzipperposition.Comparison.t
  val dominates : strict:bool -> 'Monome.t -> 'Monome.t -> bool
  val split : 'Monome.t -> 'Monome.t * 'Monome.t
  val apply_subst :
    renaming:Libzipperposition.Substs.Renaming.t ->
    Libzipperposition.Substs.t ->
    'Monome.t Libzipperposition.Scoped.t -> 'Monome.t
  val apply_subst_no_renaming :
    Libzipperposition.Substs.t ->
    'Monome.t Libzipperposition.Scoped.t -> 'Monome.t
  val variant :
    ?subst:Libzipperposition.Substs.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val matching :
    ?subst:Libzipperposition.Substs.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val unify :
    ?subst:Libzipperposition.Substs.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    'Monome.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val is_ground : 'Monome.t -> bool
  val fold :
    ('-> int -> '-> Monome.term -> 'a) -> '-> 'Monome.t -> 'a
  val fold_max :
    ord:Libzipperposition.Ordering.t ->
    ('-> int -> '-> Monome.term -> 'a) -> '-> 'Monome.t -> 'a
  val nth : 'Monome.t -> int -> 'a * Monome.term
  val set : 'Monome.t -> int -> 'a * Monome.term -> 'Monome.t
  val set_term : 'Monome.t -> int -> Monome.term -> 'Monome.t
  module Focus :
    sig
      type 'a t = {
        term : Monome.term;
        coeff : 'a;
        rest : 'Monome.monome;
      }
      val get : 'Monome.monome -> int -> 'Monome.Focus.t
      val focus_term :
        'Monome.monome -> Monome.term -> 'Monome.Focus.t option
      val focus_term_exn :
        'Monome.monome -> Monome.term -> 'Monome.Focus.t
      val to_monome : 'Monome.Focus.t -> 'Monome.monome
      val coeff : 'Monome.Focus.t -> 'a
      val term : 'Monome.Focus.t -> Monome.term
      val rest : 'Monome.Focus.t -> 'Monome.monome
      val sum : 'Monome.Focus.t -> 'Monome.monome -> 'Monome.Focus.t
      val difference :
        'Monome.Focus.t -> 'Monome.monome -> 'Monome.Focus.t
      val uminus : 'Monome.Focus.t -> 'Monome.Focus.t
      val product : 'Monome.Focus.t -> '-> 'Monome.Focus.t
      val map :
        ?term:(Monome.term -> Monome.term) ->
        ?coeff:('-> 'a) ->
        ?rest:('Monome.monome -> 'Monome.monome) ->
        'Monome.Focus.t -> 'Monome.Focus.t
      val scale :
        Z.t Monome.Focus.t ->
        Z.t Monome.Focus.t -> Z.t Monome.Focus.t * Z.t Monome.Focus.t
      val is_max :
        ord:Libzipperposition.Ordering.t -> 'Monome.Focus.t -> bool
      val fold_m :
        pos:Libzipperposition.Position.t ->
        'Monome.monome ->
        '->
        ('-> 'Monome.Focus.t -> Libzipperposition.Position.t -> 'b) -> 'b
      val apply_subst :
        renaming:Libzipperposition.Substs.Renaming.t ->
        Libzipperposition.Substs.t ->
        'Monome.Focus.t Libzipperposition.Scoped.t -> 'Monome.Focus.t
      val apply_subst_no_renaming :
        Libzipperposition.Substs.t ->
        'Monome.Focus.t Libzipperposition.Scoped.t -> 'Monome.Focus.t
      val unify_ff :
        ?subst:Libzipperposition.Substs.t ->
        'Monome.Focus.t Libzipperposition.Scoped.t ->
        'Monome.Focus.t Libzipperposition.Scoped.t ->
        ('Monome.Focus.t * 'Monome.Focus.t * Libzipperposition.Substs.t)
        Sequence.t
      val unify_mm :
        ?subst:Libzipperposition.Substs.t ->
        'Monome.monome Libzipperposition.Scoped.t ->
        'Monome.monome Libzipperposition.Scoped.t ->
        ('Monome.Focus.t * 'Monome.Focus.t * Libzipperposition.Substs.t)
        Sequence.t
      val unify_self :
        ?subst:Libzipperposition.Substs.t ->
        'Monome.Focus.t Libzipperposition.Scoped.t ->
        ('Monome.Focus.t * Libzipperposition.Substs.t) Sequence.t
      val unify_self_monome :
        ?subst:Libzipperposition.Substs.t ->
        'Monome.monome Libzipperposition.Scoped.t ->
        ('Monome.Focus.t * Libzipperposition.Substs.t) Sequence.t
      val pp : 'Monome.Focus.t CCFormat.printer
    end
  val pp : 'Monome.t CCFormat.printer
  val to_string : 'Monome.t -> string
  val pp_tstp : 'Monome.t CCFormat.printer
  exception NotLinear
  module Int :
    sig
      type t = Z.t Monome.monome
      val const : Z.t -> Monome.Int.t
      val singleton : Z.t -> Monome.term -> Monome.Int.t
      val of_list : Z.t -> (Z.t * Monome.term) list -> Monome.Int.t
      val of_term : Monome.term -> Monome.Int.t option
      val of_term_exn : Monome.term -> Monome.Int.t
      val to_term : Monome.Int.t -> Monome.term
      val normalize : Monome.Int.t -> Monome.Int.t
      val has_instances : Monome.Int.t -> bool
      val quotient : Monome.Int.t -> Z.t -> Monome.Int.t option
      val divisible : Monome.Int.t -> Z.t -> bool
      val factorize : Monome.Int.t -> (Monome.Int.t * Z.t) option
      val normalize_wrt_zero : Monome.Int.t -> Monome.Int.t
      val reduce_same_factor :
        Monome.Int.t ->
        Monome.Int.t -> Monome.term -> Monome.Int.t * Monome.Int.t
      val compare :
        (Monome.term -> Monome.term -> Libzipperposition.Comparison.t) ->
        Monome.Int.t -> Monome.Int.t -> Libzipperposition.Comparison.t
      val to_multiset : Monome.Int.t -> Multisets.MT.t
      module Modulo :
        sig
          val modulo : n:Z.t -> Z.t -> Z.t
          val sum : n:Z.t -> Z.t -> Z.t -> Z.t
          val uminus : n:Z.t -> Z.t -> Z.t
        end
      module Solve :
        sig
          type solution = (Monome.term * Monome.Int.t) list
          val split_solution :
            Monome.Int.Solve.solution ->
            Libzipperposition.Substs.t * Monome.Int.Solve.solution
          val diophant2 : Z.t -> Z.t -> Z.t -> Z.t * Z.t * Z.t
          val diophant_l : Z.t list -> Z.t -> Z.t list * Z.t
          val coeffs_n :
            Z.t list -> Z.t -> Monome.term list -> Monome.Int.t list
          val eq_zero :
            ?fresh_var:(Libzipperposition.Type.t -> Monome.term) ->
            Monome.Int.t -> Monome.Int.Solve.solution list
          val lower_zero :
            ?fresh_var:(Libzipperposition.Type.t -> Monome.term) ->
            strict:bool -> Monome.Int.t -> Monome.Int.Solve.solution list
          val lt_zero :
            ?fresh_var:(Libzipperposition.Type.t -> Monome.term) ->
            Monome.Int.t -> Monome.Int.Solve.solution list
          val leq_zero :
            ?fresh_var:(Libzipperposition.Type.t -> Monome.term) ->
            Monome.Int.t -> Monome.Int.Solve.solution list
          val neq_zero :
            ?fresh_var:(Libzipperposition.Type.t -> Monome.term) ->
            Monome.Int.t -> Monome.Int.Solve.solution list
        end
    end
end