sig
  type 'a trivial = Trivial | NonTrivial of 'a
  type 'a tree =
      Empty
    | Leaf of 'a
    | Node of 'Equality.tree * 'Equality.tree
  type elt = Hcexprs.HCE.t
  module Equality :
    sig
      type t
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
      val pair : Equality.elt -> Equality.elt -> t Equality.trivial
      val mem : Equality.elt -> t -> bool
      val add : Equality.elt -> t -> t
      val remove : Equality.elt -> t -> t Equality.trivial
      val union : t -> t -> t
      val inter : t -> t -> t Equality.trivial
      val intersects : t -> t -> bool
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (Equality.elt -> unit) -> t -> unit
      val fold : (Equality.elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (Equality.elt -> bool) -> t -> bool
      val exists : (Equality.elt -> bool) -> t -> bool
      val filter : (Equality.elt -> bool) -> t -> t Equality.trivial
      val cardinal : t -> int
      val choose : t -> Equality.elt
      val elements : t -> Equality.elt list
    end
  type equality = Equality.Equality.t
  module Set :
    sig
      type t
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
      val empty : t
      val is_empty : t -> bool
      val union : t -> t -> t
      val inter : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (Equality.equality -> unit) -> t -> unit
      val fold : (Equality.equality -> '-> 'a) -> t -> '-> 'a
      val for_all : (Equality.equality -> bool) -> t -> bool
      val exists : (Equality.equality -> bool) -> t -> bool
      val elements : t -> Equality.equality list
      val choose : t -> Equality.equality
      val remove : Hcexprs.kill_type -> Cil_types.lval -> t -> t
      val unite :
        Equality.elt * Hcexprs.lvalues ->
        Equality.elt * Hcexprs.lvalues -> t -> t
      val find : Equality.elt -> t -> Equality.equality
      val find_option : Equality.elt -> t -> Equality.equality option
      val mem : Equality.equality -> t -> bool
      val contains : Equality.elt -> t -> bool
      val deep_fold :
        (Equality.equality -> Equality.elt -> '-> 'a) -> t -> '-> 'a
      val cardinal : t -> int
      val lvalues_only_left : t -> t -> Equality.elt Equality.tree
    end
end