Skip to content

Commit f1ad7a1

Browse files
committed
task 14
1 parent 9f555fe commit f1ad7a1

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

tasks/human_eval_014.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,56 @@ use vstd::prelude::*;
99

1010
verus! {
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!
1564
fn main() {}

0 commit comments

Comments
 (0)