sig
  type variable = MultiEquation.descriptor UnionFind.point
  and descriptor = {
    mutable structure : MultiEquation.structure option;
    mutable rank : IntRank.t;
    mutable mark : Mark.t;
    mutable kind : MultiEquation.variable_kind;
    mutable name : MultiEquation.tname option;
    mutable pos : Positions.position option;
    mutable var : MultiEquation.variable option;
  }
  and structure = MultiEquation.variable CoreAlgebra.term
  and variable_kind = Rigid | Flexible | Constant
  and tname = TName of string
  type crterm = MultiEquation.variable CoreAlgebra.arterm
  val is_structured : MultiEquation.variable -> bool
  val are_equivalent :
    MultiEquation.variable -> MultiEquation.variable -> bool
  val variable_name : MultiEquation.variable -> MultiEquation.tname option
  val variable_structure :
    MultiEquation.variable -> MultiEquation.structure option
  val explode :
    MultiEquation.crterm -> MultiEquation.variable CoreAlgebra.term
  val variable :
    MultiEquation.variable_kind ->
    ?name:MultiEquation.tname ->
    ?structure:MultiEquation.crterm ->
    ?pos:Positions.position -> unit -> MultiEquation.variable
  val variable_list :
    MultiEquation.variable_kind ->
    'a list -> MultiEquation.variable list * ('a * MultiEquation.crterm) list
  val variable_list_from_names :
    (MultiEquation.tname ->
     MultiEquation.variable_kind * MultiEquation.tname option) ->
    MultiEquation.tname list ->
    MultiEquation.variable list *
    (MultiEquation.tname * MultiEquation.crterm) list
  val variable_set :
    (MultiEquation.tname ->
     MultiEquation.variable_kind * MultiEquation.tname option) ->
    Misc.StringSet.t ->
    MultiEquation.variable list *
    (MultiEquation.crterm * Positions.position) Misc.StringMap.t
  val is_rigid : MultiEquation.variable -> bool
  val is_flexible : MultiEquation.variable -> bool
  type pool
  val inhabitants : MultiEquation.pool -> MultiEquation.variable list
  val number : MultiEquation.pool -> int
  val new_pool : MultiEquation.pool -> MultiEquation.pool
  val init : unit -> MultiEquation.pool
  val register : MultiEquation.pool -> MultiEquation.variable -> unit
  val introduce : MultiEquation.pool -> MultiEquation.variable -> unit
  val instance :
    MultiEquation.pool -> MultiEquation.variable -> MultiEquation.variable
  val chop :
    MultiEquation.pool -> MultiEquation.crterm -> MultiEquation.variable
  val chopi : IntRank.t -> MultiEquation.crterm -> MultiEquation.variable
end