sig
  type obs
  type t
  val create : unit -> t
  val compare : t -> t -> int
  val total_ord : t -> t -> int
  val add_alias : t -> t -> unit
  val do_normalize : t -> unit
  val add_observer : obs -> t -> unit
  val remove_observer : obs -> t -> unit
  val string_of : t -> string
  val reset : unit -> unit
  val get_all_ts : unit -> t list
  type img
  module I : sig type key = Syntax.label type img = TVar.t end
  val domain : t -> I.key list
  val find' : I.key -> t -> I.img option
  val find_or_add : create:(unit -> I.img) -> key:I.key -> map:t -> I.img
  val iter : (I.key -> I.img -> unit) -> t -> unit
  val fold : (I.key -> I.img -> '-> 'a) -> t -> '-> 'a
  val make_write_equal :
    (I.key -> I.key -> int) ->
    (I.img -> I.img -> unit) -> t -> t -> I.key -> unit
  val string_of_map : t -> string
  val string_of_with_img : t -> string
  type domain_var
  val get_domain_var : t -> domain_var
end