@@ -9,7 +9,56 @@ use vstd::prelude::*;
99
1010verus ! {
1111
12- // TODO: Put your solution (the specification, implementation, and proof) to the task here
12+ #[ verifier:: loop_isolation( false ) ]
13+ fn all_prefixes( s: & Vec <u8 >) -> ( prefixes: Vec <Vec <u8 >>)
14+ ensures
15+ prefixes. len( )
16+ == s. len( ) ,
17+ // forall|i: int| 0 <= i < s.len() ==> prefixes[i]@ == [email protected] (0, i), 18+
19+ {
20+ let mut prefixes: Vec <Vec <u8 >> = vec![ ] ;
21+ let mut prefix = vec![ ] ;
22+ assert( forall|i: int|
23+ #![ auto]
24+ 0 <= i < prefix. len( ) ==> prefix@. index( i) == prefix@. subrange(
25+ 0 ,
26+ prefix. len( ) as int,
27+ ) . index( i) ) ;
28+
29+ assert( prefix@ == prefix@. subrange( 0 , 0 ) ) ;
30+ assert( forall|i: int|
31+ #![ auto]
32+ 0 <= i < prefix. len( ) ==> prefix@. index( i) == s@. subrange( 0 , prefix. len( ) as int) . index( i) ) ;
33+ assert( prefix@ == s@. subrange( 0 , 0 ) ) ;
34+ for i in 0 ..s. len( )
35+ invariant
36+ prefixes. len( ) == i,
37+ prefix. len( ) == i,
38+ forall|j: int| #![ auto] 0 <= j < i ==> prefixes[ j] @ == s@. subrange( 0 , j) ,
39+ prefix@ == s@. subrange( 0 , i as int) ,
40+ prefix@ == prefix@. subrange( 0 , i as int) ,
41+ {
42+ prefixes. push( prefix. clone( ) ) ;
43+
44+ let ghost pre_prefix = prefix;
45+ prefix. push( s[ i] ) ;
46+ assert( pre_prefix@. subrange( 0 , i as int) == pre_prefix@ && prefix@. subrange( 0 , i as int)
47+ == pre_prefix@. subrange( 0 , i as int) ) ;
48+ assert( prefix@. subrange( 0 , i as int) == s@. subrange( 0 , i as int) ) ;
49+ assert( prefix[ i as int] == s@. subrange( 0 , i + 1 ) . index( i as int) ) ;
50+
51+ assert( forall|j: int|
52+ #![ auto]
53+ 0 <= j < i + 1 ==> prefix@. index( j) == prefix@. subrange( 0 , ( i + 1 ) as int) . index( j) ) ;
54+ assert( prefix@ == prefix@. subrange( 0 , ( i + 1 ) as int) ) ;
55+ assert( forall|j: int|
56+ #![ auto]
57+ 0 <= j < i + 1 ==> prefix@. index( j) == s@. subrange( 0 , ( i + 1 ) as int) . index( j) ) ;
58+ assert( prefix@ == s@. subrange( 0 , ( i + 1 ) as int) ) ;
59+ }
60+ return prefixes;
61+ }
1362
1463} // verus!
1564fn main ( ) { }
0 commit comments