sig
  type t = private
      [< `Bot
       | `It of
           [ `And | `Or ] * Variable.t * Indexes.t * Indexes.t * Schema.t
       | `Lit of Literal.t
       | `Op of [ `And | `Equiv | `Imply | `Or | `Xor ] * Schema.t * Schema.t
       | `Top ]
  val bot : Schema.t
  val top : Schema.t
  val pos_lit : Proposition.t -> Indexes.t -> Schema.t
  val neg_lit : Proposition.t -> Indexes.t -> Schema.t
  val conj : Schema.t -> Schema.t -> Schema.t
  val disj : Schema.t -> Schema.t -> Schema.t
  val xor : Schema.t -> Schema.t -> Schema.t
  val equiv : Schema.t -> Schema.t -> Schema.t
  val imply : Schema.t -> Schema.t -> Schema.t
  val it_conj : Variable.t -> Indexes.t -> Indexes.t -> Schema.t -> Schema.t
  val it_disj : Variable.t -> Indexes.t -> Indexes.t -> Schema.t -> Schema.t
  val to_string : Schema.t -> string
  val list_to_string : Schema.t list -> string
  val print : Schema.t -> unit
  val equal : Schema.t -> Schema.t -> bool
  val total_compare : Schema.t -> Schema.t -> int
  val max_bound : ?acc:Indexes.t option -> Schema.t -> Indexes.t option
  val contains_iterations : Schema.t -> bool
  val neg : Schema.t -> Schema.t
  val unfold_and_once :
    var:Variable.t ->
    sch:Schema.t -> t1:Indexes.t -> t2:Indexes.t -> Schema.t
  val unfold_or_once :
    var:Variable.t ->
    sch:Schema.t -> t1:Indexes.t -> t2:Indexes.t -> Schema.t
  exception Non_regular
  val get_param : Schema.t -> Variable.t option
  val is_regular : Schema.t -> bool
  val compute_schema : Schema.t -> int -> Formula.t
  val expr_involving_param : Schema.t -> Indexes.t option
  type purable = t
  val purity_add :
    purable -> ?range:Purity.range option -> pur:Purity.t -> Purity.t
  val purify :
    purable -> cstr:Constraint.t -> pur:Purity.t -> Modified.t * purable
  type variable = Variable.t
  type term = Indexes.t
  type substituable = t
  val substitute : substituable -> var:variable -> by:term -> substituable
  module PropSubs :
    sig
      type variable = Proposition.t
      type term = Proposition.t
      type substituable = t
      val substitute :
        substituable -> var:variable -> by:term -> substituable
    end
  module LoopingMap :
    sig
      type loopable = t
      type 'a t
      val empty : 'a t
      val add : 'a t -> key:loopable -> data:'-> 'a t
      val find : 'a t -> key:loopable -> 'a option
    end
end