functor
  (X : sig
         type t
         val name : string
         val id : Ptmap.Make.t -> int
         val pretty : Format.formatter -> Ptmap.Make.t -> unit
         val equal : Ptmap.Make.t -> Ptmap.Make.t -> bool
         module Datatype :
           sig
             type t = t
             val descr : Unmarshal.t
             val copy : t -> t
             val name : string
             val register_comparable :
               ?compare:(t -> t -> int) ->
               ?equal:(t -> t -> bool) -> ?hash:(t -> int) -> unit -> unit
             val is_comparable_set : unit -> bool
             val hash : t -> int
             val equal : t -> t -> bool
             val compare : t -> t -> int
             val mem_project :
               ((Project.project -> bool) -> t -> bool) option ref
           end
       end->
  functor (V : Tagged_type->
    functor (Initial_Values : sig val v : (X.t * V.t) list list end->
      sig
        type t
        type key = X.t
        val empty : Ptmap.Make.t
        val tag : Ptmap.Make.t -> int
        val hash_debug : Ptmap.Make.t -> int
        val equal : Ptmap.Make.t -> Ptmap.Make.t -> bool
        val is_empty : Ptmap.Make.t -> bool
        val add : Ptmap.Make.key -> V.t -> Ptmap.Make.t -> Ptmap.Make.t
        val find : Ptmap.Make.key -> Ptmap.Make.t -> V.t
        val remove : Ptmap.Make.key -> Ptmap.Make.t -> Ptmap.Make.t
        val iter : (X.t -> V.t -> unit) -> Ptmap.Make.t -> unit
        val map : (V.t -> V.t) -> Ptmap.Make.t -> Ptmap.Make.t
        val fold : (X.t -> V.t -> '-> 'a) -> Ptmap.Make.t -> '-> 'a
        val generic_merge :
          cache:string * int ->
          decide:(X.t -> V.t option -> V.t option -> V.t) ->
          Ptmap.Make.t -> Ptmap.Make.t -> Ptmap.Make.t
        val symetric_merge :
          cache:string * int ->
          decide_none:(X.t -> V.t -> V.t) ->
          decide_some:(V.t -> V.t -> V.t) ->
          Ptmap.Make.t -> Ptmap.Make.t -> Ptmap.Make.t
        val generic_is_included :
          exn ->
          cache:string * int ->
          decide_fst:(X.t -> V.t -> unit) ->
          decide_snd:(X.t -> V.t -> unit) ->
          decide_both:(V.t -> V.t -> unit) ->
          Ptmap.Make.t -> Ptmap.Make.t -> unit
        val cached_fold :
          cache:string * int ->
          f:(Ptmap.Make.key -> V.t -> 'a) ->
          joiner:('-> '-> 'a) -> empty:'-> Ptmap.Make.t -> 'a
        val cached_map :
          cache:string * int ->
          f:(Ptmap.Make.key -> V.t -> V.t) -> Ptmap.Make.t -> Ptmap.Make.t
        val is_singleton : Ptmap.Make.t -> (Ptmap.Make.key * V.t) option
        val min_binding : Ptmap.Make.t -> Ptmap.Make.key * V.t
        module Datatype :
          sig
            type t = t
            val descr : Unmarshal.t
            val copy : t -> t
            val name : string
            val register_comparable :
              ?compare:(t -> t -> int) ->
              ?equal:(t -> t -> bool) -> ?hash:(t -> int) -> unit -> unit
            val is_comparable_set : unit -> bool
            val hash : t -> int
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val mem_project :
              ((Project.project -> bool) -> t -> bool) option ref
          end
        val pretty : Format.formatter -> Ptmap.Make.t -> unit
      end