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
impl Axiom
Sourcepub fn new(
genv: GlobalEnv<'_, '_>,
def_id: FluxLocalDefId,
body: Binder<Expr>,
) -> Result<Self, UncoveredAxiomVar>
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
impl TypeFoldable for Axiom
fn try_fold_with<__F: FallibleTypeFolder>( &self, __folder: &mut __F, ) -> Result<Self, __F::Error>
fn fold_with<F: TypeFolder>(&self, folder: &mut F) -> Self
Source§fn replace_holes(
&self,
f: impl FnMut(&[BoundVariableKinds], HoleKind) -> Expr,
) -> Self
fn replace_holes( &self, f: impl FnMut(&[BoundVariableKinds], HoleKind) -> Expr, ) -> Self
Source§fn with_holes(&self) -> Self
fn with_holes(&self) -> Self
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] | *}.fn replace_evars( &self, f: &mut impl FnMut(EVid) -> Option<Expr>, ) -> Result<Self, EVid>
Source§fn shift_horizontally(&self, amount: usize) -> Self
fn shift_horizontally(&self, amount: usize) -> Self
fn shift_in_escaping(&self, amount: u32) -> Self
fn shift_out_escaping(&self, amount: u32) -> Self
fn erase_regions(&self) -> Self
Source§fn erase_regions_including_bound(&self) -> Self
fn erase_regions_including_bound(&self) -> Self
TypeFoldable::erase_regions, but also erases bound regions.Source§impl TypeVisitable for Axiom
impl TypeVisitable for Axiom
fn visit_with<__V: TypeVisitor>( &self, __visitor: &mut __V, ) -> ControlFlow<__V::BreakTy>
fn has_escaping_bvars(&self) -> bool
Source§fn has_escaping_bvars_at_or_above(&self, binder: DebruijnIndex) -> bool
fn has_escaping_bvars_at_or_above(&self, binder: DebruijnIndex) -> bool
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>
fn fvars(&self) -> FxHashSet<Name>
Vec<i32[n]>{v : v > m} returns {n, m}.fn early_params(&self) -> FxHashSet<EarlyReftParam>
Source§fn redundant_bvars(&self) -> UnordSet<BoundVar>
fn redundant_bvars(&self) -> UnordSet<BoundVar>
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> 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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
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§impl<K> IntoQueryKey<K> for K
impl<K> IntoQueryKey<K> for K
§fn into_query_key(self) -> K
fn into_query_key(self) -> K
Self to K.
This should always be a very cheap conversion, e.g. [LocalDefId::to_def_id].