pub struct RefineTree {
root: NodePtr,
}
Expand description
A refinement tree tracks the “tree-like structure” of refinement variables and predicates generated during refinement type-checking. This tree can be encoded as a fixpoint constraint whose satisfiability implies the safety of a function.
We try to hide the representation of the tree as much as possible and only a couple of operations
can be used to manipulate the structure of the tree explicitly. Instead, the tree is mostly
constructed implicitly via a restricted api provided by Cursor
. Some methods operate on nodes
of the tree which we try to keep abstract, but it is important to remember that there’s an
underlying tree.
The current implementation uses Rc
and RefCell
to represent the tree, but we ensure
statically that the RefineTree
is the single owner of the data and require a mutable reference
to it for all mutations, i.e., we could in theory replace the RefCell
with an UnsafeCell
(or a GhostCell
).
Fields§
§root: NodePtr
Implementations§
Source§impl RefineTree
impl RefineTree
pub(crate) fn new(params: Vec<(Var, Sort)>) -> RefineTree
pub(crate) fn simplify(&mut self, genv: GlobalEnv<'_, '_>)
pub(crate) fn into_fixpoint( self, cx: &mut FixpointCtxt<'_, '_, Tag>, ) -> QueryResult<Constraint>
pub(crate) fn cursor_at_root(&mut self) -> Cursor<'_>
pub(crate) fn replace_evars(&mut self, evars: &EVarStore) -> Result<(), EVid>
Trait Implementations§
Source§impl Debug for RefineTree
impl Debug for RefineTree
Auto Trait Implementations§
impl Freeze for RefineTree
impl !RefUnwindSafe for RefineTree
impl !Send for RefineTree
impl !Sync for RefineTree
impl Unpin for RefineTree
impl !UnwindSafe for RefineTree
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more