Skip to content

Commit 0045f49

Browse files
committed
task 14
1 parent 9f555fe commit 0045f49

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

tasks/human_eval_014.rs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,54 @@ 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() == 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!
1562
fn main() {}

0 commit comments

Comments
 (0)