(* This signature defines the operations that an upper semi-lattice
   should provide. It is used by Kildall's algorithm. *)

module type S = sig

  (* This is the type of the lattice elements. *)

  type t

  (* This is the least element of the lattice. *)

  val bottom: t

  (* This is the lattice join operation. The lattice ordering must
     have bounded height for Kildall's algorithm to terminate. *)

  val join: t -> t -> t

  (* This is the lattice equality.  *)

  val equal: t -> t -> bool

end