@@ -9,7 +9,54 @@ 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( ) == s. len( ) ,
16+ forall|i: int| #![ auto] 0 <= i < s. len( ) ==> prefixes[ i] @ == s@. subrange( 0 , i + 1 ) ,
17+ {
18+ let mut prefixes: Vec <Vec <u8 >> = vec![ ] ;
19+ let mut prefix = vec![ ] ;
20+ assert( forall|i: int|
21+ #![ auto]
22+ 0 <= i < prefix. len( ) ==> prefix@. index( i) == prefix@. subrange(
23+ 0 ,
24+ prefix. len( ) as int,
25+ ) . index( i) ) ;
26+
27+ assert( prefix@ == prefix@. subrange( 0 , 0 ) ) ;
28+ assert( forall|i: int|
29+ #![ auto]
30+ 0 <= i < prefix. len( ) ==> prefix@. index( i) == s@. subrange( 0 , prefix. len( ) as int) . index( i) ) ;
31+ assert( prefix@ == s@. subrange( 0 , 0 ) ) ;
32+ for i in 0 ..s. len( )
33+ invariant
34+ prefixes. len( ) == i,
35+ prefix. len( ) == i,
36+ forall|j: int| #![ auto] 0 <= j < i ==> prefixes[ j] @ == s@. subrange( 0 , j + 1 ) ,
37+ prefix@ == s@. subrange( 0 , i as int) ,
38+ prefix@ == prefix@. subrange( 0 , i as int) ,
39+ {
40+ let ghost pre_prefix = prefix;
41+ prefix. push( s[ i] ) ;
42+ assert( pre_prefix@. subrange( 0 , i as int) == pre_prefix@ && prefix@. subrange( 0 , i as int)
43+ == pre_prefix@. subrange( 0 , i as int) ) ;
44+ assert( prefix@. subrange( 0 , i as int) == s@. subrange( 0 , i as int) ) ;
45+ assert( prefix[ i as int] == s@. subrange( 0 , i + 1 ) . index( i as int) ) ;
46+
47+ assert( forall|j: int|
48+ #![ auto]
49+ 0 <= j < i + 1 ==> prefix@. index( j) == prefix@. subrange( 0 , ( i + 1 ) as int) . index( j) ) ;
50+ assert( prefix@ == prefix@. subrange( 0 , ( i + 1 ) as int) ) ;
51+ assert( forall|j: int|
52+ #![ auto]
53+ 0 <= j < i + 1 ==> prefix@. index( j) == s@. subrange( 0 , ( i + 1 ) as int) . index( j) ) ;
54+ assert( prefix@ == s@. subrange( 0 , ( i + 1 ) as int) ) ;
55+
56+ prefixes. push( prefix. clone( ) ) ;
57+ }
58+ return prefixes;
59+ }
1360
1461} // verus!
1562fn main ( ) { }
0 commit comments