@@ -24,15 +24,11 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Iterator for Map<I, F> {
2424
2525 #[ law]
2626 #[ open]
27- #[ requires( a. invariant( ) ) ]
2827 #[ ensures( a. produces( Seq :: EMPTY , a) ) ]
2928 fn produces_refl ( a : Self ) { }
3029
3130 #[ law]
3231 #[ open]
33- #[ requires( a. invariant( ) ) ]
34- #[ requires( b. invariant( ) ) ]
35- #[ requires( c. invariant( ) ) ]
3632 #[ requires( a. produces( ab, b) ) ]
3733 #[ requires( b. produces( bc, c) ) ]
3834 #[ ensures( a. produces( ab. concat( bc) , c) ) ]
@@ -76,14 +72,14 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Iterator for Map<I, F> {
7672
7773impl < I : Iterator , B , F : FnMut ( I :: Item ) -> B > Map < I , F > {
7874 #[ predicate]
79- fn next_precondition ( self ) -> bool {
75+ fn next_precondition ( # [ creusot :: open_inv ] self ) -> bool {
8076 pearlite ! {
81- forall<e: I :: Item , i: I > i. invariant( ) ==>
82- self . iter. produces( Seq :: singleton( e) , i) ==> self . func. precondition( ( e, ) )
77+ forall<e: I :: Item , i: I > self . iter. produces( Seq :: singleton( e) , i) ==> self . func. precondition( ( e, ) )
8378 }
8479 }
8580
8681 #[ predicate]
82+ #[ creusot:: open_inv]
8783 fn reinitialize ( ) -> bool {
8884 pearlite ! {
8985 forall<reset : & mut Map <I , F >> ( ^reset) . iter. invariant( ) ==>
@@ -93,10 +89,9 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Map<I, F> {
9389
9490 #[ predicate]
9591 #[ ensures( result == Self :: preservation( self . iter, self . func) ) ]
96- fn preservation_inv ( self ) -> bool {
92+ fn preservation_inv ( # [ creusot :: open_inv ] self ) -> bool {
9793 pearlite ! {
9894 forall<s: Seq <I :: Item >, e1: I :: Item , e2: I :: Item , f: & mut F , b: B , i: I >
99- i. invariant( ) ==>
10095 self . func. unnest( * f) ==>
10196 self . iter. produces( s. push( e1) . push( e2) , i) ==>
10297 ( * f) . precondition( ( e1, ) ) ==>
@@ -109,7 +104,6 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Map<I, F> {
109104 fn preservation ( iter : I , func : F ) -> bool {
110105 pearlite ! {
111106 forall<s: Seq <I :: Item >, e1: I :: Item , e2: I :: Item , f: & mut F , b: B , i: I >
112- i. invariant( ) ==>
113107 func. unnest( * f) ==>
114108 iter. produces( s. push( e1) . push( e2) , i) ==>
115109 ( * f) . precondition( ( e1, ) ) ==>
@@ -119,15 +113,18 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Map<I, F> {
119113 }
120114
121115 #[ logic]
122- #[ requires( self . invariant( ) ) ]
123116 #[ requires( self . produces_one( e, other) ) ]
124117 #[ requires( other. iter. invariant( ) ) ]
125118 #[ ensures( other. invariant( ) ) ]
126- fn produces_one_invariant ( self , e : B , other : Self ) { }
119+ fn produces_one_invariant ( self , e : B , # [ creusot :: open_inv ] other : Self ) { }
127120
128121 #[ predicate]
129122 #[ ensures( result == self . produces( Seq :: singleton( visited) , succ) ) ]
130- fn produces_one ( self , visited : B , succ : Self ) -> bool {
123+ fn produces_one (
124+ #[ creusot:: open_inv] self ,
125+ visited : B ,
126+ #[ creusot:: open_inv] succ : Self ,
127+ ) -> bool {
131128 pearlite ! {
132129 exists<f: & mut F > * f == self . func && ^f == succ. func
133130 && { exists<e : I :: Item > self . iter. produces( Seq :: singleton( e) , succ. iter)
@@ -140,7 +137,6 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Map<I, F> {
140137impl < I : Iterator , B , F : FnMut ( I :: Item ) -> B > Invariant for Map < I , F > {
141138 // Should not quantify over self or the `invariant` cannot be made into a type invariant
142139 #[ predicate]
143- #[ creusot:: ignore_type_invariant]
144140 #[ open( self ) ]
145141 fn invariant ( self ) -> bool {
146142 pearlite ! {
@@ -152,11 +148,9 @@ impl<I: Iterator, B, F: FnMut(I::Item) -> B> Invariant for Map<I, F> {
152148 }
153149}
154150
155- #[ requires( forall<e : I :: Item , i2 : I > i2 . invariant ( ) ==> iter. produces( Seq :: singleton( e) , i2) ==> func. precondition( ( e, ) ) ) ]
151+ #[ requires( forall<e : I :: Item , i2 : I > iter. produces( Seq :: singleton( e) , i2) ==> func. precondition( ( e, ) ) ) ]
156152#[ requires( Map :: <I , F >:: reinitialize( ) ) ]
157- #[ requires( iter. invariant( ) ) ]
158153#[ requires( Map :: <I , F >:: preservation( iter, func) ) ]
159- #[ ensures( result. invariant( ) ) ]
160154#[ ensures( result == Map { iter, func } ) ]
161155pub fn map < I : Iterator , B , F : FnMut ( I :: Item ) -> B > ( iter : I , func : F ) -> Map < I , F > {
162156 Map { iter, func }
0 commit comments