Module rustc_mir_dataflow::lattice
source · [−]Expand description
Traits used to represent lattices for use as the domain of a dataflow analysis.
Overview
The most common lattice is a powerset of some set S
, ordered by set inclusion. The Hasse
diagram for the powerset of a set with two elements (X
and Y
) is shown below. Note that
distinct elements at the same height in a Hasse diagram (e.g. {X}
and {Y}
) are
incomparable, not equal.
{X, Y} <- top
/ \
{X} {Y}
\ /
{} <- bottom
The defining characteristic of a lattice—the one that differentiates it from a partially
ordered set—is the existence of a unique least upper and greatest lower bound for
every pair of elements. The lattice join operator (∨
) returns the least upper bound, and the
lattice meet operator (∧
) returns the greatest lower bound. Types that implement one operator
but not the other are known as semilattices. Dataflow analysis only uses the join operator and
will work with any join-semilattice, but both should be specified when possible.
PartialOrd
Given that they represent partially ordered sets, you may be surprised that JoinSemiLattice
and MeetSemiLattice
do not have PartialOrd
as a supertrait. This
is because most standard library types use lexicographic ordering instead of set inclusion for
their PartialOrd
impl. Since we do not actually need to compare lattice elements to run a
dataflow analysis, there’s no need for a newtype wrapper with a custom PartialOrd
impl. The
only benefit would be the ability to check that the least upper (or greatest lower) bound
returned by the lattice join (or meet) operator was in fact greater (or lower) than the inputs.
Structs
T
using the inverse order.Enums
T
with top and bottom elements to make it a partially ordered set in which no
value of T
is comparable with any other.