pub struct FixWith<const LIMIT: usize, Body, Param>(pub Body, pub Param);Expand description
Bounded fixpoint combinator for parameterized recursive formats.
Param is the starting parameter for the recursive Body.
Context-free recursive formats use Param = ().
Tuple Fields§
§0: Body§1: ParamImplementations§
Source§impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
Sourcepub open spec fn byte_len_gas(
body: &Body,
gas: nat,
param: Body::Param,
v: Body::T,
) -> nat
pub open spec fn byte_len_gas( body: &Body, gas: nat, param: Body::Param, v: Body::T, ) -> nat
{ body.spec_body(param, Self::specs_callback(&body, gas)).byte_len(v) }Sourcepub open spec fn consistent_gas(
body: &Body,
gas: nat,
param: Body::Param,
v: Body::T,
) -> bool
pub open spec fn consistent_gas( body: &Body, gas: nat, param: Body::Param, v: Body::T, ) -> bool
{ body.spec_body(param, Self::specs_callback(&body, gas)).consistent(v) }Sourcepub open spec fn spec_parse_gas(
body: &Body,
gas: nat,
param: Body::Param,
input: Seq<u8>,
) -> Option<(int, Body::T)>
pub open spec fn spec_parse_gas( body: &Body, gas: nat, param: Body::Param, input: Seq<u8>, ) -> Option<(int, Body::T)>
{ body.spec_body(param, Self::specs_callback(&body, gas)).spec_parse(input) }Sourcepub open spec fn spec_serialize_gas(
body: &Body,
gas: nat,
param: Body::Param,
v: Body::T,
) -> Seq<u8>
pub open spec fn spec_serialize_gas( body: &Body, gas: nat, param: Body::Param, v: Body::T, ) -> Seq<u8>
{ body.spec_body(param, Self::specs_callback(&body, gas)).spec_serialize(v) }Sourcepub open spec fn spec_serialize_dps_gas(
body: &Body,
gas: nat,
param: Body::Param,
v: Body::T,
obuf: Seq<u8>,
) -> Seq<u8>
pub open spec fn spec_serialize_dps_gas( body: &Body, gas: nat, param: Body::Param, v: Body::T, obuf: Seq<u8>, ) -> Seq<u8>
{ body.spec_body(param, Self::specs_callback(&body, gas)).spec_serialize_dps(v, obuf) }Sourcepub open spec fn spec_parse_callback(
body: &Body,
gas: nat,
param: Body::Param,
) -> ParserFnSpec<Body::T>
pub open spec fn spec_parse_callback( body: &Body, gas: nat, param: Body::Param, ) -> ParserFnSpec<Body::T>
{
|ibuf: Seq<u8>| {
if gas > 0 {
Self::spec_parse_gas(body, (gas - 1) as nat, param, ibuf)
} else {
None
}
}
}Sourcepub open spec fn consistent_callback(
body: &Body,
gas: nat,
param: Body::Param,
) -> PredFnSpec<Body::T>
pub open spec fn consistent_callback( body: &Body, gas: nat, param: Body::Param, ) -> PredFnSpec<Body::T>
{
|vv: Body::T| {
if gas > 0 {
Self::consistent_gas(body, (gas - 1) as nat, param, vv)
} else {
false
}
}
}Sourcepub open spec fn byte_len_callback(
body: &Body,
gas: nat,
param: Body::Param,
) -> ByteLenFnSpec<Body::T>
pub open spec fn byte_len_callback( body: &Body, gas: nat, param: Body::Param, ) -> ByteLenFnSpec<Body::T>
{
|vv: Body::T| {
if gas > 0 { Self::byte_len_gas(body, (gas - 1) as nat, param, vv) } else { 0 }
}
}Sourcepub open spec fn spec_serialize_callback(
body: &Body,
gas: nat,
param: Body::Param,
) -> SerializerFnSpec<Body::T>
pub open spec fn spec_serialize_callback( body: &Body, gas: nat, param: Body::Param, ) -> SerializerFnSpec<Body::T>
{
|vv: Body::T| {
if gas > 0 {
Self::spec_serialize_gas(body, (gas - 1) as nat, param, vv)
} else {
Seq::empty()
}
}
}Sourcepub open spec fn spec_serialize_dps_callback(
body: &Body,
gas: nat,
param: Body::Param,
) -> SerializerDPSFnSpec<Body::T>
pub open spec fn spec_serialize_dps_callback( body: &Body, gas: nat, param: Body::Param, ) -> SerializerDPSFnSpec<Body::T>
{
|vv: Body::T, obuf: Seq<u8>| {
if gas > 0 {
Self::spec_serialize_dps_gas(body, (gas - 1) as nat, param, vv, obuf)
} else {
obuf
}
}
}Sourcepub open spec fn specs_callback(
body: &Body,
gas: nat,
) -> ParamRecSpecs<Body::Param, Body::T>
pub open spec fn specs_callback( body: &Body, gas: nat, ) -> ParamRecSpecs<Body::Param, Body::T>
{
|param: Body::Param| (
Self::consistent_callback(&body, gas, param),
Self::byte_len_callback(&body, gas, param),
Self::spec_parse_callback(&body, gas, param),
Self::spec_serialize_callback(&body, gas, param),
Self::spec_serialize_dps_callback(&body, gas, param),
)
}Bundled callbacks used when unfolding one recursive level.
Source§impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>
Sourcepub proof fn lemma_specs_callback_safe_inv(&self, gas: nat, param: Body::Param)
pub proof fn lemma_specs_callback_safe_inv(&self, gas: nat, param: Body::Param)
ensures
Self::specs_callback(&self.0, gas)(param).safe_inv(),Source§impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> FixWith<LIMIT, Body, Param>
Sourcepub proof fn sound_parser_by_induction(
&self,
gas: nat,
param: Body::Param,
input: Seq<u8>,
n: int,
v: Body::T,
)
pub proof fn sound_parser_by_induction( &self, gas: nat, param: Body::Param, input: Seq<u8>, n: int, v: Body::T, )
ensures
Self::spec_parse_gas(&self.0, gas, param, input) == Some((n, v))
==> {
&&& Self::consistent_gas(&self.0, gas, param, v)
&&& Self::byte_len_gas(&self.0, gas, param, v) == n
},Inductive proof that spec_parse_gas satisfies sound_parser.
Trait Implementations§
Source§impl<const LIMIT: usize, Body, Param> Consistency for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> Consistency for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
Source§open spec fn consistent(&self, v: Self::Val) -> bool
open spec fn consistent(&self, v: Self::Val) -> bool
{ Self::consistent_gas(&self.0, LIMIT as nat, self.1.deep_view(), v) }Source§type Val = <Body as SpecRecBody>::T
type Val = <Body as SpecRecBody>::T
The type of values whose consistency is being checked.
Source§impl<const LIMIT: usize, Body, Param> EquivSerializers for FixWith<LIMIT, Body, Param>where
Body: EquivSerializersGeneralRecBody,
Body::Body: EquivSerializersGeneral,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> EquivSerializers for FixWith<LIMIT, Body, Param>where
Body: EquivSerializersGeneralRecBody,
Body::Body: EquivSerializersGeneral,
Param: DeepView<V = Body::Param>,
Source§impl<const LIMIT: usize, Body, Param> EquivSerializersGeneral for FixWith<LIMIT, Body, Param>where
Body: EquivSerializersGeneralRecBody,
Body::Body: EquivSerializersGeneral,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> EquivSerializersGeneral for FixWith<LIMIT, Body, Param>where
Body: EquivSerializersGeneralRecBody,
Body::Body: EquivSerializersGeneral,
Param: DeepView<V = Body::Param>,
Source§proof fn lemma_serialize_equiv(&self, v: Self::SVal, obuf: Seq<u8>)
proof fn lemma_serialize_equiv(&self, v: Self::SVal, obuf: Seq<u8>)
Source§fn equiv_general_inv(&self) -> bool
fn equiv_general_inv(&self) -> bool
Source§impl<const LIMIT: usize, Body, Param> GoodSerializer for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> GoodSerializer for FixWith<LIMIT, Body, Param>
Source§proof fn lemma_serialize_len(&self, v: Self::SVal)
proof fn lemma_serialize_len(&self, v: Self::SVal)
Source§fn serialize_inv(&self) -> bool
fn serialize_inv(&self) -> bool
Source§impl<const N: usize, Body, Param> LeafNonMalleable for FixWith<N, Body, Param>
impl<const N: usize, Body, Param> LeafNonMalleable for FixWith<N, Body, Param>
Source§proof fn nonmal_leaf_inv(&self)
proof fn nonmal_leaf_inv(&self)
Source§impl<const LIMIT: usize, Body, Param> NoLookAhead for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> NoLookAhead for FixWith<LIMIT, Body, Param>
Source§impl<const LIMIT: usize, Body, Param> NonMalleable for FixWith<LIMIT, Body, Param>where
Body: NonMalleableRecBody,
Body::Body: NonMalleable + SafeParser + SoundParser,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> NonMalleable for FixWith<LIMIT, Body, Param>where
Body: NonMalleableRecBody,
Body::Body: NonMalleable + SafeParser + SoundParser,
Param: DeepView<V = Body::Param>,
Source§proof fn lemma_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)
proof fn lemma_parse_non_malleable(&self, buf1: Seq<u8>, buf2: Seq<u8>)
Source§fn nonmal_inv(&self) -> bool
fn nonmal_inv(&self) -> bool
Source§impl<const LIMIT: usize, Body, Param> NonTailFmt for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> NonTailFmt for FixWith<LIMIT, Body, Param>
Source§proof fn lemma_serialize_dps_prepend(&self, v: Self::SValue, obuf: Seq<u8>)
proof fn lemma_serialize_dps_prepend(&self, v: Self::SValue, obuf: Seq<u8>)
Source§proof fn lemma_serialize_dps_len(&self, v: Self::SValue, obuf: Seq<u8>)
proof fn lemma_serialize_dps_len(&self, v: Self::SValue, obuf: Seq<u8>)
Source§fn serialize_dps_inv(&self) -> bool
fn serialize_dps_inv(&self) -> bool
Source§impl<const LIMIT: usize, Body, Param, I> Parser<I> for FixWith<LIMIT, Body, Param>where
I: InputBuf,
Param: DeepView<V = Body::Param>,
Body: ParserRecBody<I, EP = Param> + ProductiveRecBody,
Body::Body: Productive,
impl<const LIMIT: usize, Body, Param, I> Parser<I> for FixWith<LIMIT, Body, Param>where
I: InputBuf,
Param: DeepView<V = Body::Param>,
Body: ParserRecBody<I, EP = Param> + ProductiveRecBody,
Body::Body: Productive,
Source§impl<T, const LIMIT: usize, Body, Param> Prepare<T> for FixWith<LIMIT, Body, Param>where
T: DeepView<V = Body::T>,
Param: DeepView<V = Body::Param>,
Body: PrepareRecBody<T, EP = Param>,
impl<T, const LIMIT: usize, Body, Param> Prepare<T> for FixWith<LIMIT, Body, Param>where
T: DeepView<V = Body::T>,
Param: DeepView<V = Body::Param>,
Body: PrepareRecBody<T, EP = Param>,
Source§impl<const LIMIT: usize, Body, Param> Productive for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> Productive for FixWith<LIMIT, Body, Param>
Source§proof fn lemma_productive(&self, ibuf: Seq<u8>)
proof fn lemma_productive(&self, ibuf: Seq<u8>)
Source§fn productive_inv(&self) -> bool
fn productive_inv(&self) -> bool
Source§impl<const LIMIT: usize, Body, Param> SPRoundTripDps for FixWith<LIMIT, Body, Param>where
Body: SPRoundTripDpsRecBody + NonTailFmtRecBody,
Body::Body: SPRoundTripDps + NonTailFmt,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> SPRoundTripDps for FixWith<LIMIT, Body, Param>where
Body: SPRoundTripDpsRecBody + NonTailFmtRecBody,
Body::Body: SPRoundTripDps + NonTailFmt,
Param: DeepView<V = Body::Param>,
Source§proof fn theorem_serialize_dps_parse_roundtrip(&self, v: Self::T, obuf: Seq<u8>)
proof fn theorem_serialize_dps_parse_roundtrip(&self, v: Self::T, obuf: Seq<u8>)
Source§fn unambiguous(&self) -> bool
fn unambiguous(&self) -> bool
Source§impl<const LIMIT: usize, Body, Param> SafeParser for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> SafeParser for FixWith<LIMIT, Body, Param>
Source§impl<Output: OutputBuf, T, const LIMIT: usize, Body, Param> Serializer<Output, T> for FixWith<LIMIT, Body, Param>where
T: DeepView<V = Body::T>,
Param: DeepView<V = Body::Param>,
Body: SerializerRecBody<Output, T, EP = Param>,
impl<Output: OutputBuf, T, const LIMIT: usize, Body, Param> Serializer<Output, T> for FixWith<LIMIT, Body, Param>where
T: DeepView<V = Body::T>,
Param: DeepView<V = Body::Param>,
Body: SerializerRecBody<Output, T, EP = Param>,
Source§exec fn serialize_into(&self, v: &T, obuf: &mut Output)
exec fn serialize_into(&self, v: &T, obuf: &mut Output)
Source§impl<const LIMIT: usize, Body, Param> SoundParser for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> SoundParser for FixWith<LIMIT, Body, Param>
Source§impl<const LIMIT: usize, Body, Param> SpecByteLen for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> SpecByteLen for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
Source§impl<const LIMIT: usize, Body, Param> SpecParser for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> SpecParser for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
Source§impl<const LIMIT: usize, Body, Param> SpecSerializer for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> SpecSerializer for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
Source§open spec fn spec_serialize(&self, v: Self::SVal) -> Seq<u8>
open spec fn spec_serialize(&self, v: Self::SVal) -> Seq<u8>
{ Self::spec_serialize_gas(&self.0, LIMIT as nat, self.1.deep_view(), v) }Source§type SVal = <Body as SpecRecBody>::T
type SVal = <Body as SpecRecBody>::T
The type of values to be serialized.
Source§impl<const LIMIT: usize, Body, Param> SpecSerializerDps for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body, Param> SpecSerializerDps for FixWith<LIMIT, Body, Param>where
Body: SpecRecBody,
Param: DeepView<V = Body::Param>,
impl<const LIMIT: usize, Body: Copy, Param: Copy> Copy for FixWith<LIMIT, Body, Param>
Auto Trait Implementations§
impl<const LIMIT: usize, Body, Param> Freeze for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> RefUnwindSafe for FixWith<LIMIT, Body, Param>where
Body: RefUnwindSafe,
Param: RefUnwindSafe,
impl<const LIMIT: usize, Body, Param> Send for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> Sync for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> Unpin for FixWith<LIMIT, Body, Param>
impl<const LIMIT: usize, Body, Param> UnsafeUnpin for FixWith<LIMIT, Body, Param>where
Body: UnsafeUnpin,
Param: UnsafeUnpin,
impl<const LIMIT: usize, Body, Param> UnwindSafe for FixWith<LIMIT, Body, Param>where
Body: UnwindSafe,
Param: UnwindSafe,
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
fn obeys_from_spec() -> bool
fn from_spec(v: T) -> VERUS_SPEC__A
§impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> T
§impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> U
Source§impl<C> NonAmbiguous for Cwhere
C: SPRoundTrip,
impl<C> NonAmbiguous for Cwhere
C: SPRoundTrip,
Source§open spec fn nonamb_inv(&self) -> bool
open spec fn nonamb_inv(&self) -> bool
{ self.sp_roundtrip_inv() }Source§proof fn lemma_serialize_injective(
&self,
v1: <C as Consistency>::Val,
v2: <C as Consistency>::Val,
)
proof fn lemma_serialize_injective( &self, v1: <C as Consistency>::Val, v2: <C as Consistency>::Val, )
Source§impl<C> PSRoundTrip for C
impl<C> PSRoundTrip for C
Source§open spec fn ps_roundtrip_inv(&self) -> bool
open spec fn ps_roundtrip_inv(&self) -> bool
{ self.safe_inv() && self.sound_inv() && self.nonmal_inv() && self.sp_roundtrip_inv() }Source§proof fn theorem_parse_serialize_roundtrip(&self, ibuf: Seq<u8>)
proof fn theorem_parse_serialize_roundtrip(&self, ibuf: Seq<u8>)
Source§impl<C> SPRoundTrip for C
impl<C> SPRoundTrip for C
Source§open spec fn sp_roundtrip_inv(&self) -> bool
open spec fn sp_roundtrip_inv(&self) -> bool
{ self.serialize_inv() && self.equiv_inv() && self.unambiguous() }