pub struct FMap<K, V>(/* private fields */);Expand description
A finite map type usable in pearlite and ghost! blocks.
If you need an infinite map, see Mapping.
§Ghost
Since std::collections::HashMap and std::collections::BTreeMap have
finite capacity, this could cause some issues in ghost code:
ghost! {
let mut map = HashMap::new();
for _ in 0..=usize::MAX as u128 + 1 {
map.insert(0, 0); // cannot fail, since we are in a ghost block
}
proof_assert!(map.len() <= usize::MAX@); // by definition
proof_assert!(map.len() > usize::MAX@); // uh-oh
}This type is designed for this use-case, with no restriction on the capacity.
Implementations§
Source§impl<K, V> FMap<K, V>
Logical definitions
impl<K, V> FMap<K, V>
Logical definitions
Sourcepub fn to_mapping(self) -> Mapping<K, Option<V>>
pub fn to_mapping(self) -> Mapping<K, Option<V>>
The actual content of the map: other methods are specified relative to this.
logic(opaque) ⚠
Sourcepub fn empty() -> Self
pub fn empty() -> Self
Returns the empty map.
logic(opaque) ⚠
ensures
result.len() == 0ensures
result.to_mapping() == Mapping::cst(None)Sourcepub fn len(self) -> Int
pub fn len(self) -> Int
The number of elements in the map, also called its length.
logic(opaque) ⚠
ensures
result >= 0Sourcepub fn insert(self, k: K, v: V) -> Self
pub fn insert(self, k: K, v: V) -> Self
Returns a new map, where the key-value pair (k, v) has been inserted.
logic(opaque) ⚠
ensures
result.to_mapping() == self.to_mapping().set(k, Some(v))ensures
result.len() == if self.contains(k) { self.len() } else { self.len() + 1 }
Sourcepub fn singleton(k: K, v: V) -> Self
pub fn singleton(k: K, v: V) -> Self
Returns the map where containing the only key-value pair (k, v).
logic(open)
Self::empty().insert(k, v)Sourcepub fn remove(self, k: K) -> Self
pub fn remove(self, k: K) -> Self
Returns a new map, where the key k is no longer present.
logic(opaque) ⚠
ensures
result.to_mapping() == self.to_mapping().set(k, None)ensures
result.len() == if self.contains(k) {self.len() - 1} else {self.len()}Sourcepub fn get(self, k: K) -> Option<V>
pub fn get(self, k: K) -> Option<V>
Get the value associated with key k in the map.
If no value is present, returns None.
logic(open, inline)
self.to_mapping().get(k)Sourcepub fn lookup(self, k: K) -> V
pub fn lookup(self, k: K) -> V
Get the value associated with key k in the map.
If no value is present, the returned value is meaningless.
logic(open, inline)
self.get(k).unwrap_logic()Sourcepub fn contains(self, k: K) -> bool
pub fn contains(self, k: K) -> bool
Returns true if the map contains a value for the specified key.
logic(open, inline)
self.get(k) != NoneSourcepub fn is_empty(self) -> bool
pub fn is_empty(self) -> bool
Returns true if the map contains no elements.
logic(open)
self.ext_eq(FMap::empty())Sourcepub fn disjoint(self, other: Self) -> bool
pub fn disjoint(self, other: Self) -> bool
Returns true if the two maps have no key in common.
logic(open)
forall<k: K> !self.contains(k) || !other.contains(k)Sourcepub fn subset(self, other: Self) -> bool
pub fn subset(self, other: Self) -> bool
Returns true if all key-value pairs in self are also in other.
logic(open)
forall<k: K> self.contains(k) ==> other.get(k) == self.get(k)Sourcepub fn union(self, other: Self) -> Self
pub fn union(self, other: Self) -> Self
Returns a new map, which is the union of self and other.
If self and other are not disjoint, the result is unspecified.
logic(opaque) ⚠
requires
self.disjoint(other)ensures
forall<k: K> #[trigger(result.get(k))] !self.contains(k) ==> result.get(k) == other.get(k)
ensures
forall<k: K> #[trigger(result.get(k))] !other.contains(k) ==> result.get(k) == self.get(k)
ensures
result.len() == self.len() + other.len()Sourcepub fn subtract(self, other: Self) -> Self
pub fn subtract(self, other: Self) -> Self
Returns a new map, that contains all the key-value pairs of self such that the
key is not in other.
logic(opaque) ⚠
ensures
result.disjoint(other)ensures
other.subset(self) ==> other.union(result) == selfensures
forall<k: K> #[trigger(result.get(k))] result.get(k) == if other.contains(k) { None } else { self.get(k) }
Sourcepub fn ext_eq(self, other: Self) -> bool
pub fn ext_eq(self, other: Self) -> bool
Extensional equality.
Returns true if self and other contain exactly the same key-value pairs.
This is in fact equivalent with normal equality.
logic(open)
let _ = Self::to_mapping_inj; forall<k: K> self.get(k) == other.get(k)
ensures
result == (self == other)Sourcepub fn merge(self, m: FMap<K, V>, f: Mapping<(V, V), V>) -> FMap<K, V> ⓘ
pub fn merge(self, m: FMap<K, V>, f: Mapping<(V, V), V>) -> FMap<K, V> ⓘ
Merge the two maps together
If both map contain the same key, the entry for the result is determined by f.
logic(opaque) ⚠
ensures
forall<k: K> #[trigger(result.get(k))] match (self.get(k), m.get(k)) { (None, y) => result.get(k) == y, (x, None) => result.get(k) == x, (Some(x), Some(y)) => result.get(k) == Some(f[(x, y)]), }
Sourcepub fn map<V2>(self, f: Mapping<(K, V), V2>) -> FMap<K, V2> ⓘ
pub fn map<V2>(self, f: Mapping<(K, V), V2>) -> FMap<K, V2> ⓘ
Map every value in self according to f. Keys are unchanged.
logic ⚠
ensures
forall<k: K> #[trigger(result.get(k))] result.get(k) == match self.get(k) { None => None, Some(v) => Some(f[(k, v)]), }
ensures
result.len() == self.len()Sourcepub fn filter(self, p: Mapping<(K, V), bool>) -> Self
pub fn filter(self, p: Mapping<(K, V), bool>) -> Self
Filter key-values in self according to p.
A key-value pair will be in the result map if and only if it is in self and
p returns true on this pair.
logic ⚠
ensures
forall<k: K> #[trigger(result.get(k))] result.get(k) == match self.get(k) { None => None, Some(v) => if p[(k, v)] { Some(v) } else { None }, }
Sourcepub fn filter_map<V2>(self, f: Mapping<(K, V), Option<V2>>) -> FMap<K, V2> ⓘ
pub fn filter_map<V2>(self, f: Mapping<(K, V), Option<V2>>) -> FMap<K, V2> ⓘ
Map every value in self according to f. Keys are unchanged.
If f returns false, remove the key-value from the map.
logic(opaque) ⚠
ensures
forall<k: K> #[trigger(result.get(k))] result.get(k) == match self.get(k) { None => None, Some(v) => f[(k, v)], }
Source§impl<K, V> FMap<K, V>
Ghost definitions
impl<K, V> FMap<K, V>
Ghost definitions
Sourcepub fn new() -> Ghost<Self>
pub fn new() -> Ghost<Self>
Create a new, empty map on the ghost heap.
terminates
ghost
ensures
result.is_empty()Sourcepub fn len_ghost(&self) -> Int
pub fn len_ghost(&self) -> Int
Returns the number of elements in the map.
If you need to get the length in pearlite, consider using len.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
let len1 = map.len_ghost();
map.insert_ghost(1, 21);
map.insert_ghost(1, 42);
map.insert_ghost(2, 50);
let len2 = map.len_ghost();
proof_assert!(len1 == 0);
proof_assert!(len2 == 2);
};terminates
ghost
ensures
result == self.len()Sourcepub fn is_empty_ghost(&self) -> bool
pub fn is_empty_ghost(&self) -> bool
terminates
ghost
ensures
result == (self.len() == 0 && forall<k> !self.contains(k))Sourcepub fn contains_ghost(&self, key: &K) -> bool
pub fn contains_ghost(&self, key: &K) -> bool
Returns true if the map contains a value for the specified key.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
map.insert_ghost(1, 42);
let (b1, b2) = (map.contains_ghost(&1), map.contains_ghost(&2));
proof_assert!(b1);
proof_assert!(!b2);
};terminates
ghost
ensures
result == self.contains(*key)Sourcepub fn get_ghost(&self, key: &K) -> Option<&V>
pub fn get_ghost(&self, key: &K) -> Option<&V>
Returns a reference to the value corresponding to the key.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
map.insert_ghost(1, 2);
let x1 = map.get_ghost(&1);
let x2 = map.get_ghost(&2);
proof_assert!(x1 == Some(&2));
proof_assert!(x2 == None);
};terminates
ghost
ensures
result == self.get(*key).map_logic(|v|&v)Sourcepub fn get_mut_ghost(&mut self, key: &K) -> Option<&mut V>
pub fn get_mut_ghost(&mut self, key: &K) -> Option<&mut V>
Returns a mutable reference to the value corresponding to the key.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
map.insert_ghost(1, 21);
if let Some(x) = map.get_mut_ghost(&1) {
*x = 42;
}
proof_assert!(map[1i32] == 42i32);
};terminates
ghost
ensures
if self.contains(*key) { match result { None => false, Some(r) => (^self).contains(*key) && self[*key] == *r && (^self)[*key] == ^r, } } else { result == None && *self == ^self }
ensures
forall<k: K> k != *key ==> (*self).get(k) == (^self).get(k)ensures
(*self).len() == (^self).len()Sourcepub fn split_mut_ghost(&mut self, key: &K) -> (&mut V, &mut Self)
pub fn split_mut_ghost(&mut self, key: &K) -> (&mut V, &mut Self)
Returns a mutable reference to the value corresponding to a key, while still allowing modification on the other keys.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
map.insert_ghost(1, 21);
map.insert_ghost(2, 42);
let (x, map2) = map.split_mut_ghost(&1);
*x = 22;
map2.insert_ghost(3, 30);
map2.insert_ghost(1, 56); // This modification will be ignored on `map`
proof_assert!(map[1i32] == 22i32);
proof_assert!(map[2i32] == 42i32);
proof_assert!(map[3i32] == 30i32);
};terminates
ghost
requires
self.contains(*key)ensures
*result.1 == (*self).remove(*key)ensures
self[*key] == *result.0 && ^self == (^result.1).insert(*key, ^result.0)Sourcepub fn insert_ghost(&mut self, key: K, value: V) -> Option<V>
pub fn insert_ghost(&mut self, key: K, value: V) -> Option<V>
Inserts a key-value pair into the map.
If the map did not have this key present, None is returned.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
ghost! {
let res1 = map.insert_ghost(37, 41);
proof_assert!(res1 == None);
proof_assert!(map.is_empty() == false);
let res2 = map.insert_ghost(37, 42);
proof_assert!(res2 == Some(41));
proof_assert!(map[37i32] == 42i32);
};terminates
ghost
ensures
^self == (*self).insert(key, value)ensures
result == (*self).get(key)Sourcepub fn remove_ghost(&mut self, key: &K) -> Option<V>
pub fn remove_ghost(&mut self, key: &K) -> Option<V>
Removes a key from the map, returning the value at the key if the key was previously in the map.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut map = FMap::new();
let res = ghost! {
map.insert_ghost(1, 42);
let res1 = map.remove_ghost(&1);
let res2 = map.remove_ghost(&1);
proof_assert!(res1 == Some(42i32));
proof_assert!(res2 == None);
};terminates
ghost
ensures
^self == (*self).remove(*key)ensures
result == (*self).get(*key)Sourcepub fn clear_ghost(&mut self)
pub fn clear_ghost(&mut self)
Clears the map, removing all values.
§Example
use creusot_std::{logic::FMap, prelude::*};
let mut s = FMap::new();
ghost! {
s.insert_ghost(1, 2);
s.insert_ghost(2, 3);
s.insert_ghost(3, 42);
s.clear_ghost();
proof_assert!(s == FMap::empty());
};terminates
ghost
ensures
^self == Self::empty()Sourcepub fn remove_one_ghost(&mut self) -> Option<(K, V)>
pub fn remove_one_ghost(&mut self) -> Option<(K, V)>
terminates
ghost
ensures
match result { None => *self == ^self && self.is_empty(), Some((k, v)) => *self == (^self).insert(k, v) && !(^self).contains(k), }
Sourcepub fn to_seq(self) -> Seq<(K, V)>
pub fn to_seq(self) -> Seq<(K, V)>
terminates
ghost
ensures
result.len() == self.len()ensures
forall<k, v> (self.get(k) == Some(v)) == (exists<i> result.get(i) == Some((k, v)))
Trait Implementations§
Source§impl<K, V> IndexLogic<K> for FMap<K, V>
impl<K, V> IndexLogic<K> for FMap<K, V>
Source§impl<'a, K, V> IntoIterator for &'a FMap<K, V>
impl<'a, K, V> IntoIterator for &'a FMap<K, V>
Source§impl<K, V> Iterator for FMap<K, V>
impl<K, V> Iterator for FMap<K, V>
Source§fn next(&mut self) -> Option<(K, V)>
fn next(&mut self) -> Option<(K, V)>
terminates
ghost
ensures
match result { None => self.completed(), Some((k, v)) => (*self).produces(Seq::singleton((k, v)), ^self) && (*self) == (^self).insert(k, v), }
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 · Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse)separator between adjacent
items of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse)separator
between adjacent items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Source§impl<K, V> IteratorSpec for FMap<K, V>
impl<K, V> IteratorSpec for FMap<K, V>
Source§fn produces(self, visited: Seq<(K, V)>, o: Self) -> bool
fn produces(self, visited: Seq<(K, V)>, o: Self) -> bool
logic(open, prophetic)
/* Macro-generated */Source§fn produces_refl(self)
fn produces_refl(self)
logic(law) ⚠
ensures
self.produces(Seq::empty(), self)Source§impl<K, V: RA> LocalUpdate<FMap<K, V>> for FMapInsertLocalUpdate<K, V>
impl<K, V: RA> LocalUpdate<FMap<K, V>> for FMapInsertLocalUpdate<K, V>
Source§fn premise(self, from_auth: FMap<K, V>, _: FMap<K, V>) -> bool
fn premise(self, from_auth: FMap<K, V>, _: FMap<K, V>) -> bool
logic(open, inline)
from_auth.get(*self.0) == NoneSource§fn update(
self,
from_auth: FMap<K, V>,
from_frag: FMap<K, V>,
) -> (FMap<K, V>, FMap<K, V>)
fn update( self, from_auth: FMap<K, V>, from_frag: FMap<K, V>, ) -> (FMap<K, V>, FMap<K, V>)
logic(open, inline)
from_auth.insert(*self.0, *self.1), from_frag.insert(*self.0, *self.1)
Source§fn frame_preserving(
self,
from_auth: FMap<K, V>,
from_frag: FMap<K, V>,
frame: Option<FMap<K, V>>,
)
fn frame_preserving( self, from_auth: FMap<K, V>, from_frag: FMap<K, V>, frame: Option<FMap<K, V>>, )
logic ⚠
requires
self.premise(from_auth, from_frag)requires
Some(from_frag).op(frame) == Some(Some(from_auth))ensures
let (to_auth, to_frag) = self.update(from_auth, from_frag); Some(to_frag).op(frame) == Some(Some(to_auth))
Source§impl<K, V: RA> RA for FMap<K, V>
impl<K, V: RA> RA for FMap<K, V>
Source§fn op(self, other: Self) -> Option<Self>
fn op(self, other: Self) -> Option<Self>
logic(open)
if (forall<k: K> self.get(k).op(other.get(k)) != None) { Some(self.total_op(other)) } else { None }
Source§fn factor(self, factor: Self) -> Option<Self>
fn factor(self, factor: Self) -> Option<Self>
logic(open)
/* Macro-generated */ensures
match result { Some(c) => factor.op(c) == Some(self), None => forall<c: Self> factor.op(c) != Some(self), }
Source§fn eq(self, other: Self) -> bool
fn eq(self, other: Self) -> bool
logic(open, inline)
let _ = Self::ext_eq; forall<k: K> self.get(k).eq(other.get(k))
ensures
result == (self == other)Source§fn commutative(a: Self, b: Self)
fn commutative(a: Self, b: Self)
logic(law) ⚠
ensures
a.op(b) == b.op(a)Source§fn associative(a: Self, b: Self, c: Self)
fn associative(a: Self, b: Self, c: Self)
logic ⚠
ensures
a.op(b).and_then_logic(|ab: Self| ab.op(c)) == b.op(c).and_then_logic(|bc| a.op(bc))
Source§fn core_idemp(self)
fn core_idemp(self)
logic ⚠
requires
self.core() != Noneensures
let c = self.core().unwrap_logic(); c.op(c) == Some(c)
ensures
self.core().unwrap_logic().op(self) == Some(self)Source§fn core_is_maximal_idemp(self, i: Self)
fn core_is_maximal_idemp(self, i: Self)
logic ⚠
requires
i.op(i) == Some(i)requires
i.op(self) == Some(self)ensures
match self.core() { Some(c) => i.incl(c), None => false, }
Source§fn incl_eq(self, other: Self) -> bool
fn incl_eq(self, other: Self) -> bool
logic(open, sealed) Read more
Source§fn incl_eq_op(a: Self, b: Self, x: Self) -> bool
fn incl_eq_op(a: Self, b: Self, x: Self) -> bool
Source§fn update_nondet(self, s: Set<Self>) -> bool
fn update_nondet(self, s: Set<Self>) -> bool
Resource::update_nondet. Read moreSource§fn associative_none(a: Self, b: Self, c: Self, bc: Self)
fn associative_none(a: Self, b: Self, c: Self, bc: Self)
Source§fn associative_some(a: Self, b: Self, c: Self, ab: Self, bc: Self)
fn associative_some(a: Self, b: Self, c: Self, ab: Self, bc: Self)
Self::associative, in the case where a.op(b) and b.op(c)
are both valid. Read moreSource§fn incl_transitive(a: Self, b: Self, c: Self)
fn incl_transitive(a: Self, b: Self, c: Self)
Source§impl<K, V: RA> UnitRA for FMap<K, V>
impl<K, V: RA> UnitRA for FMap<K, V>
Source§fn unit() -> Self
fn unit() -> Self
logic(open)
proof_assert!(forall<x: Self> x.op(Self::empty()).unwrap_logic().ext_eq(x)); Self::empty()
ensures
forall<x: Self> #[trigger(x.op(result))] x.op(result) == Some(x)Source§fn core_total(self) -> Self
fn core_total(self) -> Self
logic(open)
self.filter_map(|(_, v): (K, V)| v.core())ensures
self.core() == Some(result)Source§fn core_total_idemp(self)
fn core_total_idemp(self)
logic ⚠
ensures
self.core_total().op(self.core_total()) == Some(self.core_total())ensures
self.core_total().op(self) == Some(self)