functor
  (DVar : sig
            type t
            val create : unit -> MapVar.Make.t
            val merge : MapVar.Make.t -> MapVar.Make.t -> MapVar.Make.t
          end->
  functor
    (Map : sig
             type key
             type img
             type t
             val empty : t
             val is_empty : t -> bool
             val add : key -> img -> t -> t
             val find : key -> t -> img
             val remove : key -> t -> t
             val mem : key -> t -> bool
             val iter : (key -> img -> unit) -> t -> unit
             val map : (img -> img) -> t -> t
             val mapi : (key -> img -> img) -> t -> t
             val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
             val compare : t -> t -> int
             val equal : t -> t -> bool
             val add' : key -> img option -> t -> t
             val find' : key -> t -> img option
             val add_list : (key * img) list -> t -> t
             val to_list : t -> (key * img) list
             val from_list : (key * img) list -> t
             val map_to_list : (key -> img -> 'a) -> t -> 'a list
             val mapi_and_map_to_list :
               (key -> img -> img * 'a) -> t -> t * 'a list
             val domain : t -> key list
             val fold_two :
               (key -> img option -> img option -> '-> 'a) ->
               '-> t -> t -> 'a
             val restrict : key list -> t -> t
             val string_of : t -> string
             val alias : img -> img -> unit
           end->
    functor (P : GenVars.PREFIX->
      functor (O : GenVars.OBSERVER->
        functor (State : sig type obs = O.t val add_wl : obs -> unit end->
          sig
            type obs = O.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
            module I : sig type key = Map.key type img = Map.img 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 = DVar.t
            val get_domain_var : t -> domain_var
          end