sig
  type ('a, 'b) reason =
      Not_available of 'a
    | Requested of 'a
    | Dependency of 'a * 'a list
    | Empty_disjunction of 'a * 'b list
    | Conflict of 'a * 'a
  type ('a, 'b, 'c) diagnosis = {
    dg_closure_size : int;
    dg_conflicts : int;
    dg_disjunctions : int;
    dg_dependencies : int;
    dg_failures : ('a * ('b, 'c) Diagnosis.reason list) array;
  }
  val empty_diagnosis : ('a, 'b, 'c) Diagnosis.diagnosis
  val io_reason :
    'Io.literate -> 'Io.literate -> ('a, 'b) Diagnosis.reason Io.literate
  val io_diagnosis :
    'Io.literate ->
    'Io.literate ->
    'Io.literate -> ('a, 'b, 'c) Diagnosis.diagnosis Io.literate
end