Skip to main content

Axiom

Struct Axiom 

Source
pub struct Axiom {
    pub def_id: FluxLocalDefId,
    pub body: Binder<AxiomBody>,
}
Expand description

An Axiom is a (global) fact, typically about uninterpreted functions, that is assumed to hold for all values of the variables bound in body.

Fields§

§def_id: FluxLocalDefId§body: Binder<AxiomBody>

Implementations§

Source§

impl Axiom

Source

pub fn new( genv: GlobalEnv<'_, '_>, def_id: FluxLocalDefId, body: Binder<Expr>, ) -> Result<Self, UncoveredAxiomVar>

Creates an axiom, computing its patterns from body, which must have already been reduced so that the applications are the ones that will be sent to the solver.

A function is considered uninterpreted if it has no body or if it is hidden. We also include the arithmetic and bitwise operations that can be encoded as UIFs (e.g., [&](x, y) on int, or x * y under uif_ops), the casts that have no interpretation, and associated refinements. (Whether a hidden function is revealed, or an operation is uninterpreted, depends on the item being checked, so those are candidates that are filtered when encoding the axiom.) Applications mentioning variables bound inside the body (by a let or a quantifier) are skipped as they are not valid outside of their binder.

Fails if some variable bound by the axiom does not occur in any of the patterns, as the axiom could then never be instantiated.

Trait Implementations§

Source§

impl TypeFoldable for Axiom

Source§

fn try_fold_with<__F: FallibleTypeFolder>( &self, __folder: &mut __F, ) -> Result<Self, __F::Error>

Source§

fn fold_with<F: TypeFolder>(&self, folder: &mut F) -> Self

Source§

fn reduce(&self, genv: GlobalEnv<'_, '_>) -> Self

Reduces expressions by Read more
Source§

fn replace_holes( &self, f: impl FnMut(&[BoundVariableKinds], HoleKind) -> Expr, ) -> Self

Replaces all holes with the result of calling a closure. The closure takes a list with all the layers of bound variables at the point the hole was found. Each layer corresponds to the list of bound variables at that level. The list is ordered from outermost to innermost binder, i.e., the last element is the binder closest to the hole.
Source§

fn with_holes(&self) -> Self

Remove all refinements and turn each underlying BaseTy into a TyKind::Exists with a TyKind::Constr and a hole. For example, Vec<{v. i32[v] | v > 0}>[n] becomes {n. Vec<{v. i32[v] | *}>[n] | *}.
Source§

fn replace_evars( &self, f: &mut impl FnMut(EVid) -> Option<Expr>, ) -> Result<Self, EVid>

Source§

fn shift_horizontally(&self, amount: usize) -> Self

Shift the BoundVar of all the the variables at index INNERMOST “horizontally” to the right by the specified amount.
Source§

fn shift_in_escaping(&self, amount: u32) -> Self

Source§

fn shift_out_escaping(&self, amount: u32) -> Self

Source§

fn erase_regions(&self) -> Self

Source§

fn erase_regions_including_bound(&self) -> Self

Like TypeFoldable::erase_regions, but also erases bound regions.
Source§

impl TypeVisitable for Axiom

Source§

fn visit_with<__V: TypeVisitor>( &self, __visitor: &mut __V, ) -> ControlFlow<__V::BreakTy>

Source§

fn has_escaping_bvars(&self) -> bool

Source§

fn has_escaping_bvars_at_or_above(&self, binder: DebruijnIndex) -> bool

Returns true if self has any late-bound vars that are either bound by binder or bound by some binder outside of binder. If binder is ty::INNERMOST, this indicates whether there are any late-bound vars that appear free.
Source§

fn fvars(&self) -> FxHashSet<Name>

Returns the set of all free variables. For example, Vec<i32[n]>{v : v > m} returns {n, m}.
Source§

fn early_params(&self) -> FxHashSet<EarlyReftParam>

Source§

fn redundant_bvars(&self) -> UnordSet<BoundVar>

Gives the indices of the provided bvars which: Read more

Auto Trait Implementations§

§

impl DynSend for Axiom

§

impl DynSync for Axiom

§

impl Freeze for Axiom

§

impl RefUnwindSafe for Axiom

§

impl Send for Axiom

§

impl Sync for Axiom

§

impl Unpin for Axiom

§

impl UnsafeUnpin for Axiom

§

impl UnwindSafe for Axiom

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.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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
§

impl<K> IntoQueryKey<K> for K

§

fn into_query_key(self) -> K

Argument conversion from Self to K. This should always be a very cheap conversion, e.g. [LocalDefId::to_def_id].
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more