IteratorSpec

Trait IteratorSpec 

Source
pub trait IteratorSpec: Iterator {
    // Required methods
    fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool;
    fn completed(&mut self) -> bool;
    fn produces_refl(self);
    fn produces_trans(
        a: Self,
        ab: Seq<Self::Item>,
        b: Self,
        bc: Seq<Self::Item>,
        c: Self,
    );

    // Provided method
    fn map_inv<B, F>(self, func: F) -> MapInv<Self, F> 
       where Self: Sized,
             F: FnMut(Self::Item, Snapshot<Seq<Self::Item>>) -> B { ... }
}

Required Methods§

Source

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(prophetic)

Source

fn completed(&mut self) -> bool

(prophetic)

Source

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Provided Methods§

Source

fn map_inv<B, F>(self, func: F) -> MapInv<Self, F>
where Self: Sized, F: FnMut(Self::Item, Snapshot<Seq<Self::Item>>) -> B,

terminates

ghost

requires

forall<e, i2>
                    self.produces(Seq::singleton(e), i2) ==>
                    func.precondition((e, Snapshot::new(Seq::empty())))

requires

MapInv::<Self, F>::reinitialize()

requires

MapInv::<Self, F>::preservation(self, func)

ensures

result == MapInv { iter: self, func, produced: Snapshot::new(Seq::empty())}

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'a, I, T> IteratorSpec for Cloned<I>
where I: IteratorSpec<Item = &'a T>, T: Clone + 'a,

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    exists<inner: &mut _> *inner == self.iter() && ^inner == (^self).iter() && inner.completed()
}
Source§

fn produces(self, visited: Seq<T>, o: Self) -> bool

(open, prophetic)

pearlite! {
    exists<s: Seq<&'a T>>
           self.iter().produces(s, o.iter())
        && visited.len() == s.len()
        && forall<i> 0 <= i && i < s.len() ==> T::clone.postcondition((s[i],), visited[i])
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans(a: Self, ab: Seq<T>, b: Self, bc: Seq<T>, c: Self)

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, I, T> IteratorSpec for Copied<I>
where I: IteratorSpec<Item = &'a T>, T: Copy + 'a,

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    exists<inner: &mut _> *inner == self.iter() && ^inner == (^self).iter() && inner.completed()
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    exists<s: Seq<&'a T>>
           self.iter().produces(s, o.iter())
        && visited.len() == s.len()
        && forall<i> 0 <= i && i < s.len() ==> visited[i] == *s[i]
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, K: DeepModel, V> IteratorSpec for Iter<'a, K, V>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic, inline)

// `self@` equals the union of `visited` (viewed as a finite map) and `o@`
pearlite! {
    self@.len() == visited.len() + o@.len()
    && (forall<k: &K, v: &V> visited.contains((k, v))
        ==> self@.get(k.deep_model()) == Some(*v) && o@.get(k.deep_model()) == None)
    && (forall<k: K::DeepModelTy, v: V> o@.get(k) == Some(v)
        ==> self@.get(k) == Some(v) && !exists<k2: &K, v2: &V> k2.deep_model() == k && visited.contains((k2, v2)))
    && (forall<k: K::DeepModelTy, v: V> self@.get(k) == Some(v)
        ==> (exists<k2: &K> k2.deep_model() == k && visited.contains((k2, &v))) || o@.get(k) == Some(v))
    && (forall<i1, i2>
        0 <= i1 && i1 < visited.len() && 0 <= i2 && i2 < visited.len()
        && visited[i1].0.deep_model() == visited[i2].0.deep_model()
        ==> i1 == i2)
}
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && self@.is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

proof_assert! { forall<i> 0 <= i && i < bc.len() ==> bc[i] == ab.concat(bc)[ab.len() + i] }

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, K: DeepModel, V> IteratorSpec for IterMut<'a, K, V>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic, inline)

// self@ equals the union of visited (viewed as a fmap) and o@
pearlite! {
    self@.len() == visited.len() + o@.len()
    && (forall<k: K, v: &mut V> visited.contains((&k, v))
        ==> self@.get(k.deep_model()) == Some(v) && o@.get(k.deep_model()) == None)
    && (forall<k: K::DeepModelTy, v: &mut V> o@.get(k) == Some(v)
        ==> self@.get(k) == Some(v) && !exists<k2: &K, v2: &mut V> k2.deep_model() == k && visited.contains((k2, v2)))
    && (forall<k: K::DeepModelTy, v: &mut V> self@.get(k) == Some(v)
        ==> (exists<k1: &K> k1.deep_model() == k && visited.contains((k1, v))) || o@.get(k) == Some(v))
    && (forall<i1, i2>
        0 <= i1 && i1 < visited.len() && 0 <= i2 && i2 < visited.len()
        && visited[i1].0.deep_model() == visited[i2].0.deep_model()
        ==> i1 == i2)
}
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && self@.is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

proof_assert! { forall<i> 0 <= i && i < bc.len() ==> bc[i] == ab.concat(bc)[ab.len() + i] }

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T> IteratorSpec for Iter<'a, T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && (*self@)@ == Seq::empty() }

Source§

fn produces(self, visited: Seq<Self::Item>, tl: Self) -> bool

(open)

pearlite! {
    self@.to_ref_seq() == visited.concat(tl@.to_ref_seq())
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T> IteratorSpec for Iter<'a, T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && (*self@)@ == Seq::empty() }

Source§

fn produces(self, visited: Seq<Self::Item>, tl: Self) -> bool

(open)

pearlite! {
    self@.to_ref_seq() == visited.concat(tl@.to_ref_seq())
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T> IteratorSpec for IterMut<'a, T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && (*self@)@ == Seq::empty() }

Source§

fn produces(self, visited: Seq<Self::Item>, tl: Self) -> bool

(open)

pearlite! {
    self@.to_mut_seq() == visited.concat(tl@.to_mut_seq())
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T: DeepModel> IteratorSpec for Iter<'a, T>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

set_produces(self, visited, o)

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (self@).is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

set_produces_trans(a, ab, b, bc, c);

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T: Eq + Hash + DeepModel, S: BuildHasher> IteratorSpec for Difference<'a, T, S>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

set_produces(self, visited, o)

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && (self@).is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

set_produces_trans(a, ab, b, bc, c);

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<'a, T: Eq + Hash + DeepModel, S: BuildHasher> IteratorSpec for Intersection<'a, T, S>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

set_produces(self, visited, o)

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && (self@).is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

set_produces_trans(a, ab, b, bc, c);

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<A: IteratorSpec, B: IteratorSpec> IteratorSpec for Zip<A, B>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    exists<a: &mut A, b: &mut B>
           *a == (*self).itera() && *b == (*self).iterb()
        && ^a == (^self).itera() && ^b == (^self).iterb()
        && (a.completed() && resolve(b)
            || exists<x: A::Item> inv(x) && (*a).produces(Seq::singleton(x), ^a) &&
                                  resolve(x) && (*b).completed())
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    // Using an `unzip` definition doesn't work well because of issues related to datatypes and `match`
    exists<p1: Seq<_>, p2: Seq<_>>
           p1.len() == p2.len() && p2.len() == visited.len()
        && (forall<i> 0 <= i && i < visited.len() ==> visited[i] == (p1[i], p2[i]))
        && self.itera().produces(p1, o.itera()) && self.iterb().produces(p2, o.iterb())
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: DoubleEndedIteratorSpec> IteratorSpec for Rev<I>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { self.iter_mut().completed() }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    self.iter().produces_back(visited, o.iter())
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec + ?Sized> IteratorSpec for &mut I

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! { (*self).produces(visited, *o) && ^self == ^o }

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (*self).completed() && ^*self == ^^self }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec> IteratorSpec for Enumerate<I>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    exists<inner: &mut _> *inner == self.iter() && ^inner == (^self).iter()
        && inner.completed()
        && self.n()@ == (^self).n()@
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    visited.len() == o.n()@ - self.n()@
    && exists<s: Seq<I::Item>>
           self.iter().produces(s, o.iter())
        && visited.len() == s.len()
        && forall<i> 0 <= i && i < s.len() ==> visited[i].0@ == self.n()@ + i && visited[i].1 == s[i]
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec> IteratorSpec for Fuse<I>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    (self@ == None || exists<it:&mut I> it.completed() && self@ == Some(*it)) &&
    (^self)@ == None
}
Source§

fn produces(self, prod: Seq<Self::Item>, other: Self) -> bool

(open, prophetic)

pearlite! {
    match self@ {
        None => prod == Seq::empty() && other@ == self@,
        Some(i) => match other@ {
            Some(i2) => i.produces(prod, i2),
            None => false,
        },
    }
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec> IteratorSpec for Skip<I>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    (^self).n()@ == 0 &&
    exists<s: Seq<Self::Item>, i: &mut I>
           s.len() <= (*self).n()@
        && self.iter().produces(s, *i)
        && (forall<i> 0 <= i && i < s.len() ==> resolve(s[i]))
        && i.completed()
        && ^i == (^self).iter()
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    visited == Seq::empty() && self == o ||
    o.n()@ == 0 && visited.len() > 0 &&
    exists<s: Seq<Self::Item>>
           s.len() == self.n()@
        && self.iter().produces(s.concat(visited), o.iter())
        && forall<i> 0 <= i && i < s.len() ==> resolve(s[i])
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec> IteratorSpec for Take<I>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    self.n()@ == 0 && resolve(self) ||
    (*self).n()@ > 0 && (*self).n()@ == (^self).n()@ + 1 && self.iter_mut().completed()
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    self.n()@ == o.n()@ + visited.len() && self.iter().produces(visited, o.iter())
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec, B, F: FnMut(I::Item) -> Option<B>> IteratorSpec for FilterMap<I, F>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    (exists<s: Seq<_>, e: &mut I > self.iter().produces(s, *e) && e.completed() &&
        forall<i> 0 <= i && i < s.len() ==> (*self).func().postcondition_mut((s[i],), (^self).func(), None))
    && (*self).func() == (^self).func()
}
Source§

fn produces(self, visited: Seq<Self::Item>, succ: Self) -> bool

(open, prophetic)

pearlite! {
    private_invariant(self) ==>
    self.func().hist_inv(succ.func()) &&
    // f here is a mapping from indices of `visited` to those of `s`, where `s` is the whole sequence produced by the underlying iterator
    // Interestingly, Z3 guesses `f` quite readily but gives up *totally* on `s`. However, the addition of the final assertions on the correctness of the values
    // blocks z3's guess for `f`.
    exists<s: Seq<I::Item>, f: Mapping<Int, Int>> self.iter().produces(s, succ.iter()) &&
        (forall<i> 0 <= i && i < visited.len() ==> 0 <= f.get(i) && f.get(i) < s.len()) &&
        // `f` is a monotone mapping
        (forall<i, j> 0 <= i && i < j && j < visited.len() ==> f.get(i) < f.get(j)) &&
        // `f` points to elements produced in `s` (by the underlying `iter`) for which the predicate `self.func()` returned `Some`.
        (forall<i> 0 <= i && i < visited.len() ==> self.func().postcondition_mut((s[f.get(i)],), self.func(), Some(visited[i]))) &&
        // For other elements not in the image of `f`, the predicate `self.func()` returned `None`.
        (forall<j> 0 <= j && j < s.len()
            ==> (!exists<i> 0 <= i && i < visited.len() && f.get(i) == j) == self.func().postcondition_mut((s[j],), self.func(), None))
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec, B, F: FnMut(I::Item) -> B> IteratorSpec for Map<I, F>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    (exists<inner: &mut _> *inner == self.iter() && ^inner == (^self).iter() && inner.completed())
    && (*self).func() == (^self).func()
}
Source§

fn produces(self, visited: Seq<Self::Item>, succ: Self) -> bool

(open, prophetic, inline)

pearlite! {
    self.func().hist_inv(succ.func())
    && exists<fs: Seq<&mut F>> fs.len() == visited.len()
    && exists<s: Seq<I::Item>>
        #[trigger(self.iter().produces(s, succ.iter()))]
        s.len() == visited.len() && self.iter().produces(s, succ.iter())
    && (forall<i> 1 <= i && i < fs.len() ==>  ^fs[i - 1] == *fs[i])
    && if visited.len() == 0 { self.func() == succ.func() }
       else { *fs[0] == self.func() &&  ^fs[visited.len() - 1] == succ.func() }
    && forall<i> 0 <= i && i < visited.len() ==>
         self.func().hist_inv(*fs[i])
         && (*fs[i]).precondition((s[i],))
         && (*fs[i]).postcondition_mut((s[i],), ^fs[i], visited[i])
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<I: IteratorSpec, F: FnMut(&I::Item) -> bool> IteratorSpec for Filter<I, F>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    (exists<s: Seq<_>, e: &mut I > self.iter().produces(s, *e) && e.completed() &&
        forall<i> 0 <= i && i < s.len() ==> (*self).func().postcondition_mut((&s[i],), (^self).func(), false))
    && (*self).func() == (^self).func()
}
Source§

fn produces(self, visited: Seq<Self::Item>, succ: Self) -> bool

(open, prophetic)

pearlite! {
    private_invariant(self) ==>
    self.func().hist_inv(succ.func()) &&
    // f here is a mapping from indices of `visited` to those of `s`, where `s` is the whole sequence produced by the underlying iterator
    // Interestingly, Z3 guesses `f` quite readily but gives up *totally* on `s`. However, the addition of the final assertions on the correctness of the values
    // blocks z3's guess for `f`.
    exists<s: Seq<Self::Item>, f: Mapping<Int, Int>> self.iter().produces(s, succ.iter()) &&
        (forall<i> 0 <= i && i < visited.len() ==> 0 <= f.get(i) && f.get(i) < s.len()) &&
        // `f` is a monotone mapping
        (forall<i, j> 0 <= i && i < j && j < visited.len() ==> f.get(i) < f.get(j)) &&
        (forall<i> 0 <= i && i < visited.len() ==> visited[i] == s[f.get(i)]) &&
        (forall<i> 0 <= i &&  i < s.len() ==>
            (exists<j> 0 <= j && j < visited.len() && f.get(j) == i) == self.func().postcondition_mut((&s[i],), self.func(), true))
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<Idx: DeepModel<DeepModelTy = Int> + Step> IteratorSpec for Range<Idx>

Available on crate feature nightly only.
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    resolve(self) && self.start.deep_model() >= self.end.deep_model()
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    self.end == o.end && self.start.deep_model() <= o.start.deep_model()
    && (visited.len() > 0 ==> o.start.deep_model() <= o.end.deep_model())
    && visited.len() == o.start.deep_model() - self.start.deep_model()
    && forall<i> 0 <= i && i < visited.len() ==>
        visited[i].deep_model() == self.start.deep_model() + i
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<Idx: DeepModel<DeepModelTy = Int> + Step> IteratorSpec for RangeInclusive<Idx>

Available on crate feature nightly only.
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! {
    self.is_empty_log() && (^self).is_empty_log()
}
Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    visited.len() == range_inclusive_len(self) - range_inclusive_len(o) &&
    (self.is_empty_log() ==> o.is_empty_log()) &&
    (o.is_empty_log() || self.end_log() == o.end_log()) &&
    forall<i> 0 <= i && i < visited.len() ==>
        visited[i].deep_model() == self.start_log().deep_model() + i
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<K: DeepModel, V> IteratorSpec for IntoIter<K, V>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic, inline)

// self@ equals the union of visited (viewed as a fmap) and o@
pearlite! {
    self@.len() == visited.len() + o@.len()
    && (forall<k: K, v: V> visited.contains((k, v))
        ==> self@.get(k.deep_model()) == Some(v) && o@.get(k.deep_model()) == None)
    && (forall<k: K::DeepModelTy, v: V> o@.get(k) == Some(v)
        ==> self@.get(k) == Some(v) && !exists<k2: K, v2: V> k2.deep_model() == k && visited.contains((k2, v2)))
    && (forall<k: K::DeepModelTy, v: V> self@.get(k) == Some(v)
        ==> (exists<k1: K> k1.deep_model() == k && visited.contains((k1, v))) || o@.get(k) == Some(v))
    && (forall<i1, i2>
        0 <= i1 && i1 < visited.len() && 0 <= i2 && i2 < visited.len()
        && visited[i1].0.deep_model() == visited[i2].0.deep_model()
        ==> i1 == i2)
}
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && self@.is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

proof_assert! { forall<i> 0 <= i && i < bc.len() ==> bc[i] == ab.concat(bc)[ab.len() + i] }

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T> IteratorSpec for Empty<T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

resolve(self)

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! { visited == Seq::empty() && self == o }

Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T> IteratorSpec for Once<T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (*self)@ == None && resolve(self) }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! {
    visited == Seq::empty() && self == o ||
    exists<e: Self::Item> self@ == Some(e) && visited == Seq::singleton(e) && o@ == None
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T> IteratorSpec for IntoIter<T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (*self)@ == None && resolve(self) }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    visited == Seq::empty() && self == o ||
    exists<e: Self::Item> self@ == Some(e) && visited == Seq::singleton(e) && o@ == None
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T> IteratorSpec for Iter<'_, T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (*self)@ == None && resolve(self) }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    visited == Seq::empty() && self == o ||
    exists<e: Self::Item> self@ == Some(e) && visited == Seq::singleton(e) && o@ == None
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T> IteratorSpec for IterMut<'_, T>

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (*self)@ == None && resolve(self) }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    visited == Seq::empty() && self == o ||
    exists<e: Self::Item> self@ == Some(e) && visited == Seq::singleton(e) && o@ == None
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T, A: Allocator> IteratorSpec for IntoIter<T, A>

Available on crate feature nightly only.
Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && self@ == Seq::empty() }

Source§

fn produces(self, visited: Seq<T>, rhs: Self) -> bool

(open)

pearlite! {
    self@ == visited.concat(rhs@)
}
Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans(a: Self, ab: Seq<T>, b: Self, bc: Seq<T>, c: Self)

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T, const N: usize> IteratorSpec for IntoIter<T, N>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

pearlite! { self@ == visited.concat(o@) }

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { resolve(self) && self@ == Seq::empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

{}

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T: DeepModel> IteratorSpec for IntoIter<T>

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open, prophetic)

set_produces(self, visited, o)

Source§

fn completed(&mut self) -> bool

(open, prophetic)

pearlite! { (self@).is_empty() }

Source§

fn produces_refl(self)

(open, law)

{}

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(open, law)

set_produces_trans(a, ab, b, bc, c);

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Source§

impl<T: Clone> IteratorSpec for Repeat<T>

Source§

fn completed(&mut self) -> bool

(open)

pearlite! { false }

Source§

fn produces(self, visited: Seq<Self::Item>, o: Self) -> bool

(open)

pearlite! {
    self == o &&
    forall<i> 0 <= i && i < visited.len() ==> T::clone.postcondition((&self@,), visited[i])
}
Source§

fn produces_refl(self)

(law)

ensures

self.produces(Seq::empty(), self)

Source§

fn produces_trans( a: Self, ab: Seq<Self::Item>, b: Self, bc: Seq<Self::Item>, c: Self, )

(law)

requires

a.produces(ab, b)

requires

b.produces(bc, c)

ensures

a.produces(ab.concat(bc), c)

Implementors§

Source§

impl<'a, T> IteratorSpec for SeqIterRef<'a, T>

Source§

impl<I: IteratorSpec, B, F: FnMut(I::Item, Snapshot<Seq<I::Item>>) -> B> IteratorSpec for MapInv<I, F>

Source§

impl<T> IteratorSpec for SeqIter<T>