mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
32 lines
809 B
OCaml
32 lines
809 B
OCaml
(** Union find *)
|
|
|
|
open Sidekick_core
|
|
|
|
type t
|
|
|
|
val create : unit -> t
|
|
(** New UF *)
|
|
|
|
val merge : t -> Term.t -> Term.t -> Reason.t -> unit
|
|
(** Merge two terms *)
|
|
|
|
val find : t -> Term.t -> Term.t
|
|
(** Current representative of this term *)
|
|
|
|
val are_equal : t -> Term.t -> Term.t -> bool
|
|
|
|
val on_changed : t -> (Term.t, unit) Event.t
|
|
(** Event firing for each term whose representative changed. *)
|
|
|
|
type expl = { merges: (Term.t * Term.t * Reason.t) list }
|
|
|
|
val pp_expl : expl Fmt.printer
|
|
|
|
val explain_equal : t -> Term.t -> Term.t -> expl
|
|
(** [explain_equal uf t u] returns an explanation of why [t = u].
|
|
@raise Error.Error if the terms are not equal. *)
|
|
|
|
val iter_classes : t -> (Term.t * Term.t Iter.t) Iter.t
|
|
(** Iterate on equivalence classes. *)
|
|
|
|
include Sidekick_sigs.BACKTRACKABLE0 with type t := t
|