Conflicting information.

Conflicts occur when two conflicting values are provided for a property. When conflict happens the knowledge dependent computation diverges and evaluation stops with the value of type conflict (unless it is intercepted).

The conflict value, essentially serves as the upper bound to all user provided domains, thus closing the poset structure and turning it into a real domain. Although there could be many values of type conflict it is better to think of them as one value top, equipped with diagnostic information.

type t = conflict = ..
val pp : Format.formatter -> conflict -> unit

prints the conflict

val sexp_of_t : t -> Core_kernel.Sexp.t

the s-expression denoting the conflict.

val register_printer : (t -> string option) -> unit

registers a printer for user specified extension of the conflict type.

The function shall return Some s for the variant added by the user and None for all other variants.