From 3020189c1c3e958dc4ec4b9344ad5876d9f9211a Mon Sep 17 00:00:00 2001 From: Li-yao Xia Date: Fri, 13 Dec 2024 18:52:19 +0100 Subject: [PATCH] Add various specs for HashSet, FSet, and iterators (ranges, filter_map, rev) - Also strengthen the spec of filter Note: the spec for `Borrow` is required for `HashSet::contains` --- creusot-contracts/src/logic.rs | 2 +- creusot-contracts/src/logic/fset.rs | 207 +- creusot-contracts/src/std.rs | 1 + creusot-contracts/src/std/borrow.rs | 18 + .../src/std/collections/hash_set.rs | 8 +- creusot-contracts/src/std/iter.rs | 56 + creusot-contracts/src/std/iter/filter.rs | 7 +- creusot-contracts/src/std/iter/filter_map.rs | 113 + creusot-contracts/src/std/iter/range.rs | 54 +- creusot-contracts/src/std/iter/rev.rs | 56 + .../creusot-contracts/creusot-contracts.coma | 3795 +++++++++++++---- .../creusot-contracts/why3session.xml | 338 +- .../creusot-contracts/why3shapes.gz | Bin 28585 -> 33494 bytes creusot/tests/should_succeed/100doors.coma | 8 +- creusot/tests/should_succeed/bug/164.coma | 8 +- creusot/tests/should_succeed/cc/array.coma | 4 +- .../tests/should_succeed/cc/collections.coma | 108 +- creusot/tests/should_succeed/cc/fset.coma | 96 + creusot/tests/should_succeed/cc/fset.rs | 14 + .../should_succeed/cc/fset/why3session.xml | 24 + .../should_succeed/cc/fset/why3shapes.gz | Bin 0 -> 220 bytes creusot/tests/should_succeed/cc/iter.coma | 1095 ++++- creusot/tests/should_succeed/cc/iter.rs | 21 + .../should_succeed/cc/iter/why3session.xml | 217 + .../should_succeed/cc/iter/why3shapes.gz | Bin 517 -> 3844 bytes .../tests/should_succeed/ghost/ghost_set.coma | 30 +- creusot/tests/should_succeed/hillel.coma | 24 +- .../tests/should_succeed/insertion_sort.coma | 8 +- .../iterators/03_std_iterators.coma | 80 +- .../iterators/08_collect_extend.coma | 42 +- .../should_succeed/iterators/17_filter.coma | 24 +- .../iterators/17_filter/why3session.xml | 24 +- .../iterators/17_filter/why3shapes.gz | Bin 5960 -> 6060 bytes .../tests/should_succeed/knapsack_full.coma | 28 +- .../rusthorn/inc_max_repeat.coma | 8 +- .../selection_sort_generic.coma | 8 +- creusot/tests/should_succeed/sum.coma | 28 +- creusot/tests/should_succeed/sum_of_odds.coma | 8 +- creusot/tests/should_succeed/vector/01.coma | 8 +- .../vector/03_knuth_shuffle.coma | 8 +- .../vector/06_knights_tour.coma | 32 +- .../should_succeed/vector/08_haystack.coma | 28 +- 42 files changed, 5597 insertions(+), 1041 deletions(-) create mode 100644 creusot-contracts/src/std/borrow.rs create mode 100644 creusot-contracts/src/std/iter/filter_map.rs create mode 100644 creusot-contracts/src/std/iter/rev.rs create mode 100644 creusot/tests/should_succeed/cc/fset.coma create mode 100644 creusot/tests/should_succeed/cc/fset.rs create mode 100644 creusot/tests/should_succeed/cc/fset/why3session.xml create mode 100644 creusot/tests/should_succeed/cc/fset/why3shapes.gz diff --git a/creusot-contracts/src/logic.rs b/creusot-contracts/src/logic.rs index f923da0be0..7da466a3d2 100644 --- a/creusot-contracts/src/logic.rs +++ b/creusot-contracts/src/logic.rs @@ -5,7 +5,7 @@ #![cfg_attr(not(creusot), allow(unused_imports))] mod fmap; -mod fset; +pub mod fset; mod int; mod mapping; pub mod ops; diff --git a/creusot-contracts/src/logic/fset.rs b/creusot-contracts/src/logic/fset.rs index 469bbb09c7..296fa1fb4b 100644 --- a/creusot-contracts/src/logic/fset.rs +++ b/creusot-contracts/src/logic/fset.rs @@ -1,4 +1,4 @@ -use crate::*; +use crate::{logic::Mapping, *}; /// A finite set type usable in pearlite and `ghost!` blocks. /// @@ -142,6 +142,15 @@ impl FSet { Self::is_subset(other, self) } + /// Returns `true` if `self` and `other` are disjoint. + #[trusted] + #[predicate] + #[creusot::builtins = "set.Fset.disjoint"] + pub fn disjoint(self, other: Self) -> bool { + let _ = other; + dead + } + /// Returns the number of elements in the set, also called its length. #[trusted] #[logic] @@ -171,8 +180,6 @@ impl FSet { /// Returns `true` if `self` and `other` contain exactly the same elements. /// /// This is in fact equivalent with normal equality. - // FIXME: remove `trusted` - #[trusted] #[open] #[predicate] #[ensures(result ==> self == other)] @@ -186,6 +193,119 @@ impl FSet { } } +impl FSet { + /// Returns the set containing only `x`. + #[logic] + #[open] + #[ensures(forall result.contains(y) == (x == y))] + pub fn singleton(x: T) -> Self { + FSet::EMPTY.insert(x) + } + + /// Returns the union of sets `f(t)` over all `t: T`. + #[logic] + #[open] + #[ensures(forall result.contains(y) == exists self.contains(x) && f.get(x).contains(y))] + #[variant(self.len())] + pub fn unions(self, f: Mapping>) -> FSet { + if self.len() == 0 { + FSet::EMPTY + } else { + let x = self.peek(); + f.get(x).union(self.remove(x).unions(f)) + } + } + + /// Flipped `map`. + #[logic] + #[trusted] + #[creusot::builtins = "set.Fset.map"] + pub fn fmap(_: Mapping, _: Self) -> FSet { + dead + } + + /// Returns the image of a set by a function. + #[logic] + #[open] + pub fn map(self, f: Mapping) -> FSet { + FSet::fmap(f, self) + } + + /// Returns the subset of elements of `self` which satisfy the predicate `f`. + #[logic] + #[trusted] + #[creusot::builtins = "set.Fset.filter"] + pub fn filter(self, f: Mapping) -> Self { + let _ = f; + dead + } + + /// Returns the set of sequences whose head is in `s` and whose tail is in `ss`. + #[logic] + #[trusted] // TODO: remove. Needs support for closures in logic functions with constraints + #[open] + #[ensures(forall> result.contains(xs) == (0 < xs.len() && s.contains(xs[0]) && ss.contains(xs.tail())))] + pub fn cons(s: FSet, ss: FSet>) -> FSet> { + s.unions(|x| ss.map(|xs: Seq<_>| xs.push_front(x))) + } + + /// Returns the set of concatenations of a sequence in `s` and a sequence in `t`. + #[logic] + #[trusted] // TODO: remove. Needs support for closures in logic functions with constraints + #[open] + #[ensures(forall> result.contains(xs) == (exists, zs: Seq> s.contains(ys) && t.contains(zs) && xs == ys.concat(zs)))] + pub fn concat(s: FSet>, t: FSet>) -> FSet> { + s.unions(|ys: Seq<_>| t.map(|zs| ys.concat(zs))) + } + + /// Returns the set of sequences of length `n` whose elements are in `self`. + #[open] + #[logic] + #[requires(n >= 0)] + #[ensures(forall> result.contains(xs) == (xs.len() == n && forall xs.contains(x) ==> self.contains(x)))] + #[variant(n)] + pub fn replicate(self, n: Int) -> FSet> { + pearlite! { + if n == 0 { + proof_assert! { forall> xs.len() == 0 ==> xs == Seq::EMPTY }; + FSet::singleton(Seq::EMPTY) + } else { + proof_assert! { forall, i: Int> 0 < i && i < xs.len() ==> xs[i] == xs.tail()[i-1] }; + FSet::cons(self, self.replicate(n - 1)) + } + } + } + + /// Returns the set of sequences of length at most `n` whose elements are in `self`. + #[open] + #[logic] + #[requires(n >= 0)] + #[ensures(forall> result.contains(xs) == (xs.len() <= n && forall xs.contains(x) ==> self.contains(x)))] + #[variant(n)] + pub fn replicate_up_to(self, n: Int) -> FSet> { + pearlite! { + if n == 0 { + proof_assert! { forall> xs.len() == 0 ==> xs == Seq::EMPTY }; + FSet::singleton(Seq::EMPTY) + } else { + self.replicate_up_to(n - 1).union(self.replicate(n)) + } + } + } +} + +impl FSet { + /// Return the interval of integers in `[i, j)`. + #[logic] + #[open] + #[trusted] + #[creusot::builtins = "set.FsetInt.interval"] + pub fn interval(i: Int, j: Int) -> FSet { + let _ = (i, j); + dead + } +} + /// Ghost definitions impl FSet { /// Create a new, empty set on the ghost heap. @@ -337,3 +457,84 @@ impl Invariant for FSet { pearlite! { forall self.contains(*x) ==> inv(*x) } } } + +// Properties + +/// Distributivity of `unions` over `union`. +#[logic] +#[open] +#[ensures(forall, s2: FSet, f: Mapping>> s1.union(s2).unions(f) == s1.unions(f).union(s2.unions(f)))] +#[ensures(forall, f: Mapping>, g: Mapping>> + s.unions(|x| f.get(x).union(g.get(x))) == s.unions(f).union(s.unions(g)))] +pub fn unions_union() {} + +/// Distributivity of `map` over `union`. +#[logic] +#[open] +#[ensures(forall, t: FSet, f: Mapping> s.union(t).map(f) == s.map(f).union(t.map(f)))] +pub fn map_union() {} + +/// Distributivity of `concat` over `union`. +#[logic] +#[open] +#[ensures(forall>, s2: FSet>, t: FSet>> + FSet::concat(s1.union(s2), t) == FSet::concat(s1, t).union(FSet::concat(s2, t)))] +#[ensures(forall>, t1: FSet>, t2: FSet>> + FSet::concat(s, t1.union(t2)) == FSet::concat(s, t1).union(FSet::concat(s, t2)))] +pub fn concat_union() {} + +/// Distributivity of `cons` over `union`. +#[logic] +#[open] +#[ensures(forall, t: FSet>, u: FSet>> FSet::concat(FSet::cons(s, t), u) == FSet::cons(s, FSet::concat(t, u)))] +pub fn cons_concat() { + proof_assert! { forall, ys: Seq> xs.push_front(x).concat(ys) == xs.concat(ys).push_front(x) }; + proof_assert! { forall> ys.push_front(x).tail() == ys }; + proof_assert! { forall> 0 < ys.len() ==> ys == ys.tail().push_front(ys[0]) }; +} + +/// Distributivity of `replicate` over `union`. +#[logic] +#[open] +#[requires(0 <= n && 0 <= m)] +#[ensures(s.replicate(n + m) == FSet::concat(s.replicate(n), s.replicate(m)))] +#[variant(n)] +pub fn concat_replicate(n: Int, m: Int, s: FSet) { + pearlite! { + if n == 0 { + concat_empty(s.replicate(m)); + } else { + cons_concat::(); + concat_replicate(n - 1, m, s); + } + } +} + +/// The neutral element of `FSet::concat` is `FSet::singleton(Seq::EMPTY)`. +#[logic] +#[open] +#[ensures(FSet::concat(FSet::singleton(Seq::EMPTY), s) == s)] +#[ensures(FSet::concat(s, FSet::singleton(Seq::EMPTY)) == s)] +pub fn concat_empty(s: FSet>) { + proof_assert! { forall> xs.concat(Seq::EMPTY) == xs }; + proof_assert! { forall> Seq::EMPTY.concat(xs) == xs }; +} + +/// An equation relating `s.replicate_up_to(m)` and `s.replicate_up_to(n)`. +#[logic] +#[open] +#[requires(0 <= n && n < m)] +#[ensures(s.replicate_up_to(m) == s.replicate_up_to(n).union( + FSet::concat(s.replicate(n + 1), s.replicate_up_to(m - n - 1))))] +#[variant(m)] +pub fn concat_replicate_up_to(n: Int, m: Int, s: FSet) { + pearlite! { + if n + 1 == m { + concat_empty(s.replicate(n + 1)); + } else { + concat_union::(); + concat_replicate(n, m - n - 1, s); + concat_replicate_up_to(n, m - 1, s); + } + } +} diff --git a/creusot-contracts/src/std.rs b/creusot-contracts/src/std.rs index 08c5948870..ddfc347ff7 100644 --- a/creusot-contracts/src/std.rs +++ b/creusot-contracts/src/std.rs @@ -1,6 +1,7 @@ pub use ::std::*; pub mod array; +pub mod borrow; pub mod boxed; pub mod clone; pub mod collections { diff --git a/creusot-contracts/src/std/borrow.rs b/creusot-contracts/src/std/borrow.rs new file mode 100644 index 0000000000..d2fdd19f04 --- /dev/null +++ b/creusot-contracts/src/std/borrow.rs @@ -0,0 +1,18 @@ +use crate::*; +use ::std::borrow::Borrow; + +extern_spec! { + mod std { + mod borrow { + trait Borrow + where Borrowed: ?Sized + { + #[ensures(result.deep_model() == self.deep_model())] + fn borrow(&self) -> &Borrowed + where + Self: DeepModel, + Borrowed: DeepModel; + } + } + } +} diff --git a/creusot-contracts/src/std/collections/hash_set.rs b/creusot-contracts/src/std/collections/hash_set.rs index 41bd35d589..a5b16c7b04 100644 --- a/creusot-contracts/src/std/collections/hash_set.rs +++ b/creusot-contracts/src/std/collections/hash_set.rs @@ -3,7 +3,7 @@ use crate::{ std::iter::{FromIterator, IntoIterator, Iterator}, *, }; -use ::std::{collections::hash_set::*, hash::*}; +use ::std::{borrow::Borrow, collections::hash_set::*, hash::*}; impl View for HashSet { type ViewTy = FSet; @@ -31,6 +31,12 @@ extern_spec! { { #[ensures(result@ == self@.intersection(other@))] fn intersection<'a>(&'a self, other: &'a HashSet) -> Intersection<'a, T, S>; + + #[ensures(result == self@.contains(value.deep_model()))] + fn contains(&self, value: &Q) -> bool + where + T: Borrow, + Q: Eq + Hash + DeepModel; } } } diff --git a/creusot-contracts/src/std/iter.rs b/creusot-contracts/src/std/iter.rs index be4286824c..83ffcfe398 100644 --- a/creusot-contracts/src/std/iter.rs +++ b/creusot-contracts/src/std/iter.rs @@ -6,12 +6,14 @@ mod copied; mod empty; mod enumerate; mod filter; +mod filter_map; mod fuse; mod map; mod map_inv; mod once; mod range; mod repeat; +mod rev; mod skip; mod take; mod zip; @@ -20,9 +22,11 @@ pub use cloned::ClonedExt; pub use copied::CopiedExt; pub use enumerate::EnumerateExt; pub use filter::FilterExt; +pub use filter_map::FilterMapExt; pub use fuse::FusedIterator; pub use map::MapExt; pub use map_inv::MapInv; +pub use rev::RevExt; pub use skip::SkipExt; pub use take::TakeExt; pub use zip::ZipExt; @@ -94,6 +98,37 @@ pub trait FromIterator: ::std::iter::FromIterator { fn from_iter_post(prod: Seq, res: Self) -> bool; } +pub trait DoubleEndedIterator: ::std::iter::DoubleEndedIterator + Iterator { + #[predicate(prophetic)] + fn produces_back(self, visited: Seq, o: Self) -> bool; + + #[law] + #[ensures(self.produces_back(Seq::EMPTY, self))] + fn produces_back_refl(self); + + #[law] + #[requires(a.produces_back(ab, b))] + #[requires(b.produces_back(bc, c))] + #[ensures(a.produces_back(ab.concat(bc), c))] + fn produces_back_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self); + + // FIXME: remove `trusted` + #[trusted] + #[requires(forall + self.produces_back(Seq::singleton(e), i2) ==> + func.precondition((e, Snapshot::new(Seq::EMPTY))))] + #[requires(MapInv::::reinitialize())] + #[requires(MapInv::::preservation(self, func))] + #[ensures(result == MapInv { iter: self, func, produced: Snapshot::new(Seq::EMPTY) })] + fn map_inv_back(self, func: F) -> MapInv + where + Self: Sized, + F: FnMut(Self::Item, Snapshot>) -> B, + { + MapInv { iter: self, func, produced: snapshot! {Seq::EMPTY} } + } +} + extern_spec! { mod std { mod iter { @@ -144,6 +179,13 @@ extern_spec! { fn filter

(self, f: P) -> Filter where P : for<'a> FnMut(&Self_::Item) -> bool; + #[pure] + #[requires(filter_map::immutable(f))] + #[requires(filter_map::no_precondition(f))] + #[requires(filter_map::precise(f))] + #[ensures(result.iter() == self && result.func() == f)] + fn filter_map(self, f: F) -> FilterMap + where F : for<'a> FnMut(Self_::Item) -> Option; #[pure] // These two requirements are here only to prove the absence of overflows @@ -167,6 +209,11 @@ extern_spec! { resolve(&^done) && done.completed() && self.produces(prod, *done) && B::from_iter_post(prod, result))] fn collect(self) -> B where B: FromIterator; + + #[pure] + #[ensures(result.iter() == self)] + fn rev(self) -> Rev + where Self: Sized + DoubleEndedIterator; } trait IntoIterator @@ -200,6 +247,15 @@ extern_spec! { #[pure] #[ensures(result@ == elt)] fn repeat(elt: T) -> Repeat; + + trait DoubleEndedIterator + where Self: DoubleEndedIterator { + #[ensures(match result { + None => self.completed(), + Some(v) => (*self).produces_back(Seq::singleton(v), ^self) + })] + fn next_back(&mut self) -> Option; + } } } } diff --git a/creusot-contracts/src/std/iter/filter.rs b/creusot-contracts/src/std/iter/filter.rs index ebc8b229b9..f4a5607755 100644 --- a/creusot-contracts/src/std/iter/filter.rs +++ b/creusot-contracts/src/std/iter/filter.rs @@ -90,13 +90,12 @@ where // 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, f : Mapping> self.iter().produces(s, succ.iter()) && + (forall 0 <= i && i < visited.len() ==> 0 <= f.get(i) && f.get(i) < s.len()) && // `f` is a monotone mapping - (forall 0 <= i && i <= j && j < visited.len() ==> 0 <= f.get(i) && f.get(i) <= f.get(j) && f.get(j) < s.len()) && + (forall 0 <= i && i < j && j < visited.len() ==> f.get(i) < f.get(j)) && (forall 0 <= i && i < visited.len() ==> visited[i] == s[f.get(i)]) && - (forall 0 <= i && i < s.len() ==> - (exists 0 <= j && j < visited.len() && f.get(j) == i) == self.func().postcondition_mut((&s[i],), self.func(), true) - ) + (exists 0 <= j && j < visited.len() && f.get(j) == i) == self.func().postcondition_mut((&s[i],), self.func(), true)) } } diff --git a/creusot-contracts/src/std/iter/filter_map.rs b/creusot-contracts/src/std/iter/filter_map.rs new file mode 100644 index 0000000000..06d533af47 --- /dev/null +++ b/creusot-contracts/src/std/iter/filter_map.rs @@ -0,0 +1,113 @@ +use crate::{logic::Mapping, std::ops::*, *}; +use ::std::iter::FilterMap; + +pub trait FilterMapExt { + #[logic] + fn iter(self) -> I; + + #[logic] + fn func(self) -> F; +} + +impl FilterMapExt for FilterMap { + #[trusted] + #[logic] + #[ensures(inv(self) ==> inv(result))] + fn iter(self) -> I { + dead + } + + #[trusted] + #[logic] + #[ensures(inv(self) ==> inv(result))] + fn func(self) -> F { + dead + } +} + +impl Option> Invariant for FilterMap { + #[predicate(prophetic)] + #[open(self)] + fn invariant(self) -> bool { + pearlite! { + // trivial precondition: simplification for sake of proof complexity + no_precondition(self.func()) && + // immutable state: simplification for sake of proof complexity + immutable(self.func()) && + // precision of postcondition + precise(self.func()) + } + } +} + +/// Asserts that `f` has no precondition: any closure state can be called with any input value +/// In a future release this restriction may be lifted or weakened +#[open] +#[predicate(prophetic)] +pub fn no_precondition Option>(f: F) -> bool { + pearlite! { forall f.precondition((i,)) } +} + +/// Asserts that the captures of `f` are used immutably +/// In a future release this restriction may be lifted or weakened +#[open] +#[predicate(prophetic)] +pub fn immutable Option>(f: F) -> bool { + pearlite! { forall f.unnest(g) ==> f == g } +} + +/// Asserts that the postcondition of `f` is *precise*: that there are never two possible values matching the postcondition +#[open] +#[predicate(prophetic)] +pub fn precise Option>(f1: F) -> bool { + pearlite! { forall !((exists f1.postcondition_mut((i,), f2, Some(b))) && f1.postcondition_mut((i,), f2, None)) } +} + +impl Iterator for FilterMap +where + I: Iterator, + F: FnMut(I::Item) -> Option, +{ + #[open] + #[predicate(prophetic)] + fn completed(&mut self) -> bool { + pearlite! { + (exists, e : &mut I > self.iter().produces(s, *e) && e.completed() && + forall 0 <= i && i < s.len() ==> (*self).func().postcondition_mut((s[i],), (^self).func(), None)) + && (*self).func() == (^self).func() + } + } + + #[open] + #[predicate(prophetic)] + fn produces(self, visited: Seq, succ: Self) -> bool { + pearlite! { + self.invariant() ==> + self.func().unnest(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, f : Mapping> self.iter().produces(s, succ.iter()) && + (forall 0 <= i && i < visited.len() ==> 0 <= f.get(i) && f.get(i) < s.len()) && + // `f` is a monotone mapping + (forall 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 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 0 <= j && j < s.len() + ==> (!exists 0 <= i && i < visited.len() && f.get(i) == j) == self.func().postcondition_mut((s[j],), self.func(), None)) + } + } + + #[law] + #[open(self)] + #[ensures(self.produces(Seq::EMPTY, self))] + fn produces_refl(self) {} + + #[law] + #[open(self)] + #[requires(a.produces(ab, b))] + #[requires(b.produces(bc, c))] + #[ensures(a.produces(ab.concat(bc), c))] + fn produces_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} +} diff --git a/creusot-contracts/src/std/iter/range.rs b/creusot-contracts/src/std/iter/range.rs index 2a21d42f9e..2fa6029126 100644 --- a/creusot-contracts/src/std/iter/range.rs +++ b/creusot-contracts/src/std/iter/range.rs @@ -1,6 +1,6 @@ use crate::{ std::{ - iter::Step, + iter::{DoubleEndedIterator, Step}, ops::{Range, RangeInclusive}, }, *, @@ -40,6 +40,32 @@ impl + Step> Iterator for Range { fn produces_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} } +impl + Step> DoubleEndedIterator for Range { + #[predicate] + #[open] + fn produces_back(self, visited: Seq, o: Self) -> bool { + pearlite! { + self.start == o.start && self.end.deep_model() >= o.end.deep_model() + && (visited.len() > 0 ==> o.end.deep_model() >= o.start.deep_model()) + && visited.len() == o.end.deep_model() - self.end.deep_model() + && forall 0 <= i && i < visited.len() ==> + visited[i].deep_model() == self.end.deep_model() - i + } + } + + #[law] + #[open(self)] + #[ensures(self.produces_back(Seq::EMPTY, self))] + fn produces_back_refl(self) {} + + #[law] + #[open(self)] + #[requires(a.produces_back(ab, b))] + #[requires(b.produces_back(bc, c))] + #[ensures(a.produces_back(ab.concat(bc), c))] + fn produces_back_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} +} + #[logic] #[open] #[ensures(r.is_empty_log() == (result == 0))] @@ -83,3 +109,29 @@ impl + Step> Iterator for RangeInclusive #[ensures(a.produces(ab.concat(bc), c))] fn produces_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} } + +impl + Step> DoubleEndedIterator for RangeInclusive { + #[predicate] + #[open] + fn produces_back(self, visited: Seq, o: Self) -> bool { + pearlite! { + visited.len() == range_inclusive_len(self) - range_inclusive_len(o) && + (self.is_empty_log() ==> o.is_empty_log()) && + (o.is_empty_log() || self.start_log() == o.start_log()) && + forall 0 <= i && i < visited.len() ==> + visited[i].deep_model() == self.end_log().deep_model() - i + } + } + + #[law] + #[open] + #[ensures(self.produces_back(Seq::EMPTY, self))] + fn produces_back_refl(self) {} + + #[law] + #[open] + #[requires(a.produces_back(ab, b))] + #[requires(b.produces_back(bc, c))] + #[ensures(a.produces_back(ab.concat(bc), c))] + fn produces_back_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} +} diff --git a/creusot-contracts/src/std/iter/rev.rs b/creusot-contracts/src/std/iter/rev.rs new file mode 100644 index 0000000000..c771a43434 --- /dev/null +++ b/creusot-contracts/src/std/iter/rev.rs @@ -0,0 +1,56 @@ +use crate::{ + std::iter::{DoubleEndedIterator, Iterator, Rev}, + *, +}; + +pub trait RevExt { + #[logic] + fn iter(self) -> I; + + #[logic] + fn iter_mut(&mut self) -> &mut I; +} + +impl RevExt for Rev { + #[logic] + #[trusted] + #[ensures(inv(self) ==> inv(result))] + fn iter(self) -> I { + dead + } + + #[logic] + #[trusted] + #[ensures((*self).iter() == *result && (^self).iter() == ^result)] + fn iter_mut(&mut self) -> &mut I { + dead + } +} + +impl Iterator for Rev { + #[open] + #[predicate(prophetic)] + fn completed(&mut self) -> bool { + pearlite! { self.iter_mut().completed() } + } + + #[open] + #[predicate(prophetic)] + fn produces(self, visited: Seq, o: Self) -> bool { + pearlite! { + self.iter().produces_back(visited, o.iter()) + } + } + + #[law] + #[open(self)] + #[ensures(self.produces(Seq::EMPTY, self))] + fn produces_refl(self) {} + + #[law] + #[open(self)] + #[requires(a.produces(ab, b))] + #[requires(b.produces(bc, c))] + #[ensures(a.produces(ab.concat(bc), c))] + fn produces_trans(a: Self, ab: Seq, b: Self, bc: Seq, c: Self) {} +} diff --git a/creusot/tests/creusot-contracts/creusot-contracts.coma b/creusot/tests/creusot-contracts/creusot-contracts.coma index 7b8d0eaf43..3d03a6d53c 100644 --- a/creusot/tests/creusot-contracts/creusot-contracts.coma +++ b/creusot/tests/creusot-contracts/creusot-contracts.coma @@ -1111,15 +1111,15 @@ module M_creusot_contracts__stdqy35z1__collections__hash_map__qyi160525698381677 -> Seq.get bc i = Seq.get (Seq.(++) ab bc) (Seq.length ab + i)) && (let _ = () in [%#shash_map2] produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__set_produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 74 0 80 1] - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 +module M_creusot_contracts__stdqy35z1__collections__hash_set__set_produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 80 0 86 1] + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 let%span sseq3 = "../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 - let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 82 20 82 108 - let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 83 20 83 98 - let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 - let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 + let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 88 20 88 108 + let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 89 20 89 98 + let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 + let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sseq8 = "../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 let%span sseq9 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 let%span sseq10 = "../../../creusot-contracts/src/logic/seq.rs" 80 4 80 12 @@ -1158,7 +1158,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__set_produces_trans = [%#sseq9] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_I'0) (visited : Seq.seq t_T'0) (end' : t_I'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_I'0) (visited : Seq.seq t_T'0) (end' : t_I'0) = [%#shash_set7] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -1201,7 +1201,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__set_produces_trans constant c : t_I'0 - function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 74 0 80 1] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 80 0 86 1] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () goal vc_set_produces_trans'0 : ([%#shash_set1] set_produces'0 b bc c) @@ -1214,11 +1214,11 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__set_produces_trans -> Seq.get bc i = Seq.get (Seq.(++) ab bc) (Seq.length ab + i)) && (let _ = () in let _ = () in [%#shash_set2] set_produces'0 a (Seq.(++) ab bc) c))) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 102 4 102 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 101 14 101 45 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 99 4 99 10 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 90 8 90 38 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 108 4 108 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 107 14 107 45 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 105 4 105 10 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 96 8 96 38 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span sseq5 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -1350,7 +1350,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 46 4 46 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 52 4 52 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -1374,7 +1374,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 = [%#sseq5] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) = [%#shash_set3] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -1389,29 +1389,29 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 89 4 89 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 95 4 95 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) = [%#shash_set2] set_produces'0 self visited o constant self : t_IntoIter'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 102 4 102 26] (self : t_IntoIter'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 108 4 108 26] (self : t_IntoIter'0) : () goal vc_produces_refl'0 : [%#shash_set0] produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 109 4 109 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 106 15 106 32 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 107 15 107 32 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 108 14 108 42 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 110 8 110 43 - let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 90 8 90 38 - let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 - let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 115 4 115 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 112 15 112 32 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 113 15 113 32 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 114 14 114 42 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 116 8 116 43 + let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 96 8 96 38 + let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 + let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sseq10 = "../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq11 = "../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 @@ -1543,7 +1543,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 46 4 46 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 52 4 52 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -1567,7 +1567,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 = [%#sseq13] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) = [%#shash_set9] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -1582,7 +1582,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 89 4 89 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 95 4 95 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) = [%#shash_set7] set_produces'0 self visited o @@ -1596,7 +1596,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 = contains'1 a x \/ contains'1 b x - function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 74 0 80 1] (a : t_IntoIter'0) (ab : Seq.seq t_T'0) (b : t_IntoIter'0) (bc : Seq.seq t_T'0) (c : t_IntoIter'0) : () + function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 80 0 86 1] (a : t_IntoIter'0) (ab : Seq.seq t_T'0) (b : t_IntoIter'0) (bc : Seq.seq t_T'0) (c : t_IntoIter'0) : () = [%#shash_set8] let _ = concat_contains'0 () in let _ = let _ = () in () in let _ = let _ = () in () in () @@ -1614,7 +1614,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 constant c : t_IntoIter'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 109 4 109 90] (a : t_IntoIter'0) (ab : Seq.seq t_T'0) (b : t_IntoIter'0) (bc : Seq.seq t_T'0) (c : t_IntoIter'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 115 4 115 90] (a : t_IntoIter'0) (ab : Seq.seq t_T'0) (b : t_IntoIter'0) (bc : Seq.seq t_T'0) (c : t_IntoIter'0) : () goal vc_produces_trans'0 : ([%#shash_set1] produces'0 b bc c) @@ -1624,11 +1624,11 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 /\ (([%#shash_set5] set_produces'0 a (Seq.(++) ab bc) c) -> (let _ = set_produces_trans'0 a ab b bc c in [%#shash_set2] produces'0 a (Seq.(++) ab bc) c)) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 141 4 141 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 140 14 140 45 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 138 4 138 10 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 129 8 129 38 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 147 4 147 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 146 14 146 45 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 144 4 144 10 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 135 8 135 38 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel5 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq6 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -1684,7 +1684,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 120 4 120 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 126 4 126 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -1711,7 +1711,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 = [%#sseq6] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) = [%#shash_set3] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -1726,29 +1726,29 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 128 4 128 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 134 4 134 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) = [%#shash_set2] set_produces'0 self visited o constant self : t_Iter'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 141 4 141 26] (self : t_Iter'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 147 4 147 26] (self : t_Iter'0) : () goal vc_produces_refl'0 : [%#shash_set0] produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 148 4 148 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 145 15 145 32 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 146 15 146 32 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 147 14 147 42 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 149 8 149 43 - let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 129 8 129 38 - let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 - let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 154 4 154 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 151 15 151 32 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 152 15 152 32 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 153 14 153 42 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 155 8 155 43 + let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 135 8 135 38 + let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 + let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sseq10 = "../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq11 = "../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 @@ -1804,7 +1804,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 120 4 120 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 126 4 126 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -1831,7 +1831,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 = [%#sseq14] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) = [%#shash_set9] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -1846,7 +1846,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 128 4 128 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 134 4 134 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) = [%#shash_set7] set_produces'0 self visited o @@ -1860,7 +1860,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 = contains'1 a x \/ contains'1 b x - function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 74 0 80 1] (a : t_Iter'0) (ab : Seq.seq t_T'0) (b : t_Iter'0) (bc : Seq.seq t_T'0) (c : t_Iter'0) : () + function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 80 0 86 1] (a : t_Iter'0) (ab : Seq.seq t_T'0) (b : t_Iter'0) (bc : Seq.seq t_T'0) (c : t_Iter'0) : () = [%#shash_set8] let _ = concat_contains'0 () in let _ = let _ = () in () in let _ = let _ = () in () in () @@ -1878,7 +1878,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 constant c : t_Iter'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 148 4 148 90] (a : t_Iter'0) (ab : Seq.seq t_T'0) (b : t_Iter'0) (bc : Seq.seq t_T'0) (c : t_Iter'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 154 4 154 90] (a : t_Iter'0) (ab : Seq.seq t_T'0) (b : t_Iter'0) (bc : Seq.seq t_T'0) (c : t_Iter'0) : () goal vc_produces_trans'0 : ([%#shash_set1] produces'0 b bc c) @@ -1888,11 +1888,11 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 /\ (([%#shash_set5] set_produces'0 a (Seq.(++) ab bc) c) -> (let _ = set_produces_trans'0 a ab b bc c in [%#shash_set2] produces'0 a (Seq.(++) ab bc) c)) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 216 4 216 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 215 14 215 45 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 213 4 213 10 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 204 8 204 38 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_refl [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 222 4 222 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 221 14 221 45 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 219 4 219 10 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 210 8 210 38 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel5 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq6 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -1974,7 +1974,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 195 4 195 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 201 4 201 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -2001,7 +2001,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 = [%#sseq6] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) = [%#shash_set3] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -2016,29 +2016,29 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 203 4 203 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 209 4 209 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) = [%#shash_set2] set_produces'0 self visited o constant self : t_Intersection'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 216 4 216 26] (self : t_Intersection'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 222 4 222 26] (self : t_Intersection'0) : () goal vc_produces_refl'0 : [%#shash_set0] produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 223 4 223 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 220 15 220 32 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 221 15 221 32 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 222 14 222 42 - let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 224 8 224 43 - let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 204 8 204 38 - let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 - let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_trans [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 229 4 229 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 226 15 226 32 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 227 15 227 32 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 228 14 228 42 + let%span shash_set3 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set4 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set5 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set6 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 230 8 230 43 + let%span shash_set7 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 210 8 210 38 + let%span shash_set8 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 + let%span shash_set9 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sseq10 = "../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq11 = "../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 @@ -2120,7 +2120,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 195 4 195 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 201 4 201 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -2147,7 +2147,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 = [%#sseq14] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) = [%#shash_set9] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -2162,7 +2162,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 203 4 203 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 209 4 209 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) = [%#shash_set7] set_produces'0 self visited o @@ -2176,7 +2176,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 = contains'1 a x \/ contains'1 b x - function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 74 0 80 1] (a : t_Intersection'0) (ab : Seq.seq t_T'0) (b : t_Intersection'0) (bc : Seq.seq t_T'0) (c : t_Intersection'0) : () + function set_produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 80 0 86 1] (a : t_Intersection'0) (ab : Seq.seq t_T'0) (b : t_Intersection'0) (bc : Seq.seq t_T'0) (c : t_Intersection'0) : () = [%#shash_set8] let _ = concat_contains'0 () in let _ = let _ = () in () in let _ = let _ = () in () in () @@ -2194,7 +2194,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 constant c : t_Intersection'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 223 4 223 90] (a : t_Intersection'0) (ab : Seq.seq t_T'0) (b : t_Intersection'0) (bc : Seq.seq t_T'0) (c : t_Intersection'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 229 4 229 90] (a : t_Intersection'0) (ab : Seq.seq t_T'0) (b : t_Intersection'0) (bc : Seq.seq t_T'0) (c : t_Intersection'0) : () goal vc_produces_trans'0 : ([%#shash_set1] produces'0 b bc c) @@ -4903,10 +4903,10 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr let%span scloned1 = "../../../creusot-contracts/src/std/iter/cloned.rs" 55 4 55 10 let%span scloned2 = "../../../creusot-contracts/src/std/iter/cloned.rs" 48 12 51 79 let%span scloned3 = "../../../creusot-contracts/src/std/iter/cloned.rs" 11 14 11 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -4940,16 +4940,16 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -4983,10 +4983,10 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr let%span scloned3 = "../../../creusot-contracts/src/std/iter/cloned.rs" 60 4 60 10 let%span scloned4 = "../../../creusot-contracts/src/std/iter/cloned.rs" 48 12 51 79 let%span scloned5 = "../../../creusot-contracts/src/std/iter/cloned.rs" 11 14 11 39 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -5018,16 +5018,16 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter7] produces'1 a ab b) -> ([%#siter8] produces'1 b bc c) -> ([%#siter9] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter6] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -5071,10 +5071,10 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr let%span scopied1 = "../../../creusot-contracts/src/std/iter/copied.rs" 55 4 55 10 let%span scopied2 = "../../../creusot-contracts/src/std/iter/copied.rs" 48 12 51 79 let%span scopied3 = "../../../creusot-contracts/src/std/iter/copied.rs" 11 14 11 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -5108,16 +5108,16 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -5151,10 +5151,10 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr let%span scopied3 = "../../../creusot-contracts/src/std/iter/copied.rs" 60 4 60 10 let%span scopied4 = "../../../creusot-contracts/src/std/iter/copied.rs" 48 12 51 79 let%span scopied5 = "../../../creusot-contracts/src/std/iter/copied.rs" 11 14 11 39 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -5186,16 +5186,16 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter7] produces'1 a ab b) -> ([%#siter8] produces'1 b bc c) -> ([%#siter9] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter6] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -5303,10 +5303,10 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ let%span senumerate1 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 80 4 80 10 let%span senumerate2 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 72 12 76 113 let%span senumerate3 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 14 14 14 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span senumerate8 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 45 12 49 85 use seq.Seq @@ -5334,16 +5334,16 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5355,7 +5355,7 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use prelude.prelude.Borrow - predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) @@ -5404,10 +5404,10 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ let%span senumerate3 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 85 4 85 10 let%span senumerate4 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 72 12 76 113 let%span senumerate5 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 14 14 14 39 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span senumerate10 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 45 12 49 85 type t_I'0 @@ -5433,16 +5433,16 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter7] produces'1 a ab b) -> ([%#siter8] produces'1 b bc c) -> ([%#siter9] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter6] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5454,7 +5454,7 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use prelude.prelude.Borrow - predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) @@ -5507,10 +5507,10 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ goal vc_produces_trans'0 : ([%#senumerate1] produces'0 b bc c) -> ([%#senumerate0] produces'0 a ab b) -> ([%#senumerate2] produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_refl [#"../../../creusot-contracts/src/std/iter/filter.rs" 106 4 106 26] (* as std::iter::Iterator> *) - let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 105 14 105 45 - let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 103 4 103 10 - let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 99 17 +module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_refl [#"../../../creusot-contracts/src/std/iter/filter.rs" 105 4 105 26] (* as std::iter::Iterator> *) + let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 104 14 104 45 + let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 102 4 102 10 + let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 let%span sfilter3 = "../../../creusot-contracts/src/std/iter/filter.rs" 34 12 40 124 let%span sfilter4 = "../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 let%span sfilter5 = "../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 @@ -5521,10 +5521,10 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -5607,16 +5607,16 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter14] produces'1 a ab b) -> ([%#siter15] produces'1 b bc c) -> ([%#siter16] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter13] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5632,8 +5632,8 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro [%#sfilter2] invariant'0 self -> unnest'0 (func'0 self) (func'0 succ) /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) - /\ (forall i : int, j : int . 0 <= i /\ i <= j /\ j < Seq.length visited - -> 0 <= Map.get f i /\ Map.get f i <= Map.get f j /\ Map.get f j < Seq.length s) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) /\ (forall i : int . 0 <= i /\ i < Seq.length s -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) @@ -5641,16 +5641,16 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro constant self : t_Filter'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 106 4 106 26] (self : t_Filter'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 105 4 105 26] (self : t_Filter'0) : () goal vc_produces_refl'0 : [%#sfilter0] produces'0 self (Seq.empty : Seq.seq t_Item'0) self end -module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_trans [#"../../../creusot-contracts/src/std/iter/filter.rs" 113 4 113 90] (* as std::iter::Iterator> *) - let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 110 15 110 32 - let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 111 15 111 32 - let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 112 14 112 42 - let%span sfilter3 = "../../../creusot-contracts/src/std/iter/filter.rs" 108 4 108 10 - let%span sfilter4 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 99 17 +module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_trans [#"../../../creusot-contracts/src/std/iter/filter.rs" 112 4 112 90] (* as std::iter::Iterator> *) + let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 109 15 109 32 + let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 110 15 110 32 + let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 111 14 111 42 + let%span sfilter3 = "../../../creusot-contracts/src/std/iter/filter.rs" 107 4 107 10 + let%span sfilter4 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 let%span sfilter5 = "../../../creusot-contracts/src/std/iter/filter.rs" 34 12 40 124 let%span sfilter6 = "../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 let%span sfilter7 = "../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 @@ -5661,10 +5661,10 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -5747,16 +5747,16 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter16] produces'1 a ab b) -> ([%#siter17] produces'1 b bc c) -> ([%#siter18] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter15] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5772,8 +5772,8 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro [%#sfilter4] invariant'0 self -> unnest'0 (func'0 self) (func'0 succ) /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) - /\ (forall i : int, j : int . 0 <= i /\ i <= j /\ j < Seq.length visited - -> 0 <= Map.get f i /\ Map.get f i <= Map.get f j /\ Map.get f j < Seq.length s) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) /\ (forall i : int . 0 <= i /\ i < Seq.length s -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) @@ -5789,22 +5789,361 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro constant c : t_Filter'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 113 4 113 90] (a : t_Filter'0) (ab : Seq.seq t_Item'0) (b : t_Filter'0) (bc : Seq.seq t_Item'0) (c : t_Filter'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 112 4 112 90] (a : t_Filter'0) (ab : Seq.seq t_Item'0) (b : t_Filter'0) (bc : Seq.seq t_Item'0) (c : t_Filter'0) : () goal vc_produces_trans'0 : ([%#sfilter1] produces'0 b bc c) -> ([%#sfilter0] produces'0 a ab b) -> ([%#sfilter2] produces'0 a (Seq.(++) ab bc) c) end +module M_creusot_contracts__stdqy35z1__iter__filter_map__qyi13601925333174091585__produces_refl [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 105 4 105 26] (* as std::iter::Iterator> *) + let%span sfilter_map0 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 104 14 104 45 + let%span sfilter_map1 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 102 4 102 10 + let%span sfilter_map2 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 85 12 98 148 + let%span sfilter_map3 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 34 12 38 32 + let%span sfilter_map4 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 22 14 22 39 + let%span sfilter_map5 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 15 14 15 39 + let%span sfilter_map6 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 48 16 48 50 + let%span sfilter_map7 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 56 16 56 52 + let%span sfilter_map8 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 63 16 63 135 + let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops15 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter19 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + use seq.Seq + + type t_B'0 + + use seq.Seq + + type t_I'0 + + type t_F'0 + + type t_FilterMap'0 = + { t_FilterMap__iter'0: t_I'0; t_FilterMap__f'0: t_F'0 } + + predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + + type t_Item'0 + + predicate precondition'0 [#"../../../creusot-contracts/src/std/ops.rs" 77 4 77 45] (self : t_F'0) (args : t_Item'0) + + predicate no_precondition'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 47 0 47 68] (f : t_F'0) = + [%#sfilter_map6] forall i : t_Item'0 . precondition'0 f (i) + + type t_Option'0 = + | C_None'0 + | C_Some'0 t_B'0 + + predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : t_Option'0) + + + use prelude.prelude.Borrow + + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_F'0) + + predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : t_Option'0) + + + function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : t_Option'0) : () + + + axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : t_Option'0 . [%#sops15] postcondition_once'0 self args res + = (exists res_state : t_F'0 . postcondition_mut'0 self args res_state res /\ resolve'0 res_state) + + predicate unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 103 4 103 36] (self : t_F'0) (_2 : t_F'0) + + function unnest_trans'0 [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (self : t_F'0) (b : t_F'0) (c : t_F'0) : () + + + axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops12] unnest'0 self b) + -> ([%#sops13] unnest'0 b c) -> ([%#sops14] unnest'0 self c) + + function unnest_refl'0 [#"../../../creusot-contracts/src/std/ops.rs" 116 4 116 24] (self : t_F'0) : () + + axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops11] unnest'0 self self + + function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : t_Option'0) : () + + + axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : t_Option'0 . ([%#sops9] postcondition_mut'0 self args res_state res) + -> ([%#sops10] unnest'0 self res_state) + + predicate immutable'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 55 0 55 62] (f : t_F'0) = + [%#sfilter_map7] forall g : t_F'0 . unnest'0 f g -> f = g + + predicate precise'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 62 0 62 61] (f1 : t_F'0) = + [%#sfilter_map8] forall f2 : t_F'0, i : t_Item'0 . not ((exists b : t_B'0 . postcondition_mut'0 f1 (i) f2 (C_Some'0 b)) + /\ postcondition_mut'0 f1 (i) f2 (C_None'0)) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_FilterMap'0) + + function func'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 23 4 23 22] (self : t_FilterMap'0) : t_F'0 + + axiom func'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map4] inv'0 self -> inv'1 (func'0 self) + + predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 31 4 31 30] (self : t_FilterMap'0) = + [%#sfilter_map3] no_precondition'0 (func'0 self) /\ immutable'0 (func'0 self) /\ precise'0 (func'0 self) + + axiom inv_axiom'0 [@rewrite] : forall x : t_FilterMap'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_FilterMap__iter'0 = iter ; t_FilterMap__f'0 = f} -> inv'2 iter /\ inv'1 f + end) + + use seq.Seq + + use prelude.prelude.Int + + use map.Map + + function iter'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 16 4 16 22] (self : t_FilterMap'0) : t_I'0 + + axiom iter'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map5] inv'0 self -> inv'2 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter17] produces'1 a ab b) + -> ([%#siter18] produces'1 b bc c) -> ([%#siter19] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () + + axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter16] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + + use seq.Seq + + use map.Map + + use seq.Seq + + use seq.Seq + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 83 4 83 67] (self : t_FilterMap'0) (visited : Seq.seq t_B'0) (succ : t_FilterMap'0) + + = + [%#sfilter_map2] invariant'0 self + -> unnest'0 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> postcondition_mut'0 (func'0 self) (Seq.get s (Map.get f i)) (func'0 self) (C_Some'0 (Seq.get visited i))) + /\ (forall j : int . 0 <= j /\ j < Seq.length s + -> (not (exists i : int . 0 <= i /\ i < Seq.length visited /\ Map.get f i = j)) + = postcondition_mut'0 (func'0 self) (Seq.get s j) (func'0 self) (C_None'0))) + + constant self : t_FilterMap'0 + + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 105 4 105 26] (self : t_FilterMap'0) : () + + + goal vc_produces_refl'0 : [%#sfilter_map0] produces'0 self (Seq.empty : Seq.seq t_B'0) self +end +module M_creusot_contracts__stdqy35z1__iter__filter_map__qyi13601925333174091585__produces_trans [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 112 4 112 90] (* as std::iter::Iterator> *) + let%span sfilter_map0 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 109 15 109 32 + let%span sfilter_map1 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 110 15 110 32 + let%span sfilter_map2 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 111 14 111 42 + let%span sfilter_map3 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 107 4 107 10 + let%span sfilter_map4 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 85 12 98 148 + let%span sfilter_map5 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 34 12 38 32 + let%span sfilter_map6 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 22 14 22 39 + let%span sfilter_map7 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 15 14 15 39 + let%span sfilter_map8 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 48 16 48 50 + let%span sfilter_map9 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 56 16 56 52 + let%span sfilter_map10 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 63 16 63 135 + let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops15 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops16 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops17 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter19 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter20 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter21 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + type t_I'0 + + type t_F'0 + + type t_FilterMap'0 = + { t_FilterMap__iter'0: t_I'0; t_FilterMap__f'0: t_F'0 } + + type t_B'0 + + use seq.Seq + + predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + + type t_Item'0 + + predicate precondition'0 [#"../../../creusot-contracts/src/std/ops.rs" 77 4 77 45] (self : t_F'0) (args : t_Item'0) + + predicate no_precondition'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 47 0 47 68] (f : t_F'0) = + [%#sfilter_map8] forall i : t_Item'0 . precondition'0 f (i) + + type t_Option'0 = + | C_None'0 + | C_Some'0 t_B'0 + + predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : t_Option'0) + + + use prelude.prelude.Borrow + + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_F'0) + + predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : t_Option'0) + + + function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : t_Option'0) : () + + + axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : t_Option'0 . [%#sops17] postcondition_once'0 self args res + = (exists res_state : t_F'0 . postcondition_mut'0 self args res_state res /\ resolve'0 res_state) + + predicate unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 103 4 103 36] (self : t_F'0) (_2 : t_F'0) + + function unnest_trans'0 [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (self : t_F'0) (b : t_F'0) (c : t_F'0) : () + + + axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops14] unnest'0 self b) + -> ([%#sops15] unnest'0 b c) -> ([%#sops16] unnest'0 self c) + + function unnest_refl'0 [#"../../../creusot-contracts/src/std/ops.rs" 116 4 116 24] (self : t_F'0) : () + + axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops13] unnest'0 self self + + function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : t_Option'0) : () + + + axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : t_Option'0 . ([%#sops11] postcondition_mut'0 self args res_state res) + -> ([%#sops12] unnest'0 self res_state) + + predicate immutable'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 55 0 55 62] (f : t_F'0) = + [%#sfilter_map9] forall g : t_F'0 . unnest'0 f g -> f = g + + predicate precise'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 62 0 62 61] (f1 : t_F'0) = + [%#sfilter_map10] forall f2 : t_F'0, i : t_Item'0 . not ((exists b : t_B'0 . postcondition_mut'0 f1 (i) f2 (C_Some'0 b)) + /\ postcondition_mut'0 f1 (i) f2 (C_None'0)) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_FilterMap'0) + + function func'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 23 4 23 22] (self : t_FilterMap'0) : t_F'0 + + axiom func'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map6] inv'0 self -> inv'1 (func'0 self) + + predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 31 4 31 30] (self : t_FilterMap'0) = + [%#sfilter_map5] no_precondition'0 (func'0 self) /\ immutable'0 (func'0 self) /\ precise'0 (func'0 self) + + axiom inv_axiom'0 [@rewrite] : forall x : t_FilterMap'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_FilterMap__iter'0 = iter ; t_FilterMap__f'0 = f} -> inv'2 iter /\ inv'1 f + end) + + use seq.Seq + + use prelude.prelude.Int + + use map.Map + + function iter'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 16 4 16 22] (self : t_FilterMap'0) : t_I'0 + + axiom iter'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map7] inv'0 self -> inv'2 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter19] produces'1 a ab b) + -> ([%#siter20] produces'1 b bc c) -> ([%#siter21] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () + + axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter18] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + + use seq.Seq + + use map.Map + + use seq.Seq + + use seq.Seq + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 83 4 83 67] (self : t_FilterMap'0) (visited : Seq.seq t_B'0) (succ : t_FilterMap'0) + + = + [%#sfilter_map4] invariant'0 self + -> unnest'0 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> postcondition_mut'0 (func'0 self) (Seq.get s (Map.get f i)) (func'0 self) (C_Some'0 (Seq.get visited i))) + /\ (forall j : int . 0 <= j /\ j < Seq.length s + -> (not (exists i : int . 0 <= i /\ i < Seq.length visited /\ Map.get f i = j)) + = postcondition_mut'0 (func'0 self) (Seq.get s j) (func'0 self) (C_None'0))) + + use seq.Seq + + constant a : t_FilterMap'0 + + constant ab : Seq.seq t_B'0 + + constant b : t_FilterMap'0 + + constant bc : Seq.seq t_B'0 + + constant c : t_FilterMap'0 + + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 112 4 112 90] (a : t_FilterMap'0) (ab : Seq.seq t_B'0) (b : t_FilterMap'0) (bc : Seq.seq t_B'0) (c : t_FilterMap'0) : () + + + goal vc_produces_trans'0 : ([%#sfilter_map1] produces'0 b bc c) + -> ([%#sfilter_map0] produces'0 a ab b) -> ([%#sfilter_map2] produces'0 a (Seq.(++) ab bc) c) +end module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__produces_refl [#"../../../creusot-contracts/src/std/iter/fuse.rs" 42 4 42 26] (* as std::iter::Iterator> *) let%span sfuse0 = "../../../creusot-contracts/src/std/iter/fuse.rs" 41 14 41 45 let%span sfuse1 = "../../../creusot-contracts/src/std/iter/fuse.rs" 39 4 39 10 let%span sfuse2 = "../../../creusot-contracts/src/std/iter/fuse.rs" 29 12 35 13 let%span sfuse3 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse4 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -5845,16 +6184,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter6] produces'1 a ab b) -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5883,10 +6222,10 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod let%span sfuse4 = "../../../creusot-contracts/src/std/iter/fuse.rs" 29 12 35 13 let%span sfuse5 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse6 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -5927,16 +6266,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter8] produces'1 a ab b) -> ([%#siter9] produces'1 b bc c) -> ([%#siter10] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter7] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -5983,10 +6322,10 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu let%span smodel12 = "../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span sfuse13 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse14 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -6027,16 +6366,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter16] produces'1 a ab b) -> ([%#siter17] produces'1 b bc c) -> ([%#siter18] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter15] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -6069,7 +6408,7 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu function view'0 [#"../../../creusot-contracts/src/model.rs" 109 4 109 33] (self : borrowed (t_Fuse'0)) : t_Option'0 = [%#smodel12] view'1 self.current - predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate completed'0 [#"../../../creusot-contracts/src/std/iter/fuse.rs" 18 4 18 35] (self : borrowed (t_Fuse'0)) = [%#sfuse4] (view'0 self = C_None'0 @@ -6101,10 +6440,10 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -6188,16 +6527,16 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -6250,10 +6589,10 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -6335,16 +6674,16 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter15] produces'1 a ab b) -> ([%#siter16] produces'1 b bc c) -> ([%#siter17] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter14] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -6405,10 +6744,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -6475,16 +6814,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter11] produces'1 a ab b) -> ([%#siter12] produces'1 b bc c) -> ([%#siter13] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter10] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -6546,10 +6885,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -6614,16 +6953,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -6739,7 +7078,7 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne let%span smap_inv6 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 90 17 90 21 let%span smap_inv7 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 90 26 90 44 let%span smap_inv8 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 86 14 89 5 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 162 27 162 52 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 163 26 163 71 let%span smap_inv12 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 163 15 163 31 @@ -6763,10 +7102,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne let%span smap_inv30 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 29 15 29 32 let%span smap_inv31 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 30 14 30 42 let%span smap_inv32 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 26 4 26 10 - let%span siter33 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter34 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter35 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter36 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter33 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter34 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter35 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter36 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sops37 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 let%span sops38 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 let%span sops39 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 @@ -6822,20 +7161,20 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter34] produces'0 a ab b) -> ([%#siter35] produces'0 b bc c) -> ([%#siter36] produces'0 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter33] produces'0 self (Seq.empty : Seq.seq t_Item'0) self - predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) use seq.Seq @@ -7197,10 +7536,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4899712594723907874__pr let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -7254,16 +7593,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4899712594723907874__pr use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter11] produces'0 a ab b) -> ([%#siter12] produces'0 b bc c) -> ([%#siter13] produces'0 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter10] produces'0 self (Seq.empty : Seq.seq t_Item'0) self @@ -7308,10 +7647,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4899712594723907874__pr let%span smap_inv6 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 29 15 29 32 let%span smap_inv7 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 30 14 30 42 let%span smap_inv8 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 26 4 26 10 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 let%span sops15 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 @@ -7389,16 +7728,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4899712594723907874__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter10] produces'1 a ab b) -> ([%#siter11] produces'1 b bc c) -> ([%#siter12] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter9] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -7658,108 +7997,196 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi16860283617022118777__pro goal vc_produces_trans'0 : ([%#srange1] produces'0 b bc c) -> ([%#srange0] produces'0 a ab b) -> ([%#srange2] produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__range__range_inclusive_len [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] - let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span sops1 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 - let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 +module M_creusot_contracts__stdqy35z1__iter__range__qyi16137414346896623968__produces_back_refl [#"../../../creusot-contracts/src/std/iter/range.rs" 59 4 59 31] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 58 14 58 50 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 56 4 56 10 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 48 12 52 68 + + use seq.Seq type t_Idx'0 - type t_RangeInclusive'0 = - { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + use seq.Seq - function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + type t_Range'0 = + { t_Range__start'0: t_Idx'0; t_Range__end'0: t_Idx'0 } use prelude.prelude.Int function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int - function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + use seq.Seq - function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + use seq.Seq - axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops1] not is_empty_log'0 self - -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 4 46 69] (self : t_Range'0) (visited : Seq.seq t_Idx'0) (o : t_Range'0) + + = + [%#srange2] self.t_Range__start'0 = o.t_Range__start'0 + /\ deep_model'0 self.t_Range__end'0 >= deep_model'0 o.t_Range__end'0 + /\ (Seq.length visited > 0 -> deep_model'0 o.t_Range__end'0 >= deep_model'0 o.t_Range__start'0) + /\ Seq.length visited = deep_model'0 o.t_Range__end'0 - deep_model'0 self.t_Range__end'0 + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 self.t_Range__end'0 - i) - constant r : t_RangeInclusive'0 + constant self : t_Range'0 - function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] (r : t_RangeInclusive'0) : int - + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 59 4 59 31] (self : t_Range'0) : () - goal vc_range_inclusive_len'0 : ([%#sops1] not is_empty_log'0 r - -> deep_model'0 (start_log'0 r) <= deep_model'0 (end_log'0 r)) - -> (if is_empty_log'0 r then - [%#srange0] is_empty_log'0 r = (0 = 0) - else - [%#srange0] is_empty_log'0 r = (deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 = 0) - ) + goal vc_produces_back_refl'0 : [%#srange0] produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self end -module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_refl [#"../../../creusot-contracts/src/std/iter/range.rs" 77 4 77 26] (* as std::iter::Iterator> *) - let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 76 14 76 45 - let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 74 4 74 10 - let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 - let%span sops5 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 - - use seq.Seq +module M_creusot_contracts__stdqy35z1__iter__range__qyi16137414346896623968__produces_back_trans [#"../../../creusot-contracts/src/std/iter/range.rs" 66 4 66 95] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 63 15 63 37 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 64 15 64 37 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 65 14 65 47 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 61 4 61 10 + let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 48 12 52 68 type t_Idx'0 - use seq.Seq - - type t_RangeInclusive'0 = - { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + type t_Range'0 = + { t_Range__start'0: t_Idx'0; t_Range__end'0: t_Idx'0 } use seq.Seq - function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 - use prelude.prelude.Int function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int - function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 - - function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool - - axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops5] not is_empty_log'0 self - -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) - - function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] (r : t_RangeInclusive'0) : int - - = - [%#srange4] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 - - axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange3] is_empty_log'0 r - = (range_inclusive_len'0 r = 0) + use seq.Seq use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 64 4 64 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 4 46 69] (self : t_Range'0) (visited : Seq.seq t_Idx'0) (o : t_Range'0) = - [%#srange2] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o - /\ (is_empty_log'0 self -> is_empty_log'0 o) - /\ (is_empty_log'0 o \/ end_log'0 self = end_log'0 o) + [%#srange4] self.t_Range__start'0 = o.t_Range__start'0 + /\ deep_model'0 self.t_Range__end'0 >= deep_model'0 o.t_Range__end'0 + /\ (Seq.length visited > 0 -> deep_model'0 o.t_Range__end'0 >= deep_model'0 o.t_Range__start'0) + /\ Seq.length visited = deep_model'0 o.t_Range__end'0 - deep_model'0 self.t_Range__end'0 /\ (forall i : int . 0 <= i /\ i < Seq.length visited - -> deep_model'0 (Seq.get visited i) = deep_model'0 (start_log'0 self) + i) + -> deep_model'0 (Seq.get visited i) = deep_model'0 self.t_Range__end'0 - i) - constant self : t_RangeInclusive'0 + use seq.Seq - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 77 4 77 26] (self : t_RangeInclusive'0) : () + constant a : t_Range'0 + + constant ab : Seq.seq t_Idx'0 + + constant b : t_Range'0 + + constant bc : Seq.seq t_Idx'0 + + constant c : t_Range'0 + + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 66 4 66 95] (a : t_Range'0) (ab : Seq.seq t_Idx'0) (b : t_Range'0) (bc : Seq.seq t_Idx'0) (c : t_Range'0) : () + + + goal vc_produces_back_trans'0 : ([%#srange1] produces_back'0 b bc c) + -> ([%#srange0] produces_back'0 a ab b) -> ([%#srange2] produces_back'0 a (Seq.(++) ab bc) c) +end +module M_creusot_contracts__stdqy35z1__iter__range__range_inclusive_len [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span sops1 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + + type t_Idx'0 + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops1] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + constant r : t_RangeInclusive'0 + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + + goal vc_range_inclusive_len'0 : ([%#sops1] not is_empty_log'0 r + -> deep_model'0 (start_log'0 r) <= deep_model'0 (end_log'0 r)) + -> (if is_empty_log'0 r then + [%#srange0] is_empty_log'0 r = (0 = 0) + else + [%#srange0] is_empty_log'0 r = (deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 = 0) + ) +end +module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_refl [#"../../../creusot-contracts/src/std/iter/range.rs" 103 4 103 26] (* as std::iter::Iterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 102 14 102 45 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 100 4 100 10 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span sops5 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + + use seq.Seq + + type t_Idx'0 + + use seq.Seq + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + use seq.Seq + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops5] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + = + [%#srange4] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 + + axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange3] is_empty_log'0 r + = (range_inclusive_len'0 r = 0) + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 90 4 90 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + + = + [%#srange2] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o + /\ (is_empty_log'0 self -> is_empty_log'0 o) + /\ (is_empty_log'0 o \/ end_log'0 self = end_log'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 (start_log'0 self) + i) + + constant self : t_RangeInclusive'0 + + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 103 4 103 26] (self : t_RangeInclusive'0) : () goal vc_produces_refl'0 : [%#srange0] produces'0 self (Seq.empty : Seq.seq t_Idx'0) self end -module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_trans [#"../../../creusot-contracts/src/std/iter/range.rs" 84 4 84 90] (* as std::iter::Iterator> *) - let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 81 15 81 32 - let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 82 15 82 32 - let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 83 14 83 42 - let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 79 4 79 10 - let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span srange5 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange6 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 +module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_trans [#"../../../creusot-contracts/src/std/iter/range.rs" 110 4 110 90] (* as std::iter::Iterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 107 15 107 32 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 108 15 108 32 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 109 14 109 42 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 105 4 105 10 + let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span srange5 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange6 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 type t_Idx'0 @@ -7784,7 +8211,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops7] not is_empty_log'0 self -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) - function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] (r : t_RangeInclusive'0) : int + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int = [%#srange6] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 @@ -7794,7 +8221,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 64 4 64 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 90 4 90 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) = [%#srange4] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o @@ -7815,12 +8242,139 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro constant c : t_RangeInclusive'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 84 4 84 90] (a : t_RangeInclusive'0) (ab : Seq.seq t_Idx'0) (b : t_RangeInclusive'0) (bc : Seq.seq t_Idx'0) (c : t_RangeInclusive'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 110 4 110 90] (a : t_RangeInclusive'0) (ab : Seq.seq t_Idx'0) (b : t_RangeInclusive'0) (bc : Seq.seq t_Idx'0) (c : t_RangeInclusive'0) : () goal vc_produces_trans'0 : ([%#srange1] produces'0 b bc c) -> ([%#srange0] produces'0 a ab b) -> ([%#srange2] produces'0 a (Seq.(++) ab bc) c) end +module M_creusot_contracts__stdqy35z1__iter__range__qyi12106466433038921999__produces_back_refl [#"../../../creusot-contracts/src/std/iter/range.rs" 129 4 129 31] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 128 14 128 50 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 126 4 126 10 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 118 12 122 74 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span sops5 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + + use seq.Seq + + type t_Idx'0 + + use seq.Seq + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + use seq.Seq + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops5] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + = + [%#srange4] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 + + axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange3] is_empty_log'0 r + = (range_inclusive_len'0 r = 0) + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 116 4 116 69] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + + = + [%#srange2] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o + /\ (is_empty_log'0 self -> is_empty_log'0 o) + /\ (is_empty_log'0 o \/ start_log'0 self = start_log'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 (end_log'0 self) - i) + + constant self : t_RangeInclusive'0 + + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 129 4 129 31] (self : t_RangeInclusive'0) : () + + + goal vc_produces_back_refl'0 : [%#srange0] produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self +end +module M_creusot_contracts__stdqy35z1__iter__range__qyi12106466433038921999__produces_back_trans [#"../../../creusot-contracts/src/std/iter/range.rs" 136 4 136 95] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 133 15 133 37 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 134 15 134 37 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 135 14 135 47 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 131 4 131 10 + let%span srange4 = "../../../creusot-contracts/src/std/iter/range.rs" 118 12 122 74 + let%span srange5 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange6 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + + type t_Idx'0 + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + use seq.Seq + + use seq.Seq + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops7] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + = + [%#srange6] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 + + axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange5] is_empty_log'0 r + = (range_inclusive_len'0 r = 0) + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 116 4 116 69] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + + = + [%#srange4] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o + /\ (is_empty_log'0 self -> is_empty_log'0 o) + /\ (is_empty_log'0 o \/ start_log'0 self = start_log'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 (end_log'0 self) - i) + + use seq.Seq + + constant a : t_RangeInclusive'0 + + constant ab : Seq.seq t_Idx'0 + + constant b : t_RangeInclusive'0 + + constant bc : Seq.seq t_Idx'0 + + constant c : t_RangeInclusive'0 + + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 136 4 136 95] (a : t_RangeInclusive'0) (ab : Seq.seq t_Idx'0) (b : t_RangeInclusive'0) (bc : Seq.seq t_Idx'0) (c : t_RangeInclusive'0) : () + + + goal vc_produces_back_trans'0 : ([%#srange1] produces_back'0 b bc c) + -> ([%#srange0] produces_back'0 a ab b) -> ([%#srange2] produces_back'0 a (Seq.(++) ab bc) c) +end module M_creusot_contracts__stdqy35z1__iter__repeat__qyi8658929399712466629__produces_refl [#"../../../creusot-contracts/src/std/iter/repeat.rs" 32 4 32 26] (* as std::iter::Iterator> *) let%span srepeat0 = "../../../creusot-contracts/src/std/iter/repeat.rs" 31 14 31 45 let%span srepeat1 = "../../../creusot-contracts/src/std/iter/repeat.rs" 29 4 29 10 @@ -7899,16 +8453,15 @@ module M_creusot_contracts__stdqy35z1__iter__repeat__qyi8658929399712466629__pro goal vc_produces_trans'0 : ([%#srepeat1] produces'0 b bc c) -> ([%#srepeat0] produces'0 a ab b) -> ([%#srepeat2] produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produces_refl [#"../../../creusot-contracts/src/std/iter/skip.rs" 74 4 74 26] (* as std::iter::Iterator> *) - let%span sskip0 = "../../../creusot-contracts/src/std/iter/skip.rs" 73 14 73 45 - let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 71 4 71 10 - let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 - let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 - let%span sskip4 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__rev__qyi4378764544541057436__produces_refl [#"../../../creusot-contracts/src/std/iter/rev.rs" 48 4 48 26] (* as std::iter::Iterator> *) + let%span srev0 = "../../../creusot-contracts/src/std/iter/rev.rs" 47 14 47 45 + let%span srev1 = "../../../creusot-contracts/src/std/iter/rev.rs" 45 4 45 10 + let%span srev2 = "../../../creusot-contracts/src/std/iter/rev.rs" 41 12 41 56 + let%span srev3 = "../../../creusot-contracts/src/std/iter/rev.rs" 17 14 17 39 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 106 14 106 50 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 110 15 110 37 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 111 15 111 37 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 112 14 112 47 use seq.Seq @@ -7918,106 +8471,239 @@ module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produ type t_I'0 - use prelude.prelude.UIntSize - - type t_Skip'0 = - { t_Skip__iter'0: t_I'0; t_Skip__n'0: usize } - - use prelude.prelude.Int - - constant v_MAX'0 : usize = (18446744073709551615 : usize) - - use prelude.prelude.UIntSize - - function n'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 22 4 22 21] (self : t_Skip'0) : int - - axiom n'0_spec : forall self : t_Skip'0 . [%#sskip3] n'0 self >= 0 /\ n'0 self <= UIntSize.to_int (v_MAX'0 : usize) - - use seq.Seq + type t_Rev'0 = + { t_Rev__iter'0: t_I'0 } predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) - predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Skip'0) + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Rev'0) - axiom inv_axiom'0 [@rewrite] : forall x : t_Skip'0 [inv'0 x] . inv'0 x + axiom inv_axiom'0 [@rewrite] : forall x : t_Rev'0 [inv'0 x] . inv'0 x = match x with - | {t_Skip__iter'0 = iter ; t_Skip__n'0 = n} -> inv'1 iter + | {t_Rev__iter'0 = iter} -> inv'1 iter end - function iter'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 15 4 15 22] (self : t_Skip'0) : t_I'0 + function iter'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 18 4 18 22] (self : t_Rev'0) : t_I'0 - axiom iter'0_spec : forall self : t_Skip'0 . [%#sskip4] inv'0 self -> inv'1 (iter'0 self) + axiom iter'0_spec : forall self : t_Rev'0 . [%#srev3] inv'0 self -> inv'1 (iter'0 self) use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter.rs" 103 4 103 70] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 113 4 113 96] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () - axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter6] produces'1 a ab b) - -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) - - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () - - axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - - use seq.Seq + axiom produces_back_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces_back'0 a ab b) + -> ([%#siter6] produces_back'0 b bc c) -> ([%#siter7] produces_back'0 a (Seq.(++) ab bc) c) - use prelude.prelude.Borrow + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 107 4 107 32] (self : t_I'0) : () - predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_Item'0) + axiom produces_back_refl'0_spec : forall self : t_I'0 . [%#siter4] produces_back'0 self (Seq.empty : Seq.seq t_Item'0) self - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 60 4 60 64] (self : t_Skip'0) (visited : Seq.seq t_Item'0) (o : t_Skip'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 39 4 39 64] (self : t_Rev'0) (visited : Seq.seq t_Item'0) (o : t_Rev'0) = - [%#sskip2] visited = (Seq.empty : Seq.seq t_Item'0) /\ self = o - \/ n'0 o = 0 - /\ Seq.length visited > 0 - /\ (exists s : Seq.seq t_Item'0 . Seq.length s = n'0 self - /\ produces'1 (iter'0 self) (Seq.(++) s visited) (iter'0 o) - /\ (forall i : int . 0 <= i /\ i < Seq.length s -> resolve'0 (Seq.get s i))) + [%#srev2] produces_back'0 (iter'0 self) visited (iter'0 o) - constant self : t_Skip'0 + constant self : t_Rev'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 74 4 74 26] (self : t_Skip'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 48 4 48 26] (self : t_Rev'0) : () - goal vc_produces_refl'0 : [%#sskip0] produces'0 self (Seq.empty : Seq.seq t_Item'0) self + goal vc_produces_refl'0 : [%#srev0] produces'0 self (Seq.empty : Seq.seq t_Item'0) self end -module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produces_trans [#"../../../creusot-contracts/src/std/iter/skip.rs" 81 4 81 90] (* as std::iter::Iterator> *) - let%span sskip0 = "../../../creusot-contracts/src/std/iter/skip.rs" 78 15 78 32 - let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 79 15 79 32 - let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 80 14 80 42 - let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 76 4 76 10 - let%span sskip4 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 - let%span sskip5 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 - let%span sskip6 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__rev__qyi4378764544541057436__produces_trans [#"../../../creusot-contracts/src/std/iter/rev.rs" 55 4 55 90] (* as std::iter::Iterator> *) + let%span srev0 = "../../../creusot-contracts/src/std/iter/rev.rs" 52 15 52 32 + let%span srev1 = "../../../creusot-contracts/src/std/iter/rev.rs" 53 15 53 32 + let%span srev2 = "../../../creusot-contracts/src/std/iter/rev.rs" 54 14 54 42 + let%span srev3 = "../../../creusot-contracts/src/std/iter/rev.rs" 50 4 50 10 + let%span srev4 = "../../../creusot-contracts/src/std/iter/rev.rs" 41 12 41 56 + let%span srev5 = "../../../creusot-contracts/src/std/iter/rev.rs" 17 14 17 39 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 106 14 106 50 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 110 15 110 37 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 111 15 111 37 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 112 14 112 47 type t_I'0 - use prelude.prelude.UIntSize - - type t_Skip'0 = - { t_Skip__iter'0: t_I'0; t_Skip__n'0: usize } + type t_Rev'0 = + { t_Rev__iter'0: t_I'0 } type t_Item'0 use seq.Seq - use seq.Seq + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) - use prelude.prelude.Int + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Rev'0) - constant v_MAX'0 : usize = (18446744073709551615 : usize) + axiom inv_axiom'0 [@rewrite] : forall x : t_Rev'0 [inv'0 x] . inv'0 x + = match x with + | {t_Rev__iter'0 = iter} -> inv'1 iter + end - use prelude.prelude.UIntSize + function iter'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 18 4 18 22] (self : t_Rev'0) : t_I'0 - function n'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 22 4 22 21] (self : t_Skip'0) : int + axiom iter'0_spec : forall self : t_Rev'0 . [%#srev5] inv'0 self -> inv'1 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter.rs" 103 4 103 70] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 113 4 113 96] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_back_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter7] produces_back'0 a ab b) + -> ([%#siter8] produces_back'0 b bc c) -> ([%#siter9] produces_back'0 a (Seq.(++) ab bc) c) + + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 107 4 107 32] (self : t_I'0) : () + + axiom produces_back_refl'0_spec : forall self : t_I'0 . [%#siter6] produces_back'0 self (Seq.empty : Seq.seq t_Item'0) self + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 39 4 39 64] (self : t_Rev'0) (visited : Seq.seq t_Item'0) (o : t_Rev'0) + + = + [%#srev4] produces_back'0 (iter'0 self) visited (iter'0 o) + + constant a : t_Rev'0 + + constant ab : Seq.seq t_Item'0 + + constant b : t_Rev'0 + + constant bc : Seq.seq t_Item'0 + + constant c : t_Rev'0 + + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 55 4 55 90] (a : t_Rev'0) (ab : Seq.seq t_Item'0) (b : t_Rev'0) (bc : Seq.seq t_Item'0) (c : t_Rev'0) : () + + + goal vc_produces_trans'0 : ([%#srev1] produces'0 b bc c) + -> ([%#srev0] produces'0 a ab b) -> ([%#srev2] produces'0 a (Seq.(++) ab bc) c) +end +module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produces_refl [#"../../../creusot-contracts/src/std/iter/skip.rs" 74 4 74 26] (* as std::iter::Iterator> *) + let%span sskip0 = "../../../creusot-contracts/src/std/iter/skip.rs" 73 14 73 45 + let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 71 4 71 10 + let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 + let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 + let%span sskip4 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + use seq.Seq + + type t_Item'0 + + use seq.Seq + + type t_I'0 + + use prelude.prelude.UIntSize + + type t_Skip'0 = + { t_Skip__iter'0: t_I'0; t_Skip__n'0: usize } + + use prelude.prelude.Int + + constant v_MAX'0 : usize = (18446744073709551615 : usize) + + use prelude.prelude.UIntSize + + function n'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 22 4 22 21] (self : t_Skip'0) : int + + axiom n'0_spec : forall self : t_Skip'0 . [%#sskip3] n'0 self >= 0 /\ n'0 self <= UIntSize.to_int (v_MAX'0 : usize) + + use seq.Seq + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Skip'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_Skip'0 [inv'0 x] . inv'0 x + = match x with + | {t_Skip__iter'0 = iter ; t_Skip__n'0 = n} -> inv'1 iter + end + + function iter'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 15 4 15 22] (self : t_Skip'0) : t_I'0 + + axiom iter'0_spec : forall self : t_Skip'0 . [%#sskip4] inv'0 self -> inv'1 (iter'0 self) + + use seq.Seq + + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter6] produces'1 a ab b) + -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () + + axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + + use seq.Seq + + use prelude.prelude.Borrow + + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_Item'0) + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 60 4 60 64] (self : t_Skip'0) (visited : Seq.seq t_Item'0) (o : t_Skip'0) + + = + [%#sskip2] visited = (Seq.empty : Seq.seq t_Item'0) /\ self = o + \/ n'0 o = 0 + /\ Seq.length visited > 0 + /\ (exists s : Seq.seq t_Item'0 . Seq.length s = n'0 self + /\ produces'1 (iter'0 self) (Seq.(++) s visited) (iter'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length s -> resolve'0 (Seq.get s i))) + + constant self : t_Skip'0 + + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 74 4 74 26] (self : t_Skip'0) : () + + goal vc_produces_refl'0 : [%#sskip0] produces'0 self (Seq.empty : Seq.seq t_Item'0) self +end +module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produces_trans [#"../../../creusot-contracts/src/std/iter/skip.rs" 81 4 81 90] (* as std::iter::Iterator> *) + let%span sskip0 = "../../../creusot-contracts/src/std/iter/skip.rs" 78 15 78 32 + let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 79 15 79 32 + let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 80 14 80 42 + let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 76 4 76 10 + let%span sskip4 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 + let%span sskip5 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 + let%span sskip6 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + type t_I'0 + + use prelude.prelude.UIntSize + + type t_Skip'0 = + { t_Skip__iter'0: t_I'0; t_Skip__n'0: usize } + + type t_Item'0 + + use seq.Seq + + use seq.Seq + + use prelude.prelude.Int + + constant v_MAX'0 : usize = (18446744073709551615 : usize) + + use prelude.prelude.UIntSize + + function n'0 [#"../../../creusot-contracts/src/std/iter/skip.rs" 22 4 22 21] (self : t_Skip'0) : int axiom n'0_spec : forall self : t_Skip'0 . [%#sskip5] n'0 self >= 0 /\ n'0 self <= UIntSize.to_int (v_MAX'0 : usize) @@ -8038,16 +8724,16 @@ module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter8] produces'1 a ab b) -> ([%#siter9] produces'1 b bc c) -> ([%#siter10] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter7] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -8089,10 +8775,10 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod let%span stake2 = "../../../creusot-contracts/src/std/iter/take.rs" 65 12 65 88 let%span stake3 = "../../../creusot-contracts/src/std/iter/take.rs" 31 14 31 50 let%span stake4 = "../../../creusot-contracts/src/std/iter/take.rs" 17 14 17 39 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -8134,16 +8820,16 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter6] produces'1 a ab b) -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -8166,10 +8852,10 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod let%span stake4 = "../../../creusot-contracts/src/std/iter/take.rs" 65 12 65 88 let%span stake5 = "../../../creusot-contracts/src/std/iter/take.rs" 31 14 31 50 let%span stake6 = "../../../creusot-contracts/src/std/iter/take.rs" 17 14 17 39 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -8211,16 +8897,16 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter8] produces'1 a ab b) -> ([%#siter9] produces'1 b bc c) -> ([%#siter10] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter7] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -8251,10 +8937,10 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc let%span szip2 = "../../../creusot-contracts/src/std/iter/zip.rs" 46 12 49 95 let%span szip3 = "../../../creusot-contracts/src/std/iter/zip.rs" 14 14 14 39 let%span szip4 = "../../../creusot-contracts/src/std/iter/zip.rs" 21 14 21 39 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -8311,16 +8997,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () axiom produces_trans'0_spec : forall a : t_A'0, ab : Seq.seq t_Item'0, b : t_A'0, bc : Seq.seq t_Item'0, c : t_A'0 . ([%#siter6] produces'1 a ab b) -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_A'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_A'0) : () axiom produces_refl'1_spec : forall self : t_A'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -8332,16 +9018,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) + predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () axiom produces_trans'1_spec : forall a : t_B'0, ab : Seq.seq t_Item'1, b : t_B'0, bc : Seq.seq t_Item'1, c : t_B'0 . ([%#siter6] produces'2 a ab b) -> ([%#siter7] produces'2 b bc c) -> ([%#siter8] produces'2 a (Seq.(++) ab bc) c) - function produces_refl'2 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_B'0) : () + function produces_refl'2 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_B'0) : () axiom produces_refl'2_spec : forall self : t_B'0 . [%#siter5] produces'2 self (Seq.empty : Seq.seq t_Item'1) self @@ -8367,10 +9053,10 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc let%span szip4 = "../../../creusot-contracts/src/std/iter/zip.rs" 46 12 49 95 let%span szip5 = "../../../creusot-contracts/src/std/iter/zip.rs" 14 14 14 39 let%span szip6 = "../../../creusot-contracts/src/std/iter/zip.rs" 21 14 21 39 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_A'0 @@ -8425,16 +9111,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () axiom produces_trans'1_spec : forall a : t_A'0, ab : Seq.seq t_Item'0, b : t_A'0, bc : Seq.seq t_Item'0, c : t_A'0 . ([%#siter8] produces'1 a ab b) -> ([%#siter9] produces'1 b bc c) -> ([%#siter10] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_A'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_A'0) : () axiom produces_refl'0_spec : forall self : t_A'0 . [%#siter7] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -8446,16 +9132,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) + predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) - function produces_trans'2 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () + function produces_trans'2 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () axiom produces_trans'2_spec : forall a : t_B'0, ab : Seq.seq t_Item'1, b : t_B'0, bc : Seq.seq t_Item'1, c : t_B'0 . ([%#siter8] produces'2 a ab b) -> ([%#siter9] produces'2 b bc c) -> ([%#siter10] produces'2 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_B'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_B'0) : () axiom produces_refl'1_spec : forall self : t_B'0 . [%#siter7] produces'2 self (Seq.empty : Seq.seq t_Item'1) self @@ -8485,14 +9171,14 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc goal vc_produces_trans'0 : ([%#szip1] produces'0 b bc c) -> ([%#szip0] produces'0 a ab b) -> ([%#szip2] produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_refl [#"../../../creusot-contracts/src/std/iter.rs" 223 4 223 26] (* <&mut I as std::iter::Iterator> *) - let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 222 14 222 45 - let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 220 4 220 10 - let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 211 20 211 64 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_refl [#"../../../creusot-contracts/src/std/iter.rs" 279 4 279 26] (* <&mut I as std::iter::Iterator> *) + let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 278 14 278 45 + let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 276 4 276 10 + let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 267 20 267 64 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use seq.Seq @@ -8506,40 +9192,40 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_re use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 210 4 210 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 266 4 266 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) = [%#siter2] produces'1 self.current visited o.current /\ self.final = o.final constant self : borrowed t_I'0 - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 223 4 223 26] (self : borrowed t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 279 4 279 26] (self : borrowed t_I'0) : () goal vc_produces_refl'0 : [%#siter0] produces'0 self (Seq.empty : Seq.seq t_Item'0) self end -module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_trans [#"../../../creusot-contracts/src/std/iter.rs" 230 4 230 90] (* <&mut I as std::iter::Iterator> *) - let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 227 15 227 32 - let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 228 15 228 32 - let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 229 14 229 42 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 225 4 225 10 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 211 20 211 64 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_trans [#"../../../creusot-contracts/src/std/iter.rs" 286 4 286 90] (* <&mut I as std::iter::Iterator> *) + let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 283 15 283 32 + let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 284 15 284 32 + let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 285 14 285 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 281 4 281 10 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 267 20 267 64 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter8 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use prelude.prelude.Borrow @@ -8553,20 +9239,20 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_tr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter6] produces'1 a ab b) -> ([%#siter7] produces'1 b bc c) -> ([%#siter8] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter5] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 210 4 210 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 266 4 266 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) = [%#siter4] produces'1 self.current visited o.current /\ self.final = o.final @@ -8581,7 +9267,7 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_tr constant c : borrowed t_I'0 - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 230 4 230 90] (a : borrowed t_I'0) (ab : Seq.seq t_Item'0) (b : borrowed t_I'0) (bc : Seq.seq t_Item'0) (c : borrowed t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 286 4 286 90] (a : borrowed t_I'0) (ab : Seq.seq t_Item'0) (b : borrowed t_I'0) (bc : Seq.seq t_Item'0) (c : borrowed t_I'0) : () goal vc_produces_trans'0 : ([%#siter1] produces'0 b bc c) @@ -12819,30 +13505,1031 @@ module M_creusot_contracts__logic__fmap__qyi9892930999379617882__contains_ghost (! return' {result}) ] - predicate invariant'2 [#"../../../creusot-contracts/src/invariant.rs" 23 4 23 30] (self : t_Option'0) = - [%#sinvariant13] inv'2 self + predicate invariant'2 [#"../../../creusot-contracts/src/invariant.rs" 23 4 23 30] (self : t_Option'0) = + [%#sinvariant13] inv'2 self + + predicate inv'3 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Option'0) + + axiom inv_axiom'3 [@rewrite] : forall x : t_Option'0 [inv'3 x] . inv'3 x = invariant'2 x + + let rec is_some'0 (self:t_Option'0) (return' (ret:bool))= {[@expl:is_some 'self' type invariant] inv'3 self} + any [ return' (result:bool)-> {[%#soption7] result = (self <> C_None'0)} (! return' {result}) ] + + use prelude.prelude.Intrinsic + + meta "compute_max_steps" 1000000 + + let rec contains_ghost'0 (self:t_FMap'0) (key:t_K'0) (return' (ret:bool))= {[@expl:contains_ghost 'self' type invariant] [%#sfmap0] inv'0 self} + {[@expl:contains_ghost 'key' type invariant] [%#sfmap1] inv'1 key} + (! bb0 + [ bb0 = s0 [ s0 = get_ghost'0 {self} {key} (fun (_ret':t_Option'0) -> [ &_5 <- _ret' ] s1) | s1 = bb1 ] + | bb1 = s0 [ s0 = is_some'0 {_5} (fun (_ret':bool) -> [ &_0 <- _ret' ] s1) | s1 = bb2 ] + | bb2 = return' {_0} ] + ) [ & _0 : bool = any_l () | & self : t_FMap'0 = self | & key : t_K'0 = key | & _5 : t_Option'0 = any_l () ] + [ return' (result:bool)-> {[@expl:contains_ghost ensures] [%#sfmap2] result = contains'0 self key} + (! return' {result}) ] + +end +module M_creusot_contracts__logic__fset__qyi12147533290214288165__ext_eq [#"../../../creusot-contracts/src/logic/fset.rs" 186 4 188 17] (* logic::fset::FSet *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 185 14 185 38 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 191 12 191 63 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + type t_T'0 + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset2] Fset.mem e self + + constant self : Fset.fset t_T'0 + + constant other : Fset.fset t_T'0 + + predicate ext_eq'0 [#"../../../creusot-contracts/src/logic/fset.rs" 186 4 188 17] (self : Fset.fset t_T'0) (other : Fset.fset t_T'0) + + + goal vc_ext_eq'0 : [%#sfset0] ([%#sfset1] forall e : t_T'0 . contains'0 self e = contains'0 other e) -> self = other +end +module M_creusot_contracts__logic__fset__qyi12147533290214288165__singleton [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (* logic::fset::FSet *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + + type t_T'0 + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset2] Fset.mem e self + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset t_T'0) (e : t_T'0) : Fset.fset t_T'0 + + = + [%#sfset3] Fset.add e self + + constant x : t_T'0 + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : t_T'0) : Fset.fset t_T'0 + + goal vc_singleton'0 : [%#sfset0] forall y : t_T'0 . contains'0 (insert'0 (Fset.empty : Fset.fset t_T'0) x) y = (x = y) +end +module M_creusot_contracts__logic__fset__qyi12147533290214288165__unions [#"../../../creusot-contracts/src/logic/fset.rs" 210 4 210 61] (* logic::fset::FSet *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 208 14 208 102 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 209 14 209 24 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 206 4 206 12 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 92 8 92 26 + + type t_U'0 + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_U'0) (e : t_U'0) + + = + [%#sfset3] Fset.mem e self + + type t_T'0 + + use set.Fset + + use set.Fset + + predicate contains'1 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset3] Fset.mem e self + + use map.Map + + use set.Fset + + use map.Map + + use prelude.prelude.Int + + use set.Fset + + use set.Fset + + use set.Fset + + function remove'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 91 4 91 37] (self : Fset.fset t_T'0) (e : t_T'0) : Fset.fset t_T'0 + + = + [%#sfset4] Fset.remove e self + + use set.Fset + + constant self : Fset.fset t_T'0 + + constant f : Map.map t_T'0 (Fset.fset t_U'0) + + function unions'0 [#"../../../creusot-contracts/src/logic/fset.rs" 210 4 210 61] (self : Fset.fset t_T'0) (f : Map.map t_T'0 (Fset.fset t_U'0)) : Fset.fset t_U'0 + + + goal vc_unions'0 : if Fset.cardinal self = 0 then + [%#sfset0] forall y : t_U'0 . contains'0 (Fset.empty : Fset.fset t_U'0) y + = (exists x : t_T'0 . contains'1 self x /\ contains'0 (Map.get f x) y) + else + let x = Fset.pick self in (0 <= ([%#sfset1] Fset.cardinal self) + /\ ([%#sfset1] Fset.cardinal (remove'0 self x)) < ([%#sfset1] Fset.cardinal self)) + /\ (([%#sfset0] forall y : t_U'0 . contains'0 (unions'0 (remove'0 self x) f) y + = (exists x' : t_T'0 . contains'1 (remove'0 self x) x' /\ contains'0 (Map.get f x') y)) + -> ([%#sfset0] forall y : t_U'0 . contains'0 (Fset.union (Map.get f x) (unions'0 (remove'0 self x) f)) y + = (exists x : t_T'0 . contains'1 self x /\ contains'0 (Map.get f x) y))) + +end +module M_creusot_contracts__logic__fset__qyi12147533290214288165__replicate [#"../../../creusot-contracts/src/logic/fset.rs" 267 4 267 50] (* logic::fset::FSet *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 264 15 264 21 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 265 14 265 123 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 266 14 266 15 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 270 32 270 85 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 273 32 273 108 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 247 14 247 117 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 268 8 276 9 + let%span sfset8 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sseq9 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 + let%span sfset10 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sseq11 = "../../../creusot-contracts/src/logic/seq.rs" 173 8 173 39 + let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + + use prelude.prelude.Int + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset8] Fset.mem e self + + use seq.Seq + + use seq.Seq + + predicate contains'1 [#"../../../creusot-contracts/src/logic/seq.rs" 351 4 353 17] (self : Seq.seq t_T'0) (x : t_T'0) + = + [%#sseq9] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x + + use set.Fset + + use set.Fset + + predicate contains'2 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset8] Fset.mem e self + + use seq.Seq + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset12] Fset.add e self + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset10] insert'0 (Fset.empty : Fset.fset (Seq.seq t_T'0)) x + + axiom singleton'0_spec : forall x : Seq.seq t_T'0 . [%#sfset4] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 x) y + = (x = y) + + use seq.Seq + + function tail'0 [#"../../../creusot-contracts/src/logic/seq.rs" 172 4 172 29] (self : Seq.seq t_T'0) : Seq.seq t_T'0 = + [%#sseq11] Seq.([..]) self 1 (Seq.length self) + + function cons'0 [#"../../../creusot-contracts/src/logic/fset.rs" 248 4 248 61] (s : Fset.fset t_T'0) (ss : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom cons'0_spec : forall s : Fset.fset t_T'0, ss : Fset.fset (Seq.seq t_T'0) . [%#sfset6] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 s ss) xs + = (0 < Seq.length xs /\ contains'2 s (Seq.get xs 0) /\ contains'0 ss (tail'0 xs)) + + constant self : Fset.fset t_T'0 + + constant n : int + + function replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 267 4 267 50] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + goal vc_replicate'0 : ([%#sfset0] n >= 0) + -> (if n = 0 then + ([%#sfset3] forall xs : Seq.seq t_T'0 . Seq.length xs = 0 -> xs = (Seq.empty : Seq.seq t_T'0)) + && (let _ = () in let _ = () in ([%#sfset4] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) y + = ((Seq.empty : Seq.seq t_T'0) = y)) + -> ([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x)))) + else + ([%#sfset5] forall xs : Seq.seq t_T'0, i : int . 0 < i /\ i < Seq.length xs + -> Seq.get xs i = Seq.get (tail'0 xs) (i - 1)) + && (let _ = () in let _ = () in (([@expl:replicate requires] [%#sfset0] n - 1 >= 0) + /\ 0 <= ([%#sfset2] n) /\ ([%#sfset2] n - 1) < ([%#sfset2] n)) + /\ (([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 self (n - 1)) xs + = (Seq.length xs = n - 1 /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + -> ([%#sfset6] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 self (replicate'0 self (n - 1))) xs + = (0 < Seq.length xs /\ contains'2 self (Seq.get xs 0) /\ contains'0 (replicate'0 self (n - 1)) (tail'0 xs))) + -> ([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 self (replicate'0 self (n - 1))) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))))) + ) +end +module M_creusot_contracts__logic__fset__qyi12147533290214288165__replicate_up_to [#"../../../creusot-contracts/src/logic/fset.rs" 285 4 285 56] (* logic::fset::FSet *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 282 15 282 21 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 283 14 283 123 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 284 14 284 15 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 288 32 288 85 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 264 15 264 21 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 265 14 265 123 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 266 14 266 15 + let%span sfset8 = "../../../creusot-contracts/src/logic/fset.rs" 286 8 293 9 + let%span sfset9 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sseq10 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 + let%span sfset11 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 268 8 276 9 + let%span sfset13 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + let%span sfset14 = "../../../creusot-contracts/src/logic/fset.rs" 247 14 247 117 + let%span sseq15 = "../../../creusot-contracts/src/logic/seq.rs" 173 8 173 39 + + use prelude.prelude.Int + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset9] Fset.mem e self + + use seq.Seq + + use seq.Seq + + predicate contains'1 [#"../../../creusot-contracts/src/logic/seq.rs" 351 4 353 17] (self : Seq.seq t_T'0) (x : t_T'0) + = + [%#sseq10] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x + + use set.Fset + + use set.Fset + + predicate contains'2 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset9] Fset.mem e self + + use seq.Seq + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset13] Fset.add e self + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset11] insert'0 (Fset.empty : Fset.fset (Seq.seq t_T'0)) x + + axiom singleton'0_spec : forall x : Seq.seq t_T'0 . [%#sfset4] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 x) y + = (x = y) + + use seq.Seq + + function tail'0 [#"../../../creusot-contracts/src/logic/seq.rs" 172 4 172 29] (self : Seq.seq t_T'0) : Seq.seq t_T'0 = + [%#sseq15] Seq.([..]) self 1 (Seq.length self) + + function cons'0 [#"../../../creusot-contracts/src/logic/fset.rs" 248 4 248 61] (s : Fset.fset t_T'0) (ss : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom cons'0_spec : forall s : Fset.fset t_T'0, ss : Fset.fset (Seq.seq t_T'0) . [%#sfset14] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 s ss) xs + = (0 < Seq.length xs /\ contains'2 s (Seq.get xs 0) /\ contains'0 ss (tail'0 xs)) + + function replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 267 4 267 50] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + axiom replicate'0_def : forall self : Fset.fset t_T'0, n : int . ([%#sfset5] n >= 0) + -> replicate'0 self n + = ([%#sfset12] if n = 0 then + let _ = let _ = () in () in singleton'0 (Seq.empty : Seq.seq t_T'0) + else + let _ = let _ = () in () in cons'0 self (replicate'0 self (n - 1)) + ) + + axiom replicate'0_spec : forall self : Fset.fset t_T'0, n : int . ([%#sfset5] n >= 0) + -> ([%#sfset6] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 self n) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + + use set.Fset + + constant self : Fset.fset t_T'0 + + constant n : int + + function replicate_up_to'0 [#"../../../creusot-contracts/src/logic/fset.rs" 285 4 285 56] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + goal vc_replicate_up_to'0 : ([%#sfset0] n >= 0) + -> (if n = 0 then + ([%#sfset3] forall xs : Seq.seq t_T'0 . Seq.length xs = 0 -> xs = (Seq.empty : Seq.seq t_T'0)) + && (let _ = () in let _ = () in ([%#sfset4] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) y + = ((Seq.empty : Seq.seq t_T'0) = y)) + -> ([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) xs + = (Seq.length xs <= n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x)))) + else + (([@expl:replicate_up_to requires] [%#sfset0] n - 1 >= 0) + /\ 0 <= ([%#sfset2] n) /\ ([%#sfset2] n - 1) < ([%#sfset2] n)) + /\ (([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (replicate_up_to'0 self (n - 1)) xs + = (Seq.length xs <= n - 1 /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + -> ([@expl:replicate requires] [%#sfset5] n >= 0) + /\ (([%#sfset6] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 self n) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + -> ([%#sfset1] forall xs : Seq.seq t_T'0 . contains'0 (Fset.union (replicate_up_to'0 self (n + - 1)) (replicate'0 self n)) xs + = (Seq.length xs <= n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))))) + ) +end +module M_creusot_contracts__logic__fset__unions_union [#"../../../creusot-contracts/src/logic/fset.rs" 469 0 469 27] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 466 10 466 125 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 467 10 468 76 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 464 0 464 8 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 208 14 208 102 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 209 14 209 24 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 206 4 206 12 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 92 8 92 26 + + type t_T'0 + + use set.Fset + + type t_U'0 + + use set.Fset + + use map.Map + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_U'0) (e : t_U'0) + + = + [%#sfset6] Fset.mem e self + + use set.Fset + + predicate contains'1 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset6] Fset.mem e self + + use map.Map + + use set.Fset + + use set.Fset + + use set.Fset + + use set.Fset + + function remove'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 91 4 91 37] (self : Fset.fset t_T'0) (e : t_T'0) : Fset.fset t_T'0 + + = + [%#sfset7] Fset.remove e self + + use set.Fset + + function unions'0 [#"../../../creusot-contracts/src/logic/fset.rs" 210 4 210 61] (self : Fset.fset t_T'0) (f : Map.map t_T'0 (Fset.fset t_U'0)) : Fset.fset t_U'0 + + + axiom unions'0_def : forall self : Fset.fset t_T'0, f : Map.map t_T'0 (Fset.fset t_U'0) . unions'0 self f + = ([%#sfset5] if Fset.cardinal self = 0 then + Fset.empty : Fset.fset t_U'0 + else + let x = Fset.pick self in Fset.union (Map.get f x) (unions'0 (remove'0 self x) f) + ) + + axiom unions'0_spec : forall self : Fset.fset t_T'0, f : Map.map t_T'0 (Fset.fset t_U'0) . [%#sfset3] forall y : t_U'0 . contains'0 (unions'0 self f) y + = (exists x : t_T'0 . contains'1 self x /\ contains'0 (Map.get f x) y) + + use prelude.prelude.Mapping + + constant _1 : () + + function unions_union'0 [#"../../../creusot-contracts/src/logic/fset.rs" 469 0 469 27] (_1 : ()) : () + + goal vc_unions_union'0 : ([%#sfset0] forall s1 : Fset.fset t_T'0, s2 : Fset.fset t_T'0, f : Map.map t_T'0 (Fset.fset t_U'0) . unions'0 (Fset.union s1 s2) f + = Fset.union (unions'0 s1 f) (unions'0 s2 f)) + && ([%#sfset1] forall s : Fset.fset t_T'0, f : Map.map t_T'0 (Fset.fset t_U'0), g : Map.map t_T'0 (Fset.fset t_U'0) . unions'0 s (Mapping.from_fn (fun (x : t_T'0) -> Fset.union (Map.get f x) (Map.get g x))) + = Fset.union (unions'0 s f) (unions'0 s g)) +end +module M_creusot_contracts__logic__fset__map_union [#"../../../creusot-contracts/src/logic/fset.rs" 475 0 475 24] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 474 10 474 104 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 472 0 472 8 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 231 8 231 27 + + type t_T'0 + + use set.Fset + + type t_U'0 + + use map.Map + + use set.Fset + + use set.Fset + + use set.Fset + + function map'0 [#"../../../creusot-contracts/src/logic/fset.rs" 230 4 230 52] (self : Fset.fset t_T'0) (f : Map.map t_T'0 t_U'0) : Fset.fset t_U'0 + + = + [%#sfset2] Fset.map f self + + use set.Fset + + constant _1 : () + + function map_union'0 [#"../../../creusot-contracts/src/logic/fset.rs" 475 0 475 24] (_1 : ()) : () + + goal vc_map_union'0 : [%#sfset0] forall s : Fset.fset t_T'0, t : Fset.fset t_T'0, f : Map.map t_T'0 t_U'0 . map'0 (Fset.union s t) f + = Fset.union (map'0 s f) (map'0 t f) +end +module M_creusot_contracts__logic__fset__concat_union [#"../../../creusot-contracts/src/logic/fset.rs" 484 0 484 24] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 480 10 481 83 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 482 10 483 83 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 478 0 478 8 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 256 14 256 144 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset4] Fset.mem e self + + use seq.Seq + + function concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 257 4 257 67] (s : Fset.fset (Seq.seq t_T'0)) (t : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom concat'0_spec : forall s : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . [%#sfset3] forall xs : Seq.seq t_T'0 . contains'0 (concat'0 s t) xs + = (exists ys : Seq.seq t_T'0, zs : Seq.seq t_T'0 . contains'0 s ys /\ contains'0 t zs /\ xs = Seq.(++) ys zs) + + constant _1 : () + + function concat_union'0 [#"../../../creusot-contracts/src/logic/fset.rs" 484 0 484 24] (_1 : ()) : () + + goal vc_concat_union'0 : ([%#sfset0] forall s1 : Fset.fset (Seq.seq t_T'0), s2 : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . concat'0 (Fset.union s1 s2) t + = Fset.union (concat'0 s1 t) (concat'0 s2 t)) + && ([%#sfset1] forall s : Fset.fset (Seq.seq t_T'0), t1 : Fset.fset (Seq.seq t_T'0), t2 : Fset.fset (Seq.seq t_T'0) . concat'0 s (Fset.union t1 t2) + = Fset.union (concat'0 s t1) (concat'0 s t2)) +end +module M_creusot_contracts__logic__fset__cons_concat [#"../../../creusot-contracts/src/logic/fset.rs" 490 0 490 23] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 489 10 489 133 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 491 20 491 115 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 492 20 492 74 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 493 20 493 89 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 491 4 491 117 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 247 14 247 117 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 256 14 256 144 + let%span sseq7 = "../../../creusot-contracts/src/logic/seq.rs" 251 8 251 27 + let%span sseq8 = "../../../creusot-contracts/src/logic/seq.rs" 173 8 173 39 + let%span sfset9 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + type t_T'0 + + use set.Fset + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset9] Fset.mem e self + + use seq.Seq + + use prelude.prelude.Int + + use seq.Seq + + use set.Fset + + predicate contains'1 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset9] Fset.mem e self + + use seq.Seq + + function tail'0 [#"../../../creusot-contracts/src/logic/seq.rs" 172 4 172 29] (self : Seq.seq t_T'0) : Seq.seq t_T'0 = + [%#sseq8] Seq.([..]) self 1 (Seq.length self) + + function cons'0 [#"../../../creusot-contracts/src/logic/fset.rs" 248 4 248 61] (s : Fset.fset t_T'0) (ss : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom cons'0_spec : forall s : Fset.fset t_T'0, ss : Fset.fset (Seq.seq t_T'0) . [%#sfset5] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 s ss) xs + = (0 < Seq.length xs /\ contains'1 s (Seq.get xs 0) /\ contains'0 ss (tail'0 xs)) + + use seq.Seq + + function concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 257 4 257 67] (s : Fset.fset (Seq.seq t_T'0)) (t : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom concat'0_spec : forall s : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . [%#sfset6] forall xs : Seq.seq t_T'0 . contains'0 (concat'0 s t) xs + = (exists ys : Seq.seq t_T'0, zs : Seq.seq t_T'0 . contains'0 s ys /\ contains'0 t zs /\ xs = Seq.(++) ys zs) + + use seq.Seq + + function push_front'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/seq.rs" 250 4 250 41] (self : Seq.seq t_T'0) (x : t_T'0) : Seq.seq t_T'0 + + = + [%#sseq7] Seq.cons x self + + constant _1 : () + + function cons_concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 490 0 490 23] (_1 : ()) : () + + goal vc_cons_concat'0 : ([%#sfset1] forall x : t_T'0, xs : Seq.seq t_T'0, ys : Seq.seq t_T'0 . Seq.(++) (push_front'0 xs x) ys + = push_front'0 (Seq.(++) xs ys) x) + && (let _ = () in let _ = () in ([%#sfset2] forall x : t_T'0, ys : Seq.seq t_T'0 . tail'0 (push_front'0 ys x) = ys) + && (let _ = () in let _ = () in ([%#sfset3] forall ys : Seq.seq t_T'0 . 0 < Seq.length ys + -> ys = push_front'0 (tail'0 ys) (Seq.get ys 0)) + && (let _ = () in let _ = () in [%#sfset0] forall s : Fset.fset t_T'0, t : Fset.fset (Seq.seq t_T'0), u : Fset.fset (Seq.seq t_T'0) . concat'0 (cons'0 s t) u + = cons'0 s (concat'0 t u)))) +end +module M_creusot_contracts__logic__fset__concat_replicate [#"../../../creusot-contracts/src/logic/fset.rs" 502 0 502 54] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 499 11 499 27 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 500 10 500 76 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 501 10 501 11 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 264 15 264 21 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 265 14 265 123 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 266 14 266 15 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 516 10 516 59 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 517 10 517 59 + let%span sfset8 = "../../../creusot-contracts/src/logic/fset.rs" 489 10 489 133 + let%span sfset9 = "../../../creusot-contracts/src/logic/fset.rs" 503 4 510 5 + let%span sfset10 = "../../../creusot-contracts/src/logic/fset.rs" 268 8 276 9 + let%span sfset11 = "../../../creusot-contracts/src/logic/fset.rs" 256 14 256 144 + let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sseq13 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 + let%span sfset14 = "../../../creusot-contracts/src/logic/fset.rs" 519 4 519 68 + let%span sfset15 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset16 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sfset17 = "../../../creusot-contracts/src/logic/fset.rs" 491 4 491 117 + let%span sfset18 = "../../../creusot-contracts/src/logic/fset.rs" 247 14 247 117 + let%span sfset19 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + let%span sseq20 = "../../../creusot-contracts/src/logic/seq.rs" 173 8 173 39 + + use prelude.prelude.Int + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset12] Fset.mem e self + + use seq.Seq + + use seq.Seq + + predicate contains'1 [#"../../../creusot-contracts/src/logic/seq.rs" 351 4 353 17] (self : Seq.seq t_T'0) (x : t_T'0) + = + [%#sseq13] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x + + use set.Fset + + use set.Fset + + predicate contains'2 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset12] Fset.mem e self + + use seq.Seq + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset19] Fset.add e self + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset16] insert'0 (Fset.empty : Fset.fset (Seq.seq t_T'0)) x + + axiom singleton'0_spec : forall x : Seq.seq t_T'0 . [%#sfset15] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 x) y + = (x = y) + + use seq.Seq + + function tail'0 [#"../../../creusot-contracts/src/logic/seq.rs" 172 4 172 29] (self : Seq.seq t_T'0) : Seq.seq t_T'0 = + [%#sseq20] Seq.([..]) self 1 (Seq.length self) + + function cons'0 [#"../../../creusot-contracts/src/logic/fset.rs" 248 4 248 61] (s : Fset.fset t_T'0) (ss : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom cons'0_spec : forall s : Fset.fset t_T'0, ss : Fset.fset (Seq.seq t_T'0) . [%#sfset18] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 s ss) xs + = (0 < Seq.length xs /\ contains'2 s (Seq.get xs 0) /\ contains'0 ss (tail'0 xs)) + + function replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 267 4 267 50] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + axiom replicate'0_def : forall self : Fset.fset t_T'0, n : int . ([%#sfset3] n >= 0) + -> replicate'0 self n + = ([%#sfset10] if n = 0 then + let _ = let _ = () in () in singleton'0 (Seq.empty : Seq.seq t_T'0) + else + let _ = let _ = () in () in cons'0 self (replicate'0 self (n - 1)) + ) + + axiom replicate'0_spec : forall self : Fset.fset t_T'0, n : int . ([%#sfset3] n >= 0) + -> ([%#sfset4] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 self n) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + + use seq.Seq + + function concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 257 4 257 67] (s : Fset.fset (Seq.seq t_T'0)) (t : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom concat'0_spec : forall s : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . [%#sfset11] forall xs : Seq.seq t_T'0 . contains'0 (concat'0 s t) xs + = (exists ys : Seq.seq t_T'0, zs : Seq.seq t_T'0 . contains'0 s ys /\ contains'0 t zs /\ xs = Seq.(++) ys zs) + + function concat_empty'0 [#"../../../creusot-contracts/src/logic/fset.rs" 518 0 518 39] (s : Fset.fset (Seq.seq t_T'0)) : () + + = + [%#sfset14] let _ = let _ = () in () in let _ = let _ = () in () in () + + axiom concat_empty'0_spec : forall s : Fset.fset (Seq.seq t_T'0) . ([%#sfset6] concat'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) s + = s) + && ([%#sfset7] concat'0 s (singleton'0 (Seq.empty : Seq.seq t_T'0)) = s) + + function cons_concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 490 0 490 23] (_1 : ()) : () = + [%#sfset17] let _ = let _ = () in () in let _ = let _ = () in () in let _ = let _ = () in () in () + + axiom cons_concat'0_spec : forall _1 : () . [%#sfset8] forall s : Fset.fset t_T'0, t : Fset.fset (Seq.seq t_T'0), u : Fset.fset (Seq.seq t_T'0) . concat'0 (cons'0 s t) u + = cons'0 s (concat'0 t u) + + constant n : int + + constant m : int + + constant s : Fset.fset t_T'0 + + function concat_replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 502 0 502 54] (n : int) (m : int) (s : Fset.fset t_T'0) : () + + + goal vc_concat_replicate'0 : ([%#sfset0] 0 <= n /\ 0 <= m) + -> (if n = 0 then + ([@expl:replicate requires] [%#sfset3] m >= 0) + /\ (([%#sfset4] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 s m) xs + = (Seq.length xs = m /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 s x))) + -> ([%#sfset6] concat'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) (replicate'0 s m) = replicate'0 s m) + && ([%#sfset7] concat'0 (replicate'0 s m) (singleton'0 (Seq.empty : Seq.seq t_T'0)) = replicate'0 s m) + -> (let _ = concat_empty'0 (replicate'0 s m) in [%#sfset1] replicate'0 s (n + m) + = concat'0 (replicate'0 s n) (replicate'0 s m))) + else + ([%#sfset8] forall s : Fset.fset t_T'0, t : Fset.fset (Seq.seq t_T'0), u : Fset.fset (Seq.seq t_T'0) . concat'0 (cons'0 s t) u + = cons'0 s (concat'0 t u)) + -> (let _ = cons_concat'0 () in (([@expl:concat_replicate requires] [%#sfset0] 0 <= n - 1 /\ 0 <= m) + /\ 0 <= ([%#sfset2] n) /\ ([%#sfset2] n - 1) < ([%#sfset2] n)) + /\ (([%#sfset1] replicate'0 s (n - 1 + m) = concat'0 (replicate'0 s (n - 1)) (replicate'0 s m)) + -> (let _ = concat_replicate'0 (n - 1) m s in [%#sfset1] replicate'0 s (n + m) + = concat'0 (replicate'0 s n) (replicate'0 s m)))) + ) +end +module M_creusot_contracts__logic__fset__concat_empty [#"../../../creusot-contracts/src/logic/fset.rs" 518 0 518 39] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 516 10 516 59 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 517 10 517 59 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 519 20 519 66 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 520 20 520 66 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 519 4 519 68 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 256 14 256 144 + let%span sfset8 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sfset9 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + + use seq.Seq + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset8] Fset.mem e self + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset9] Fset.add e self + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset6] insert'0 (Fset.empty : Fset.fset (Seq.seq t_T'0)) x + + axiom singleton'0_spec : forall x : Seq.seq t_T'0 . [%#sfset5] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 x) y + = (x = y) + + use seq.Seq + + function concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 257 4 257 67] (s : Fset.fset (Seq.seq t_T'0)) (t : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom concat'0_spec : forall s : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . [%#sfset7] forall xs : Seq.seq t_T'0 . contains'0 (concat'0 s t) xs + = (exists ys : Seq.seq t_T'0, zs : Seq.seq t_T'0 . contains'0 s ys /\ contains'0 t zs /\ xs = Seq.(++) ys zs) + + constant s : Fset.fset (Seq.seq t_T'0) + + function concat_empty'0 [#"../../../creusot-contracts/src/logic/fset.rs" 518 0 518 39] (s : Fset.fset (Seq.seq t_T'0)) : () + + + goal vc_concat_empty'0 : ([%#sfset2] forall xs : Seq.seq t_T'0 . Seq.(++) xs (Seq.empty : Seq.seq t_T'0) = xs) + && (let _ = () in let _ = () in ([%#sfset3] forall xs : Seq.seq t_T'0 . Seq.(++) (Seq.empty : Seq.seq t_T'0) xs = xs) + && (let _ = () in let _ = () in ([%#sfset0] concat'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) s = s) + && ([%#sfset1] concat'0 s (singleton'0 (Seq.empty : Seq.seq t_T'0)) = s))) +end +module M_creusot_contracts__logic__fset__concat_replicate_up_to [#"../../../creusot-contracts/src/logic/fset.rs" 530 0 530 60] + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 526 11 526 26 + let%span sfset1 = "../../../creusot-contracts/src/logic/fset.rs" 527 10 528 67 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 529 10 529 11 + let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 264 15 264 21 + let%span sfset4 = "../../../creusot-contracts/src/logic/fset.rs" 265 14 265 123 + let%span sfset5 = "../../../creusot-contracts/src/logic/fset.rs" 266 14 266 15 + let%span sfset6 = "../../../creusot-contracts/src/logic/fset.rs" 516 10 516 59 + let%span sfset7 = "../../../creusot-contracts/src/logic/fset.rs" 517 10 517 59 + let%span sfset8 = "../../../creusot-contracts/src/logic/fset.rs" 480 10 481 83 + let%span sfset9 = "../../../creusot-contracts/src/logic/fset.rs" 482 10 483 83 + let%span sfset10 = "../../../creusot-contracts/src/logic/fset.rs" 499 11 499 27 + let%span sfset11 = "../../../creusot-contracts/src/logic/fset.rs" 500 10 500 76 + let%span sfset12 = "../../../creusot-contracts/src/logic/fset.rs" 501 10 501 11 + let%span sfset13 = "../../../creusot-contracts/src/logic/fset.rs" 531 4 539 5 + let%span sfset14 = "../../../creusot-contracts/src/logic/fset.rs" 282 15 282 21 + let%span sfset15 = "../../../creusot-contracts/src/logic/fset.rs" 283 14 283 123 + let%span sfset16 = "../../../creusot-contracts/src/logic/fset.rs" 284 14 284 15 + let%span sfset17 = "../../../creusot-contracts/src/logic/fset.rs" 286 8 293 9 + let%span sfset18 = "../../../creusot-contracts/src/logic/fset.rs" 268 8 276 9 + let%span sfset19 = "../../../creusot-contracts/src/logic/fset.rs" 256 14 256 144 + let%span sfset20 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + let%span sseq21 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 + let%span sfset22 = "../../../creusot-contracts/src/logic/fset.rs" 519 4 519 68 + let%span sfset23 = "../../../creusot-contracts/src/logic/fset.rs" 200 14 200 57 + let%span sfset24 = "../../../creusot-contracts/src/logic/fset.rs" 202 8 202 29 + let%span sfset25 = "../../../creusot-contracts/src/logic/fset.rs" 478 0 478 8 + let%span sfset26 = "../../../creusot-contracts/src/logic/fset.rs" 503 4 510 5 + let%span sfset27 = "../../../creusot-contracts/src/logic/fset.rs" 247 14 247 117 + let%span sfset28 = "../../../creusot-contracts/src/logic/fset.rs" 65 8 65 26 + let%span sfset29 = "../../../creusot-contracts/src/logic/fset.rs" 489 10 489 133 + let%span sfset30 = "../../../creusot-contracts/src/logic/fset.rs" 491 4 491 117 + let%span sseq31 = "../../../creusot-contracts/src/logic/seq.rs" 173 8 173 39 + + use prelude.prelude.Int + + type t_T'0 + + use seq.Seq + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) + + = + [%#sfset20] Fset.mem e self + + use seq.Seq + + use seq.Seq + + predicate contains'1 [#"../../../creusot-contracts/src/logic/seq.rs" 351 4 353 17] (self : Seq.seq t_T'0) (x : t_T'0) + = + [%#sseq21] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x + + use set.Fset + + use set.Fset + + predicate contains'2 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 45 4 45 39] (self : Fset.fset t_T'0) (e : t_T'0) + + = + [%#sfset20] Fset.mem e self + + use seq.Seq + + use set.Fset + + use set.Fset + + function insert'0 [@inline:trivial] [#"../../../creusot-contracts/src/logic/fset.rs" 64 4 64 37] (self : Fset.fset (Seq.seq t_T'0)) (e : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset28] Fset.add e self + + function singleton'0 [#"../../../creusot-contracts/src/logic/fset.rs" 201 4 201 34] (x : Seq.seq t_T'0) : Fset.fset (Seq.seq t_T'0) + + = + [%#sfset24] insert'0 (Fset.empty : Fset.fset (Seq.seq t_T'0)) x + + axiom singleton'0_spec : forall x : Seq.seq t_T'0 . [%#sfset23] forall y : Seq.seq t_T'0 . contains'0 (singleton'0 x) y + = (x = y) + + use seq.Seq + + function tail'0 [#"../../../creusot-contracts/src/logic/seq.rs" 172 4 172 29] (self : Seq.seq t_T'0) : Seq.seq t_T'0 = + [%#sseq31] Seq.([..]) self 1 (Seq.length self) + + function cons'0 [#"../../../creusot-contracts/src/logic/fset.rs" 248 4 248 61] (s : Fset.fset t_T'0) (ss : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom cons'0_spec : forall s : Fset.fset t_T'0, ss : Fset.fset (Seq.seq t_T'0) . [%#sfset27] forall xs : Seq.seq t_T'0 . contains'0 (cons'0 s ss) xs + = (0 < Seq.length xs /\ contains'2 s (Seq.get xs 0) /\ contains'0 ss (tail'0 xs)) + + function replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 267 4 267 50] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + axiom replicate'0_def : forall self : Fset.fset t_T'0, n : int . ([%#sfset3] n >= 0) + -> replicate'0 self n + = ([%#sfset18] if n = 0 then + let _ = let _ = () in () in singleton'0 (Seq.empty : Seq.seq t_T'0) + else + let _ = let _ = () in () in cons'0 self (replicate'0 self (n - 1)) + ) + + axiom replicate'0_spec : forall self : Fset.fset t_T'0, n : int . ([%#sfset3] n >= 0) + -> ([%#sfset4] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 self n) xs + = (Seq.length xs = n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + + use set.Fset + + function replicate_up_to'0 [#"../../../creusot-contracts/src/logic/fset.rs" 285 4 285 56] (self : Fset.fset t_T'0) (n : int) : Fset.fset (Seq.seq t_T'0) + + + axiom replicate_up_to'0_def : forall self : Fset.fset t_T'0, n : int . ([%#sfset14] n >= 0) + -> replicate_up_to'0 self n + = ([%#sfset17] if n = 0 then + let _ = let _ = () in () in singleton'0 (Seq.empty : Seq.seq t_T'0) + else + Fset.union (replicate_up_to'0 self (n - 1)) (replicate'0 self n) + ) + + axiom replicate_up_to'0_spec : forall self : Fset.fset t_T'0, n : int . ([%#sfset14] n >= 0) + -> ([%#sfset15] forall xs : Seq.seq t_T'0 . contains'0 (replicate_up_to'0 self n) xs + = (Seq.length xs <= n /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 self x))) + + use seq.Seq + + function concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 257 4 257 67] (s : Fset.fset (Seq.seq t_T'0)) (t : Fset.fset (Seq.seq t_T'0)) : Fset.fset (Seq.seq t_T'0) + + + axiom concat'0_spec : forall s : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . [%#sfset19] forall xs : Seq.seq t_T'0 . contains'0 (concat'0 s t) xs + = (exists ys : Seq.seq t_T'0, zs : Seq.seq t_T'0 . contains'0 s ys /\ contains'0 t zs /\ xs = Seq.(++) ys zs) + + function concat_empty'0 [#"../../../creusot-contracts/src/logic/fset.rs" 518 0 518 39] (s : Fset.fset (Seq.seq t_T'0)) : () + + = + [%#sfset22] let _ = let _ = () in () in let _ = let _ = () in () in () + + axiom concat_empty'0_spec : forall s : Fset.fset (Seq.seq t_T'0) . ([%#sfset6] concat'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) s + = s) + && ([%#sfset7] concat'0 s (singleton'0 (Seq.empty : Seq.seq t_T'0)) = s) + + function concat_union'0 [#"../../../creusot-contracts/src/logic/fset.rs" 484 0 484 24] (_1 : ()) : () = + [%#sfset25] () + + axiom concat_union'0_spec : forall _1 : () . ([%#sfset8] forall s1 : Fset.fset (Seq.seq t_T'0), s2 : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . concat'0 (Fset.union s1 s2) t + = Fset.union (concat'0 s1 t) (concat'0 s2 t)) + && ([%#sfset9] forall s : Fset.fset (Seq.seq t_T'0), t1 : Fset.fset (Seq.seq t_T'0), t2 : Fset.fset (Seq.seq t_T'0) . concat'0 s (Fset.union t1 t2) + = Fset.union (concat'0 s t1) (concat'0 s t2)) + + function cons_concat'0 [#"../../../creusot-contracts/src/logic/fset.rs" 490 0 490 23] (_1 : ()) : () = + [%#sfset30] let _ = let _ = () in () in let _ = let _ = () in () in let _ = let _ = () in () in () - predicate inv'3 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Option'0) + axiom cons_concat'0_spec : forall _1 : () . [%#sfset29] forall s : Fset.fset t_T'0, t : Fset.fset (Seq.seq t_T'0), u : Fset.fset (Seq.seq t_T'0) . concat'0 (cons'0 s t) u + = cons'0 s (concat'0 t u) - axiom inv_axiom'3 [@rewrite] : forall x : t_Option'0 [inv'3 x] . inv'3 x = invariant'2 x + function concat_replicate'0 [#"../../../creusot-contracts/src/logic/fset.rs" 502 0 502 54] (n : int) (m : int) (s : Fset.fset t_T'0) : () + - let rec is_some'0 (self:t_Option'0) (return' (ret:bool))= {[@expl:is_some 'self' type invariant] inv'3 self} - any [ return' (result:bool)-> {[%#soption7] result = (self <> C_None'0)} (! return' {result}) ] + axiom concat_replicate'0_def : forall n : int, m : int, s : Fset.fset t_T'0 . ([%#sfset10] 0 <= n /\ 0 <= m) + -> concat_replicate'0 n m s + = ([%#sfset26] if n = 0 then + let _ = concat_empty'0 (replicate'0 s m) in () + else + let _ = cons_concat'0 () in let _ = concat_replicate'0 (n - 1) m s in () + ) - use prelude.prelude.Intrinsic + axiom concat_replicate'0_spec : forall n : int, m : int, s : Fset.fset t_T'0 . ([%#sfset10] 0 <= n /\ 0 <= m) + -> ([%#sfset11] replicate'0 s (n + m) = concat'0 (replicate'0 s n) (replicate'0 s m)) - meta "compute_max_steps" 1000000 + constant n : int - let rec contains_ghost'0 (self:t_FMap'0) (key:t_K'0) (return' (ret:bool))= {[@expl:contains_ghost 'self' type invariant] [%#sfmap0] inv'0 self} - {[@expl:contains_ghost 'key' type invariant] [%#sfmap1] inv'1 key} - (! bb0 - [ bb0 = s0 [ s0 = get_ghost'0 {self} {key} (fun (_ret':t_Option'0) -> [ &_5 <- _ret' ] s1) | s1 = bb1 ] - | bb1 = s0 [ s0 = is_some'0 {_5} (fun (_ret':bool) -> [ &_0 <- _ret' ] s1) | s1 = bb2 ] - | bb2 = return' {_0} ] - ) [ & _0 : bool = any_l () | & self : t_FMap'0 = self | & key : t_K'0 = key | & _5 : t_Option'0 = any_l () ] - [ return' (result:bool)-> {[@expl:contains_ghost ensures] [%#sfmap2] result = contains'0 self key} - (! return' {result}) ] + constant m : int + + constant s : Fset.fset t_T'0 + + function concat_replicate_up_to'0 [#"../../../creusot-contracts/src/logic/fset.rs" 530 0 530 60] (n : int) (m : int) (s : Fset.fset t_T'0) : () + + goal vc_concat_replicate_up_to'0 : ([%#sfset0] 0 <= n /\ n < m) + -> (if n + 1 = m then + ([@expl:replicate requires] [%#sfset3] n + 1 >= 0) + /\ (([%#sfset4] forall xs : Seq.seq t_T'0 . contains'0 (replicate'0 s (n + 1)) xs + = (Seq.length xs = n + 1 /\ (forall x : t_T'0 . contains'1 xs x -> contains'2 s x))) + -> ([%#sfset6] concat'0 (singleton'0 (Seq.empty : Seq.seq t_T'0)) (replicate'0 s (n + 1)) = replicate'0 s (n + 1)) + && ([%#sfset7] concat'0 (replicate'0 s (n + 1)) (singleton'0 (Seq.empty : Seq.seq t_T'0)) = replicate'0 s (n + 1)) + -> (let _ = concat_empty'0 (replicate'0 s (n + 1)) in [%#sfset1] replicate_up_to'0 s m + = Fset.union (replicate_up_to'0 s n) (concat'0 (replicate'0 s (n + 1)) (replicate_up_to'0 s (m - n - 1))))) + else + ([%#sfset8] forall s1 : Fset.fset (Seq.seq t_T'0), s2 : Fset.fset (Seq.seq t_T'0), t : Fset.fset (Seq.seq t_T'0) . concat'0 (Fset.union s1 s2) t + = Fset.union (concat'0 s1 t) (concat'0 s2 t)) + && ([%#sfset9] forall s : Fset.fset (Seq.seq t_T'0), t1 : Fset.fset (Seq.seq t_T'0), t2 : Fset.fset (Seq.seq t_T'0) . concat'0 s (Fset.union t1 t2) + = Fset.union (concat'0 s t1) (concat'0 s t2)) + -> (let _ = concat_union'0 () in ([@expl:concat_replicate requires] [%#sfset10] 0 <= n /\ 0 <= m - n - 1) + /\ (([%#sfset11] replicate'0 s (n + (m - n - 1)) = concat'0 (replicate'0 s n) (replicate'0 s (m - n - 1))) + -> (let _ = concat_replicate'0 n (m - n - 1) s in (([@expl:concat_replicate_up_to requires] [%#sfset0] 0 <= n + /\ n < m - 1) + /\ 0 <= ([%#sfset2] m) /\ ([%#sfset2] m - 1) < ([%#sfset2] m)) + /\ (([%#sfset1] replicate_up_to'0 s (m - 1) + = Fset.union (replicate_up_to'0 s n) (concat'0 (replicate'0 s (n + 1)) (replicate_up_to'0 s (m - 1 - n - 1)))) + -> (let _ = concat_replicate_up_to'0 n (m - 1) s in [%#sfset1] replicate_up_to'0 s m + = Fset.union (replicate_up_to'0 s n) (concat'0 (replicate'0 s (n + 1)) (replicate_up_to'0 s (m - n - 1)))))))) + ) end module M_creusot_contracts__logic__ord__qyi8355372356285216375__cmp_le_log [#"../../../creusot-contracts/src/logic/ord.rs" 130 8 130 39] (* *) let%span sord0 = "../../../creusot-contracts/src/logic/ord.rs" 129 39 129 89 @@ -19128,10 +20815,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_map__qyi160525698381677 goal refines : [%#shash_map0] forall self : t_IterMut'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq (t_K'0, borrowed t_V'0)) self -> produces'0 self (Seq.empty : Seq.seq (t_K'0, borrowed t_V'0)) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 102 4 102 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 102 4 102 26 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 90 8 90 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 108 4 108 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 108 4 108 26 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 96 8 96 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span sseq4 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19263,7 +20950,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 46 4 46 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 52 4 52 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19287,7 +20974,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 = [%#sseq4] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19302,7 +20989,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 89 4 89 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 95 4 95 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) = [%#shash_set1] set_produces'0 self visited o @@ -19310,10 +20997,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 goal refines : [%#shash_set0] forall self : t_IntoIter'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_T'0) self -> produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 109 4 109 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 109 4 109 90 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 90 8 90 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi2602027177218488890__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 115 4 115 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 115 4 115 90 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 96 8 96 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span sseq4 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19443,7 +21130,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 46 4 46 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 52 4 52 33] (self : t_IntoIter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19467,7 +21154,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 = [%#sseq4] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_IntoIter'0) (visited : Seq.seq t_T'0) (end' : t_IntoIter'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19482,7 +21169,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 89 4 89 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 95 4 95 64] (self : t_IntoIter'0) (visited : Seq.seq t_T'0) (o : t_IntoIter'0) = [%#shash_set1] set_produces'0 self visited o @@ -19494,10 +21181,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi260202717721848 -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 148 4 148 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 148 4 148 90 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 129 8 129 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 154 4 154 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 154 4 154 90 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 135 8 135 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel4 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq5 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19551,7 +21238,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 120 4 120 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 126 4 126 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19578,7 +21265,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 = [%#sseq5] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19593,7 +21280,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 128 4 128 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 134 4 134 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) = [%#shash_set1] set_produces'0 self visited o @@ -19605,10 +21292,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 141 4 141 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 141 4 141 26 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 129 8 129 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi7331660899108484271__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 147 4 147 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 147 4 147 26 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 135 8 135 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel4 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq5 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19664,7 +21351,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 120 4 120 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 126 4 126 33] (self : t_Iter'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19691,7 +21378,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 = [%#sseq5] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Iter'0) (visited : Seq.seq t_T'0) (end' : t_Iter'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19706,7 +21393,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 128 4 128 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 134 4 134 64] (self : t_Iter'0) (visited : Seq.seq t_T'0) (o : t_Iter'0) = [%#shash_set1] set_produces'0 self visited o @@ -19714,10 +21401,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi733166089910848 goal refines : [%#shash_set0] forall self : t_Iter'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_T'0) self -> produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 216 4 216 26] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 216 4 216 26 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 204 8 204 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_refl__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 222 4 222 26] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 222 4 222 26 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 210 8 210 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel4 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq5 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19799,7 +21486,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 195 4 195 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 201 4 201 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19826,7 +21513,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 = [%#sseq5] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19841,7 +21528,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 203 4 203 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 209 4 209 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) = [%#shash_set1] set_produces'0 self visited o @@ -19849,10 +21536,10 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 goal refines : [%#shash_set0] forall self : t_Intersection'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_T'0) self -> produces'0 self (Seq.empty : Seq.seq t_T'0) self end -module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 223 4 223 90] (* as std::iter::Iterator> *) - let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 223 4 223 90 - let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 204 8 204 38 - let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 +module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi3673804955138978513__produces_trans__refines [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 229 4 229 90] (* as std::iter::Iterator> *) + let%span shash_set0 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 229 4 229 90 + let%span shash_set1 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 210 8 210 38 + let%span shash_set2 = "../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel4 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq5 = "../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -19932,7 +21619,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 use set.Fset - function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 195 4 195 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 + function view'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 201 4 201 33] (self : t_Intersection'0) : Fset.fset t_DeepModelTy'0 use set.Fset @@ -19959,7 +21646,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 = [%#sseq5] exists i : int . 0 <= i /\ i < Seq.length self /\ Seq.get self i = x - predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 53 0 57 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) + predicate set_produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 59 0 63 9] (start : t_Intersection'0) (visited : Seq.seq t_T'0) (end' : t_Intersection'0) = [%#shash_set2] Fset.cardinal (view'0 start) = Seq.length visited + Fset.cardinal (view'0 end') @@ -19974,7 +21661,7 @@ module M_creusot_contracts__stdqy35z1__collections__hash_set__qyi367380495513897 /\ 0 <= j /\ j < Seq.length visited /\ deep_model'0 (Seq.get visited i) = deep_model'0 (Seq.get visited j) -> i = j) - predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 203 4 203 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/collections/hash_set.rs" 209 4 209 64] (self : t_Intersection'0) (visited : Seq.seq t_T'0) (o : t_Intersection'0) = [%#shash_set1] set_produces'0 self visited o @@ -20158,10 +21845,10 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr let%span scloned0 = "../../../creusot-contracts/src/std/iter/cloned.rs" 65 4 65 90 let%span scloned1 = "../../../creusot-contracts/src/std/iter/cloned.rs" 48 12 51 79 let%span scloned2 = "../../../creusot-contracts/src/std/iter/cloned.rs" 11 14 11 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20193,16 +21880,16 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -20234,10 +21921,10 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr let%span scloned0 = "../../../creusot-contracts/src/std/iter/cloned.rs" 58 4 58 26 let%span scloned1 = "../../../creusot-contracts/src/std/iter/cloned.rs" 48 12 51 79 let%span scloned2 = "../../../creusot-contracts/src/std/iter/cloned.rs" 11 14 11 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20271,16 +21958,16 @@ module M_creusot_contracts__stdqy35z1__iter__cloned__qyi10472681371035856984__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -20308,10 +21995,10 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr let%span scopied0 = "../../../creusot-contracts/src/std/iter/copied.rs" 58 4 58 26 let%span scopied1 = "../../../creusot-contracts/src/std/iter/copied.rs" 48 12 51 79 let%span scopied2 = "../../../creusot-contracts/src/std/iter/copied.rs" 11 14 11 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20345,16 +22032,16 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -20382,10 +22069,10 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr let%span scopied0 = "../../../creusot-contracts/src/std/iter/copied.rs" 65 4 65 90 let%span scopied1 = "../../../creusot-contracts/src/std/iter/copied.rs" 48 12 51 79 let%span scopied2 = "../../../creusot-contracts/src/std/iter/copied.rs" 11 14 11 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20417,16 +22104,16 @@ module M_creusot_contracts__stdqy35z1__iter__copied__qyi18224474876607687026__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_T'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_T'0) (b : t_I'0) (bc : Seq.seq t_T'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_T'0, b : t_I'0, bc : Seq.seq t_T'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_T'0) self @@ -20504,10 +22191,10 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ let%span senumerate0 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 90 4 90 90 let%span senumerate1 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 72 12 76 113 let%span senumerate2 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 14 14 14 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span senumerate7 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 45 12 49 85 type t_I'0 @@ -20533,16 +22220,16 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -20554,7 +22241,7 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use prelude.prelude.Borrow - predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) @@ -20600,10 +22287,10 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ let%span senumerate0 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 83 4 83 26 let%span senumerate1 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 72 12 76 113 let%span senumerate2 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 14 14 14 39 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span senumerate7 = "../../../creusot-contracts/src/std/iter/enumerate.rs" 45 12 49 85 type t_I'0 @@ -20631,16 +22318,16 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter4] produces'1 a ab b) -> ([%#siter5] produces'1 b bc c) -> ([%#siter6] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter3] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -20652,7 +22339,7 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ use prelude.prelude.Borrow - predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) @@ -20690,9 +22377,9 @@ module M_creusot_contracts__stdqy35z1__iter__enumerate__qyi2718914205750388896__ goal refines : [%#senumerate0] forall self : t_Enumerate'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq (usize, t_Item'0)) self -> produces'0 self (Seq.empty : Seq.seq (usize, t_Item'0)) self end -module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/filter.rs" 106 4 106 26] (* as std::iter::Iterator> *) - let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 106 4 106 26 - let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 99 17 +module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/filter.rs" 105 4 105 26] (* as std::iter::Iterator> *) + let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 105 4 105 26 + let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 34 12 40 124 let%span sfilter3 = "../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 let%span sfilter4 = "../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 @@ -20703,10 +22390,10 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20789,16 +22476,16 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -20814,8 +22501,8 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro [%#sfilter1] invariant'0 self -> unnest'0 (func'0 self) (func'0 succ) /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) - /\ (forall i : int, j : int . 0 <= i /\ i <= j /\ j < Seq.length visited - -> 0 <= Map.get f i /\ Map.get f i <= Map.get f j /\ Map.get f j < Seq.length s) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) /\ (forall i : int . 0 <= i /\ i < Seq.length s -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) @@ -20824,9 +22511,9 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro goal refines : [%#sfilter0] forall self : t_Filter'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_Item'0) self -> produces'0 self (Seq.empty : Seq.seq t_Item'0) self end -module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/filter.rs" 113 4 113 90] (* as std::iter::Iterator> *) - let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 113 4 113 90 - let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 99 17 +module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/filter.rs" 112 4 112 90] (* as std::iter::Iterator> *) + let%span sfilter0 = "../../../creusot-contracts/src/std/iter/filter.rs" 112 4 112 90 + let%span sfilter1 = "../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 let%span sfilter2 = "../../../creusot-contracts/src/std/iter/filter.rs" 34 12 40 124 let%span sfilter3 = "../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 let%span sfilter4 = "../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 @@ -20837,10 +22524,10 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -20857,18 +22544,329 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro predicate precondition'0 [#"../../../creusot-contracts/src/std/ops.rs" 77 4 77 45] (self : t_F'0) (args : t_Item'0) - predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : bool) + predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : bool) + + + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_F'0) + + predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : bool) + + + function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : bool) : () + + + axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : bool . [%#sops11] postcondition_once'0 self args res + = (exists res_state : t_F'0 . postcondition_mut'0 self args res_state res /\ resolve'0 res_state) + + predicate unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 103 4 103 36] (self : t_F'0) (_2 : t_F'0) + + function unnest_trans'0 [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (self : t_F'0) (b : t_F'0) (c : t_F'0) : () + + + axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops8] unnest'0 self b) + -> ([%#sops9] unnest'0 b c) -> ([%#sops10] unnest'0 self c) + + function unnest_refl'0 [#"../../../creusot-contracts/src/std/ops.rs" 116 4 116 24] (self : t_F'0) : () + + axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops7] unnest'0 self self + + function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : bool) : () + + + axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : bool . ([%#sops5] postcondition_mut'0 self args res_state res) + -> ([%#sops6] unnest'0 self res_state) + + predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 31 4 31 30] (self : t_Filter'0) = + [%#sfilter2] forall f : t_F'0, i : t_Item'0 . precondition'0 f (i) + /\ (forall f : t_F'0, g : t_F'0 . unnest'0 f g -> f = g) + /\ (forall f1 : t_F'0, f2 : t_F'0, i : t_Item'0 . not (postcondition_mut'0 f1 (i) f2 true + /\ postcondition_mut'0 f1 (i) f2 false)) + + predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Filter'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_Filter'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_Filter__iter'0 = iter ; t_Filter__predicate'0 = predicate'} -> inv'2 iter /\ inv'1 predicate' + end) + + function func'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 23 4 23 22] (self : t_Filter'0) : t_F'0 + + axiom func'0_spec : forall self : t_Filter'0 . [%#sfilter3] inv'0 self -> inv'1 (func'0 self) + + use prelude.prelude.Int + + use map.Map + + function iter'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 16 4 16 22] (self : t_Filter'0) : t_I'0 + + axiom iter'0_spec : forall self : t_Filter'0 . [%#sfilter4] inv'0 self -> inv'2 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) + -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () + + axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + + use seq.Seq + + use map.Map + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 85 4 85 67] (self : t_Filter'0) (visited : Seq.seq t_Item'0) (succ : t_Filter'0) + + = + [%#sfilter1] invariant'0 self + -> unnest'0 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) + /\ (forall i : int . 0 <= i /\ i < Seq.length s + -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) + = postcondition_mut'0 (func'0 self) (Seq.get s i) (func'0 self) true)) + + goal refines : [%#sfilter0] forall a : t_Filter'0 . forall ab : Seq.seq t_Item'0 . forall b : t_Filter'0 . forall bc : Seq.seq t_Item'0 . forall c : t_Filter'0 . produces'0 b bc c + /\ produces'0 a ab b + -> produces'0 b bc c + /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) +end +module M_creusot_contracts__stdqy35z1__iter__filter_map__qyi13601925333174091585__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 105 4 105 26] (* as std::iter::Iterator> *) + let%span sfilter_map0 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 105 4 105 26 + let%span sfilter_map1 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 85 12 98 148 + let%span sfilter_map2 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 34 12 38 32 + let%span sfilter_map3 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 22 14 22 39 + let%span sfilter_map4 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 15 14 15 39 + let%span sfilter_map5 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 48 16 48 50 + let%span sfilter_map6 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 56 16 56 52 + let%span sfilter_map7 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 63 16 63 135 + let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + type t_I'0 + + type t_F'0 + + type t_FilterMap'0 = + { t_FilterMap__iter'0: t_I'0; t_FilterMap__f'0: t_F'0 } + + use seq.Seq + + type t_B'0 + + use seq.Seq + + predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + + type t_Item'0 + + predicate precondition'0 [#"../../../creusot-contracts/src/std/ops.rs" 77 4 77 45] (self : t_F'0) (args : t_Item'0) + + predicate no_precondition'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 47 0 47 68] (f : t_F'0) = + [%#sfilter_map5] forall i : t_Item'0 . precondition'0 f (i) + + type t_Option'0 = + | C_None'0 + | C_Some'0 t_B'0 + + predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : t_Option'0) + + + use prelude.prelude.Borrow + + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_F'0) + + predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : t_Option'0) + + + function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : t_Option'0) : () + + + axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : t_Option'0 . [%#sops14] postcondition_once'0 self args res + = (exists res_state : t_F'0 . postcondition_mut'0 self args res_state res /\ resolve'0 res_state) + + predicate unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 103 4 103 36] (self : t_F'0) (_2 : t_F'0) + + function unnest_trans'0 [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (self : t_F'0) (b : t_F'0) (c : t_F'0) : () + + + axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops11] unnest'0 self b) + -> ([%#sops12] unnest'0 b c) -> ([%#sops13] unnest'0 self c) + + function unnest_refl'0 [#"../../../creusot-contracts/src/std/ops.rs" 116 4 116 24] (self : t_F'0) : () + + axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops10] unnest'0 self self + + function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : t_Option'0) : () + + + axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : t_Option'0 . ([%#sops8] postcondition_mut'0 self args res_state res) + -> ([%#sops9] unnest'0 self res_state) + + predicate immutable'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 55 0 55 62] (f : t_F'0) = + [%#sfilter_map6] forall g : t_F'0 . unnest'0 f g -> f = g + + predicate precise'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 62 0 62 61] (f1 : t_F'0) = + [%#sfilter_map7] forall f2 : t_F'0, i : t_Item'0 . not ((exists b : t_B'0 . postcondition_mut'0 f1 (i) f2 (C_Some'0 b)) + /\ postcondition_mut'0 f1 (i) f2 (C_None'0)) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_FilterMap'0) + + function func'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 23 4 23 22] (self : t_FilterMap'0) : t_F'0 + + axiom func'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map3] inv'0 self -> inv'1 (func'0 self) + + predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 31 4 31 30] (self : t_FilterMap'0) = + [%#sfilter_map2] no_precondition'0 (func'0 self) /\ immutable'0 (func'0 self) /\ precise'0 (func'0 self) + + axiom inv_axiom'0 [@rewrite] : forall x : t_FilterMap'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_FilterMap__iter'0 = iter ; t_FilterMap__f'0 = f} -> inv'2 iter /\ inv'1 f + end) + + use seq.Seq + + use prelude.prelude.Int + + use map.Map + + function iter'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 16 4 16 22] (self : t_FilterMap'0) : t_I'0 + + axiom iter'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map4] inv'0 self -> inv'2 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter16] produces'1 a ab b) + -> ([%#siter17] produces'1 b bc c) -> ([%#siter18] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () + + axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter15] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + + use seq.Seq + + use map.Map + + use seq.Seq + + use seq.Seq + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 83 4 83 67] (self : t_FilterMap'0) (visited : Seq.seq t_B'0) (succ : t_FilterMap'0) + + = + [%#sfilter_map1] invariant'0 self + -> unnest'0 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> postcondition_mut'0 (func'0 self) (Seq.get s (Map.get f i)) (func'0 self) (C_Some'0 (Seq.get visited i))) + /\ (forall j : int . 0 <= j /\ j < Seq.length s + -> (not (exists i : int . 0 <= i /\ i < Seq.length visited /\ Map.get f i = j)) + = postcondition_mut'0 (func'0 self) (Seq.get s j) (func'0 self) (C_None'0))) + + goal refines : [%#sfilter_map0] forall self : t_FilterMap'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_B'0) self + -> produces'0 self (Seq.empty : Seq.seq t_B'0) self +end +module M_creusot_contracts__stdqy35z1__iter__filter_map__qyi13601925333174091585__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 112 4 112 90] (* as std::iter::Iterator> *) + let%span sfilter_map0 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 112 4 112 90 + let%span sfilter_map1 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 85 12 98 148 + let%span sfilter_map2 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 34 12 38 32 + let%span sfilter_map3 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 22 14 22 39 + let%span sfilter_map4 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 15 14 15 39 + let%span sfilter_map5 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 48 16 48 50 + let%span sfilter_map6 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 56 16 56 52 + let%span sfilter_map7 = "../../../creusot-contracts/src/std/iter/filter_map.rs" 63 16 63 135 + let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops12 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops13 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops14 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 + + type t_I'0 + + type t_F'0 + + type t_FilterMap'0 = + { t_FilterMap__iter'0: t_I'0; t_FilterMap__f'0: t_F'0 } + + type t_B'0 + + use seq.Seq + + predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + + type t_Item'0 + + predicate precondition'0 [#"../../../creusot-contracts/src/std/ops.rs" 77 4 77 45] (self : t_F'0) (args : t_Item'0) + + predicate no_precondition'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 47 0 47 68] (f : t_F'0) = + [%#sfilter_map5] forall i : t_Item'0 . precondition'0 f (i) + + type t_Option'0 = + | C_None'0 + | C_Some'0 t_B'0 + + predicate postcondition_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 85 4 85 73] (self : t_F'0) (args : t_Item'0) (result : t_Option'0) + use prelude.prelude.Borrow + predicate resolve'0 [#"../../../creusot-contracts/src/resolve.rs" 19 0 19 40] (_1 : t_F'0) - predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : bool) + predicate postcondition_mut'0 [#"../../../creusot-contracts/src/std/ops.rs" 95 4 95 92] (self : t_F'0) (args : t_Item'0) (result_state : t_F'0) (result : t_Option'0) - function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : bool) : () + function fn_mut_once'0 [#"../../../creusot-contracts/src/std/ops.rs" 129 4 129 55] (self : t_F'0) (args : t_Item'0) (res : t_Option'0) : () - axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : bool . [%#sops11] postcondition_once'0 self args res + axiom fn_mut_once'0_spec : forall self : t_F'0, args : t_Item'0, res : t_Option'0 . [%#sops14] postcondition_once'0 self args res = (exists res_state : t_F'0 . postcondition_mut'0 self args res_state res /\ resolve'0 res_state) predicate unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 103 4 103 36] (self : t_F'0) (_2 : t_F'0) @@ -20876,65 +22874,67 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro function unnest_trans'0 [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (self : t_F'0) (b : t_F'0) (c : t_F'0) : () - axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops8] unnest'0 self b) - -> ([%#sops9] unnest'0 b c) -> ([%#sops10] unnest'0 self c) + axiom unnest_trans'0_spec : forall self : t_F'0, b : t_F'0, c : t_F'0 . ([%#sops11] unnest'0 self b) + -> ([%#sops12] unnest'0 b c) -> ([%#sops13] unnest'0 self c) function unnest_refl'0 [#"../../../creusot-contracts/src/std/ops.rs" 116 4 116 24] (self : t_F'0) : () - axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops7] unnest'0 self self + axiom unnest_refl'0_spec : forall self : t_F'0 . [%#sops10] unnest'0 self self - function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : bool) : () + function postcondition_mut_unnest'0 [#"../../../creusot-contracts/src/std/ops.rs" 111 4 111 85] (self : t_F'0) (args : t_Item'0) (res_state : t_F'0) (res : t_Option'0) : () - axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : bool . ([%#sops5] postcondition_mut'0 self args res_state res) - -> ([%#sops6] unnest'0 self res_state) + axiom postcondition_mut_unnest'0_spec : forall self : t_F'0, args : t_Item'0, res_state : t_F'0, res : t_Option'0 . ([%#sops8] postcondition_mut'0 self args res_state res) + -> ([%#sops9] unnest'0 self res_state) - predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 31 4 31 30] (self : t_Filter'0) = - [%#sfilter2] forall f : t_F'0, i : t_Item'0 . precondition'0 f (i) - /\ (forall f : t_F'0, g : t_F'0 . unnest'0 f g -> f = g) - /\ (forall f1 : t_F'0, f2 : t_F'0, i : t_Item'0 . not (postcondition_mut'0 f1 (i) f2 true - /\ postcondition_mut'0 f1 (i) f2 false)) + predicate immutable'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 55 0 55 62] (f : t_F'0) = + [%#sfilter_map6] forall g : t_F'0 . unnest'0 f g -> f = g - predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + predicate precise'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 62 0 62 61] (f1 : t_F'0) = + [%#sfilter_map7] forall f2 : t_F'0, i : t_Item'0 . not ((exists b : t_B'0 . postcondition_mut'0 f1 (i) f2 (C_Some'0 b)) + /\ postcondition_mut'0 f1 (i) f2 (C_None'0)) - predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_F'0) + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_FilterMap'0) - predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Filter'0) + function func'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 23 4 23 22] (self : t_FilterMap'0) : t_F'0 - axiom inv_axiom'0 [@rewrite] : forall x : t_Filter'0 [inv'0 x] . inv'0 x + axiom func'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map3] inv'0 self -> inv'1 (func'0 self) + + predicate invariant'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 31 4 31 30] (self : t_FilterMap'0) = + [%#sfilter_map2] no_precondition'0 (func'0 self) /\ immutable'0 (func'0 self) /\ precise'0 (func'0 self) + + axiom inv_axiom'0 [@rewrite] : forall x : t_FilterMap'0 [inv'0 x] . inv'0 x = (invariant'0 x /\ match x with - | {t_Filter__iter'0 = iter ; t_Filter__predicate'0 = predicate'} -> inv'2 iter /\ inv'1 predicate' + | {t_FilterMap__iter'0 = iter ; t_FilterMap__f'0 = f} -> inv'2 iter /\ inv'1 f end) - function func'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 23 4 23 22] (self : t_Filter'0) : t_F'0 - - axiom func'0_spec : forall self : t_Filter'0 . [%#sfilter3] inv'0 self -> inv'1 (func'0 self) + use seq.Seq use prelude.prelude.Int use map.Map - function iter'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 16 4 16 22] (self : t_Filter'0) : t_I'0 + function iter'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 16 4 16 22] (self : t_FilterMap'0) : t_I'0 - axiom iter'0_spec : forall self : t_Filter'0 . [%#sfilter4] inv'0 self -> inv'2 (iter'0 self) + axiom iter'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map4] inv'0 self -> inv'2 (iter'0 self) use seq.Seq use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () - axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) - -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) + axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter16] produces'1 a ab b) + -> ([%#siter17] produces'1 b bc c) -> ([%#siter18] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () - axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self + axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter15] produces'1 self (Seq.empty : Seq.seq t_Item'0) self use seq.Seq @@ -20942,20 +22942,27 @@ module M_creusot_contracts__stdqy35z1__iter__filter__qyi9573749579793237160__pro use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter.rs" 85 4 85 67] (self : t_Filter'0) (visited : Seq.seq t_Item'0) (succ : t_Filter'0) + use seq.Seq + + use seq.Seq + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/filter_map.rs" 83 4 83 67] (self : t_FilterMap'0) (visited : Seq.seq t_B'0) (succ : t_FilterMap'0) = - [%#sfilter1] invariant'0 self + [%#sfilter_map1] invariant'0 self -> unnest'0 (func'0 self) (func'0 succ) /\ (exists s : Seq.seq t_Item'0, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) - /\ (forall i : int, j : int . 0 <= i /\ i <= j /\ j < Seq.length visited - -> 0 <= Map.get f i /\ Map.get f i <= Map.get f j /\ Map.get f j < Seq.length s) - /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) - /\ (forall i : int . 0 <= i /\ i < Seq.length s - -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) - = postcondition_mut'0 (func'0 self) (Seq.get s i) (func'0 self) true)) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> postcondition_mut'0 (func'0 self) (Seq.get s (Map.get f i)) (func'0 self) (C_Some'0 (Seq.get visited i))) + /\ (forall j : int . 0 <= j /\ j < Seq.length s + -> (not (exists i : int . 0 <= i /\ i < Seq.length visited /\ Map.get f i = j)) + = postcondition_mut'0 (func'0 self) (Seq.get s j) (func'0 self) (C_None'0))) - goal refines : [%#sfilter0] forall a : t_Filter'0 . forall ab : Seq.seq t_Item'0 . forall b : t_Filter'0 . forall bc : Seq.seq t_Item'0 . forall c : t_Filter'0 . produces'0 b bc c + use seq.Seq + + goal refines : [%#sfilter_map0] forall a : t_FilterMap'0 . forall ab : Seq.seq t_B'0 . forall b : t_FilterMap'0 . forall bc : Seq.seq t_B'0 . forall c : t_FilterMap'0 . produces'0 b bc c /\ produces'0 a ab b -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) @@ -20965,10 +22972,10 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod let%span sfuse1 = "../../../creusot-contracts/src/std/iter/fuse.rs" 29 12 35 13 let%span sfuse2 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse3 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21009,16 +23016,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21043,10 +23050,10 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod let%span sfuse1 = "../../../creusot-contracts/src/std/iter/fuse.rs" 29 12 35 13 let%span sfuse2 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse3 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21087,16 +23094,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi10730559947553418603__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21126,10 +23133,10 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21213,16 +23220,16 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter12] produces'1 a ab b) -> ([%#siter13] produces'1 b bc c) -> ([%#siter14] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter11] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21269,10 +23276,10 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21354,16 +23361,16 @@ module M_creusot_contracts__stdqy35z1__iter__map__qyi6597778842032428791__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter12] produces'1 a ab b) -> ([%#siter13] produces'1 b bc c) -> ([%#siter14] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter11] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21412,10 +23419,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr let%span sops6 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21482,16 +23489,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter10] produces'1 a ab b) -> ([%#siter11] produces'1 b bc c) -> ([%#siter12] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter9] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21547,10 +23554,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr let%span sops6 = "../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops7 = "../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops8 = "../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter9 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter10 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter11 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -21615,16 +23622,16 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi9026772487048432788__pr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter10] produces'1 a ab b) -> ([%#siter11] produces'1 b bc c) -> ([%#siter12] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter9] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -21820,11 +23827,11 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi16860283617022118777__pro -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 84 4 84 90] (* as std::iter::Iterator> *) - let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 84 4 84 90 - let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 +module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 110 4 110 90] (* as std::iter::Iterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 110 4 110 90 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 let%span sops4 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 type t_Idx'0 @@ -21849,7 +23856,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops4] not is_empty_log'0 self -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) - function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] (r : t_RangeInclusive'0) : int + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int = [%#srange3] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 @@ -21859,7 +23866,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 64 4 64 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 90 4 90 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) = [%#srange1] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o @@ -21875,11 +23882,11 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) end -module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 77 4 77 26] (* as std::iter::Iterator> *) - let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 77 4 77 26 - let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 +module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 103 4 103 26] (* as std::iter::Iterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 103 4 103 26 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 let%span sops4 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 type t_Idx'0 @@ -21906,7 +23913,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops4] not is_empty_log'0 self -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) - function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 0 46 92] (r : t_RangeInclusive'0) : int + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int = [%#srange3] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 @@ -21916,7 +23923,7 @@ module M_creusot_contracts__stdqy35z1__iter__range__qyi11108913944999844411__pro use seq.Seq - predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 64 4 64 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 90 4 90 64] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) = [%#srange1] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o @@ -21988,15 +23995,129 @@ module M_creusot_contracts__stdqy35z1__iter__repeat__qyi8658929399712466629__pro -> produces'0 b bc c /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) end +module M_creusot_contracts__stdqy35z1__iter__rev__qyi4378764544541057436__produces_refl__refines [#"../../../creusot-contracts/src/std/iter/rev.rs" 48 4 48 26] (* as std::iter::Iterator> *) + let%span srev0 = "../../../creusot-contracts/src/std/iter/rev.rs" 48 4 48 26 + let%span srev1 = "../../../creusot-contracts/src/std/iter/rev.rs" 41 12 41 56 + let%span srev2 = "../../../creusot-contracts/src/std/iter/rev.rs" 17 14 17 39 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 106 14 106 50 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 110 15 110 37 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 111 15 111 37 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 112 14 112 47 + + type t_I'0 + + type t_Rev'0 = + { t_Rev__iter'0: t_I'0 } + + use seq.Seq + + type t_Item'0 + + use seq.Seq + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Rev'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_Rev'0 [inv'0 x] . inv'0 x + = match x with + | {t_Rev__iter'0 = iter} -> inv'1 iter + end + + function iter'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 18 4 18 22] (self : t_Rev'0) : t_I'0 + + axiom iter'0_spec : forall self : t_Rev'0 . [%#srev2] inv'0 self -> inv'1 (iter'0 self) + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter.rs" 103 4 103 70] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 113 4 113 96] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_back_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter4] produces_back'0 a ab b) + -> ([%#siter5] produces_back'0 b bc c) -> ([%#siter6] produces_back'0 a (Seq.(++) ab bc) c) + + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 107 4 107 32] (self : t_I'0) : () + + axiom produces_back_refl'0_spec : forall self : t_I'0 . [%#siter3] produces_back'0 self (Seq.empty : Seq.seq t_Item'0) self + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 39 4 39 64] (self : t_Rev'0) (visited : Seq.seq t_Item'0) (o : t_Rev'0) + + = + [%#srev1] produces_back'0 (iter'0 self) visited (iter'0 o) + + goal refines : [%#srev0] forall self : t_Rev'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_Item'0) self + -> produces'0 self (Seq.empty : Seq.seq t_Item'0) self +end +module M_creusot_contracts__stdqy35z1__iter__rev__qyi4378764544541057436__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/rev.rs" 55 4 55 90] (* as std::iter::Iterator> *) + let%span srev0 = "../../../creusot-contracts/src/std/iter/rev.rs" 55 4 55 90 + let%span srev1 = "../../../creusot-contracts/src/std/iter/rev.rs" 41 12 41 56 + let%span srev2 = "../../../creusot-contracts/src/std/iter/rev.rs" 17 14 17 39 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 106 14 106 50 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 110 15 110 37 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 111 15 111 37 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 112 14 112 47 + + type t_I'0 + + type t_Rev'0 = + { t_Rev__iter'0: t_I'0 } + + type t_Item'0 + + use seq.Seq + + predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_I'0) + + predicate inv'0 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_Rev'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_Rev'0 [inv'0 x] . inv'0 x + = match x with + | {t_Rev__iter'0 = iter} -> inv'1 iter + end + + function iter'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 18 4 18 22] (self : t_Rev'0) : t_I'0 + + axiom iter'0_spec : forall self : t_Rev'0 . [%#srev2] inv'0 self -> inv'1 (iter'0 self) + + use seq.Seq + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter.rs" 103 4 103 70] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + + + function produces_back_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 113 4 113 96] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + + + axiom produces_back_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter4] produces_back'0 a ab b) + -> ([%#siter5] produces_back'0 b bc c) -> ([%#siter6] produces_back'0 a (Seq.(++) ab bc) c) + + function produces_back_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 107 4 107 32] (self : t_I'0) : () + + axiom produces_back_refl'0_spec : forall self : t_I'0 . [%#siter3] produces_back'0 self (Seq.empty : Seq.seq t_Item'0) self + + predicate produces'0 [#"../../../creusot-contracts/src/std/iter/rev.rs" 39 4 39 64] (self : t_Rev'0) (visited : Seq.seq t_Item'0) (o : t_Rev'0) + + = + [%#srev1] produces_back'0 (iter'0 self) visited (iter'0 o) + + goal refines : [%#srev0] forall a : t_Rev'0 . forall ab : Seq.seq t_Item'0 . forall b : t_Rev'0 . forall bc : Seq.seq t_Item'0 . forall c : t_Rev'0 . produces'0 b bc c + /\ produces'0 a ab b + -> produces'0 b bc c + /\ produces'0 a ab b /\ (forall result : () . produces'0 a (Seq.(++) ab bc) c -> produces'0 a (Seq.(++) ab bc) c) +end module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produces_trans__refines [#"../../../creusot-contracts/src/std/iter/skip.rs" 81 4 81 90] (* as std::iter::Iterator> *) let%span sskip0 = "../../../creusot-contracts/src/std/iter/skip.rs" 81 4 81 90 let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -22038,16 +24159,16 @@ module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22077,10 +24198,10 @@ module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produ let%span sskip1 = "../../../creusot-contracts/src/std/iter/skip.rs" 62 12 67 74 let%span sskip2 = "../../../creusot-contracts/src/std/iter/skip.rs" 21 14 21 50 let%span sskip3 = "../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -22122,16 +24243,16 @@ module M_creusot_contracts__stdqy35z1__iter__skip__qyi3195031491774060502__produ use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22159,10 +24280,10 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod let%span stake1 = "../../../creusot-contracts/src/std/iter/take.rs" 65 12 65 88 let%span stake2 = "../../../creusot-contracts/src/std/iter/take.rs" 31 14 31 50 let%span stake3 = "../../../creusot-contracts/src/std/iter/take.rs" 17 14 17 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -22204,16 +24325,16 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22230,10 +24351,10 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod let%span stake1 = "../../../creusot-contracts/src/std/iter/take.rs" 65 12 65 88 let%span stake2 = "../../../creusot-contracts/src/std/iter/take.rs" 31 14 31 50 let%span stake3 = "../../../creusot-contracts/src/std/iter/take.rs" 17 14 17 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 @@ -22275,16 +24396,16 @@ module M_creusot_contracts__stdqy35z1__iter__take__qyi12344256497067751022__prod use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22303,10 +24424,10 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc let%span szip1 = "../../../creusot-contracts/src/std/iter/zip.rs" 46 12 49 95 let%span szip2 = "../../../creusot-contracts/src/std/iter/zip.rs" 14 14 14 39 let%span szip3 = "../../../creusot-contracts/src/std/iter/zip.rs" 21 14 21 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_A'0 @@ -22361,16 +24482,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () axiom produces_trans'1_spec : forall a : t_A'0, ab : Seq.seq t_Item'0, b : t_A'0, bc : Seq.seq t_Item'0, c : t_A'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_A'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_A'0) : () axiom produces_refl'0_spec : forall self : t_A'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22382,16 +24503,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) + predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) - function produces_trans'2 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () + function produces_trans'2 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () axiom produces_trans'2_spec : forall a : t_B'0, ab : Seq.seq t_Item'1, b : t_B'0, bc : Seq.seq t_Item'1, c : t_B'0 . ([%#siter5] produces'2 a ab b) -> ([%#siter6] produces'2 b bc c) -> ([%#siter7] produces'2 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_B'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_B'0) : () axiom produces_refl'1_spec : forall self : t_B'0 . [%#siter4] produces'2 self (Seq.empty : Seq.seq t_Item'1) self @@ -22415,10 +24536,10 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc let%span szip1 = "../../../creusot-contracts/src/std/iter/zip.rs" 46 12 49 95 let%span szip2 = "../../../creusot-contracts/src/std/iter/zip.rs" 14 14 14 39 let%span szip3 = "../../../creusot-contracts/src/std/iter/zip.rs" 21 14 21 39 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter6 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter7 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_A'0 @@ -22475,16 +24596,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_A'0) (visited : Seq.seq t_Item'0) (o : t_A'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_A'0) (ab : Seq.seq t_Item'0) (b : t_A'0) (bc : Seq.seq t_Item'0) (c : t_A'0) : () axiom produces_trans'0_spec : forall a : t_A'0, ab : Seq.seq t_Item'0, b : t_A'0, bc : Seq.seq t_Item'0, c : t_A'0 . ([%#siter5] produces'1 a ab b) -> ([%#siter6] produces'1 b bc c) -> ([%#siter7] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_A'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_A'0) : () axiom produces_refl'1_spec : forall self : t_A'0 . [%#siter4] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -22496,16 +24617,16 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc use seq.Seq - predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) + predicate produces'2 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_B'0) (visited : Seq.seq t_Item'1) (o : t_B'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_B'0) (ab : Seq.seq t_Item'1) (b : t_B'0) (bc : Seq.seq t_Item'1) (c : t_B'0) : () axiom produces_trans'1_spec : forall a : t_B'0, ab : Seq.seq t_Item'1, b : t_B'0, bc : Seq.seq t_Item'1, c : t_B'0 . ([%#siter5] produces'2 a ab b) -> ([%#siter6] produces'2 b bc c) -> ([%#siter7] produces'2 a (Seq.(++) ab bc) c) - function produces_refl'2 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_B'0) : () + function produces_refl'2 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_B'0) : () axiom produces_refl'2_spec : forall self : t_B'0 . [%#siter4] produces'2 self (Seq.empty : Seq.seq t_Item'1) self @@ -22520,13 +24641,13 @@ module M_creusot_contracts__stdqy35z1__iter__zip__qyi2281060687216883844__produc goal refines : [%#szip0] forall self : t_Zip'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq (t_Item'0, t_Item'1)) self -> produces'0 self (Seq.empty : Seq.seq (t_Item'0, t_Item'1)) self end -module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_refl__refines [#"../../../creusot-contracts/src/std/iter.rs" 223 4 223 26] (* <&mut I as std::iter::Iterator> *) - let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 223 4 223 26 - let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 211 20 211 64 - let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_refl__refines [#"../../../creusot-contracts/src/std/iter.rs" 279 4 279 26] (* <&mut I as std::iter::Iterator> *) + let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 279 4 279 26 + let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 267 20 267 64 + let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use prelude.prelude.Borrow @@ -22540,20 +24661,20 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_re use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'0 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'0_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter3] produces'1 a ab b) -> ([%#siter4] produces'1 b bc c) -> ([%#siter5] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter2] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 210 4 210 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 266 4 266 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) = [%#siter1] produces'1 self.current visited o.current /\ self.final = o.final @@ -22561,13 +24682,13 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_re goal refines : [%#siter0] forall self : borrowed t_I'0 . forall result : () . produces'0 self (Seq.empty : Seq.seq t_Item'0) self -> produces'0 self (Seq.empty : Seq.seq t_Item'0) self end -module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_trans__refines [#"../../../creusot-contracts/src/std/iter.rs" 230 4 230 90] (* <&mut I as std::iter::Iterator> *) - let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 230 4 230 90 - let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 211 20 211 64 - let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 +module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_trans__refines [#"../../../creusot-contracts/src/std/iter.rs" 286 4 286 90] (* <&mut I as std::iter::Iterator> *) + let%span siter0 = "../../../creusot-contracts/src/std/iter.rs" 286 4 286 90 + let%span siter1 = "../../../creusot-contracts/src/std/iter.rs" 267 20 267 64 + let%span siter2 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter3 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter4 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter5 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use prelude.prelude.Borrow @@ -22581,20 +24702,20 @@ module M_creusot_contracts__stdqy35z1__iter__qyi8355237225316942617__produces_tr use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter3] produces'1 a ab b) -> ([%#siter4] produces'1 b bc c) -> ([%#siter5] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'0 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'0_spec : forall self : t_I'0 . [%#siter2] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 210 4 210 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) + predicate produces'0 [#"../../../creusot-contracts/src/std/iter.rs" 266 4 266 64] (self : borrowed t_I'0) (visited : Seq.seq t_Item'0) (o : borrowed t_I'0) = [%#siter1] produces'1 self.current visited o.current /\ self.final = o.final @@ -30047,10 +32168,10 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu let%span sfuse9 = "../../../creusot-contracts/src/std/iter/fuse.rs" 8 14 8 39 let%span sfuse10 = "../../../creusot-contracts/src/std/iter/fuse.rs" 9 14 9 71 let%span smodel11 = "../../../creusot-contracts/src/model.rs" 110 8 110 22 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 use prelude.prelude.Borrow @@ -30093,16 +32214,16 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu axiom view'0_spec : forall self : t_Fuse'0 . ([%#sfuse9] inv'0 self -> inv'1 (view'0 self)) && ([%#sfuse10] forall other : t_Fuse'0 . view'0 self = view'0 other -> self = other) - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self @@ -30133,7 +32254,7 @@ module M_creusot_contracts__stdqy35z1__iter__fuse__qyi7691061398646472980__is_fu function view'1 [#"../../../creusot-contracts/src/model.rs" 109 4 109 33] (self : borrowed (t_Fuse'0)) : t_Option'0 = [%#smodel11] view'0 self.current - predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) predicate completed'0 [#"../../../creusot-contracts/src/std/iter/fuse.rs" 18 4 18 35] (self : borrowed (t_Fuse'0)) = [%#sfuse2] (view'1 self = C_None'0 @@ -30160,10 +32281,10 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne let%span smap_inv9 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 30 14 30 42 let%span smap_inv10 = "../../../creusot-contracts/src/std/iter/map_inv.rs" 26 4 26 10 let%span sinvariant11 = "../../../creusot-contracts/src/invariant.rs" 34 20 34 44 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter13 = "../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter15 = "../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sops16 = "../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 let%span sops17 = "../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 let%span sops18 = "../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 @@ -30197,20 +32318,20 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne use seq.Seq - predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 32 4 32 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) + predicate produces'1 [#"../../../creusot-contracts/src/std/iter.rs" 36 4 36 65] (self : t_I'0) (visited : Seq.seq t_Item'0) (o : t_I'0) - function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 45 4 45 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () + function produces_trans'1 [#"../../../creusot-contracts/src/std/iter.rs" 49 4 49 91] (a : t_I'0) (ab : Seq.seq t_Item'0) (b : t_I'0) (bc : Seq.seq t_Item'0) (c : t_I'0) : () axiom produces_trans'1_spec : forall a : t_I'0, ab : Seq.seq t_Item'0, b : t_I'0, bc : Seq.seq t_Item'0, c : t_I'0 . ([%#siter13] produces'1 a ab b) -> ([%#siter14] produces'1 b bc c) -> ([%#siter15] produces'1 a (Seq.(++) ab bc) c) - function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 27] (self : t_I'0) : () + function produces_refl'1 [#"../../../creusot-contracts/src/std/iter.rs" 43 4 43 27] (self : t_I'0) : () axiom produces_refl'1_spec : forall self : t_I'0 . [%#siter12] produces'1 self (Seq.empty : Seq.seq t_Item'0) self - predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 35 4 35 36] (self : borrowed t_I'0) + predicate completed'1 [#"../../../creusot-contracts/src/std/iter.rs" 39 4 39 36] (self : borrowed t_I'0) use seq.Seq @@ -30420,6 +32541,186 @@ module M_creusot_contracts__stdqy35z1__iter__map_inv__qyi4413682431414748756__ne end /\ inv'1 result) end +module M_creusot_contracts__stdqy35z1__iter__range__qyi16137414346896623968__produces_back_refl__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 59 4 59 31] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 59 4 59 31 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 48 12 52 68 + + type t_Idx'0 + + type t_Range'0 = + { t_Range__start'0: t_Idx'0; t_Range__end'0: t_Idx'0 } + + use seq.Seq + + use seq.Seq + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + use seq.Seq + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 4 46 69] (self : t_Range'0) (visited : Seq.seq t_Idx'0) (o : t_Range'0) + + = + [%#srange1] self.t_Range__start'0 = o.t_Range__start'0 + /\ deep_model'0 self.t_Range__end'0 >= deep_model'0 o.t_Range__end'0 + /\ (Seq.length visited > 0 -> deep_model'0 o.t_Range__end'0 >= deep_model'0 o.t_Range__start'0) + /\ Seq.length visited = deep_model'0 o.t_Range__end'0 - deep_model'0 self.t_Range__end'0 + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 self.t_Range__end'0 - i) + + goal refines : [%#srange0] forall self : t_Range'0 . forall result : () . produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self + -> produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self +end +module M_creusot_contracts__stdqy35z1__iter__range__qyi16137414346896623968__produces_back_trans__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 66 4 66 95] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 66 4 66 95 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 48 12 52 68 + + type t_Idx'0 + + type t_Range'0 = + { t_Range__start'0: t_Idx'0; t_Range__end'0: t_Idx'0 } + + use seq.Seq + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + use seq.Seq + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 46 4 46 69] (self : t_Range'0) (visited : Seq.seq t_Idx'0) (o : t_Range'0) + + = + [%#srange1] self.t_Range__start'0 = o.t_Range__start'0 + /\ deep_model'0 self.t_Range__end'0 >= deep_model'0 o.t_Range__end'0 + /\ (Seq.length visited > 0 -> deep_model'0 o.t_Range__end'0 >= deep_model'0 o.t_Range__start'0) + /\ Seq.length visited = deep_model'0 o.t_Range__end'0 - deep_model'0 self.t_Range__end'0 + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 self.t_Range__end'0 - i) + + use seq.Seq + + goal refines : [%#srange0] forall a : t_Range'0 . forall ab : Seq.seq t_Idx'0 . forall b : t_Range'0 . forall bc : Seq.seq t_Idx'0 . forall c : t_Range'0 . produces_back'0 b bc c + /\ produces_back'0 a ab b + -> produces_back'0 b bc c + /\ produces_back'0 a ab b + /\ (forall result : () . produces_back'0 a (Seq.(++) ab bc) c -> produces_back'0 a (Seq.(++) ab bc) c) +end +module M_creusot_contracts__stdqy35z1__iter__range__qyi12106466433038921999__produces_back_refl__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 129 4 129 31] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 129 4 129 31 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 118 12 122 74 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span sops4 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + + type t_Idx'0 + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + use seq.Seq + + use seq.Seq + + use seq.Seq + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops4] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + = + [%#srange3] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 + + axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange2] is_empty_log'0 r + = (range_inclusive_len'0 r = 0) + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 116 4 116 69] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + + = + [%#srange1] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o + /\ (is_empty_log'0 self -> is_empty_log'0 o) + /\ (is_empty_log'0 o \/ start_log'0 self = start_log'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 (end_log'0 self) - i) + + goal refines : [%#srange0] forall self : t_RangeInclusive'0 . forall result : () . produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self + -> produces_back'0 self (Seq.empty : Seq.seq t_Idx'0) self +end +module M_creusot_contracts__stdqy35z1__iter__range__qyi12106466433038921999__produces_back_trans__refines [#"../../../creusot-contracts/src/std/iter/range.rs" 136 4 136 95] (* as std::iter::DoubleEndedIterator> *) + let%span srange0 = "../../../creusot-contracts/src/std/iter/range.rs" 136 4 136 95 + let%span srange1 = "../../../creusot-contracts/src/std/iter/range.rs" 118 12 122 74 + let%span srange2 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange3 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span sops4 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 + + type t_Idx'0 + + type t_RangeInclusive'0 = + { t_RangeInclusive__start'0: t_Idx'0; t_RangeInclusive__end'0: t_Idx'0; t_RangeInclusive__exhausted'0: bool } + + use seq.Seq + + use seq.Seq + + function start_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 193 4 193 29] (self : t_RangeInclusive'0) : t_Idx'0 + + use prelude.prelude.Int + + function deep_model'0 [#"../../../creusot-contracts/src/model.rs" 29 4 29 45] (self : t_Idx'0) : int + + function end_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 199 4 199 27] (self : t_RangeInclusive'0) : t_Idx'0 + + function is_empty_log'0 [#"../../../creusot-contracts/src/std/ops.rs" 206 4 209 35] (self : t_RangeInclusive'0) : bool + + axiom is_empty_log'0_spec : forall self : t_RangeInclusive'0 . [%#sops4] not is_empty_log'0 self + -> deep_model'0 (start_log'0 self) <= deep_model'0 (end_log'0 self) + + function range_inclusive_len'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 72 0 72 92] (r : t_RangeInclusive'0) : int + + = + [%#srange3] if is_empty_log'0 r then 0 else deep_model'0 (end_log'0 r) - deep_model'0 (start_log'0 r) + 1 + + axiom range_inclusive_len'0_spec : forall r : t_RangeInclusive'0 . [%#srange2] is_empty_log'0 r + = (range_inclusive_len'0 r = 0) + + use seq.Seq + + predicate produces_back'0 [#"../../../creusot-contracts/src/std/iter/range.rs" 116 4 116 69] (self : t_RangeInclusive'0) (visited : Seq.seq t_Idx'0) (o : t_RangeInclusive'0) + + = + [%#srange1] Seq.length visited = range_inclusive_len'0 self - range_inclusive_len'0 o + /\ (is_empty_log'0 self -> is_empty_log'0 o) + /\ (is_empty_log'0 o \/ start_log'0 self = start_log'0 o) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> deep_model'0 (Seq.get visited i) = deep_model'0 (end_log'0 self) - i) + + use seq.Seq + + goal refines : [%#srange0] forall a : t_RangeInclusive'0 . forall ab : Seq.seq t_Idx'0 . forall b : t_RangeInclusive'0 . forall bc : Seq.seq t_Idx'0 . forall c : t_RangeInclusive'0 . produces_back'0 b bc c + /\ produces_back'0 a ab b + -> produces_back'0 b bc c + /\ produces_back'0 a ab b + /\ (forall result : () . produces_back'0 a (Seq.(++) ab bc) c -> produces_back'0 a (Seq.(++) ab bc) c) +end module M_creusot_contracts__stdqy35z1__ops__qyi14194840286170235833__unnest_trans__refines [#"../../../creusot-contracts/src/std/ops.rs" 123 4 123 43] (* > *) let%span sops0 = "../../../creusot-contracts/src/std/ops.rs" 123 4 123 43 @@ -30667,10 +32968,10 @@ module M_creusot_contracts__logic__fmap__qyi4648834920430559677__clone__refines goal refines : [%#sfmap0] forall self : t_FMap'0 . inv'0 self -> inv'0 self /\ (forall result : t_FMap'0 . result = self /\ inv'1 result -> result = self /\ inv'1 result) end -module M_creusot_contracts__logic__fset__qyi11096226875104347554__clone__refines [#"../../../creusot-contracts/src/logic/fset.rs" 323 4 323 27] (* as std::clone::Clone> *) - let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 323 4 323 27 +module M_creusot_contracts__logic__fset__qyi11096226875104347554__clone__refines [#"../../../creusot-contracts/src/logic/fset.rs" 443 4 443 27] (* as std::clone::Clone> *) + let%span sfset0 = "../../../creusot-contracts/src/logic/fset.rs" 443 4 443 27 let%span sinvariant1 = "../../../creusot-contracts/src/invariant.rs" 24 8 24 18 - let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 337 20 337 63 + let%span sfset2 = "../../../creusot-contracts/src/logic/fset.rs" 457 20 457 63 let%span sfset3 = "../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 use prelude.prelude.Borrow @@ -30688,7 +32989,7 @@ module M_creusot_contracts__logic__fset__qyi11096226875104347554__clone__refines predicate inv'2 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : t_T'0) - predicate invariant'1 [#"../../../creusot-contracts/src/logic/fset.rs" 336 4 336 30] (self : Fset.fset t_T'0) = + predicate invariant'1 [#"../../../creusot-contracts/src/logic/fset.rs" 456 4 456 30] (self : Fset.fset t_T'0) = [%#sfset2] forall x : t_T'0 . contains'0 self x -> inv'2 x predicate inv'1 [#"../../../creusot-contracts/src/invariant.rs" 41 0 41 35] (_1 : Fset.fset t_T'0) diff --git a/creusot/tests/creusot-contracts/creusot-contracts/why3session.xml b/creusot/tests/creusot-contracts/creusot-contracts/why3session.xml index 7303c86f62..3423243069 100644 --- a/creusot/tests/creusot-contracts/creusot-contracts/why3session.xml +++ b/creusot/tests/creusot-contracts/creusot-contracts/why3session.xml @@ -72,13 +72,13 @@ - + - + - + @@ -124,7 +124,7 @@ - + @@ -173,7 +173,7 @@ - + @@ -243,7 +243,7 @@ - + @@ -310,11 +310,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2266,7 +2386,7 @@ - + @@ -2286,7 +2406,7 @@ - + @@ -2308,34 +2428,34 @@ - + - + - + - + - + - + - + - + - + @@ -2388,6 +2508,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2477,7 +2715,7 @@ - + @@ -2552,7 +2790,7 @@ - + @@ -2570,7 +2808,7 @@ - + @@ -2760,6 +2998,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -2785,6 +3043,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -2805,6 +3083,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/creusot/tests/creusot-contracts/creusot-contracts/why3shapes.gz b/creusot/tests/creusot-contracts/creusot-contracts/why3shapes.gz index 928b3d061bd59b63a58490c2cfec069c417664ac..b93bff03d33a28d5d37c39c6cb708d2321a3160e 100644 GIT binary patch literal 33494 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 z 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 A`~Uy| diff --git a/creusot/tests/should_succeed/100doors.coma b/creusot/tests/should_succeed/100doors.coma index ef30ab8053..89811ac506 100644 --- a/creusot/tests/should_succeed/100doors.coma +++ b/creusot/tests/should_succeed/100doors.coma @@ -15,10 +15,10 @@ module M_100doors__f [#"100doors.rs" 18 0 18 10] let%span s100doors13 = "100doors.rs" 26 29 26 30 let%span svec14 = "../../../creusot-contracts/src/std/vec.rs" 180 22 180 41 let%span svec15 = "../../../creusot-contracts/src/std/vec.rs" 181 22 181 76 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span svec17 = "../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span srange18 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter19 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter19 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec20 = "../../../creusot-contracts/src/std/vec.rs" 162 27 162 46 let%span svec21 = "../../../creusot-contracts/src/std/vec.rs" 163 26 163 54 let%span svec22 = "../../../creusot-contracts/src/std/vec.rs" 152 27 152 46 @@ -27,8 +27,8 @@ module M_100doors__f [#"100doors.rs" 18 0 18 10] let%span svec25 = "../../../creusot-contracts/src/std/vec.rs" 155 26 155 62 let%span svec26 = "../../../creusot-contracts/src/std/vec.rs" 156 26 156 55 let%span sindex27 = "../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 - let%span siter28 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter28 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange30 = "../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange31 = "../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange32 = "../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/bug/164.coma b/creusot/tests/should_succeed/bug/164.coma index 2780aeba45..b76abe1396 100644 --- a/creusot/tests/should_succeed/bug/164.coma +++ b/creusot/tests/should_succeed/bug/164.coma @@ -27,11 +27,11 @@ module M_164__main [#"164.rs" 5 0 5 13] let%span s16425 = "164.rs" 61 4 61 7 let%span s16426 = "164.rs" 60 16 60 27 let%span s16427 = "164.rs" 61 4 61 7 - let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span srange29 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter30 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 - let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter32 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter30 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 + let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter32 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange33 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange34 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange35 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/cc/array.coma b/creusot/tests/should_succeed/cc/array.coma index 75f935b709..3199e1060c 100644 --- a/creusot/tests/should_succeed/cc/array.coma +++ b/creusot/tests/should_succeed/cc/array.coma @@ -3,11 +3,11 @@ module M_array__test_array [#"array.rs" 3 0 3 19] let%span sarray1 = "array.rs" 4 17 4 18 let%span sarray2 = "array.rs" 4 20 4 21 let%span sslice3 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sarray5 = "array.rs" 5 31 5 32 let%span soption6 = "../../../../creusot-contracts/src/std/option.rs" 23 26 23 75 let%span sarray7 = "array.rs" 6 31 6 32 - let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sarray9 = "array.rs" 10 30 10 31 let%span sslice10 = "../../../../creusot-contracts/src/std/slice.rs" 398 20 398 61 let%span sslice11 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 diff --git a/creusot/tests/should_succeed/cc/collections.coma b/creusot/tests/should_succeed/cc/collections.coma index f8345c7cc2..420651540a 100644 --- a/creusot/tests/should_succeed/cc/collections.coma +++ b/creusot/tests/should_succeed/cc/collections.coma @@ -3,8 +3,8 @@ module M_collections__roundtrip_hashmap_into_iter [#"collections.rs" 15 0 17 18] let%span scollections1 = "collections.rs" 22 8 25 80 let%span scollections2 = "collections.rs" 27 20 27 79 let%span scollections3 = "collections.rs" 14 10 14 24 - let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span siter5 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter5 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span shash_map6 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 73 20 73 54 let%span shash_map7 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 56 12 66 29 let%span sfmap8 = "../../../../creusot-contracts/src/logic/fmap.rs" 92 8 95 9 @@ -371,7 +371,7 @@ module M_collections__roundtrip_hashmap_iter [#"collections.rs" 32 0 32 97] let%span scollections1 = "collections.rs" 38 4 41 77 let%span scollections2 = "collections.rs" 31 10 31 98 let%span shash_map3 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 23 0 37 1 - let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span shash_map5 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 125 20 125 54 let%span shash_map6 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 108 12 118 29 let%span sfmap7 = "../../../../creusot-contracts/src/logic/fmap.rs" 92 8 95 9 @@ -691,7 +691,7 @@ module M_collections__roundtrip_hashmap_iter_mut [#"collections.rs" 48 0 50 24] let%span scollections3 = "collections.rs" 46 10 46 107 let%span scollections4 = "collections.rs" 47 10 47 110 let%span shash_map5 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 23 0 37 1 - let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span shash_map7 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 177 20 177 54 let%span shash_map8 = "../../../../creusot-contracts/src/std/collections/hash_map.rs" 160 12 170 29 let%span sfmap9 = "../../../../creusot-contracts/src/logic/fmap.rs" 92 8 95 9 @@ -1068,27 +1068,27 @@ module M_collections__roundtrip_hashmap_iter_mut [#"collections.rs" 48 0 50 24] end module M_collections__roundtrip_hashset_into_iter [#"collections.rs" 64 0 64 90] let%span scollections0 = "collections.rs" 63 10 63 24 - let%span siter1 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 - let%span shash_set3 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 157 20 157 24 - let%span shash_set4 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 163 20 163 33 - let%span shash_set5 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 96 20 96 38 - let%span shash_set6 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 90 8 90 38 - let%span shash_set7 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 185 20 185 121 - let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 101 14 101 45 - let%span shash_set9 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 99 4 99 10 - let%span shash_set10 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 106 15 106 32 - let%span shash_set11 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 107 15 107 32 - let%span shash_set12 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 108 14 108 42 - let%span shash_set13 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 110 8 110 43 + let%span siter1 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 + let%span shash_set3 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 163 20 163 24 + let%span shash_set4 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 169 20 169 33 + let%span shash_set5 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 102 20 102 38 + let%span shash_set6 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 96 8 96 38 + let%span shash_set7 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 191 20 191 121 + let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 107 14 107 45 + let%span shash_set9 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 105 4 105 10 + let%span shash_set10 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 112 15 112 32 + let%span shash_set11 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 113 15 113 32 + let%span shash_set12 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 114 14 114 42 + let%span shash_set13 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 116 8 116 43 let%span smodel14 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 - let%span shash_set15 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 + let%span shash_set15 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset16 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span sseq17 = "../../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 - let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 + let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 let%span sseq22 = "../../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq23 = "../../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 @@ -1372,27 +1372,27 @@ module M_collections__roundtrip_hashset_into_iter [#"collections.rs" 64 0 64 90] end module M_collections__roundtrip_hashset_iter [#"collections.rs" 69 0 69 87] let%span scollections0 = "collections.rs" 68 10 68 24 - let%span shash_set1 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 19 0 38 1 - let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span shash_set1 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 19 0 44 1 + let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span smodel3 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span shash_set4 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 135 20 135 38 - let%span shash_set5 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 129 8 129 38 - let%span shash_set6 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 185 20 185 121 - let%span shash_set7 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 140 14 140 45 - let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 138 4 138 10 - let%span shash_set9 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 145 15 145 32 - let%span shash_set10 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 146 15 146 32 - let%span shash_set11 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 147 14 147 42 - let%span shash_set12 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 149 8 149 43 + let%span shash_set4 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 141 20 141 38 + let%span shash_set5 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 135 8 135 38 + let%span shash_set6 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 191 20 191 121 + let%span shash_set7 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 146 14 146 45 + let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 144 4 144 10 + let%span shash_set9 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 151 15 151 32 + let%span shash_set10 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 152 15 152 32 + let%span shash_set11 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 153 14 153 42 + let%span shash_set12 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 155 8 155 43 let%span smodel13 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 - let%span shash_set14 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 + let%span shash_set14 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 let%span sfset15 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span smodel16 = "../../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq17 = "../../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 - let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 + let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 let%span sseq22 = "../../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq23 = "../../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 @@ -1615,35 +1615,35 @@ end module M_collections__hashset_intersection [#"collections.rs" 74 0 77 15] let%span scollections0 = "collections.rs" 73 10 73 42 let%span shash_set1 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 32 30 32 67 - let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span smodel4 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span scopied5 = "../../../../creusot-contracts/src/std/iter/copied.rs" 11 14 11 39 let%span scopied6 = "../../../../creusot-contracts/src/std/iter/copied.rs" 40 12 40 105 let%span scopied7 = "../../../../creusot-contracts/src/std/iter/copied.rs" 48 12 51 79 - let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 185 20 185 121 + let%span shash_set8 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 191 20 191 121 let%span scopied9 = "../../../../creusot-contracts/src/std/iter/copied.rs" 21 8 21 29 let%span scopied10 = "../../../../creusot-contracts/src/std/iter/copied.rs" 57 14 57 45 let%span scopied11 = "../../../../creusot-contracts/src/std/iter/copied.rs" 62 15 62 32 let%span scopied12 = "../../../../creusot-contracts/src/std/iter/copied.rs" 63 15 63 32 let%span scopied13 = "../../../../creusot-contracts/src/std/iter/copied.rs" 64 14 64 42 - let%span shash_set14 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 210 20 210 56 - let%span shash_set15 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 204 8 204 38 + let%span shash_set14 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 216 20 216 56 + let%span shash_set15 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 210 8 210 38 let%span sfset16 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 let%span sseq17 = "../../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 - let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 215 14 215 45 - let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 213 4 213 10 - let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 220 15 220 32 - let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 221 15 221 32 - let%span shash_set22 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 222 14 222 42 - let%span shash_set23 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 224 8 224 43 + let%span shash_set18 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 221 14 221 45 + let%span shash_set19 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 219 4 219 10 + let%span shash_set20 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 226 15 226 32 + let%span shash_set21 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 227 15 227 32 + let%span shash_set22 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 228 14 228 42 + let%span shash_set23 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 230 8 230 43 let%span sresolve24 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span smodel25 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 - let%span shash_set26 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 58 16 65 23 - let%span shash_set27 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 71 11 71 33 - let%span shash_set28 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 72 11 72 33 - let%span shash_set29 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 73 10 73 43 - let%span shash_set30 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 81 4 81 31 + let%span shash_set26 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 64 16 71 23 + let%span shash_set27 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 77 11 77 33 + let%span shash_set28 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 78 11 78 33 + let%span shash_set29 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 79 10 79 43 + let%span shash_set30 = "../../../../creusot-contracts/src/std/collections/hash_set.rs" 87 4 87 31 let%span smodel31 = "../../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sseq32 = "../../../../creusot-contracts/src/logic/seq.rs" 382 14 383 65 let%span sseq33 = "../../../../creusot-contracts/src/logic/seq.rs" 381 4 381 12 diff --git a/creusot/tests/should_succeed/cc/fset.coma b/creusot/tests/should_succeed/cc/fset.coma new file mode 100644 index 0000000000..3f37cef7b4 --- /dev/null +++ b/creusot/tests/should_succeed/cc/fset.coma @@ -0,0 +1,96 @@ +module M_fset__map_spec [#"fset.rs" 8 0 8 23] + let%span sfset0 = "fset.rs" 7 10 7 123 + let%span sfset1 = "../../../../creusot-contracts/src/logic/fset.rs" 231 8 231 27 + let%span sfset2 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + use prelude.prelude.Intrinsic + + type t_T'0 + + use set.Fset + + type t_U'0 + + use map.Map + + use set.Fset + + use set.Fset + + function map'0 (self : Fset.fset t_T'0) (f : Map.map t_T'0 t_U'0) : Fset.fset t_U'0 = + [%#sfset1] Fset.map f self + + use set.Fset + + predicate contains'0 [@inline:trivial] (self : Fset.fset t_U'0) (e : t_U'0) = + [%#sfset2] Fset.mem e self + + use set.Fset + + predicate contains'1 [@inline:trivial] (self : Fset.fset t_T'0) (e : t_T'0) = + [%#sfset2] Fset.mem e self + + use map.Map + + meta "compute_max_steps" 1000000 + + let rec map_spec'0 (_1:()) (return' (ret:()))= (! bb0 [ bb0 = return' {_0} ] ) [ & _0 : () = any_l () ] + [ return' (result:())-> {[@expl:map_spec ensures] [%#sfset0] forall xs : Fset.fset t_T'0, f : Map.map t_T'0 t_U'0, y : t_U'0 . contains'0 (map'0 xs f) y + = (exists x : t_T'0 . contains'1 xs x /\ Map.get f x = y)} + (! return' {result}) ] + +end +module M_fset__filter_spec [#"fset.rs" 11 0 11 23] + let%span sfset0 = "fset.rs" 10 10 10 113 + let%span sfset1 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + use prelude.prelude.Intrinsic + + type t_T'0 + + use set.Fset + + use map.Map + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] (self : Fset.fset t_T'0) (e : t_T'0) = + [%#sfset1] Fset.mem e self + + use map.Map + + meta "compute_max_steps" 1000000 + + let rec filter_spec'0 (_1:()) (return' (ret:()))= (! bb0 [ bb0 = return' {_0} ] ) [ & _0 : () = any_l () ] + [ return' (result:())-> {[@expl:filter_spec ensures] [%#sfset0] forall xs : Fset.fset t_T'0, f : Map.map t_T'0 bool, x : t_T'0 . contains'0 (Fset.filter xs f) x + = (contains'0 xs x /\ Map.get f x)} + (! return' {result}) ] + +end +module M_fset__interval_spec [#"fset.rs" 14 0 14 22] + let%span sfset0 = "fset.rs" 13 10 13 94 + let%span sfset1 = "../../../../creusot-contracts/src/logic/fset.rs" 46 8 46 26 + + use prelude.prelude.Intrinsic + + use prelude.prelude.Int + + use set.FsetInt + + use set.Fset + + use set.Fset + + predicate contains'0 [@inline:trivial] (self : Fset.fset int) (e : int) = + [%#sfset1] Fset.mem e self + + meta "compute_max_steps" 1000000 + + let rec interval_spec'0 (_1:()) (return' (ret:()))= (! bb0 [ bb0 = return' {_0} ] ) [ & _0 : () = any_l () ] + [ return' (result:())-> {[@expl:interval_spec ensures] [%#sfset0] forall i : int, j : int, k : int . contains'0 (FsetInt.interval i j) k + = (i <= k /\ k < j)} + (! return' {result}) ] + +end diff --git a/creusot/tests/should_succeed/cc/fset.rs b/creusot/tests/should_succeed/cc/fset.rs new file mode 100644 index 0000000000..1c2bbab18e --- /dev/null +++ b/creusot/tests/should_succeed/cc/fset.rs @@ -0,0 +1,14 @@ +extern crate creusot_contracts; +use creusot_contracts::{ + logic::{FSet, Mapping}, + *, +}; + +#[ensures(forall, f: Mapping, y: U> xs.map(f).contains(y) == exists xs.contains(x) && f.get(x) == y)] +pub fn map_spec() {} + +#[ensures(forall, f: Mapping, x: T> xs.filter(f).contains(x) == (xs.contains(x) && f.get(x)))] +pub fn filter_spec() {} + +#[ensures(forall FSet::interval(i, j).contains(k) == (i <= k && k < j))] +pub fn interval_spec() {} diff --git a/creusot/tests/should_succeed/cc/fset/why3session.xml b/creusot/tests/should_succeed/cc/fset/why3session.xml new file mode 100644 index 0000000000..26600bd03f --- /dev/null +++ b/creusot/tests/should_succeed/cc/fset/why3session.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/creusot/tests/should_succeed/cc/fset/why3shapes.gz b/creusot/tests/should_succeed/cc/fset/why3shapes.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf1e1f1e016a695e8142233191febf6c2e14bcfb GIT binary patch literal 220 zcmV<203-h&iwFP!00000|7FZgPQx$|K;gYl;a#Dt@l4_$)GoRx;sD57GpFX{ZwVvO3lv!V8n)~zcq^({*D&F!zmS`eH+;Kh+3-`mkG7%!}Kkfne z#N!HTHW8ndoW|wz?dN!3Aiqu*`E~i`_-9i3<08}T!kdWE?0B>N2m7JAD<5xES!5f! z&Ux;bMPoc4tZAF}HlTt;faua-Oasm=;U2+_Z WxD3WYaJJa4B2r%*`FA@o0RR9+TWU)H literal 0 HcmV?d00001 diff --git a/creusot/tests/should_succeed/cc/iter.coma b/creusot/tests/should_succeed/cc/iter.coma index ddb4b17c16..ba4fc71290 100644 --- a/creusot/tests/should_succeed/cc/iter.coma +++ b/creusot/tests/should_succeed/cc/iter.coma @@ -1,11 +1,11 @@ -module M_iter__test_mut_ref [#"iter.rs" 3 0 3 21] - let%span siter0 = "iter.rs" 4 17 4 18 - let%span siter1 = "iter.rs" 4 20 4 21 +module M_iter__test_mut_ref [#"iter.rs" 4 0 4 21] + let%span siter0 = "iter.rs" 5 17 5 18 + let%span siter1 = "iter.rs" 5 20 5 21 let%span sslice2 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 - let%span siter4 = "iter.rs" 5 38 5 39 + let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 + let%span siter4 = "iter.rs" 6 38 6 39 let%span soption5 = "../../../../creusot-contracts/src/std/option.rs" 23 26 23 75 - let%span siter6 = "iter.rs" 6 38 6 39 + let%span siter6 = "iter.rs" 7 38 7 39 let%span sslice7 = "../../../../creusot-contracts/src/std/slice.rs" 398 20 398 61 let%span sslice8 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 let%span sresolve9 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 @@ -333,3 +333,1086 @@ module M_iter__test_mut_ref [#"iter.rs" 3 0 3 21] | & _78 : array int32 = any_l () ] [ return' (result:())-> (! return' {result}) ] end +module M_iter__test_filter [#"iter.rs" 11 0 11 20] + let%span siter0 = "iter.rs" 12 17 12 21 + let%span siter1 = "iter.rs" 12 23 12 28 + let%span siter2 = "iter.rs" 12 30 12 34 + let%span sslice3 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 + let%span siter4 = "iter.rs" 13 18 13 31 + let%span siter5 = "../../../../creusot-contracts/src/std/iter.rs" 175 27 175 47 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 176 27 176 53 + let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 177 27 177 45 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 + let%span siter10 = "iter.rs" 16 38 16 42 + let%span soption11 = "../../../../creusot-contracts/src/std/option.rs" 23 26 23 75 + let%span siter12 = "iter.rs" 17 38 17 42 + let%span sfilter13 = "../../../../creusot-contracts/src/std/iter/filter.rs" 58 16 58 59 + let%span sfilter14 = "../../../../creusot-contracts/src/std/iter/filter.rs" 50 16 50 57 + let%span sfilter15 = "../../../../creusot-contracts/src/std/iter/filter.rs" 65 16 65 126 + let%span sfilter16 = "../../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 + let%span sfilter17 = "../../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 + let%span sfilter18 = "../../../../creusot-contracts/src/std/iter/filter.rs" 77 12 79 47 + let%span sfilter19 = "../../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 + let%span sresolve20 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 + let%span smodel21 = "../../../../creusot-contracts/src/model.rs" 83 8 83 28 + let%span sops22 = "../../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops23 = "../../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops24 = "../../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops25 = "../../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops26 = "../../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops27 = "../../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops28 = "../../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span sfilter29 = "../../../../creusot-contracts/src/std/iter/filter.rs" 104 14 104 45 + let%span sfilter30 = "../../../../creusot-contracts/src/std/iter/filter.rs" 109 15 109 32 + let%span sfilter31 = "../../../../creusot-contracts/src/std/iter/filter.rs" 110 15 110 32 + let%span sfilter32 = "../../../../creusot-contracts/src/std/iter/filter.rs" 111 14 111 42 + let%span sslice33 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 + let%span sslice34 = "../../../../creusot-contracts/src/std/slice.rs" 398 20 398 61 + let%span sinvariant35 = "../../../../creusot-contracts/src/invariant.rs" 34 20 34 44 + let%span soption36 = "../../../../creusot-contracts/src/std/option.rs" 11 8 14 9 + let%span sslice37 = "../../../../creusot-contracts/src/std/slice.rs" 411 14 411 45 + let%span sslice38 = "../../../../creusot-contracts/src/std/slice.rs" 409 4 409 10 + let%span sslice39 = "../../../../creusot-contracts/src/std/slice.rs" 416 15 416 32 + let%span sslice40 = "../../../../creusot-contracts/src/std/slice.rs" 417 15 417 32 + let%span sslice41 = "../../../../creusot-contracts/src/std/slice.rs" 418 14 418 42 + let%span sslice42 = "../../../../creusot-contracts/src/std/slice.rs" 414 4 414 10 + let%span sslice43 = "../../../../creusot-contracts/src/std/slice.rs" 96 14 96 41 + let%span sslice44 = "../../../../creusot-contracts/src/std/slice.rs" 97 14 97 80 + let%span smodel45 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 + let%span sslice46 = "../../../../creusot-contracts/src/std/slice.rs" 28 14 28 41 + let%span sslice47 = "../../../../creusot-contracts/src/std/slice.rs" 29 14 29 42 + let%span smodel48 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 + let%span sindex49 = "../../../../creusot-contracts/src/logic/ops/index.rs" 49 8 49 31 + let%span smodel50 = "../../../../creusot-contracts/src/model.rs" 120 8 120 12 + + use prelude.prelude.Slice + + use prelude.prelude.Borrow + + use prelude.prelude.Intrinsic + + let rec promoted3__test_filter'0 (return' (ret:array bool))= bb0 + [ bb0 = s0 + [ s0 = any + [ any_ (__arr_temp:array bool)-> (! -{Seq.get __arr_temp.elts 0 + /\ Seq.get __arr_temp.elts 1 = ([%#siter1] false) + /\ Seq.get __arr_temp.elts 2 /\ Seq.length __arr_temp.elts = 3}- + [ &_1 <- __arr_temp ] + s1) ] + + | s1 = [ &_0 <- _1 ] s2 + | s2 = return' {_0} ] + ] + [ & _0 : array bool = any_l () | & _1 : array bool = any_l () ] + [ return' (result:array bool)-> return' {result} ] + + + predicate inv'2 (_1 : slice bool) + + axiom inv_axiom'2 [@rewrite] : forall x : slice bool [inv'2 x] . inv'2 x = true + + use prelude.prelude.Opaque + + type t_NonNull'0 = + { t_NonNull__pointer'0: opaque_ptr } + + type t_Iter'0 = + { t_Iter__ptr'0: t_NonNull'0; t_Iter__end_or_len'0: opaque_ptr; t_Iter__qy95zmarker'0: () } + + function view'0 (self : t_Iter'0) : slice bool + + let rec iter'0 (self:slice bool) (return' (ret:t_Iter'0))= {[@expl:iter 'self' type invariant] inv'2 self} + any [ return' (result:t_Iter'0)-> {[%#sslice3] view'0 result = self} (! return' {result}) ] + + predicate resolve'3 (self : borrowed ()) = + [%#sresolve20] self.final = self.current + + predicate resolve'1 (_1 : borrowed ()) = + resolve'3 _1 + + predicate postcondition_once'0 (self : ()) (args : bool) (result : bool) = + [%#siter4] let (b) = args in result = b + + predicate resolve'4 (_1 : ()) = + true + + predicate unnest'0 (self : ()) (_2 : ()) = + true + + predicate postcondition_mut'1 (self : ()) (args : bool) (result_state : ()) (result : bool) = + (let (b) = args in result = b) /\ unnest'0 self result_state + + function fn_mut_once'0 (self : ()) (args : bool) (res : bool) : () + + axiom fn_mut_once'0_spec : forall self : (), args : bool, res : bool . [%#sops28] postcondition_once'0 self args res + = (exists res_state : () . postcondition_mut'1 self args res_state res /\ resolve'4 res_state) + + function unnest_trans'0 (self : ()) (b : ()) (c : ()) : () + + axiom unnest_trans'0_spec : forall self : (), b : (), c : () . ([%#sops25] unnest'0 self b) + -> ([%#sops26] unnest'0 b c) -> ([%#sops27] unnest'0 self c) + + function unnest_refl'0 (self : ()) : () + + axiom unnest_refl'0_spec : forall self : () . [%#sops24] unnest'0 self self + + function postcondition_mut_unnest'0 (self : ()) (args : bool) (res_state : ()) (res : bool) : () + + axiom postcondition_mut_unnest'0_spec : forall self : (), args : bool, res_state : (), res : bool . ([%#sops22] postcondition_mut'1 self args res_state res) + -> ([%#sops23] unnest'0 self res_state) + + let rec closure0'0 (_1:borrowed ()) (b:bool) (return' (ret:bool))= (! bb0 + [ bb0 = s0 [ s0 = -{resolve'1 _1}- s1 | s1 = [ &res <- b ] s2 | s2 = [ &_0 <- res ] s3 | s3 = return' {_0} ] ] + ) [ & _0 : bool = any_l () | & _1 : borrowed () = _1 | & b : bool = b | & res : bool = any_l () ] + [ return' (result:bool)-> {[@expl:closure ensures] [%#siter4] result = b} + {[@expl:closure unnest] unnest'0 _1.current _1.final} + (! return' {result}) ] + + + predicate inv'3 (_1 : t_Iter'0) + + axiom inv_axiom'3 [@rewrite] : forall x : t_Iter'0 [inv'3 x] . inv'3 x = true + + predicate inv'4 (_1 : ()) + + axiom inv_axiom'4 [@rewrite] : forall x : () [inv'4 x] . inv'4 x = true + + predicate postcondition_once'1 (self : ()) (args : bool) (result : bool) = + [%#siter4] let (b) = args in result = b + + predicate postcondition_mut'0 (self : ()) (args : bool) (result_state : ()) (result : bool) = + (let (b) = args in result = b) /\ unnest'0 self result_state + + function fn_mut_once'1 (self : ()) (args : bool) (res : bool) : () + + axiom fn_mut_once'1_spec : forall self : (), args : bool, res : bool . [%#sops28] postcondition_once'1 self args res + = (exists res_state : () . postcondition_mut'0 self args res_state res /\ resolve'4 res_state) + + predicate unnest'1 (self : ()) (_2 : ()) = + true + + function unnest_trans'1 (self : ()) (b : ()) (c : ()) : () + + axiom unnest_trans'1_spec : forall self : (), b : (), c : () . ([%#sops25] unnest'1 self b) + -> ([%#sops26] unnest'1 b c) -> ([%#sops27] unnest'1 self c) + + function unnest_refl'1 (self : ()) : () + + axiom unnest_refl'1_spec : forall self : () . [%#sops24] unnest'1 self self + + function postcondition_mut_unnest'1 (self : ()) (args : bool) (res_state : ()) (res : bool) : () + + axiom postcondition_mut_unnest'1_spec : forall self : (), args : bool, res_state : (), res : bool . ([%#sops22] postcondition_mut'0 self args res_state res) + -> ([%#sops23] unnest'1 self res_state) + + predicate immutable'0 (_1 : ()) = + [%#sfilter13] forall f : (), g : () . unnest'1 f g -> f = g + + predicate precondition'0 (self : ()) (args : bool) = + let (b) = args in true + + predicate no_precondition'0 (_1 : ()) = + [%#sfilter14] forall f : (), i : bool . precondition'0 f (i) + + predicate precise'0 (_1 : ()) = + [%#sfilter15] forall f1 : (), f2 : (), i : bool . not (postcondition_mut'0 f1 (i) f2 true + /\ postcondition_mut'0 f1 (i) f2 false) + + type t_Filter'0 = + { t_Filter__iter'0: t_Iter'0; t_Filter__predicate'0: () } + + predicate invariant'0 (self : t_Filter'0) + + predicate inv'0 (_1 : t_Filter'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_Filter'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_Filter__iter'0 = iter ; t_Filter__predicate'0 = predicate'} -> true + end) + + function iter'1 (self : t_Filter'0) : t_Iter'0 + + axiom iter'1_spec : forall self : t_Filter'0 . [%#sfilter16] inv'0 self -> inv'3 (iter'1 self) + + function func'0 (self : t_Filter'0) : () + + axiom func'0_spec : forall self : t_Filter'0 . [%#sfilter17] inv'0 self -> inv'4 (func'0 self) + + let rec filter'0 (self:t_Iter'0) (predicate':()) (return' (ret:t_Filter'0))= {[@expl:filter 'self' type invariant] inv'3 self} + {[@expl:filter 'predicate' type invariant] inv'4 predicate'} + {[@expl:filter requires #0] [%#siter5] immutable'0 predicate'} + {[@expl:filter requires #1] [%#siter6] no_precondition'0 predicate'} + {[@expl:filter requires #2] [%#siter7] precise'0 predicate'} + any + [ return' (result:t_Filter'0)-> {inv'0 result} + {[%#siter8] iter'1 result = self /\ func'0 result = predicate'} + (! return' {result}) ] + + + predicate invariant'1 (self : borrowed (t_Filter'0)) = + [%#sinvariant35] inv'0 self.current /\ inv'0 self.final + + predicate inv'1 (_1 : borrowed (t_Filter'0)) + + axiom inv_axiom'1 [@rewrite] : forall x : borrowed (t_Filter'0) [inv'1 x] . inv'1 x = invariant'1 x + + type t_Option'0 = + | C_None'0 + | C_Some'0 bool + + predicate inv'5 (_1 : t_Option'0) + + axiom inv_axiom'5 [@rewrite] : forall x : t_Option'0 [inv'5 x] . inv'5 x = true + + use seq.Seq + + use prelude.prelude.Int + + use map.Map + + use seq.Seq + + use seq.Seq + + use seq.Seq + + use seq.Seq + + use seq.Seq + + use prelude.prelude.UIntSize + + constant v_MAX'0 : usize = (18446744073709551615 : usize) + + use prelude.prelude.UIntSize + + use prelude.prelude.Slice + + function view'2 (self : slice bool) : Seq.seq bool + + axiom view'2_spec : forall self : slice bool . ([%#sslice46] Seq.length (view'2 self) + <= UIntSize.to_int (v_MAX'0 : usize)) + && ([%#sslice47] view'2 self = Slice.id self) + + function view'3 (self : slice bool) : Seq.seq bool = + [%#smodel48] view'2 self + + use seq.Seq + + use seq.Seq + + function index_logic'0 [@inline:trivial] (self : slice bool) (ix : int) : bool = + [%#sindex49] Seq.get (view'2 self) ix + + function to_ref_seq'0 (self : slice bool) : Seq.seq bool + + axiom to_ref_seq'0_spec : forall self : slice bool . ([%#sslice43] Seq.length (to_ref_seq'0 self) + = Seq.length (view'3 self)) + && ([%#sslice44] forall i : int . 0 <= i /\ i < Seq.length (to_ref_seq'0 self) + -> Seq.get (to_ref_seq'0 self) i = index_logic'0 self i) + + predicate produces'1 (self : t_Iter'0) (visited : Seq.seq bool) (tl : t_Iter'0) = + [%#sslice33] to_ref_seq'0 (view'0 self) = Seq.(++) visited (to_ref_seq'0 (view'0 tl)) + + function produces_trans'1 (a : t_Iter'0) (ab : Seq.seq bool) (b : t_Iter'0) (bc : Seq.seq bool) (c : t_Iter'0) : () = + [%#sslice42] () + + axiom produces_trans'1_spec : forall a : t_Iter'0, ab : Seq.seq bool, b : t_Iter'0, bc : Seq.seq bool, c : t_Iter'0 . ([%#sslice39] produces'1 a ab b) + -> ([%#sslice40] produces'1 b bc c) -> ([%#sslice41] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'1 (self : t_Iter'0) : () = + [%#sslice38] () + + axiom produces_refl'1_spec : forall self : t_Iter'0 . [%#sslice37] produces'1 self (Seq.empty : Seq.seq bool) self + + use map.Map + + predicate produces'0 (self : t_Filter'0) (visited : Seq.seq bool) (succ : t_Filter'0) = + [%#sfilter19] invariant'0 self + -> unnest'1 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq bool, f : Map.map int int . produces'1 (iter'1 self) s (iter'1 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) + /\ (forall i : int . 0 <= i /\ i < Seq.length s + -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) + = postcondition_mut'0 (func'0 self) (Seq.get s i) (func'0 self) true)) + + function produces_trans'0 (a : t_Filter'0) (ab : Seq.seq bool) (b : t_Filter'0) (bc : Seq.seq bool) (c : t_Filter'0) : () + + + axiom produces_trans'0_spec : forall a : t_Filter'0, ab : Seq.seq bool, b : t_Filter'0, bc : Seq.seq bool, c : t_Filter'0 . ([%#sfilter30] produces'0 a ab b) + -> ([%#sfilter31] produces'0 b bc c) -> ([%#sfilter32] produces'0 a (Seq.(++) ab bc) c) + + function produces_refl'0 (self : t_Filter'0) : () + + axiom produces_refl'0_spec : forall self : t_Filter'0 . [%#sfilter29] produces'0 self (Seq.empty : Seq.seq bool) self + + predicate resolve'5 (self : borrowed (t_Iter'0)) = + [%#sresolve20] self.final = self.current + + function view'1 (self : borrowed (t_Iter'0)) : slice bool = + [%#smodel45] view'0 self.current + + use seq.Seq + + predicate completed'1 (self : borrowed (t_Iter'0)) = + [%#sslice34] resolve'5 self /\ view'2 (view'1 self) = (Seq.empty : Seq.seq bool) + + predicate completed'0 (self : borrowed (t_Filter'0)) = + [%#sfilter18] (exists s : Seq.seq bool, e : borrowed (t_Iter'0) . produces'1 (iter'1 self.current) s e.current + /\ completed'1 e + /\ (forall i : int . 0 <= i /\ i < Seq.length s + -> postcondition_mut'0 (func'0 self.current) (Seq.get s i) (func'0 self.final) false)) + /\ func'0 self.current = func'0 self.final + + use seq.Seq + + let rec next'0 (self:borrowed (t_Filter'0)) (return' (ret:t_Option'0))= {[@expl:next 'self' type invariant] inv'1 self} + any + [ return' (result:t_Option'0)-> {inv'5 result} + {[%#siter9] match result with + | C_None'0 -> completed'0 self + | C_Some'0 v -> produces'0 self.current (Seq.singleton v) self.final + end} + (! return' {result}) ] + + + predicate resolve'2 (self : borrowed (t_Filter'0)) = + [%#sresolve20] self.final = self.current + + predicate resolve'0 (_1 : borrowed (t_Filter'0)) = + resolve'2 _1 + + let rec promoted2__test_filter'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_Some'0 ([%#siter10] true) ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + predicate inv'6 (_1 : t_Option'0) + + axiom inv_axiom'6 [@rewrite] : forall x : t_Option'0 [inv'6 x] . inv'6 x = true + + type t_Option'1 = + | C_None'1 + | C_Some'1 bool + + function deep_model'3 (self : bool) : bool = + [%#smodel50] self + + function deep_model'2 (self : bool) : bool = + [%#smodel21] deep_model'3 self + + function deep_model'1 (self : t_Option'0) : t_Option'1 = + [%#soption36] match self with + | C_Some'0 t -> C_Some'1 (deep_model'2 t) + | C_None'0 -> C_None'1 + end + + function deep_model'0 (self : t_Option'0) : t_Option'1 = + [%#smodel21] deep_model'1 self + + let rec eq'0 (self:t_Option'0) (other:t_Option'0) (return' (ret:bool))= {[@expl:eq 'self' type invariant] inv'6 self} + {[@expl:eq 'other' type invariant] inv'6 other} + any + [ return' (result:bool)-> {[%#soption11] result = (deep_model'0 self = deep_model'0 other)} (! return' {result}) ] + + + let rec promoted1__test_filter'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_Some'0 ([%#siter12] true) ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + let rec promoted0__test_filter'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_None'0 ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + type t_AssertKind'0 = + | C_Eq'0 + | C_Ne'0 + | C_Match'0 + + meta "compute_max_steps" 1000000 + + let rec test_filter'0 (_1:()) (return' (ret:()))= (! bb0 + [ bb0 = s0 + [ s0 = promoted3__test_filter'0 (fun (pr3:array bool) -> [ &_80 <- pr3 ] s1) + | s1 = iter'0 {_80} (fun (_ret':t_Iter'0) -> [ &_2 <- _ret' ] s2) + | s2 = bb1 ] + + | bb1 = s0 + [ s0 = [ &_6 <- () ] s1 | s1 = filter'0 {_2} {_6} (fun (_ret':t_Filter'0) -> [ &a <- _ret' ] s2) | s2 = bb2 ] + + | bb2 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_Filter'0)) -> [ &_12 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _12.current} + Borrow.borrow_final {_12.current} {Borrow.get_id _12} + (fun (_ret':borrowed (t_Filter'0)) -> + [ &_11 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_12 <- { _12 with current = _ret'.final } ] + s2) + | s2 = next'0 {_11} (fun (_ret':t_Option'0) -> [ &_10 <- _ret' ] s3) + | s3 = bb3 ] + + | bb3 = s0 + [ s0 = {[@expl:type invariant] inv'1 _12} s1 + | s1 = -{resolve'0 _12}- s2 + | s2 = promoted2__test_filter'0 (fun (pr2:t_Option'0) -> [ &_79 <- pr2 ] s3) + | s3 = [ &_8 <- (_10, _79) ] s4 + | s4 = [ &left_val <- let (r'0, _) = _8 in r'0 ] s5 + | s5 = [ &right_val <- let (_, r'1) = _8 in r'1 ] s6 + | s6 = eq'0 {left_val} {right_val} (fun (_ret':bool) -> [ &_19 <- _ret' ] s7) + | s7 = bb4 ] + + | bb4 = any [ br0 -> {_19 = false} (! bb6) | br1 -> {_19} (! bb5) ] + | bb5 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_Filter'0)) -> [ &_36 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _36.current} + Borrow.borrow_final {_36.current} {Borrow.get_id _36} + (fun (_ret':borrowed (t_Filter'0)) -> + [ &_35 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_36 <- { _36 with current = _ret'.final } ] + s2) + | s2 = next'0 {_35} (fun (_ret':t_Option'0) -> [ &_34 <- _ret' ] s3) + | s3 = bb7 ] + + | bb7 = s0 + [ s0 = {[@expl:type invariant] inv'1 _36} s1 + | s1 = -{resolve'0 _36}- s2 + | s2 = promoted1__test_filter'0 (fun (pr1:t_Option'0) -> [ &_78 <- pr1 ] s3) + | s3 = [ &_32 <- (_34, _78) ] s4 + | s4 = [ &left_val1 <- let (r'0, _) = _32 in r'0 ] s5 + | s5 = [ &right_val1 <- let (_, r'1) = _32 in r'1 ] s6 + | s6 = eq'0 {left_val1} {right_val1} (fun (_ret':bool) -> [ &_43 <- _ret' ] s7) + | s7 = bb8 ] + + | bb8 = any [ br0 -> {_43 = false} (! bb10) | br1 -> {_43} (! bb9) ] + | bb9 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_Filter'0)) -> [ &_60 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _60.current} + Borrow.borrow_final {_60.current} {Borrow.get_id _60} + (fun (_ret':borrowed (t_Filter'0)) -> + [ &_59 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_60 <- { _60 with current = _ret'.final } ] + s2) + | s2 = next'0 {_59} (fun (_ret':t_Option'0) -> [ &_58 <- _ret' ] s3) + | s3 = bb11 ] + + | bb11 = s0 + [ s0 = {[@expl:type invariant] inv'1 _60} s1 + | s1 = -{resolve'0 _60}- s2 + | s2 = {[@expl:type invariant] inv'0 a} s3 + | s3 = promoted0__test_filter'0 (fun (pr0:t_Option'0) -> [ &_77 <- pr0 ] s4) + | s4 = [ &_56 <- (_58, _77) ] s5 + | s5 = [ &left_val2 <- let (r'0, _) = _56 in r'0 ] s6 + | s6 = [ &right_val2 <- let (_, r'1) = _56 in r'1 ] s7 + | s7 = eq'0 {left_val2} {right_val2} (fun (_ret':bool) -> [ &_65 <- _ret' ] s8) + | s8 = bb12 ] + + | bb12 = any [ br0 -> {_65 = false} (! bb14) | br1 -> {_65} (! bb13) ] + | bb13 = return' {_0} + | bb14 = s0 + [ s0 = [ &kind2 <- C_Eq'0 ] s1 + | s1 = [ &_73 <- left_val2 ] s2 + | s2 = [ &_75 <- right_val2 ] s3 + | s3 = {false} any ] + + | bb10 = s0 + [ s0 = {[@expl:type invariant] inv'0 a} s1 + | s1 = [ &kind1 <- C_Eq'0 ] s2 + | s2 = [ &_51 <- left_val1 ] s3 + | s3 = [ &_53 <- right_val1 ] s4 + | s4 = {false} any ] + + | bb6 = s0 + [ s0 = {[@expl:type invariant] inv'0 a} s1 + | s1 = [ &kind <- C_Eq'0 ] s2 + | s2 = [ &_27 <- left_val ] s3 + | s3 = [ &_29 <- right_val ] s4 + | s4 = {false} any ] + ] + ) + [ & _0 : () = any_l () + | & a : t_Filter'0 = any_l () + | & _2 : t_Iter'0 = any_l () + | & _6 : () = any_l () + | & _8 : (t_Option'0, t_Option'0) = any_l () + | & _10 : t_Option'0 = any_l () + | & _11 : borrowed (t_Filter'0) = any_l () + | & _12 : borrowed (t_Filter'0) = any_l () + | & left_val : t_Option'0 = any_l () + | & right_val : t_Option'0 = any_l () + | & _19 : bool = any_l () + | & kind : t_AssertKind'0 = any_l () + | & _27 : t_Option'0 = any_l () + | & _29 : t_Option'0 = any_l () + | & _32 : (t_Option'0, t_Option'0) = any_l () + | & _34 : t_Option'0 = any_l () + | & _35 : borrowed (t_Filter'0) = any_l () + | & _36 : borrowed (t_Filter'0) = any_l () + | & left_val1 : t_Option'0 = any_l () + | & right_val1 : t_Option'0 = any_l () + | & _43 : bool = any_l () + | & kind1 : t_AssertKind'0 = any_l () + | & _51 : t_Option'0 = any_l () + | & _53 : t_Option'0 = any_l () + | & _56 : (t_Option'0, t_Option'0) = any_l () + | & _58 : t_Option'0 = any_l () + | & _59 : borrowed (t_Filter'0) = any_l () + | & _60 : borrowed (t_Filter'0) = any_l () + | & left_val2 : t_Option'0 = any_l () + | & right_val2 : t_Option'0 = any_l () + | & _65 : bool = any_l () + | & kind2 : t_AssertKind'0 = any_l () + | & _73 : t_Option'0 = any_l () + | & _75 : t_Option'0 = any_l () + | & _77 : t_Option'0 = any_l () + | & _78 : t_Option'0 = any_l () + | & _79 : t_Option'0 = any_l () + | & _80 : array bool = any_l () ] + [ return' (result:())-> (! return' {result}) ] +end +module M_iter__test_filter_map [#"iter.rs" 21 0 21 24] + let%span siter0 = "iter.rs" 22 17 22 21 + let%span siter1 = "iter.rs" 22 23 22 28 + let%span siter2 = "iter.rs" 22 30 22 34 + let%span sslice3 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 + let%span siter4 = "iter.rs" 24 32 24 37 + let%span siter5 = "iter.rs" 23 18 23 63 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 183 27 183 51 + let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 184 27 184 57 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 185 27 185 49 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 + let%span siter11 = "iter.rs" 26 37 26 42 + let%span soption12 = "../../../../creusot-contracts/src/std/option.rs" 23 26 23 75 + let%span siter13 = "iter.rs" 27 37 27 42 + let%span sfilter_map14 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 56 16 56 52 + let%span sfilter_map15 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 48 16 48 50 + let%span sfilter_map16 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 63 16 63 135 + let%span sfilter_map17 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 15 14 15 39 + let%span sfilter_map18 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 22 14 22 39 + let%span sfilter_map19 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 75 12 77 47 + let%span sfilter_map20 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 85 12 98 148 + let%span sresolve21 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 + let%span smodel22 = "../../../../creusot-contracts/src/model.rs" 83 8 83 28 + let%span sops23 = "../../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 + let%span sops24 = "../../../../creusot-contracts/src/std/ops.rs" 110 14 110 36 + let%span sops25 = "../../../../creusot-contracts/src/std/ops.rs" 115 14 115 31 + let%span sops26 = "../../../../creusot-contracts/src/std/ops.rs" 120 15 120 29 + let%span sops27 = "../../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 + let%span sops28 = "../../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 + let%span sops29 = "../../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 + let%span sfilter_map30 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 104 14 104 45 + let%span sfilter_map31 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 109 15 109 32 + let%span sfilter_map32 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 110 15 110 32 + let%span sfilter_map33 = "../../../../creusot-contracts/src/std/iter/filter_map.rs" 111 14 111 42 + let%span sslice34 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 + let%span sslice35 = "../../../../creusot-contracts/src/std/slice.rs" 398 20 398 61 + let%span sinvariant36 = "../../../../creusot-contracts/src/invariant.rs" 34 20 34 44 + let%span soption37 = "../../../../creusot-contracts/src/std/option.rs" 11 8 14 9 + let%span sslice38 = "../../../../creusot-contracts/src/std/slice.rs" 411 14 411 45 + let%span sslice39 = "../../../../creusot-contracts/src/std/slice.rs" 409 4 409 10 + let%span sslice40 = "../../../../creusot-contracts/src/std/slice.rs" 416 15 416 32 + let%span sslice41 = "../../../../creusot-contracts/src/std/slice.rs" 417 15 417 32 + let%span sslice42 = "../../../../creusot-contracts/src/std/slice.rs" 418 14 418 42 + let%span sslice43 = "../../../../creusot-contracts/src/std/slice.rs" 414 4 414 10 + let%span sslice44 = "../../../../creusot-contracts/src/std/slice.rs" 96 14 96 41 + let%span sslice45 = "../../../../creusot-contracts/src/std/slice.rs" 97 14 97 80 + let%span smodel46 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 + let%span sslice47 = "../../../../creusot-contracts/src/std/slice.rs" 28 14 28 41 + let%span sslice48 = "../../../../creusot-contracts/src/std/slice.rs" 29 14 29 42 + let%span smodel49 = "../../../../creusot-contracts/src/model.rs" 120 8 120 12 + let%span smodel50 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 + let%span sindex51 = "../../../../creusot-contracts/src/logic/ops/index.rs" 49 8 49 31 + + use prelude.prelude.Slice + + use prelude.prelude.Borrow + + use prelude.prelude.Intrinsic + + let rec promoted3__test_filter_map'0 (return' (ret:array bool))= bb0 + [ bb0 = s0 + [ s0 = any + [ any_ (__arr_temp:array bool)-> (! -{Seq.get __arr_temp.elts 0 + /\ Seq.get __arr_temp.elts 1 = ([%#siter1] false) + /\ Seq.get __arr_temp.elts 2 /\ Seq.length __arr_temp.elts = 3}- + [ &_1 <- __arr_temp ] + s1) ] + + | s1 = [ &_0 <- _1 ] s2 + | s2 = return' {_0} ] + ] + [ & _0 : array bool = any_l () | & _1 : array bool = any_l () ] + [ return' (result:array bool)-> return' {result} ] + + + predicate inv'2 (_1 : slice bool) + + axiom inv_axiom'2 [@rewrite] : forall x : slice bool [inv'2 x] . inv'2 x = true + + use prelude.prelude.Opaque + + type t_NonNull'0 = + { t_NonNull__pointer'0: opaque_ptr } + + type t_Iter'0 = + { t_Iter__ptr'0: t_NonNull'0; t_Iter__end_or_len'0: opaque_ptr; t_Iter__qy95zmarker'0: () } + + function view'0 (self : t_Iter'0) : slice bool + + let rec iter'0 (self:slice bool) (return' (ret:t_Iter'0))= {[@expl:iter 'self' type invariant] inv'2 self} + any [ return' (result:t_Iter'0)-> {[%#sslice3] view'0 result = self} (! return' {result}) ] + + predicate resolve'3 (self : borrowed ()) = + [%#sresolve21] self.final = self.current + + predicate resolve'1 (_1 : borrowed ()) = + resolve'3 _1 + + type t_Option'0 = + | C_None'0 + | C_Some'0 bool + + predicate postcondition_once'0 (self : ()) (args : bool) (result : t_Option'0) = + [%#siter5] let (b) = args in result = (if b then C_Some'0 false else C_None'0) + + predicate resolve'4 (_1 : ()) = + true + + predicate unnest'0 (self : ()) (_2 : ()) = + true + + predicate postcondition_mut'0 (self : ()) (args : bool) (result_state : ()) (result : t_Option'0) = + (let (b) = args in result = (if b then C_Some'0 false else C_None'0)) /\ unnest'0 self result_state + + function fn_mut_once'0 (self : ()) (args : bool) (res : t_Option'0) : () + + axiom fn_mut_once'0_spec : forall self : (), args : bool, res : t_Option'0 . [%#sops29] postcondition_once'0 self args res + = (exists res_state : () . postcondition_mut'0 self args res_state res /\ resolve'4 res_state) + + function unnest_trans'0 (self : ()) (b : ()) (c : ()) : () + + axiom unnest_trans'0_spec : forall self : (), b : (), c : () . ([%#sops26] unnest'0 self b) + -> ([%#sops27] unnest'0 b c) -> ([%#sops28] unnest'0 self c) + + function unnest_refl'0 (self : ()) : () + + axiom unnest_refl'0_spec : forall self : () . [%#sops25] unnest'0 self self + + function postcondition_mut_unnest'0 (self : ()) (args : bool) (res_state : ()) (res : t_Option'0) : () + + axiom postcondition_mut_unnest'0_spec : forall self : (), args : bool, res_state : (), res : t_Option'0 . ([%#sops23] postcondition_mut'0 self args res_state res) + -> ([%#sops24] unnest'0 self res_state) + + let rec closure0'0 (_1:borrowed ()) (b:bool) (return' (ret:t_Option'0))= (! bb0 + [ bb0 = s0 [ s0 = -{resolve'1 _1}- s1 | s1 = any [ br0 -> {b = false} (! bb2) | br1 -> {b} (! bb1) ] ] + | bb1 = s0 [ s0 = [ &res <- C_Some'0 ([%#siter4] false) ] s1 | s1 = bb3 ] + | bb2 = s0 [ s0 = [ &res <- C_None'0 ] s1 | s1 = bb3 ] + | bb3 = s0 [ s0 = [ &_0 <- res ] s1 | s1 = return' {_0} ] ] + ) [ & _0 : t_Option'0 = any_l () | & _1 : borrowed () = _1 | & b : bool = b | & res : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> {[@expl:closure ensures] [%#siter5] result + = (if b then C_Some'0 false else C_None'0)} + {[@expl:closure unnest] unnest'0 _1.current _1.final} + (! return' {result}) ] + + + predicate inv'3 (_1 : t_Iter'0) + + axiom inv_axiom'3 [@rewrite] : forall x : t_Iter'0 [inv'3 x] . inv'3 x = true + + predicate inv'4 (_1 : ()) + + axiom inv_axiom'4 [@rewrite] : forall x : () [inv'4 x] . inv'4 x = true + + predicate immutable'0 (f : ()) = + [%#sfilter_map14] forall g : () . unnest'0 f g -> f = g + + predicate precondition'0 (self : ()) (args : bool) = + let (b) = args in true + + predicate no_precondition'0 (f : ()) = + [%#sfilter_map15] forall i : bool . precondition'0 f (i) + + predicate precise'0 (f1 : ()) = + [%#sfilter_map16] forall f2 : (), i : bool . not ((exists b : bool . postcondition_mut'0 f1 (i) f2 (C_Some'0 b)) + /\ postcondition_mut'0 f1 (i) f2 (C_None'0)) + + type t_FilterMap'0 = + { t_FilterMap__iter'0: t_Iter'0; t_FilterMap__f'0: () } + + predicate invariant'0 (self : t_FilterMap'0) + + predicate inv'0 (_1 : t_FilterMap'0) + + axiom inv_axiom'0 [@rewrite] : forall x : t_FilterMap'0 [inv'0 x] . inv'0 x + = (invariant'0 x + /\ match x with + | {t_FilterMap__iter'0 = iter ; t_FilterMap__f'0 = f} -> true + end) + + function iter'1 (self : t_FilterMap'0) : t_Iter'0 + + axiom iter'1_spec : forall self : t_FilterMap'0 . [%#sfilter_map17] inv'0 self -> inv'3 (iter'1 self) + + function func'0 (self : t_FilterMap'0) : () + + axiom func'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map18] inv'0 self -> inv'4 (func'0 self) + + let rec filter_map'0 (self:t_Iter'0) (f:()) (return' (ret:t_FilterMap'0))= {[@expl:filter_map 'self' type invariant] inv'3 self} + {[@expl:filter_map 'f' type invariant] inv'4 f} + {[@expl:filter_map requires #0] [%#siter6] immutable'0 f} + {[@expl:filter_map requires #1] [%#siter7] no_precondition'0 f} + {[@expl:filter_map requires #2] [%#siter8] precise'0 f} + any + [ return' (result:t_FilterMap'0)-> {inv'0 result} + {[%#siter9] iter'1 result = self /\ func'0 result = f} + (! return' {result}) ] + + + predicate invariant'1 (self : borrowed (t_FilterMap'0)) = + [%#sinvariant36] inv'0 self.current /\ inv'0 self.final + + predicate inv'1 (_1 : borrowed (t_FilterMap'0)) + + axiom inv_axiom'1 [@rewrite] : forall x : borrowed (t_FilterMap'0) [inv'1 x] . inv'1 x = invariant'1 x + + predicate inv'5 (_1 : t_Option'0) + + axiom inv_axiom'5 [@rewrite] : forall x : t_Option'0 [inv'5 x] . inv'5 x = true + + use seq.Seq + + use seq.Seq + + use prelude.prelude.Int + + use map.Map + + use seq.Seq + + use seq.Seq + + use seq.Seq + + use seq.Seq + + use prelude.prelude.UIntSize + + constant v_MAX'0 : usize = (18446744073709551615 : usize) + + use prelude.prelude.UIntSize + + use prelude.prelude.Slice + + function view'2 (self : slice bool) : Seq.seq bool + + axiom view'2_spec : forall self : slice bool . ([%#sslice47] Seq.length (view'2 self) + <= UIntSize.to_int (v_MAX'0 : usize)) + && ([%#sslice48] view'2 self = Slice.id self) + + function view'3 (self : slice bool) : Seq.seq bool = + [%#smodel50] view'2 self + + use seq.Seq + + use seq.Seq + + function index_logic'0 [@inline:trivial] (self : slice bool) (ix : int) : bool = + [%#sindex51] Seq.get (view'2 self) ix + + function to_ref_seq'0 (self : slice bool) : Seq.seq bool + + axiom to_ref_seq'0_spec : forall self : slice bool . ([%#sslice44] Seq.length (to_ref_seq'0 self) + = Seq.length (view'3 self)) + && ([%#sslice45] forall i : int . 0 <= i /\ i < Seq.length (to_ref_seq'0 self) + -> Seq.get (to_ref_seq'0 self) i = index_logic'0 self i) + + predicate produces'1 (self : t_Iter'0) (visited : Seq.seq bool) (tl : t_Iter'0) = + [%#sslice34] to_ref_seq'0 (view'0 self) = Seq.(++) visited (to_ref_seq'0 (view'0 tl)) + + function produces_trans'1 (a : t_Iter'0) (ab : Seq.seq bool) (b : t_Iter'0) (bc : Seq.seq bool) (c : t_Iter'0) : () = + [%#sslice43] () + + axiom produces_trans'1_spec : forall a : t_Iter'0, ab : Seq.seq bool, b : t_Iter'0, bc : Seq.seq bool, c : t_Iter'0 . ([%#sslice40] produces'1 a ab b) + -> ([%#sslice41] produces'1 b bc c) -> ([%#sslice42] produces'1 a (Seq.(++) ab bc) c) + + function produces_refl'1 (self : t_Iter'0) : () = + [%#sslice39] () + + axiom produces_refl'1_spec : forall self : t_Iter'0 . [%#sslice38] produces'1 self (Seq.empty : Seq.seq bool) self + + use map.Map + + use seq.Seq + + use seq.Seq + + predicate produces'0 (self : t_FilterMap'0) (visited : Seq.seq bool) (succ : t_FilterMap'0) = + [%#sfilter_map20] invariant'0 self + -> unnest'0 (func'0 self) (func'0 succ) + /\ (exists s : Seq.seq bool, f : Map.map int int . produces'1 (iter'1 self) s (iter'1 succ) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited + -> postcondition_mut'0 (func'0 self) (Seq.get s (Map.get f i)) (func'0 self) (C_Some'0 (Seq.get visited i))) + /\ (forall j : int . 0 <= j /\ j < Seq.length s + -> (not (exists i : int . 0 <= i /\ i < Seq.length visited /\ Map.get f i = j)) + = postcondition_mut'0 (func'0 self) (Seq.get s j) (func'0 self) (C_None'0))) + + function produces_trans'0 (a : t_FilterMap'0) (ab : Seq.seq bool) (b : t_FilterMap'0) (bc : Seq.seq bool) (c : t_FilterMap'0) : () + + + axiom produces_trans'0_spec : forall a : t_FilterMap'0, ab : Seq.seq bool, b : t_FilterMap'0, bc : Seq.seq bool, c : t_FilterMap'0 . ([%#sfilter_map31] produces'0 a ab b) + -> ([%#sfilter_map32] produces'0 b bc c) -> ([%#sfilter_map33] produces'0 a (Seq.(++) ab bc) c) + + function produces_refl'0 (self : t_FilterMap'0) : () + + axiom produces_refl'0_spec : forall self : t_FilterMap'0 . [%#sfilter_map30] produces'0 self (Seq.empty : Seq.seq bool) self + + predicate resolve'5 (self : borrowed (t_Iter'0)) = + [%#sresolve21] self.final = self.current + + function view'1 (self : borrowed (t_Iter'0)) : slice bool = + [%#smodel46] view'0 self.current + + predicate completed'1 (self : borrowed (t_Iter'0)) = + [%#sslice35] resolve'5 self /\ view'2 (view'1 self) = (Seq.empty : Seq.seq bool) + + predicate completed'0 (self : borrowed (t_FilterMap'0)) = + [%#sfilter_map19] (exists s : Seq.seq bool, e : borrowed (t_Iter'0) . produces'1 (iter'1 self.current) s e.current + /\ completed'1 e + /\ (forall i : int . 0 <= i /\ i < Seq.length s + -> postcondition_mut'0 (func'0 self.current) (Seq.get s i) (func'0 self.final) (C_None'0))) + /\ func'0 self.current = func'0 self.final + + use seq.Seq + + let rec next'0 (self:borrowed (t_FilterMap'0)) (return' (ret:t_Option'0))= {[@expl:next 'self' type invariant] inv'1 self} + any + [ return' (result:t_Option'0)-> {inv'5 result} + {[%#siter10] match result with + | C_None'0 -> completed'0 self + | C_Some'0 v -> produces'0 self.current (Seq.singleton v) self.final + end} + (! return' {result}) ] + + + predicate resolve'2 (self : borrowed (t_FilterMap'0)) = + [%#sresolve21] self.final = self.current + + predicate resolve'0 (_1 : borrowed (t_FilterMap'0)) = + resolve'2 _1 + + let rec promoted2__test_filter_map'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_Some'0 ([%#siter11] false) ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + predicate inv'6 (_1 : t_Option'0) + + axiom inv_axiom'6 [@rewrite] : forall x : t_Option'0 [inv'6 x] . inv'6 x = true + + function deep_model'2 (self : bool) : bool = + [%#smodel49] self + + function deep_model'1 (self : t_Option'0) : t_Option'0 = + [%#soption37] match self with + | C_Some'0 t -> C_Some'0 (deep_model'2 t) + | C_None'0 -> C_None'0 + end + + function deep_model'0 (self : t_Option'0) : t_Option'0 = + [%#smodel22] deep_model'1 self + + let rec eq'0 (self:t_Option'0) (other:t_Option'0) (return' (ret:bool))= {[@expl:eq 'self' type invariant] inv'6 self} + {[@expl:eq 'other' type invariant] inv'6 other} + any + [ return' (result:bool)-> {[%#soption12] result = (deep_model'0 self = deep_model'0 other)} (! return' {result}) ] + + + let rec promoted1__test_filter_map'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_Some'0 ([%#siter13] false) ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + let rec promoted0__test_filter_map'0 (return' (ret:t_Option'0))= bb0 + [ bb0 = s0 [ s0 = [ &_1 <- C_None'0 ] s1 | s1 = [ &_0 <- _1 ] s2 | s2 = return' {_0} ] ] + [ & _0 : t_Option'0 = any_l () | & _1 : t_Option'0 = any_l () ] + [ return' (result:t_Option'0)-> return' {result} ] + + + type t_AssertKind'0 = + | C_Eq'0 + | C_Ne'0 + | C_Match'0 + + meta "compute_max_steps" 1000000 + + let rec test_filter_map'0 (_1:()) (return' (ret:()))= (! bb0 + [ bb0 = s0 + [ s0 = promoted3__test_filter_map'0 (fun (pr3:array bool) -> [ &_76 <- pr3 ] s1) + | s1 = iter'0 {_76} (fun (_ret':t_Iter'0) -> [ &_2 <- _ret' ] s2) + | s2 = bb1 ] + + | bb1 = s0 + [ s0 = [ &_6 <- () ] s1 + | s1 = filter_map'0 {_2} {_6} (fun (_ret':t_FilterMap'0) -> [ &a <- _ret' ] s2) + | s2 = bb2 ] + + | bb2 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_FilterMap'0)) -> [ &_12 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _12.current} + Borrow.borrow_final {_12.current} {Borrow.get_id _12} + (fun (_ret':borrowed (t_FilterMap'0)) -> + [ &_11 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_12 <- { _12 with current = _ret'.final } ] + s2) + | s2 = next'0 {_11} (fun (_ret':t_Option'0) -> [ &_10 <- _ret' ] s3) + | s3 = bb3 ] + + | bb3 = s0 + [ s0 = {[@expl:type invariant] inv'1 _12} s1 + | s1 = -{resolve'0 _12}- s2 + | s2 = promoted2__test_filter_map'0 (fun (pr2:t_Option'0) -> [ &_75 <- pr2 ] s3) + | s3 = [ &_8 <- (_10, _75) ] s4 + | s4 = [ &left_val <- let (r'0, _) = _8 in r'0 ] s5 + | s5 = [ &right_val <- let (_, r'1) = _8 in r'1 ] s6 + | s6 = eq'0 {left_val} {right_val} (fun (_ret':bool) -> [ &_17 <- _ret' ] s7) + | s7 = bb4 ] + + | bb4 = any [ br0 -> {_17 = false} (! bb6) | br1 -> {_17} (! bb5) ] + | bb5 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_FilterMap'0)) -> [ &_34 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _34.current} + Borrow.borrow_final {_34.current} {Borrow.get_id _34} + (fun (_ret':borrowed (t_FilterMap'0)) -> + [ &_33 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_34 <- { _34 with current = _ret'.final } ] + s2) + | s2 = next'0 {_33} (fun (_ret':t_Option'0) -> [ &_32 <- _ret' ] s3) + | s3 = bb7 ] + + | bb7 = s0 + [ s0 = {[@expl:type invariant] inv'1 _34} s1 + | s1 = -{resolve'0 _34}- s2 + | s2 = promoted1__test_filter_map'0 (fun (pr1:t_Option'0) -> [ &_74 <- pr1 ] s3) + | s3 = [ &_30 <- (_32, _74) ] s4 + | s4 = [ &left_val1 <- let (r'0, _) = _30 in r'0 ] s5 + | s5 = [ &right_val1 <- let (_, r'1) = _30 in r'1 ] s6 + | s6 = eq'0 {left_val1} {right_val1} (fun (_ret':bool) -> [ &_39 <- _ret' ] s7) + | s7 = bb8 ] + + | bb8 = any [ br0 -> {_39 = false} (! bb10) | br1 -> {_39} (! bb9) ] + | bb9 = s0 + [ s0 = {inv'0 a} + Borrow.borrow_mut {a} + (fun (_ret':borrowed (t_FilterMap'0)) -> [ &_56 <- _ret' ] -{inv'0 _ret'.final}- [ &a <- _ret'.final ] s1) + | s1 = {inv'0 _56.current} + Borrow.borrow_final {_56.current} {Borrow.get_id _56} + (fun (_ret':borrowed (t_FilterMap'0)) -> + [ &_55 <- _ret' ] + -{inv'0 _ret'.final}- + [ &_56 <- { _56 with current = _ret'.final } ] + s2) + | s2 = next'0 {_55} (fun (_ret':t_Option'0) -> [ &_54 <- _ret' ] s3) + | s3 = bb11 ] + + | bb11 = s0 + [ s0 = {[@expl:type invariant] inv'1 _56} s1 + | s1 = -{resolve'0 _56}- s2 + | s2 = {[@expl:type invariant] inv'0 a} s3 + | s3 = promoted0__test_filter_map'0 (fun (pr0:t_Option'0) -> [ &_73 <- pr0 ] s4) + | s4 = [ &_52 <- (_54, _73) ] s5 + | s5 = [ &left_val2 <- let (r'0, _) = _52 in r'0 ] s6 + | s6 = [ &right_val2 <- let (_, r'1) = _52 in r'1 ] s7 + | s7 = eq'0 {left_val2} {right_val2} (fun (_ret':bool) -> [ &_61 <- _ret' ] s8) + | s8 = bb12 ] + + | bb12 = any [ br0 -> {_61 = false} (! bb14) | br1 -> {_61} (! bb13) ] + | bb13 = return' {_0} + | bb14 = s0 + [ s0 = [ &kind2 <- C_Eq'0 ] s1 + | s1 = [ &_69 <- left_val2 ] s2 + | s2 = [ &_71 <- right_val2 ] s3 + | s3 = {false} any ] + + | bb10 = s0 + [ s0 = {[@expl:type invariant] inv'0 a} s1 + | s1 = [ &kind1 <- C_Eq'0 ] s2 + | s2 = [ &_47 <- left_val1 ] s3 + | s3 = [ &_49 <- right_val1 ] s4 + | s4 = {false} any ] + + | bb6 = s0 + [ s0 = {[@expl:type invariant] inv'0 a} s1 + | s1 = [ &kind <- C_Eq'0 ] s2 + | s2 = [ &_25 <- left_val ] s3 + | s3 = [ &_27 <- right_val ] s4 + | s4 = {false} any ] + ] + ) + [ & _0 : () = any_l () + | & a : t_FilterMap'0 = any_l () + | & _2 : t_Iter'0 = any_l () + | & _6 : () = any_l () + | & _8 : (t_Option'0, t_Option'0) = any_l () + | & _10 : t_Option'0 = any_l () + | & _11 : borrowed (t_FilterMap'0) = any_l () + | & _12 : borrowed (t_FilterMap'0) = any_l () + | & left_val : t_Option'0 = any_l () + | & right_val : t_Option'0 = any_l () + | & _17 : bool = any_l () + | & kind : t_AssertKind'0 = any_l () + | & _25 : t_Option'0 = any_l () + | & _27 : t_Option'0 = any_l () + | & _30 : (t_Option'0, t_Option'0) = any_l () + | & _32 : t_Option'0 = any_l () + | & _33 : borrowed (t_FilterMap'0) = any_l () + | & _34 : borrowed (t_FilterMap'0) = any_l () + | & left_val1 : t_Option'0 = any_l () + | & right_val1 : t_Option'0 = any_l () + | & _39 : bool = any_l () + | & kind1 : t_AssertKind'0 = any_l () + | & _47 : t_Option'0 = any_l () + | & _49 : t_Option'0 = any_l () + | & _52 : (t_Option'0, t_Option'0) = any_l () + | & _54 : t_Option'0 = any_l () + | & _55 : borrowed (t_FilterMap'0) = any_l () + | & _56 : borrowed (t_FilterMap'0) = any_l () + | & left_val2 : t_Option'0 = any_l () + | & right_val2 : t_Option'0 = any_l () + | & _61 : bool = any_l () + | & kind2 : t_AssertKind'0 = any_l () + | & _69 : t_Option'0 = any_l () + | & _71 : t_Option'0 = any_l () + | & _73 : t_Option'0 = any_l () + | & _74 : t_Option'0 = any_l () + | & _75 : t_Option'0 = any_l () + | & _76 : array bool = any_l () ] + [ return' (result:())-> (! return' {result}) ] +end diff --git a/creusot/tests/should_succeed/cc/iter.rs b/creusot/tests/should_succeed/cc/iter.rs index a74861d6f2..c1c5218741 100644 --- a/creusot/tests/should_succeed/cc/iter.rs +++ b/creusot/tests/should_succeed/cc/iter.rs @@ -1,4 +1,5 @@ extern crate creusot_contracts; +use creusot_contracts::*; pub fn test_mut_ref() { let mut a = [1, 2].iter(); @@ -6,3 +7,23 @@ pub fn test_mut_ref() { assert_eq!((&mut a).next(), Some(&2)); assert_eq!((&mut a).next(), None); } + +pub fn test_filter() { + let mut a = [true, false, true].iter().filter( + #[ensures(result == **b)] + |b: &&bool| **b, + ); + assert_eq!((&mut a).next(), Some(&true)); + assert_eq!((&mut a).next(), Some(&true)); + assert_eq!((&mut a).next(), None); +} + +pub fn test_filter_map() { + let mut a = [true, false, true].iter().filter_map( + #[ensures(result == if *b { Some(false) } else { None })] + |b: &bool| if *b { Some(false) } else { None }, + ); + assert_eq!((&mut a).next(), Some(false)); + assert_eq!((&mut a).next(), Some(false)); + assert_eq!((&mut a).next(), None); +} diff --git a/creusot/tests/should_succeed/cc/iter/why3session.xml b/creusot/tests/should_succeed/cc/iter/why3session.xml index 64f15028f0..8cf5e5320d 100644 --- a/creusot/tests/should_succeed/cc/iter/why3session.xml +++ b/creusot/tests/should_succeed/cc/iter/why3session.xml @@ -3,6 +3,9 @@ "https://www.why3.org/why3session.dtd"> + + + @@ -10,5 +13,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/creusot/tests/should_succeed/cc/iter/why3shapes.gz b/creusot/tests/should_succeed/cc/iter/why3shapes.gz index 4834e6dcaadb93d25cd48f95b5918685fb52050b..3ad65f9392c0cad86e588a1bcdd1e64f460cc0a8 100644 GIT binary patch literal 3844 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 GMgRbY%#P;( literal 517 zcmV+g0{Z)idZ{L zFtUL-?Z5BxWlSNttzPZE(mt$scwCgP`i$k`iba{){QJUNJbrVki%#?Fk|`$ppx3zK zvJV`+(bp6|mY_hViGr!Kr8wOrsKF7ZP4Lb+s` z;Ga0N$JDe+q@PLd?8fQ!L53+;ZuMq9V{{Fn1f6>>Z1Qffr0tb{dQzSW)H=GC{fV-o zEPq_fna0z(`b&ZAses}gmO66wbgKmM9G`508P$M4TI*fBw>d7^<*;q5Zc4YNibxk& z+U!cAez8SiKQLLI-V}HWTm`FWr;Rmp)s*8jnQYXxx8p{Qt#z5^M>4dz zf}pn8#Xs$d(o}Pw_OpX8rHu4OfzZE-ciisVSn90AXwo_S-+Ak3;4)aqfkMA~;{cy> z;7vR1D-P5vpXK1TweuX@dk*W`;*JB{I6%jN2LlI+=Q;4n1azJ9%V06(zJz}p$H-5A#?r#?cI-i H;RFBxb=3~Z diff --git a/creusot/tests/should_succeed/ghost/ghost_set.coma b/creusot/tests/should_succeed/ghost/ghost_set.coma index 715ebc53ba..cc7b9fca1c 100644 --- a/creusot/tests/should_succeed/ghost/ghost_set.coma +++ b/creusot/tests/should_succeed/ghost/ghost_set.coma @@ -1,7 +1,7 @@ module M_ghost_set__ghost_map [#"ghost_set.rs" 4 0 4 18] let%span sghost_set0 = "ghost_set.rs" 5 18 5 36 - let%span sfset1 = "../../../../creusot-contracts/src/logic/fset.rs" 196 4 196 34 - let%span sfset2 = "../../../../creusot-contracts/src/logic/fset.rs" 194 14 194 31 + let%span sfset1 = "../../../../creusot-contracts/src/logic/fset.rs" 316 4 316 34 + let%span sfset2 = "../../../../creusot-contracts/src/logic/fset.rs" 314 14 314 31 let%span sghost_set3 = "ghost_set.rs" 7 22 7 53 let%span sghost_set4 = "ghost_set.rs" 8 25 8 26 let%span sghost_set5 = "ghost_set.rs" 10 22 10 63 @@ -25,22 +25,22 @@ module M_ghost_set__ghost_map [#"ghost_set.rs" 4 0 4 18] let%span sghost23 = "../../../../creusot-contracts/src/ghost.rs" 85 22 85 26 let%span sghost24 = "../../../../creusot-contracts/src/ghost.rs" 85 4 85 48 let%span sghost25 = "../../../../creusot-contracts/src/ghost.rs" 84 14 84 36 - let%span sfset26 = "../../../../creusot-contracts/src/logic/fset.rs" 277 29 277 33 - let%span sfset27 = "../../../../creusot-contracts/src/logic/fset.rs" 277 35 277 40 - let%span sfset28 = "../../../../creusot-contracts/src/logic/fset.rs" 275 14 275 44 - let%span sfset29 = "../../../../creusot-contracts/src/logic/fset.rs" 276 14 276 48 + let%span sfset26 = "../../../../creusot-contracts/src/logic/fset.rs" 397 29 397 33 + let%span sfset27 = "../../../../creusot-contracts/src/logic/fset.rs" 397 35 397 40 + let%span sfset28 = "../../../../creusot-contracts/src/logic/fset.rs" 395 14 395 44 + let%span sfset29 = "../../../../creusot-contracts/src/logic/fset.rs" 396 14 396 48 let%span sghost30 = "../../../../creusot-contracts/src/ghost.rs" 69 14 69 18 let%span sghost31 = "../../../../creusot-contracts/src/ghost.rs" 69 4 69 36 let%span sghost32 = "../../../../creusot-contracts/src/ghost.rs" 68 14 68 35 - let%span sfset33 = "../../../../creusot-contracts/src/logic/fset.rs" 222 22 222 26 - let%span sfset34 = "../../../../creusot-contracts/src/logic/fset.rs" 221 14 221 34 - let%span sfset35 = "../../../../creusot-contracts/src/logic/fset.rs" 313 29 313 33 - let%span sfset36 = "../../../../creusot-contracts/src/logic/fset.rs" 313 35 313 40 - let%span sfset37 = "../../../../creusot-contracts/src/logic/fset.rs" 311 14 311 45 - let%span sfset38 = "../../../../creusot-contracts/src/logic/fset.rs" 312 14 312 48 - let%span sfset39 = "../../../../creusot-contracts/src/logic/fset.rs" 243 27 243 31 - let%span sfset40 = "../../../../creusot-contracts/src/logic/fset.rs" 243 33 243 38 - let%span sfset41 = "../../../../creusot-contracts/src/logic/fset.rs" 242 14 242 45 + let%span sfset33 = "../../../../creusot-contracts/src/logic/fset.rs" 342 22 342 26 + let%span sfset34 = "../../../../creusot-contracts/src/logic/fset.rs" 341 14 341 34 + let%span sfset35 = "../../../../creusot-contracts/src/logic/fset.rs" 433 29 433 33 + let%span sfset36 = "../../../../creusot-contracts/src/logic/fset.rs" 433 35 433 40 + let%span sfset37 = "../../../../creusot-contracts/src/logic/fset.rs" 431 14 431 45 + let%span sfset38 = "../../../../creusot-contracts/src/logic/fset.rs" 432 14 432 48 + let%span sfset39 = "../../../../creusot-contracts/src/logic/fset.rs" 363 27 363 31 + let%span sfset40 = "../../../../creusot-contracts/src/logic/fset.rs" 363 33 363 38 + let%span sfset41 = "../../../../creusot-contracts/src/logic/fset.rs" 362 14 362 45 let%span sghost42 = "../../../../creusot-contracts/src/ghost.rs" 181 15 181 16 let%span sghost43 = "../../../../creusot-contracts/src/ghost.rs" 181 4 181 28 let%span sghost44 = "../../../../creusot-contracts/src/ghost.rs" 179 14 179 28 diff --git a/creusot/tests/should_succeed/hillel.coma b/creusot/tests/should_succeed/hillel.coma index 92d67b95cc..8504d79b48 100644 --- a/creusot/tests/should_succeed/hillel.coma +++ b/creusot/tests/should_succeed/hillel.coma @@ -504,11 +504,11 @@ module M_hillel__insert_unique [#"hillel.rs" 80 0 80 62] let%span shillel22 = "hillel.rs" 67 8 67 72 let%span svec23 = "../../../creusot-contracts/src/std/vec.rs" 169 26 169 42 let%span sslice24 = "../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter25 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter25 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sindex26 = "../../../creusot-contracts/src/logic/ops/index.rs" 93 8 93 33 let%span smodel27 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span sslice28 = "../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 - let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sindex30 = "../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span scmp31 = "../../../creusot-contracts/src/std/cmp.rs" 11 26 11 75 let%span shillel32 = "hillel.rs" 60 8 60 64 @@ -517,8 +517,8 @@ module M_hillel__insert_unique [#"hillel.rs" 80 0 80 62] let%span svec35 = "../../../creusot-contracts/src/std/vec.rs" 29 14 29 47 let%span svec36 = "../../../creusot-contracts/src/std/vec.rs" 30 14 31 51 let%span smodel37 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter38 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter39 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter38 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter39 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span sslice40 = "../../../creusot-contracts/src/std/slice.rs" 411 14 411 45 let%span sslice41 = "../../../creusot-contracts/src/std/slice.rs" 409 4 409 10 let%span sslice42 = "../../../creusot-contracts/src/std/slice.rs" 416 15 416 32 @@ -1018,14 +1018,14 @@ module M_hillel__unique [#"hillel.rs" 102 0 102 56] let%span shillel19 = "hillel.rs" 101 10 101 58 let%span svec20 = "../../../creusot-contracts/src/std/vec.rs" 74 26 74 44 let%span sslice21 = "../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter22 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter22 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel23 = "../../../creusot-contracts/src/model.rs" 83 8 83 28 let%span svec24 = "../../../creusot-contracts/src/std/vec.rs" 29 14 29 47 let%span svec25 = "../../../creusot-contracts/src/std/vec.rs" 30 14 31 51 let%span shillel26 = "hillel.rs" 67 8 67 72 let%span shillel27 = "hillel.rs" 53 8 53 105 let%span srange28 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span shillel30 = "hillel.rs" 80 36 80 39 let%span shillel31 = "hillel.rs" 80 54 80 58 let%span shillel32 = "hillel.rs" 75 11 75 38 @@ -1035,8 +1035,8 @@ module M_hillel__unique [#"hillel.rs" 102 0 102 56] let%span shillel36 = "hillel.rs" 79 10 79 58 let%span smodel37 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span svec38 = "../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 - let%span siter39 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter40 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter39 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter40 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span sslice41 = "../../../creusot-contracts/src/std/slice.rs" 40 14 40 44 let%span sslice42 = "../../../creusot-contracts/src/std/slice.rs" 41 14 41 96 let%span sindex43 = "../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 @@ -1670,14 +1670,14 @@ module M_hillel__fulcrum [#"hillel.rs" 159 0 159 30] let%span shillel22 = "hillel.rs" 156 11 156 23 let%span shillel23 = "hillel.rs" 157 10 157 44 let%span shillel24 = "hillel.rs" 158 10 158 86 - let%span siter25 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter25 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel26 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span shillel27 = "hillel.rs" 123 11 123 53 let%span shillel28 = "hillel.rs" 124 10 124 21 let%span shillel29 = "hillel.rs" 122 10 122 19 let%span shillel30 = "hillel.rs" 121 0 121 8 let%span sslice31 = "../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 - let%span siter32 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter32 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sslice33 = "../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 let%span shillel34 = "hillel.rs" 144 11 144 35 let%span shillel35 = "hillel.rs" 145 10 145 64 @@ -1699,8 +1699,8 @@ module M_hillel__fulcrum [#"hillel.rs" 159 0 159 30] let%span sslice51 = "../../../creusot-contracts/src/std/slice.rs" 97 14 97 80 let%span sslice52 = "../../../creusot-contracts/src/std/slice.rs" 398 20 398 61 let%span sresolve53 = "../../../creusot-contracts/src/resolve.rs" 54 20 54 34 - let%span siter54 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter55 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter54 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter55 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span shillel56 = "hillel.rs" 135 11 135 63 let%span shillel57 = "hillel.rs" 136 10 136 85 let%span shillel58 = "hillel.rs" 134 10 134 18 diff --git a/creusot/tests/should_succeed/insertion_sort.coma b/creusot/tests/should_succeed/insertion_sort.coma index 76c9889d86..26e29f5177 100644 --- a/creusot/tests/should_succeed/insertion_sort.coma +++ b/creusot/tests/should_succeed/insertion_sort.coma @@ -23,13 +23,13 @@ module M_insertion_sort__insertion_sort [#"insertion_sort.rs" 21 0 21 40] let%span sinsertion_sort21 = "insertion_sort.rs" 19 10 19 42 let%span sinsertion_sort22 = "insertion_sort.rs" 20 10 20 27 let%span sslice23 = "../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter24 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter24 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span ssnapshot25 = "../../../creusot-contracts/src/snapshot.rs" 52 20 52 39 let%span smodel26 = "../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span sseq27 = "../../../creusot-contracts/src/logic/seq.rs" 316 8 316 41 let%span sinsertion_sort28 = "insertion_sort.rs" 8 8 8 72 let%span srange29 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter30 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter30 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sindex31 = "../../../creusot-contracts/src/logic/ops/index.rs" 60 8 60 32 let%span sindex32 = "../../../creusot-contracts/src/logic/ops/index.rs" 49 8 49 31 let%span sslice33 = "../../../creusot-contracts/src/std/slice.rs" 257 19 257 35 @@ -39,8 +39,8 @@ module M_insertion_sort__insertion_sort [#"insertion_sort.rs" 21 0 21 40] let%span sslice37 = "../../../creusot-contracts/src/std/slice.rs" 29 14 29 42 let%span sinsertion_sort38 = "insertion_sort.rs" 15 8 15 35 let%span smodel39 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter40 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter41 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter40 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter41 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange42 = "../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange43 = "../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange44 = "../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/iterators/03_std_iterators.coma b/creusot/tests/should_succeed/iterators/03_std_iterators.coma index 1f3a9b3f17..6e1fc8be1e 100644 --- a/creusot/tests/should_succeed/iterators/03_std_iterators.coma +++ b/creusot/tests/should_succeed/iterators/03_std_iterators.coma @@ -10,12 +10,12 @@ module M_03_std_iterators__slice_iter [#"03_std_iterators.rs" 6 0 6 42] let%span s03_std_iterators8 = "03_std_iterators.rs" 4 11 4 30 let%span s03_std_iterators9 = "03_std_iterators.rs" 5 10 5 33 let%span sslice10 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sslice12 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span smodel14 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span sslice17 = "../../../../creusot-contracts/src/std/slice.rs" 411 14 411 45 let%span sslice18 = "../../../../creusot-contracts/src/std/slice.rs" 409 4 409 10 let%span sslice19 = "../../../../creusot-contracts/src/std/slice.rs" 416 15 416 32 @@ -322,9 +322,9 @@ module M_03_std_iterators__vec_iter [#"03_std_iterators.rs" 17 0 17 41] let%span s03_std_iterators7 = "03_std_iterators.rs" 17 19 17 22 let%span s03_std_iterators8 = "03_std_iterators.rs" 15 11 15 28 let%span s03_std_iterators9 = "03_std_iterators.rs" 16 10 16 31 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sslice11 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span smodel13 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span svec14 = "../../../../creusot-contracts/src/std/vec.rs" 205 20 205 24 let%span svec15 = "../../../../creusot-contracts/src/std/vec.rs" 211 20 211 34 @@ -650,18 +650,18 @@ module M_03_std_iterators__all_zero [#"03_std_iterators.rs" 28 0 28 35] let%span svec8 = "../../../../creusot-contracts/src/std/vec.rs" 175 26 175 42 let%span svec9 = "../../../../creusot-contracts/src/std/vec.rs" 176 26 176 48 let%span sslice10 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sindex12 = "../../../../creusot-contracts/src/logic/ops/index.rs" 93 8 93 33 let%span sslice13 = "../../../../creusot-contracts/src/std/slice.rs" 459 12 459 66 - let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec15 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span smodel16 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span sindex17 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span sslice18 = "../../../../creusot-contracts/src/std/slice.rs" 28 14 28 41 let%span sslice19 = "../../../../creusot-contracts/src/std/slice.rs" 29 14 29 42 let%span sslice20 = "../../../../creusot-contracts/src/std/slice.rs" 427 14 427 50 - let%span siter21 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter22 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter21 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter22 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span sresolve23 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span sslice24 = "../../../../creusot-contracts/src/std/slice.rs" 465 14 465 45 let%span sslice25 = "../../../../creusot-contracts/src/std/slice.rs" 463 4 463 10 @@ -992,8 +992,8 @@ end module M_03_std_iterators__skip_take [#"03_std_iterators.rs" 35 0 35 48] let%span s03_std_iterators0 = "03_std_iterators.rs" 38 20 38 31 let%span s03_std_iterators1 = "03_std_iterators.rs" 35 30 35 34 - let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span stake4 = "../../../../creusot-contracts/src/std/iter/take.rs" 17 14 17 39 let%span stake5 = "../../../../creusot-contracts/src/std/iter/take.rs" 31 14 31 50 let%span sskip6 = "../../../../creusot-contracts/src/std/iter/skip.rs" 14 14 14 39 @@ -1015,10 +1015,10 @@ module M_03_std_iterators__skip_take [#"03_std_iterators.rs" 35 0 35 48] let%span stake22 = "../../../../creusot-contracts/src/std/iter/take.rs" 78 14 78 42 let%span stake23 = "../../../../creusot-contracts/src/std/iter/take.rs" 24 14 24 68 let%span stake24 = "../../../../creusot-contracts/src/std/iter/take.rs" 41 8 41 29 - let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter26 = "../../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter27 = "../../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter26 = "../../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter27 = "../../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sresolve29 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 type t_I'0 @@ -1268,14 +1268,14 @@ module M_03_std_iterators__counter [#"03_std_iterators.rs" 41 0 41 27] let%span s03_std_iterators6 = "03_std_iterators.rs" 50 23 50 24 let%span s03_std_iterators7 = "03_std_iterators.rs" 47 23 47 65 let%span s03_std_iterators8 = "03_std_iterators.rs" 48 22 48 89 - let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 55 21 55 25 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 55 27 55 31 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 49 15 51 69 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 52 15 52 51 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 53 15 53 70 - let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 55 4 58 61 - let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 54 14 54 88 - let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 59 21 59 25 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 59 27 59 31 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 53 15 55 69 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 56 15 56 51 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 57 15 57 70 + let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 59 4 62 61 + let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 58 14 58 88 + let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span svec17 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span smodel18 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span sslice19 = "../../../../creusot-contracts/src/std/slice.rs" 411 14 411 45 @@ -1722,11 +1722,11 @@ module M_03_std_iterators__sum_range [#"03_std_iterators.rs" 63 0 63 35] let%span s03_std_iterators7 = "03_std_iterators.rs" 67 13 67 14 let%span s03_std_iterators8 = "03_std_iterators.rs" 61 11 61 18 let%span s03_std_iterators9 = "03_std_iterators.rs" 62 10 62 21 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span srange11 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange15 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange16 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange17 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 @@ -1928,17 +1928,17 @@ module M_03_std_iterators__enumerate_range [#"03_std_iterators.rs" 72 0 72 24] let%span s03_std_iterators4 = "03_std_iterators.rs" 73 16 73 93 let%span s03_std_iterators5 = "03_std_iterators.rs" 74 4 74 7 let%span s03_std_iterators6 = "03_std_iterators.rs" 74 4 74 7 - let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 150 27 150 99 - let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 151 27 151 115 - let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 192 27 192 99 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 193 27 193 115 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sindex10 = "../../../../creusot-contracts/src/logic/ops/index.rs" 93 8 93 33 let%span senumerate11 = "../../../../creusot-contracts/src/std/iter/enumerate.rs" 72 12 76 113 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span srange13 = "../../../../creusot-contracts/src/std/iter/range.rs" 14 12 14 78 let%span srange14 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 let%span senumerate15 = "../../../../creusot-contracts/src/std/iter/enumerate.rs" 14 14 14 39 - let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span senumerate18 = "../../../../creusot-contracts/src/std/iter/enumerate.rs" 82 14 82 45 let%span senumerate19 = "../../../../creusot-contracts/src/std/iter/enumerate.rs" 87 15 87 32 let%span senumerate20 = "../../../../creusot-contracts/src/std/iter/enumerate.rs" 88 15 88 32 @@ -2253,13 +2253,13 @@ module M_03_std_iterators__my_reverse [#"03_std_iterators.rs" 94 0 94 37] let%span s03_std_iterators20 = "03_std_iterators.rs" 93 10 93 44 let%span sslice21 = "../../../../creusot-contracts/src/std/slice.rs" 245 0 354 1 let%span smodel22 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 - let%span siter23 = "../../../../creusot-contracts/src/std/iter.rs" 159 27 159 48 - let%span siter24 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 161 26 161 62 + let%span siter23 = "../../../../creusot-contracts/src/std/iter.rs" 201 27 201 48 + let%span siter24 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 203 26 203 62 let%span s03_std_iterators26 = "03_std_iterators.rs" 89 8 89 60 let%span s03_std_iterators27 = "03_std_iterators.rs" 82 8 82 58 let%span szip28 = "../../../../creusot-contracts/src/std/iter/zip.rs" 46 12 49 95 - let%span siter29 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter29 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sslice30 = "../../../../creusot-contracts/src/std/slice.rs" 257 19 257 35 let%span sslice31 = "../../../../creusot-contracts/src/std/slice.rs" 258 19 258 35 let%span sslice32 = "../../../../creusot-contracts/src/std/slice.rs" 259 18 259 50 @@ -2267,10 +2267,10 @@ module M_03_std_iterators__my_reverse [#"03_std_iterators.rs" 94 0 94 37] let%span sslice34 = "../../../../creusot-contracts/src/std/slice.rs" 28 14 28 41 let%span sslice35 = "../../../../creusot-contracts/src/std/slice.rs" 29 14 29 42 let%span smodel36 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter37 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 + let%span siter37 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 let%span szip38 = "../../../../creusot-contracts/src/std/iter/zip.rs" 14 14 14 39 let%span szip39 = "../../../../creusot-contracts/src/std/iter/zip.rs" 21 14 21 39 - let%span siter40 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter40 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span szip41 = "../../../../creusot-contracts/src/std/iter/zip.rs" 55 14 55 45 let%span szip42 = "../../../../creusot-contracts/src/std/iter/zip.rs" 60 15 60 32 let%span szip43 = "../../../../creusot-contracts/src/std/iter/zip.rs" 61 15 61 32 diff --git a/creusot/tests/should_succeed/iterators/08_collect_extend.coma b/creusot/tests/should_succeed/iterators/08_collect_extend.coma index 50f3f4a7ec..b4c00914e5 100644 --- a/creusot/tests/should_succeed/iterators/08_collect_extend.coma +++ b/creusot/tests/should_succeed/iterators/08_collect_extend.coma @@ -9,19 +9,19 @@ module M_08_collect_extend__extend [#"08_collect_extend.rs" 26 0 26 66] let%span s08_collect_extend7 = "08_collect_extend.rs" 26 40 26 43 let%span s08_collect_extend8 = "08_collect_extend.rs" 26 58 26 62 let%span s08_collect_extend9 = "08_collect_extend.rs" 23 2 24 82 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel11 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span ssnapshot12 = "../../../../creusot-contracts/src/snapshot.rs" 52 20 52 39 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec14 = "../../../../creusot-contracts/src/std/vec.rs" 87 26 87 56 let%span svec15 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 - let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span smodel18 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter19 = "../../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter21 = "../../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter22 = "../../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter19 = "../../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter21 = "../../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter22 = "../../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sresolve23 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span sinvariant24 = "../../../../creusot-contracts/src/invariant.rs" 34 20 34 44 let%span sseq25 = "../../../../creusot-contracts/src/logic/seq.rs" 633 20 633 95 @@ -332,16 +332,16 @@ module M_08_collect_extend__collect [#"08_collect_extend.rs" 44 0 44 52] let%span s08_collect_extend8 = "08_collect_extend.rs" 44 40 44 52 let%span s08_collect_extend9 = "08_collect_extend.rs" 41 2 42 88 let%span svec10 = "../../../../creusot-contracts/src/std/vec.rs" 74 26 74 44 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span svec12 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec14 = "../../../../creusot-contracts/src/std/vec.rs" 87 26 87 56 - let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 - let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter18 = "../../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter19 = "../../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter16 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 + let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter18 = "../../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter19 = "../../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 let%span sresolve21 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span smodel22 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span svec23 = "../../../../creusot-contracts/src/std/vec.rs" 65 20 65 41 @@ -621,7 +621,7 @@ module M_08_collect_extend__extend_index [#"08_collect_extend.rs" 55 0 55 51] let%span s08_collect_extend0 = "08_collect_extend.rs" 56 16 56 32 let%span s08_collect_extend1 = "08_collect_extend.rs" 57 16 57 32 let%span s08_collect_extend2 = "08_collect_extend.rs" 60 20 60 53 - let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter3 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span s08_collect_extend4 = "08_collect_extend.rs" 26 40 26 43 let%span s08_collect_extend5 = "08_collect_extend.rs" 26 58 26 62 let%span s08_collect_extend6 = "08_collect_extend.rs" 23 2 24 82 @@ -821,10 +821,10 @@ module M_08_collect_extend__collect_example [#"08_collect_extend.rs" 65 0 65 56] let%span s08_collect_extend5 = "08_collect_extend.rs" 41 2 42 88 let%span svec6 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span sindex7 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 - let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 38 14 38 45 - let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 42 15 42 32 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 43 15 43 32 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 44 14 44 42 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 42 14 42 45 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 46 15 46 32 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 47 15 47 32 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 48 14 48 42 type t_I'0 diff --git a/creusot/tests/should_succeed/iterators/17_filter.coma b/creusot/tests/should_succeed/iterators/17_filter.coma index 17b7e10dc9..a8a91b04c9 100644 --- a/creusot/tests/should_succeed/iterators/17_filter.coma +++ b/creusot/tests/should_succeed/iterators/17_filter.coma @@ -750,12 +750,12 @@ end module M_17_filter__less_than [#"17_filter.rs" 120 0 120 49] let%span s17_filter0 = "17_filter.rs" 118 10 118 70 let%span s17_filter1 = "17_filter.rs" 119 10 119 79 - let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter2 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span s17_filter3 = "17_filter.rs" 123 22 123 40 - let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 140 27 140 47 - let%span siter5 = "../../../../creusot-contracts/src/std/iter.rs" 141 27 141 53 - let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 142 27 142 45 - let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter4 = "../../../../creusot-contracts/src/std/iter.rs" 175 27 175 47 + let%span siter5 = "../../../../creusot-contracts/src/std/iter.rs" 176 27 176 53 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 177 27 177 45 + let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span svec8 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span sindex9 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span sseq10 = "../../../../creusot-contracts/src/logic/seq.rs" 355 20 355 77 @@ -767,7 +767,7 @@ module M_17_filter__less_than [#"17_filter.rs" 120 0 120 49] let%span sfilter16 = "../../../../creusot-contracts/src/std/iter/filter.rs" 15 14 15 39 let%span sfilter17 = "../../../../creusot-contracts/src/std/iter/filter.rs" 22 14 22 39 let%span sfilter18 = "../../../../creusot-contracts/src/std/iter/filter.rs" 77 12 79 47 - let%span sfilter19 = "../../../../creusot-contracts/src/std/iter/filter.rs" 87 12 99 17 + let%span sfilter19 = "../../../../creusot-contracts/src/std/iter/filter.rs" 87 12 98 143 let%span svec20 = "../../../../creusot-contracts/src/std/vec.rs" 285 20 285 32 let%span sresolve21 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span sops22 = "../../../../creusot-contracts/src/std/ops.rs" 109 15 109 59 @@ -777,10 +777,10 @@ module M_17_filter__less_than [#"17_filter.rs" 120 0 120 49] let%span sops26 = "../../../../creusot-contracts/src/std/ops.rs" 121 15 121 26 let%span sops27 = "../../../../creusot-contracts/src/std/ops.rs" 122 14 122 28 let%span sops28 = "../../../../creusot-contracts/src/std/ops.rs" 127 14 128 105 - let%span sfilter29 = "../../../../creusot-contracts/src/std/iter/filter.rs" 105 14 105 45 - let%span sfilter30 = "../../../../creusot-contracts/src/std/iter/filter.rs" 110 15 110 32 - let%span sfilter31 = "../../../../creusot-contracts/src/std/iter/filter.rs" 111 15 111 32 - let%span sfilter32 = "../../../../creusot-contracts/src/std/iter/filter.rs" 112 14 112 42 + let%span sfilter29 = "../../../../creusot-contracts/src/std/iter/filter.rs" 104 14 104 45 + let%span sfilter30 = "../../../../creusot-contracts/src/std/iter/filter.rs" 109 15 109 32 + let%span sfilter31 = "../../../../creusot-contracts/src/std/iter/filter.rs" 110 15 110 32 + let%span sfilter32 = "../../../../creusot-contracts/src/std/iter/filter.rs" 111 14 111 42 let%span svec33 = "../../../../creusot-contracts/src/std/vec.rs" 264 12 264 41 let%span svec34 = "../../../../creusot-contracts/src/std/vec.rs" 257 20 257 57 let%span svec35 = "../../../../creusot-contracts/src/std/vec.rs" 270 14 270 45 @@ -1026,8 +1026,8 @@ module M_17_filter__less_than [#"17_filter.rs" 120 0 120 49] [%#sfilter19] invariant'0 self -> unnest'1 (func'0 self) (func'0 succ) /\ (exists s : Seq.seq uint32, f : Map.map int int . produces'1 (iter'0 self) s (iter'0 succ) - /\ (forall i : int, j : int . 0 <= i /\ i <= j /\ j < Seq.length visited - -> 0 <= Map.get f i /\ Map.get f i <= Map.get f j /\ Map.get f j < Seq.length s) + /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> 0 <= Map.get f i /\ Map.get f i < Seq.length s) + /\ (forall i : int, j : int . 0 <= i /\ i < j /\ j < Seq.length visited -> Map.get f i < Map.get f j) /\ (forall i : int . 0 <= i /\ i < Seq.length visited -> Seq.get visited i = Seq.get s (Map.get f i)) /\ (forall i : int . 0 <= i /\ i < Seq.length s -> (exists j : int . 0 <= j /\ j < Seq.length visited /\ Map.get f j = i) diff --git a/creusot/tests/should_succeed/iterators/17_filter/why3session.xml b/creusot/tests/should_succeed/iterators/17_filter/why3session.xml index 884ef860bb..95aec3083e 100644 --- a/creusot/tests/should_succeed/iterators/17_filter/why3session.xml +++ b/creusot/tests/should_succeed/iterators/17_filter/why3session.xml @@ -184,7 +184,7 @@ - + @@ -227,7 +227,7 @@ - + @@ -267,36 +267,36 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/creusot/tests/should_succeed/iterators/17_filter/why3shapes.gz b/creusot/tests/should_succeed/iterators/17_filter/why3shapes.gz index 33e8379902dbb4e4fa76d2eadccd7a417f2e1c79..918b37f6d9524fef5793c64929a1d1dcdbfa6b1f 100644 GIT binary patch literal 6060 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 literal 5960 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 diff --git a/creusot/tests/should_succeed/knapsack_full.coma b/creusot/tests/should_succeed/knapsack_full.coma index 88a92da694..50f4b87068 100644 --- a/creusot/tests/should_succeed/knapsack_full.coma +++ b/creusot/tests/should_succeed/knapsack_full.coma @@ -345,7 +345,7 @@ module M_knapsack_full__knapsack01_dyn [#"knapsack_full.rs" 86 0 86 91] let%span svec40 = "../../../creusot-contracts/src/std/vec.rs" 180 22 180 41 let%span svec41 = "../../../creusot-contracts/src/std/vec.rs" 181 22 181 76 let%span svec42 = "../../../creusot-contracts/src/std/vec.rs" 83 26 83 48 - let%span siter43 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter43 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel44 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span sindex45 = "../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span svec46 = "../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 @@ -356,13 +356,13 @@ module M_knapsack_full__knapsack01_dyn [#"knapsack_full.rs" 86 0 86 91] let%span sknapsack_full51 = "knapsack_full.rs" 60 10 60 11 let%span sknapsack_full52 = "knapsack_full.rs" 68 4 75 5 let%span srange53 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter54 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter54 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec55 = "../../../creusot-contracts/src/std/vec.rs" 162 27 162 46 let%span svec56 = "../../../creusot-contracts/src/std/vec.rs" 163 26 163 54 let%span sops57 = "../../../creusot-contracts/src/std/ops.rs" 219 26 219 53 let%span sops58 = "../../../creusot-contracts/src/std/ops.rs" 220 26 220 49 let%span sops59 = "../../../creusot-contracts/src/std/ops.rs" 221 26 221 91 - let%span srange60 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 + let%span srange60 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 let%span sknapsack_full61 = "knapsack_full.rs" 15 10 15 31 let%span svec62 = "../../../creusot-contracts/src/std/vec.rs" 152 27 152 46 let%span svec63 = "../../../creusot-contracts/src/std/vec.rs" 153 26 153 54 @@ -382,8 +382,8 @@ module M_knapsack_full__knapsack01_dyn [#"knapsack_full.rs" 86 0 86 91] let%span sknapsack_full77 = "knapsack_full.rs" 36 10 36 19 let%span sknapsack_full78 = "knapsack_full.rs" 39 4 42 5 let%span svec79 = "../../../creusot-contracts/src/std/vec.rs" 87 26 87 56 - let%span siter80 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter81 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter80 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter81 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange82 = "../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange83 = "../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange84 = "../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 @@ -394,15 +394,15 @@ module M_knapsack_full__knapsack01_dyn [#"knapsack_full.rs" 86 0 86 91] let%span sslice89 = "../../../creusot-contracts/src/std/slice.rs" 122 20 122 37 let%span sslice90 = "../../../creusot-contracts/src/std/slice.rs" 129 20 129 37 let%span sops91 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 - let%span srange92 = "../../../creusot-contracts/src/std/iter/range.rs" 76 14 76 45 - let%span srange93 = "../../../creusot-contracts/src/std/iter/range.rs" 74 4 74 10 - let%span srange94 = "../../../creusot-contracts/src/std/iter/range.rs" 81 15 81 32 - let%span srange95 = "../../../creusot-contracts/src/std/iter/range.rs" 82 15 82 32 - let%span srange96 = "../../../creusot-contracts/src/std/iter/range.rs" 83 14 83 42 - let%span srange97 = "../../../creusot-contracts/src/std/iter/range.rs" 79 4 79 10 - let%span srange98 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange99 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 - let%span srange100 = "../../../creusot-contracts/src/std/iter/range.rs" 58 12 58 57 + let%span srange92 = "../../../creusot-contracts/src/std/iter/range.rs" 102 14 102 45 + let%span srange93 = "../../../creusot-contracts/src/std/iter/range.rs" 100 4 100 10 + let%span srange94 = "../../../creusot-contracts/src/std/iter/range.rs" 107 15 107 32 + let%span srange95 = "../../../creusot-contracts/src/std/iter/range.rs" 108 15 108 32 + let%span srange96 = "../../../creusot-contracts/src/std/iter/range.rs" 109 14 109 42 + let%span srange97 = "../../../creusot-contracts/src/std/iter/range.rs" 105 4 105 10 + let%span srange98 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange99 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span srange100 = "../../../creusot-contracts/src/std/iter/range.rs" 84 12 84 57 let%span smodel101 = "../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span sslice102 = "../../../creusot-contracts/src/std/slice.rs" 136 20 136 94 let%span svec103 = "../../../creusot-contracts/src/std/vec.rs" 65 20 65 41 diff --git a/creusot/tests/should_succeed/rusthorn/inc_max_repeat.coma b/creusot/tests/should_succeed/rusthorn/inc_max_repeat.coma index c0b3819894..ce2a57936e 100644 --- a/creusot/tests/should_succeed/rusthorn/inc_max_repeat.coma +++ b/creusot/tests/should_succeed/rusthorn/inc_max_repeat.coma @@ -77,12 +77,12 @@ module M_inc_max_repeat__inc_max_repeat [#"inc_max_repeat.rs" 15 0 15 53] let%span sinc_max_repeat7 = "inc_max_repeat.rs" 20 15 20 16 let%span sinc_max_repeat8 = "inc_max_repeat.rs" 22 4 22 37 let%span sinc_max_repeat9 = "inc_max_repeat.rs" 14 11 14 70 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span srange11 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span sinc_max_repeat13 = "inc_max_repeat.rs" 4 0 5 56 - let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter15 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange16 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange17 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange18 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/selection_sort_generic.coma b/creusot/tests/should_succeed/selection_sort_generic.coma index 3a397dfc7d..fa51b6439f 100644 --- a/creusot/tests/should_succeed/selection_sort_generic.coma +++ b/creusot/tests/should_succeed/selection_sort_generic.coma @@ -20,7 +20,7 @@ module M_selection_sort_generic__selection_sort [#"selection_sort_generic.rs" 30 let%span sselection_sort_generic18 = "selection_sort_generic.rs" 28 10 28 35 let%span sselection_sort_generic19 = "selection_sort_generic.rs" 29 10 29 34 let%span svec20 = "../../../creusot-contracts/src/std/vec.rs" 83 26 83 48 - let%span siter21 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter21 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel22 = "../../../creusot-contracts/src/model.rs" 101 8 101 28 let%span sselection_sort_generic23 = "selection_sort_generic.rs" 25 16 25 105 let%span sselection_sort_generic24 = "selection_sort_generic.rs" 12 8 12 72 @@ -28,7 +28,7 @@ module M_selection_sort_generic__selection_sort [#"selection_sort_generic.rs" 30 let%span ssnapshot26 = "../../../creusot-contracts/src/snapshot.rs" 52 20 52 39 let%span sseq27 = "../../../creusot-contracts/src/logic/seq.rs" 316 8 316 41 let%span srange28 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter29 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec30 = "../../../creusot-contracts/src/std/vec.rs" 162 27 162 46 let%span svec31 = "../../../creusot-contracts/src/std/vec.rs" 163 26 163 54 let%span scmp32 = "../../../creusot-contracts/src/std/cmp.rs" 35 26 35 76 @@ -42,8 +42,8 @@ module M_selection_sort_generic__selection_sort [#"selection_sort_generic.rs" 30 let%span sselection_sort_generic40 = "selection_sort_generic.rs" 19 8 19 35 let%span svec41 = "../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span smodel42 = "../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter43 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter44 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter43 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter44 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange45 = "../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange46 = "../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange47 = "../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/sum.coma b/creusot/tests/should_succeed/sum.coma index 15558c7c82..68832fb4fe 100644 --- a/creusot/tests/should_succeed/sum.coma +++ b/creusot/tests/should_succeed/sum.coma @@ -11,22 +11,22 @@ module M_sum__sum_first_n [#"sum.rs" 6 0 6 33] let%span sops9 = "../../../creusot-contracts/src/std/ops.rs" 219 26 219 53 let%span sops10 = "../../../creusot-contracts/src/std/ops.rs" 220 26 220 49 let%span sops11 = "../../../creusot-contracts/src/std/ops.rs" 221 26 221 91 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 - let%span srange13 = "../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 + let%span srange13 = "../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span siter14 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span snum15 = "../../../creusot-contracts/src/std/num.rs" 21 28 21 33 let%span sops16 = "../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 - let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 - let%span srange19 = "../../../creusot-contracts/src/std/iter/range.rs" 76 14 76 45 - let%span srange20 = "../../../creusot-contracts/src/std/iter/range.rs" 74 4 74 10 - let%span srange21 = "../../../creusot-contracts/src/std/iter/range.rs" 81 15 81 32 - let%span srange22 = "../../../creusot-contracts/src/std/iter/range.rs" 82 15 82 32 - let%span srange23 = "../../../creusot-contracts/src/std/iter/range.rs" 83 14 83 42 - let%span srange24 = "../../../creusot-contracts/src/std/iter/range.rs" 79 4 79 10 - let%span srange25 = "../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange26 = "../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 - let%span srange27 = "../../../creusot-contracts/src/std/iter/range.rs" 58 12 58 57 + let%span siter17 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter18 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 + let%span srange19 = "../../../creusot-contracts/src/std/iter/range.rs" 102 14 102 45 + let%span srange20 = "../../../creusot-contracts/src/std/iter/range.rs" 100 4 100 10 + let%span srange21 = "../../../creusot-contracts/src/std/iter/range.rs" 107 15 107 32 + let%span srange22 = "../../../creusot-contracts/src/std/iter/range.rs" 108 15 108 32 + let%span srange23 = "../../../creusot-contracts/src/std/iter/range.rs" 109 14 109 42 + let%span srange24 = "../../../creusot-contracts/src/std/iter/range.rs" 105 4 105 10 + let%span srange25 = "../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange26 = "../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span srange27 = "../../../creusot-contracts/src/std/iter/range.rs" 84 12 84 57 let%span sresolve28 = "../../../creusot-contracts/src/resolve.rs" 54 20 54 34 use prelude.prelude.UInt32 diff --git a/creusot/tests/should_succeed/sum_of_odds.coma b/creusot/tests/should_succeed/sum_of_odds.coma index 16c800ba59..2dfa52b168 100644 --- a/creusot/tests/should_succeed/sum_of_odds.coma +++ b/creusot/tests/should_succeed/sum_of_odds.coma @@ -59,17 +59,17 @@ module M_sum_of_odds__compute_sum_of_odd [#"sum_of_odds.rs" 36 0 36 36] let%span ssum_of_odds9 = "sum_of_odds.rs" 44 21 44 22 let%span ssum_of_odds10 = "sum_of_odds.rs" 34 11 34 23 let%span ssum_of_odds11 = "sum_of_odds.rs" 35 10 35 35 - let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter12 = "../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span ssum_of_odds13 = "sum_of_odds.rs" 17 10 17 11 let%span ssum_of_odds14 = "sum_of_odds.rs" 16 0 16 8 let%span srange15 = "../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter16 = "../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span ssum_of_odds17 = "sum_of_odds.rs" 27 11 27 17 let%span ssum_of_odds18 = "sum_of_odds.rs" 28 10 28 33 let%span ssum_of_odds19 = "sum_of_odds.rs" 29 10 29 11 let%span ssum_of_odds20 = "sum_of_odds.rs" 31 4 31 65 - let%span siter21 = "../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter22 = "../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter21 = "../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter22 = "../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange23 = "../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange24 = "../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange25 = "../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/vector/01.coma b/creusot/tests/should_succeed/vector/01.coma index 5086234a58..0bf98dd0e2 100644 --- a/creusot/tests/should_succeed/vector/01.coma +++ b/creusot/tests/should_succeed/vector/01.coma @@ -11,12 +11,12 @@ module M_01__all_zero [#"01.rs" 7 0 7 33] let%span s019 = "01.rs" 5 10 5 71 let%span s0110 = "01.rs" 6 10 6 33 let%span svec11 = "../../../../creusot-contracts/src/std/vec.rs" 83 26 83 48 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span sindex13 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span smodel14 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span ssnapshot15 = "../../../../creusot-contracts/src/snapshot.rs" 52 20 52 39 let%span srange16 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec18 = "../../../../creusot-contracts/src/std/vec.rs" 152 27 152 46 let%span svec19 = "../../../../creusot-contracts/src/std/vec.rs" 153 26 153 54 let%span svec20 = "../../../../creusot-contracts/src/std/vec.rs" 154 26 154 57 @@ -24,8 +24,8 @@ module M_01__all_zero [#"01.rs" 7 0 7 33] let%span svec22 = "../../../../creusot-contracts/src/std/vec.rs" 156 26 156 55 let%span svec23 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span smodel24 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter26 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter25 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter26 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange27 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange28 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange29 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/vector/03_knuth_shuffle.coma b/creusot/tests/should_succeed/vector/03_knuth_shuffle.coma index 3017bc95e8..e02a7f83d8 100644 --- a/creusot/tests/should_succeed/vector/03_knuth_shuffle.coma +++ b/creusot/tests/should_succeed/vector/03_knuth_shuffle.coma @@ -11,12 +11,12 @@ module M_03_knuth_shuffle__knuth_shuffle [#"03_knuth_shuffle.rs" 13 0 13 39] let%span s03_knuth_shuffle9 = "03_knuth_shuffle.rs" 13 24 13 25 let%span s03_knuth_shuffle10 = "03_knuth_shuffle.rs" 12 10 12 34 let%span svec11 = "../../../../creusot-contracts/src/std/vec.rs" 83 26 83 48 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel13 = "../../../../creusot-contracts/src/model.rs" 110 8 110 22 let%span ssnapshot14 = "../../../../creusot-contracts/src/snapshot.rs" 52 20 52 39 let%span sseq15 = "../../../../creusot-contracts/src/logic/seq.rs" 316 8 316 41 let%span srange16 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter17 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span s03_knuth_shuffle18 = "03_knuth_shuffle.rs" 6 11 6 19 let%span s03_knuth_shuffle19 = "03_knuth_shuffle.rs" 7 10 7 40 let%span svec20 = "../../../../creusot-contracts/src/std/vec.rs" 175 26 175 42 @@ -26,8 +26,8 @@ module M_03_knuth_shuffle__knuth_shuffle [#"03_knuth_shuffle.rs" 13 0 13 39] let%span sslice24 = "../../../../creusot-contracts/src/std/slice.rs" 259 18 259 50 let%span svec25 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span smodel26 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 - let%span siter27 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter27 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter28 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange29 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange30 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange31 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/vector/06_knights_tour.coma b/creusot/tests/should_succeed/vector/06_knights_tour.coma index 83756e7c9b..b2fd5bf001 100644 --- a/creusot/tests/should_succeed/vector/06_knights_tour.coma +++ b/creusot/tests/should_succeed/vector/06_knights_tour.coma @@ -98,14 +98,14 @@ module M_06_knights_tour__qyi4580598960913230815__new [#"06_knights_tour.rs" 40 let%span s06_knights_tour3 = "06_knights_tour.rs" 39 14 39 25 let%span s06_knights_tour4 = "06_knights_tour.rs" 44 28 44 29 let%span s06_knights_tour5 = "06_knights_tour.rs" 43 26 43 48 - let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 55 21 55 25 - let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 55 27 55 31 - let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 49 15 51 69 - let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 52 15 52 51 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 53 15 53 70 - let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 55 4 58 61 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 54 14 54 88 - let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 166 26 167 120 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 59 21 59 25 + let%span siter7 = "../../../../creusot-contracts/src/std/iter.rs" 59 27 59 31 + let%span siter8 = "../../../../creusot-contracts/src/std/iter.rs" 53 15 55 69 + let%span siter9 = "../../../../creusot-contracts/src/std/iter.rs" 56 15 56 51 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 57 15 57 70 + let%span siter11 = "../../../../creusot-contracts/src/std/iter.rs" 59 4 62 61 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 58 14 58 88 + let%span siter13 = "../../../../creusot-contracts/src/std/iter.rs" 208 26 209 120 let%span s06_knights_tour14 = "06_knights_tour.rs" 32 12 34 93 let%span svec15 = "../../../../creusot-contracts/src/std/vec.rs" 180 22 180 41 let%span svec16 = "../../../../creusot-contracts/src/std/vec.rs" 181 22 181 76 @@ -729,9 +729,9 @@ module M_06_knights_tour__qyi4580598960913230815__count_degree [#"06_knights_tou let%span s06_knights_tour9 = "06_knights_tour.rs" 69 15 69 32 let%span s06_knights_tour10 = "06_knights_tour.rs" 93 10 93 28 let%span s06_knights_tour11 = "06_knights_tour.rs" 94 10 94 128 - let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter12 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span svec13 = "../../../../creusot-contracts/src/std/vec.rs" 264 12 264 41 - let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter14 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span s06_knights_tour15 = "06_knights_tour.rs" 12 15 12 52 let%span s06_knights_tour16 = "06_knights_tour.rs" 13 15 13 52 let%span s06_knights_tour17 = "06_knights_tour.rs" 14 15 14 46 @@ -1337,11 +1337,11 @@ module M_06_knights_tour__min [#"06_knights_tour.rs" 110 0 110 58] let%span s06_knights_tour3 = "06_knights_tour.rs" 114 4 114 7 let%span s06_knights_tour4 = "06_knights_tour.rs" 114 4 114 7 let%span s06_knights_tour5 = "06_knights_tour.rs" 108 10 109 60 - let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter6 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel7 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span sindex8 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 let%span sslice9 = "../../../../creusot-contracts/src/std/slice.rs" 405 12 405 66 - let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter10 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec11 = "../../../../creusot-contracts/src/std/vec.rs" 205 20 205 24 let%span svec12 = "../../../../creusot-contracts/src/std/vec.rs" 211 20 211 34 let%span svec13 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 @@ -1677,11 +1677,11 @@ module M_06_knights_tour__knights_tour [#"06_knights_tour.rs" 135 0 135 69] let%span s06_knights_tour28 = "06_knights_tour.rs" 128 11 128 22 let%span s06_knights_tour29 = "06_knights_tour.rs" 129 10 129 30 let%span s06_knights_tour30 = "06_knights_tour.rs" 127 0 127 8 - let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span s06_knights_tour32 = "06_knights_tour.rs" 63 12 63 75 let%span s06_knights_tour33 = "06_knights_tour.rs" 32 12 34 93 let%span srange34 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 - let%span siter35 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span siter35 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span svec36 = "../../../../creusot-contracts/src/std/vec.rs" 74 26 74 44 let%span s06_knights_tour37 = "06_knights_tour.rs" 93 10 93 28 let%span s06_knights_tour38 = "06_knights_tour.rs" 94 10 94 128 @@ -1700,8 +1700,8 @@ module M_06_knights_tour__knights_tour [#"06_knights_tour.rs" 135 0 135 69] let%span s06_knights_tour51 = "06_knights_tour.rs" 69 15 69 32 let%span svec52 = "../../../../creusot-contracts/src/std/vec.rs" 87 26 87 56 let%span s06_knights_tour53 = "06_knights_tour.rs" 108 10 109 60 - let%span siter54 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter55 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter54 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter55 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span srange56 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange57 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32 let%span srange58 = "../../../../creusot-contracts/src/std/iter/range.rs" 38 15 38 32 diff --git a/creusot/tests/should_succeed/vector/08_haystack.coma b/creusot/tests/should_succeed/vector/08_haystack.coma index c7126fd7aa..954193c032 100644 --- a/creusot/tests/should_succeed/vector/08_haystack.coma +++ b/creusot/tests/should_succeed/vector/08_haystack.coma @@ -19,29 +19,29 @@ module M_08_haystack__search [#"08_haystack.rs" 21 0 21 60] let%span sops17 = "../../../../creusot-contracts/src/std/ops.rs" 219 26 219 53 let%span sops18 = "../../../../creusot-contracts/src/std/ops.rs" 220 26 220 49 let%span sops19 = "../../../../creusot-contracts/src/std/ops.rs" 221 26 221 91 - let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 97 0 205 1 + let%span siter20 = "../../../../creusot-contracts/src/std/iter.rs" 132 0 261 1 let%span smodel21 = "../../../../creusot-contracts/src/model.rs" 92 8 92 22 let%span s08_haystack22 = "08_haystack.rs" 8 16 11 62 - let%span srange23 = "../../../../creusot-contracts/src/std/iter/range.rs" 66 12 70 76 - let%span siter24 = "../../../../creusot-contracts/src/std/iter.rs" 103 26 106 17 + let%span srange23 = "../../../../creusot-contracts/src/std/iter/range.rs" 92 12 96 76 + let%span siter24 = "../../../../creusot-contracts/src/std/iter.rs" 138 26 141 17 let%span srange25 = "../../../../creusot-contracts/src/std/iter/range.rs" 22 12 26 70 let%span svec26 = "../../../../creusot-contracts/src/std/vec.rs" 162 27 162 46 let%span svec27 = "../../../../creusot-contracts/src/std/vec.rs" 163 26 163 54 let%span snum28 = "../../../../creusot-contracts/src/std/num.rs" 21 28 21 33 let%span sops29 = "../../../../creusot-contracts/src/std/ops.rs" 205 14 205 86 - let%span siter30 = "../../../../creusot-contracts/src/std/iter.rs" 82 20 82 24 - let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 88 8 88 19 + let%span siter30 = "../../../../creusot-contracts/src/std/iter.rs" 86 20 86 24 + let%span siter31 = "../../../../creusot-contracts/src/std/iter.rs" 92 8 92 19 let%span svec32 = "../../../../creusot-contracts/src/std/vec.rs" 18 14 18 41 let%span sindex33 = "../../../../creusot-contracts/src/logic/ops/index.rs" 27 8 27 31 - let%span srange34 = "../../../../creusot-contracts/src/std/iter/range.rs" 76 14 76 45 - let%span srange35 = "../../../../creusot-contracts/src/std/iter/range.rs" 74 4 74 10 - let%span srange36 = "../../../../creusot-contracts/src/std/iter/range.rs" 81 15 81 32 - let%span srange37 = "../../../../creusot-contracts/src/std/iter/range.rs" 82 15 82 32 - let%span srange38 = "../../../../creusot-contracts/src/std/iter/range.rs" 83 14 83 42 - let%span srange39 = "../../../../creusot-contracts/src/std/iter/range.rs" 79 4 79 10 - let%span srange40 = "../../../../creusot-contracts/src/std/iter/range.rs" 45 10 45 43 - let%span srange41 = "../../../../creusot-contracts/src/std/iter/range.rs" 47 4 50 5 - let%span srange42 = "../../../../creusot-contracts/src/std/iter/range.rs" 58 12 58 57 + let%span srange34 = "../../../../creusot-contracts/src/std/iter/range.rs" 102 14 102 45 + let%span srange35 = "../../../../creusot-contracts/src/std/iter/range.rs" 100 4 100 10 + let%span srange36 = "../../../../creusot-contracts/src/std/iter/range.rs" 107 15 107 32 + let%span srange37 = "../../../../creusot-contracts/src/std/iter/range.rs" 108 15 108 32 + let%span srange38 = "../../../../creusot-contracts/src/std/iter/range.rs" 109 14 109 42 + let%span srange39 = "../../../../creusot-contracts/src/std/iter/range.rs" 105 4 105 10 + let%span srange40 = "../../../../creusot-contracts/src/std/iter/range.rs" 71 10 71 43 + let%span srange41 = "../../../../creusot-contracts/src/std/iter/range.rs" 73 4 76 5 + let%span srange42 = "../../../../creusot-contracts/src/std/iter/range.rs" 84 12 84 57 let%span sresolve43 = "../../../../creusot-contracts/src/resolve.rs" 54 20 54 34 let%span srange44 = "../../../../creusot-contracts/src/std/iter/range.rs" 32 14 32 45 let%span srange45 = "../../../../creusot-contracts/src/std/iter/range.rs" 37 15 37 32