Skip to main content

VerusIdempotentProof

Struct VerusIdempotentProof 

Source
pub struct VerusIdempotentProof { /* private fields */ }
Expand description

A machine-checked proof of idempotence, verified by Verus.

Created by the verus_proof_idempotent_fold!, verus_proof_idempotent_reduce!, verus_proof_idempotent_map!, verus_proof_idempotent_filter!, and verus_proof_idempotent_effect! macros, one per closure shape, each generating the precise obligation that makes a retried (duplicated) element unobservable for that shape (final accumulator, re-emitted output, retention decision, or captured state, respectively). The obligation is generated by the macro directly from the actual closure body — it symbolically executes the body on an element once, and on the same element twice in a row, from equal initial states, and requires the observable results to be equal — so users never write (and cannot weaken) the assertion. Users only declare the types involved and, optionally, provide a proof script to help the SMT solver, which is itself checked by Verus.

Combined with a commutativity proof (required on unordered streams), the obligation also covers duplicates that are not adjacent to the original element, since commutativity allows moving the duplicate next to it.

When the crate is verified with cargo verus verify, Verus checks the obligation (which also proves the closure body panic-free, e.g. no arithmetic overflow). Under normal compilation, the proof is erased and this type simply marks the property as proven. Note that the simulator does not inject retries, so (unlike commutativity) idempotence claims are not explored by simulation tests at all; a Verus proof is the only mechanical check. This type only implements IdempotentProof, so it cannot be used to fulfill a different property (e.g. commutative = ...).

Trait Implementations§

Source§

impl Default for VerusIdempotentProof

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl IdempotentProof for VerusIdempotentProof

Source§

fn register_proof(&self, _expr: &Expr)

Registers the expression with the proof mechanism. Read more

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.

§

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<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToSinkBuild for T

Source§

fn iter_to_sink_build(self) -> SendIterBuild<Self>
where Self: Sized + Iterator,

Starts a SinkBuild adaptor chain to send all items from self as an Iterator.
Source§

fn stream_to_sink_build(self) -> SendStreamBuild<Self>
where Self: Sized + Stream,

Starts a SinkBuild adaptor chain to send all items from self as a [Stream].
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<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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