Struct RefineTree

Source
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

Source

pub(crate) fn new(params: Vec<(Var, Sort)>) -> RefineTree

Source

pub(crate) fn simplify(&mut self, genv: GlobalEnv<'_, '_>)

Source

pub(crate) fn into_fixpoint( self, cx: &mut FixpointCtxt<'_, '_, Tag>, ) -> QueryResult<Constraint>

Source

pub(crate) fn cursor_at_root(&mut self) -> Cursor<'_>

Source

pub(crate) fn replace_evars(&mut self, evars: &EVarStore) -> Result<(), EVid>

Trait Implementations§

Source§

impl Debug for RefineTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Pretty for RefineTree

Source§

fn fmt(&self, cx: &PrettyCx<'_, '_>, f: &mut Formatter<'_>) -> Result

Source§

fn default_cx(tcx: TyCtxt<'_>) -> PrettyCx<'_, '_>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.