sig
  exception EUnion of string
  module type IMG =
    sig
      type t
      val compare : GenVars.IMG.t -> GenVars.IMG.t -> int
      val merge : GenVars.IMG.t -> GenVars.IMG.t -> GenVars.IMG.t
      val normalize : GenVars.IMG.t -> GenVars.IMG.t
      val string_of : GenVars.IMG.t -> string
    end
  module type PREFIX = sig val prefix : string end
  module type OBSERVER =
    sig
      type t
      val compare : GenVars.OBSERVER.t -> GenVars.OBSERVER.t -> int
      val string_of : GenVars.OBSERVER.t -> string
      val fire : GenVars.OBSERVER.t -> unit
    end
  module type STATE = sig type obs val add_wl : GenVars.STATE.obs -> unit end
  module type VAR_WITHOUT_IMG =
    sig
      type obs
      type t
      val create : unit -> GenVars.VAR_WITHOUT_IMG.t
      val compare :
        GenVars.VAR_WITHOUT_IMG.t -> GenVars.VAR_WITHOUT_IMG.t -> int
      val total_ord :
        GenVars.VAR_WITHOUT_IMG.t -> GenVars.VAR_WITHOUT_IMG.t -> int
      val add_alias :
        GenVars.VAR_WITHOUT_IMG.t -> GenVars.VAR_WITHOUT_IMG.t -> unit
      val do_normalize : GenVars.VAR_WITHOUT_IMG.t -> unit
      val add_observer :
        GenVars.VAR_WITHOUT_IMG.obs -> GenVars.VAR_WITHOUT_IMG.t -> unit
      val remove_observer :
        GenVars.VAR_WITHOUT_IMG.obs -> GenVars.VAR_WITHOUT_IMG.t -> unit
      val string_of : GenVars.VAR_WITHOUT_IMG.t -> string
      val reset : unit -> unit
      val get_all_ts : unit -> GenVars.VAR_WITHOUT_IMG.t list
    end
  module type VAR =
    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
      val add_img : GenVars.VAR.img -> t -> unit
      val get_img : t -> GenVars.VAR.img option
    end
  module type CVAR =
    functor (Obs : OBSERVER->
      sig
        type obs = Obs.t
        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
        val add_img : img -> t -> unit
        val get_img : t -> img option
      end
  module type MAKE =
    functor (Pre : PREFIX->
      functor (Obs : OBSERVER->
        functor (Img : IMG->
          functor
            (State : sig type obs = Obs.t val add_wl : obs -> unit end->
            sig
              type obs = Obs.t
              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 = Img.t
              val add_img : img -> t -> unit
              val get_img : t -> img option
            end
  module Make : MAKE
end