sig
  type inconsistency_reason =
      [ `Conflict of
          (Cudf_types.pkgname * Cudf_types.version) * Cudf_types.vpkglist
      | `Unsat_dep of
          (Cudf_types.pkgname * Cudf_types.version) * Cudf_types.vpkgformula ]
  type bad_solution_reason =
      [ `Conflict of
          (Cudf_types.pkgname * Cudf_types.version) * Cudf_types.vpkglist
      | `Downgrade of Cudf_types.vpkglist
      | `Missing_install of Cudf_types.vpkglist
      | `Missing_upgrade of Cudf_types.vpkglist
      | `Multi_upgrade of Cudf_types.pkgname list
      | `Not_kept of
          Cudf_types.pkgname * Cudf_types.version * Cudf_types.enum_keep
      | `Unremoved of Cudf_types.vpkglist
      | `Unsat_dep of
          (Cudf_types.pkgname * Cudf_types.version) * Cudf_types.vpkgformula ]
  val explain_reason : Cudf_checker.bad_solution_reason -> string
  val satisfy_formula :
    Cudf.universe -> Cudf_types.vpkgformula -> bool * Cudf_types.vpkgformula
  val disjoint :
    Cudf.universe ->
    ?ignore:(Cudf.package -> bool) ->
    Cudf_types.vpkglist -> bool * Cudf_types.vpkglist
  val is_consistent :
    Cudf.universe -> bool * Cudf_checker.inconsistency_reason option
  val is_solution :
    Cudf.cudf ->
    Cudf.solution -> bool * Cudf_checker.bad_solution_reason list
end