sig
  type parameter = int
  module ParameterMap :
    sig
      type key = parameter
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val max_binding : 'a t -> key * 'a
      val choose : 'a t -> key * 'a
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
    end
  type property = Fact.fact
  and fact = Fact.hypothesis Mode.ModeMap.t
  and hypothesis = HFalse | HConjunction of Fact.hypotheses
  and hypotheses = Mode.mode Fact.ParameterMap.t
  val conjunction : ('-> Fact.hypothesis) -> 'a list -> Fact.hypothesis
  val bottom : Fact.fact
  val equal : Fact.fact -> Fact.fact -> bool
  val leq : Fact.fact -> Fact.fact -> bool
  val join : Fact.fact -> Fact.fact -> Fact.fact
  val join_many : ('-> Fact.fact) -> 'a list -> Fact.fact
  val meet : Fact.fact -> Fact.fact -> Fact.fact
  val is_maximal : Fact.fact -> bool
  val constant : Mode.mode -> Fact.fact
  val implication : Mode.mode -> Fact.hypothesis -> Fact.fact
  val duplicable : Fact.hypothesis -> Fact.fact
  val allow_exclusive : Fact.fact -> Fact.fact
  val disallow_exclusive : Fact.fact -> Fact.fact
  val parameter : Fact.parameter -> Fact.fact
  val compose : Fact.fact -> Fact.fact list -> Fact.fact
  val complete : Fact.fact -> Fact.fact
  val print :
    (Fact.parameter -> PPrint.document) ->
    PPrint.document -> Fact.fact -> PPrint.document
  val internal_print : Fact.fact -> PPrint.document
end