sig
  type term = Libzipperposition.FOTerm.t
  type op = Equal | Different | Less | Lesseq
  type 'm divides = { num : Z.t; power : int; monome : 'm; sign : bool; }
  type t = private
      Binary of ArithLit.op * Z.t Monome.t * Z.t Monome.t
    | Divides of Z.t Monome.t ArithLit.divides
  type lit = ArithLit.t
  val equal_com : ArithLit.t -> ArithLit.t -> bool
  val compare : ArithLit.t -> ArithLit.t -> int
  val equal : ArithLit.t -> ArithLit.t -> bool
  val hash_fun : t -> CCHash.state -> CCHash.state
  val hash : t -> int
  val make : ArithLit.op -> Z.t Monome.t -> Z.t Monome.t -> ArithLit.t
  val mk_eq : Z.t Monome.t -> Z.t Monome.t -> ArithLit.t
  val mk_neq : Z.t Monome.t -> Z.t Monome.t -> ArithLit.t
  val mk_less : Z.t Monome.t -> Z.t Monome.t -> ArithLit.t
  val mk_lesseq : Z.t Monome.t -> Z.t Monome.t -> ArithLit.t
  val mk_divides :
    ?sign:bool -> Z.t -> power:int -> Z.t Monome.t -> ArithLit.t
  val mk_not_divides : Z.t -> power:int -> Z.t Monome.t -> ArithLit.t
  val negate : ArithLit.t -> ArithLit.t
  val sign : ArithLit.t -> bool
  val polarity : ArithLit.t -> bool
  val is_pos : ArithLit.t -> bool
  val is_neg : ArithLit.t -> bool
  val is_eq : ArithLit.t -> bool
  val is_neq : ArithLit.t -> bool
  val is_eqn : ArithLit.t -> bool
  val is_ineq : ArithLit.t -> bool
  val is_less : ArithLit.t -> bool
  val is_lesseq : ArithLit.t -> bool
  val is_divides : ArithLit.t -> bool
  val pp : ArithLit.t CCFormat.printer
  val pp_tstp : ArithLit.t CCFormat.printer
  val to_string : ArithLit.t -> string
  val fold : ('-> ArithLit.term -> 'a) -> '-> ArithLit.t -> 'a
  val map : (ArithLit.term -> ArithLit.term) -> ArithLit.t -> ArithLit.t
  type 'a unif =
      subst:Libzipperposition.Substs.t ->
      'Libzipperposition.Scoped.t ->
      'Libzipperposition.Scoped.t -> Libzipperposition.Substs.t Sequence.t
  val generic_unif : Z.t Monome.t ArithLit.unif -> ArithLit.t ArithLit.unif
  val apply_subst :
    renaming:Libzipperposition.Substs.Renaming.t ->
    Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t -> ArithLit.t
  val apply_subst_no_renaming :
    Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t -> ArithLit.t
  val apply_subst_no_simp :
    renaming:Libzipperposition.Substs.Renaming.t ->
    Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t -> ArithLit.t
  val matching :
    ?subst:Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val variant :
    ?subst:Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val unify :
    ?subst:Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val subsumes :
    ?subst:Libzipperposition.Substs.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    ArithLit.t Libzipperposition.Scoped.t ->
    Libzipperposition.Substs.t Sequence.t
  val are_variant : ArithLit.t -> ArithLit.t -> bool
  val is_trivial : ArithLit.t -> bool
  val is_absurd : ArithLit.t -> bool
  val fold_terms :
    ?pos:Libzipperposition.Position.t ->
    ?vars:bool ->
    ?ty_args:bool ->
    which:[< `All | `Max ] ->
    ord:Libzipperposition.Ordering.t ->
    subterms:bool ->
    ArithLit.t -> (ArithLit.term * Libzipperposition.Position.t) Sequence.t
  val max_terms :
    ord:Libzipperposition.Ordering.t -> ArithLit.t -> ArithLit.term list
  val to_form :
    ArithLit.t -> Libzipperposition.FOTerm.t Libzipperposition.SLiteral.t
  module Seq :
    sig
      val terms : ArithLit.t -> ArithLit.term Sequence.t
      val vars : ArithLit.t -> Libzipperposition.FOTerm.var Sequence.t
      val to_multiset : ArithLit.t -> (ArithLit.term * Z.t) Sequence.t
    end
  module Focus :
    sig
      type t =
          Left of ArithLit.op * Z.t Monome.Focus.t * Z.t Monome.t
        | Right of ArithLit.op * Z.t Monome.t * Z.t Monome.Focus.t
        | Div of Z.t Monome.Focus.t ArithLit.divides
      val mk_left :
        ArithLit.op -> Z.t Monome.Focus.t -> Z.t Monome.t -> ArithLit.Focus.t
      val mk_right :
        ArithLit.op -> Z.t Monome.t -> Z.t Monome.Focus.t -> ArithLit.Focus.t
      val mk_div :
        ?sign:bool ->
        Z.t -> power:int -> Z.t Monome.Focus.t -> ArithLit.Focus.t
      val get :
        ArithLit.lit ->
        Libzipperposition.Position.t -> ArithLit.Focus.t option
      val get_exn :
        ArithLit.lit -> Libzipperposition.Position.t -> ArithLit.Focus.t
      val focus_term :
        ArithLit.lit -> ArithLit.term -> ArithLit.Focus.t option
      val focus_term_exn : ArithLit.lit -> ArithLit.term -> ArithLit.Focus.t
      val replace : ArithLit.Focus.t -> Z.t Monome.t -> ArithLit.lit
      val term : ArithLit.Focus.t -> ArithLit.term
      val focused_monome : ArithLit.Focus.t -> Z.t Monome.Focus.t
      val opposite_monome : ArithLit.Focus.t -> Z.t Monome.t option
      val opposite_monome_exn : ArithLit.Focus.t -> Z.t Monome.t
      val is_max :
        ord:Libzipperposition.Ordering.t -> ArithLit.Focus.t -> bool
      val is_strictly_max :
        ord:Libzipperposition.Ordering.t -> ArithLit.Focus.t -> bool
      val map_lit :
        f_m:(Z.t Monome.t -> Z.t Monome.t) ->
        f_mf:(Z.t Monome.Focus.t -> Z.t Monome.Focus.t) ->
        ArithLit.Focus.t -> ArithLit.Focus.t
      val product : ArithLit.Focus.t -> Z.t -> ArithLit.Focus.t
      val scale :
        ArithLit.Focus.t ->
        ArithLit.Focus.t -> ArithLit.Focus.t * ArithLit.Focus.t
      val scale_power : ArithLit.Focus.t -> int -> ArithLit.Focus.t
      val apply_subst :
        renaming:Libzipperposition.Substs.Renaming.t ->
        Libzipperposition.Substs.t ->
        ArithLit.Focus.t Libzipperposition.Scoped.t -> ArithLit.Focus.t
      val apply_subst_no_renaming :
        Libzipperposition.Substs.t ->
        ArithLit.Focus.t Libzipperposition.Scoped.t -> ArithLit.Focus.t
      val unify :
        ?subst:Libzipperposition.Substs.t ->
        ArithLit.Focus.t Libzipperposition.Scoped.t ->
        ArithLit.Focus.t Libzipperposition.Scoped.t ->
        (ArithLit.Focus.t * ArithLit.Focus.t * Libzipperposition.Substs.t)
        Sequence.t
      val fold_terms :
        ?pos:Libzipperposition.Position.t ->
        ArithLit.lit ->
        (ArithLit.Focus.t * Libzipperposition.Position.t) Sequence.t
      val op : ArithLit.Focus.t -> [ `Binary of ArithLit.op | `Divides ]
      val unfocus : ArithLit.Focus.t -> ArithLit.lit
      val pp : ArithLit.Focus.t CCFormat.printer
      val to_string : ArithLit.Focus.t -> string
    end
  module Util :
    sig
      type divisor = { prime : Z.t; power : int; }
      val is_prime : Z.t -> bool
      val prime_decomposition : Z.t -> ArithLit.Util.divisor list
      val primes_leq : Z.t -> Z.t Sequence.t
    end
end