@@ -20,7 +20,6 @@ let merge_invariant_prop
2020 ( len : SZ. t )
2121 ( l1_0 : Ghost . erased ( list t ))
2222 ( l2_0 : Ghost . erased ( list t ))
23- ( cont : bool)
2423 i1 i2 ( res : bool) accu l1 l2
2524: Tot prop
2625=
@@ -33,8 +32,7 @@ let merge_invariant_prop
3332 if res
3433 then spec_merge compare accu l1 l2
3534 else ( false , accu ` List.Tot. append ` ( l1 ` List.Tot. append ` l2 ))
36- ) /\
37- cont == ( res && not ( i1 = i2 || i2 = len ))
35+ )
3836
3937let merge_invariant
4038 (# tl # th : Type)
@@ -47,7 +45,6 @@ let merge_invariant
4745 ( pi1 : R. ref SZ. t )
4846 ( pi2 : R. ref SZ. t )
4947 ( pres : R. ref bool)
50- ( cont : bool)
5148 i1 i2 ( res : bool) c c1 c2 accu l1 l2
5249: Tot slprop
5350= exists * ca .
@@ -60,7 +57,7 @@ let merge_invariant
6057 ( SM. seq_list_match c accu vmatch ** ( SM. seq_list_match c1 l1 vmatch ** SM. seq_list_match c2 l2 vmatch ))
6158 ( SM. seq_list_match c1_0 l1_0 vmatch ** SM. seq_list_match c2_0 l2_0 vmatch ) **
6259 pure ( ca == ( Seq. append c ( Seq. append c1 c2 ))) **
63- pure ( merge_invariant_prop compare ( S. len a ) l1_0 l2_0 cont i1 i2 res accu l1 l2 )
60+ pure ( merge_invariant_prop compare ( S. len a ) l1_0 l2_0 i1 i2 res accu l1 l2 )
6461
6562let merge_case_1
6663 (# t : Type)
@@ -139,27 +136,22 @@ requires
139136 let mut pi2 = mi ;
140137 let mut pres = true ;
141138 fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres
142- ( not ( 0sz = mi || mi = S. len a ))
143139 0sz mi true
144140 Seq. empty c1 c2 [] l1_0 l2_0
145141 );
146142 while (
147- with gcont gi1 gi2 gres c c1' c2' accu l1' l2' .
148- assert ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gcont gi1 gi2 gres c c1' c2' accu l1' l2' );
149- unfold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gcont gi1 gi2 gres c c1' c2' accu l1' l2' );
143+ unfold merge_invariant ;
150144 let i1 = !pi1 ;
151145 let i2 = !pi2 ;
152146 let res = !pres ;
153- let cont = ( res && not ( i1 = i2 || i2 = S. len a ));
154- fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres cont gi1 gi2 gres c c1' c2' accu l1' l2' );
155- cont
147+ ( res && not ( i1 = i2 || i2 = S. len a ))
156148 )
157- invariant cont . exists * i1 i2 res c c1' c2' accu l1' l2' .
158- merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres cont i1 i2 res c c1' c2' accu l1' l2'
149+ invariant exists * i1 i2 res c c1' c2' accu l1' l2' .
150+ merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres i1 i2 res c c1' c2' accu l1' l2'
159151 {
160152 with gi1 gi2 gres c c1' c2' accu l1 l2 .
161- assert ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres true gi1 gi2 gres c c1' c2' accu l1 l2 );
162- unfold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres true gi1 gi2 gres c c1' c2' accu l1 l2 );
153+ fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gi1 gi2 gres c c1' c2' accu l1 l2 );
154+ unfold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gi1 gi2 gres c c1' c2' accu l1 l2 );
163155 let prf_res : squash ( gres == true ) = ();
164156 S. pts_to_len a ;
165157 SM. seq_list_match_length vmatch c accu ;
@@ -186,7 +178,7 @@ requires
186178 Trade. elim ( vmatch x2 ( List.Tot. hd l2 ) ** _ ) _ ;
187179 if ( comp = 0s ) {
188180 pres := false ;
189- fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 (* pc pc1 pc2 *) pi1 pi2 pres false gi1 gi2 false c
181+ fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 (* pc pc1 pc2 *) pi1 pi2 pres gi1 gi2 false c
190182 c1'
191183 c2'
192184 accu
@@ -202,12 +194,11 @@ requires
202194 seq_helper_1 c1' x1 ;
203195 merge_aux_consume_1 vmatch c accu c1' l1 c2' l2 x1 ();
204196 Trade. trans _ _ ( SM. seq_list_match c1 l1_0 vmatch ** SM. seq_list_match c2 l2_0 vmatch );
205- let gcont' = Ghost . hide ( gres && not ( i1' ` size_eq ` gi2 || gi2 ` size_eq ` S. len a ));
206197 List.Tot. append_assoc accu l1 l2 ;
207198 List.Tot. append_assoc accu [ List.Tot. hd l1 ] ( List.Tot. tl l1 );
208199 List.Tot. append_assoc ( List.Tot. append accu [ List.Tot. hd l1 ]) ( List.Tot. tl l1 ) l2 ;
209200 merge_case_1 c x1 c1' c2' ;
210- fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gcont' i1' gi2 gres
201+ fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres i1' gi2 gres
211202 ( Seq. append c ( Seq. cons x1 Seq. empty ))
212203 ( Seq. tail c1' )
213204 c2'
@@ -230,13 +221,12 @@ requires
230221 pi2 := i2' ;
231222 merge_aux_consume_2 vmatch c accu c1' l1 c2' l2 x2 ();
232223 Trade. trans _ _ ( SM. seq_list_match c1 l1_0 vmatch ** SM. seq_list_match c2 l2_0 vmatch );
233- let gcont' = Ghost . hide ( gres && not ( i1' ` size_eq ` i2' || i2' ` size_eq ` S. len a ));
234224 List.Tot. append_assoc l1 [ List.Tot. hd l2 ] ( List.Tot. tl l2 );
235225 List.Tot. append_assoc accu ( List.Tot. append l1 [ List.Tot. hd l2 ]) ( List.Tot. tl l2 );
236226 List.Tot. append_assoc accu l1 [ List.Tot. hd l2 ];
237227 List.Tot. append_assoc accu [ List.Tot. hd l2 ] l1 ;
238228 List.Tot. append_assoc ( List.Tot. append accu [ List.Tot. hd l2 ]) l1 ( List.Tot. tl l2 );
239- fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres gcont' i1' i2' gres
229+ fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres i1' i2' gres
240230 ( Seq. append c ( Seq. cons x2 Seq. empty ))
241231 c1'
242232 ( Seq. tail c2' )
@@ -247,8 +237,8 @@ requires
247237 }
248238 };
249239 with i1 i2 res c c1' c2' accu l1' l2' .
250- assert ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres false i1 i2 res c c1' c2' accu l1' l2' );
251- unfold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres false i1 i2 res c c1' c2' accu l1' l2' );
240+ fold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres i1 i2 res c c1' c2' accu l1' l2' );
241+ unfold ( merge_invariant vmatch compare a c1 c2 l1_0 l2_0 pi1 pi2 pres i1 i2 res c c1' c2' accu l1' l2' );
252242 SM. seq_list_match_append_intro_trade vmatch c1' l1' c2' l2' ;
253243 List.Tot. append_length l1' l2' ;
254244 Trade. trans_hyp_r ( SM. seq_list_match c accu vmatch ) ( SM. seq_list_match ( Seq. append c1' c2' ) ( List.Tot. append l1' l2' ) vmatch ) ( SM. seq_list_match c1' l1' vmatch ** SM. seq_list_match c2' l2' vmatch ) _ ;
0 commit comments