sig
  type t
  type range = Variable.t * Indexes.t * Indexes.t
  val empty : Purity.t
  val add :
    ?range:Purity.range option -> lit:Literal.t -> Purity.t -> Purity.t
  val merge : Purity.t -> Purity.t -> Purity.t
  val is_pure : cstr:Constraint.t -> pur:Purity.t -> Literal.t -> bool
  module type Purable =
    sig
      type purable
      val purity_add :
        Purity.Purable.purable ->
        ?range:Purity.range option -> pur:Purity.t -> Purity.t
      val purify :
        Purity.Purable.purable ->
        cstr:Constraint.t ->
        pur:Purity.t -> Modified.t * Purity.Purable.purable
    end
end