sig
  type relop = [ `Eq | `Geq | `Gt | `Leq | `Lt | `Neq ]
  val string_of_relop : OpamFormula.relop -> string
  val relop_of_string : string -> OpamFormula.relop
  type version_constraint = OpamFormula.relop * OpamPackage.Version.t
  type atom = OpamPackage.Name.t * OpamFormula.version_constraint option
  val string_of_atom : OpamFormula.atom -> string
  val short_string_of_atom : OpamFormula.atom -> string
  val string_of_atoms : OpamFormula.atom list -> string
  val check : OpamFormula.atom -> OpamPackage.t -> bool
  type 'a conjunction = 'a list
  val string_of_conjunction :
    ('-> string) -> 'OpamFormula.conjunction -> string
  type 'a disjunction = 'a list
  val string_of_disjunction :
    ('-> string) -> 'OpamFormula.disjunction -> string
  type 'a cnf = 'OpamFormula.disjunction OpamFormula.conjunction
  type 'a dnf = 'OpamFormula.conjunction OpamFormula.disjunction
  val string_of_cnf : ('-> string) -> 'OpamFormula.cnf -> string
  val string_of_dnf : ('-> string) -> 'OpamFormula.dnf -> string
  type 'a formula =
      Empty
    | Atom of 'a
    | Block of 'OpamFormula.formula
    | And of 'OpamFormula.formula * 'OpamFormula.formula
    | Or of 'OpamFormula.formula * 'OpamFormula.formula
  val eval : ('-> bool) -> 'OpamFormula.formula -> bool
  val check_relop : OpamFormula.relop -> int -> bool
  val eval_relop :
    OpamFormula.relop ->
    OpamPackage.Version.t -> OpamPackage.Version.t -> bool
  val neg_relop : OpamFormula.relop -> OpamFormula.relop
  val string_of_formula : ('-> string) -> 'OpamFormula.formula -> string
  val ands : 'OpamFormula.formula list -> 'OpamFormula.formula
  val ands_to_list : 'OpamFormula.formula -> 'OpamFormula.formula list
  val ors : 'OpamFormula.formula list -> 'OpamFormula.formula
  val ors_to_list : 'OpamFormula.formula -> 'OpamFormula.formula list
  val map :
    ('-> 'OpamFormula.formula) ->
    'OpamFormula.formula -> 'OpamFormula.formula
  val map_formula :
    ('OpamFormula.formula -> 'OpamFormula.formula) ->
    'OpamFormula.formula -> 'OpamFormula.formula
  val neg : ('-> 'a) -> 'OpamFormula.formula -> 'OpamFormula.formula
  val iter : ('-> unit) -> 'OpamFormula.formula -> unit
  val fold_left : ('-> '-> 'a) -> '-> 'OpamFormula.formula -> 'a
  type version_formula = OpamFormula.version_constraint OpamFormula.formula
  type t =
      (OpamPackage.Name.t * OpamFormula.version_formula) OpamFormula.formula
  val cnf_of_formula : 'OpamFormula.formula -> 'OpamFormula.formula
  val dnf_of_formula : 'OpamFormula.formula -> 'OpamFormula.formula
  val to_atom_formula : OpamFormula.t -> OpamFormula.atom OpamFormula.formula
  val of_atom_formula : OpamFormula.atom OpamFormula.formula -> OpamFormula.t
  val simplify_version_formula :
    OpamFormula.version_formula -> OpamFormula.version_formula
  val atoms : OpamFormula.t -> OpamFormula.atom list
  val to_string : OpamFormula.t -> string
  val to_conjunction :
    OpamFormula.t -> OpamFormula.atom OpamFormula.conjunction
  val of_conjunction :
    OpamFormula.atom OpamFormula.conjunction -> OpamFormula.t
  val to_disjunction :
    OpamFormula.t -> OpamFormula.atom OpamFormula.disjunction
  val of_disjunction :
    OpamFormula.atom OpamFormula.disjunction -> OpamFormula.t
  val to_cnf : OpamFormula.t -> OpamFormula.atom OpamFormula.cnf
  val to_dnf : OpamFormula.t -> OpamFormula.atom OpamFormula.dnf
  type 'a ext_package_formula =
      (OpamPackage.Name.t * ('a * OpamFormula.version_formula))
      OpamFormula.formula
  val formula_of_extended :
    filter:('-> bool) ->
    'OpamFormula.ext_package_formula -> OpamFormula.t
end