# Module Cudf_checker

    module Cudf_checker: sig .. end

Checkers for CUDF documents

Consistency and problem-solution matching.

    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 : bad_solution_reason -> string

provide a string explaining a given reason, meant for error messages

    val satisfy_formula : Cudf.universe -> Cudf_types.vpkgformula -> bool * Cudf_types.vpkgformula

check whether a given package formula is satisfied by a given package status

- Returns `true, []` if the formula is satisfied; `false, f` otherwise, where f is a sub-formula of the input denoting an unsatisfiable formula (ideally, a witness of the unsatisfiability of the input formula)

    val disjoint : Cudf.universe ->
           ?ignore:(Cudf.package -> bool) ->
           Cudf_types.vpkglist -> bool * Cudf_types.vpkglist

check whether a package list is not satisfied by a given package status

- Returns `true, []` if the list is disjoint; `false, l` otherwise, where l is a list of packages satisfied by the universe (ideally, the reason of the non-disjointness)

    val is_consistent : Cudf.universe -> bool * inconsistency_reason option

- Returns `true, None` if the given installation is consistent, `false, Some r` otherwise, where r is the inconsistency reason

    val is_solution : Cudf.universe * Cudf.request ->
           Cudf.universe -> bool * bad_solution_reason list

`is_solution (status, req) sol` checks whether `sol` fulfills the CUDF upgrade scenario described by `(status, req)`

Note: the `sol` package universe must contain all relevant package metadata (e.g. Depends, Conflicts, etc.), copied from `status`, a compact universe only containing package names and versions won't be enough. To load compact universes see `Cudf_parser.load_solution`.

Note: in accordance with CUDF semantics, for a solution to be valid, the solution shall correspond to a consistent universe. A solution that does satisfy user request, but at the same time proposes an inconsistent universe (as per `Cudf_checker.is_consistent`) will be reported by `is_solution` as not being a valid solution.

- Returns `true, []` if this is the case, `false, l` otherwise, where r explains why the solution is bad