sig
  module type IMPERATIVE_MAPS =
    sig
      type key
      type 'data t
      val create : unit -> 'data Fix.IMPERATIVE_MAPS.t
      val clear : 'data Fix.IMPERATIVE_MAPS.t -> unit
      val add :
        Fix.IMPERATIVE_MAPS.key ->
        'data -> 'data Fix.IMPERATIVE_MAPS.t -> unit
      val find :
        Fix.IMPERATIVE_MAPS.key -> 'data Fix.IMPERATIVE_MAPS.t -> 'data
      val iter :
        (Fix.IMPERATIVE_MAPS.key -> 'data -> unit) ->
        'data Fix.IMPERATIVE_MAPS.t -> unit
    end
  module type PROPERTY =
    sig
      type property
      val bottom : Fix.PROPERTY.property
      val equal : Fix.PROPERTY.property -> Fix.PROPERTY.property -> bool
      val is_maximal : Fix.PROPERTY.property -> bool
    end
  module Make :
    functor (M : IMPERATIVE_MAPS->
      functor (P : PROPERTY->
        sig
          type variable = M.key
          type property = P.property
          type valuation = Fix.Make.variable -> Fix.Make.property
          type rhs = Fix.Make.valuation -> Fix.Make.property
          type equations = Fix.Make.variable -> Fix.Make.rhs
          val lfp : Fix.Make.equations -> Fix.Make.valuation
        end
end