Skip to content

Commit a558d4e

Browse files
committed
Restore existing tasks to a verifying state with the latest version of
Verus. Largest change is adding decreases clauses.
1 parent 0e646ee commit a558d4e

27 files changed

+65
-14
lines changed

tasks/human_eval_005.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ pub fn intersperse(numbers: Vec<u64>, delimiter: u64) -> (result: Vec<u64>)
106106
result.len() == 2 * index,
107107
forall|i: int| 0 <= i < index ==> #[trigger] result[even(i)] == numbers[i],
108108
forall|i: int| 0 <= i < index ==> #[trigger] result[odd(i)] == delimiter,
109+
decreases numbers.len() - 1 - index,
109110
{
110111
result.push(numbers[index]);
111112
result.push(delimiter);

tasks/human_eval_013.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ fn compute_gcd(a: u64, b: u64) -> (g: u64)
4646
loop
4747
invariant
4848
gcd(a1 as nat, b1 as nat) == gcd(a as nat, b as nat),
49+
decreases b1,
4950
{
5051
if a1 == 0 {
5152
return b1;

tasks/human_eval_015.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ pub fn number_to_char_impl(n: u8) -> (char_vec: Vec<char>)
130130
while (i > 0)
131131
invariant
132132
number_to_char(n as nat) == number_to_char(i as nat).add(output@),
133+
decreases i,
133134
{
134135
let m = i % 10;
135136
let current = single_digit_number_to_char_impl(m);

tasks/human_eval_024.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use vstd::prelude::*;
1313
verus! {
1414

1515
pub open spec fn mul(a: nat, b: nat) -> nat {
16-
builtin::mul(a, b)
16+
vstd::prelude::mul(a, b)
1717
}
1818

1919
/// Specification for what it means for d to divide a
@@ -73,6 +73,7 @@ fn largest_divisor(n: u32) -> (ret: u32)
7373
n > 0,
7474
i < n,
7575
forall|k: u32| i < k < n ==> !divides(k as nat, n as nat),
76+
decreases i,
7677
{
7778
if n % i == 0 {
7879
assert(divides(i as nat, n as nat)) by {

tasks/human_eval_025.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ pub fn factorize(n: u8) -> (factorization: Vec<u8>)
326326
forall|i: nat, j: nat|
327327
(1 < i <= j < factorization.len()) ==> ((#[trigger] factorization[i as int] as nat)
328328
<= (#[trigger] factorization[j as int] as nat) <= m),
329+
decreases n + 2 - m, k,
329330
{
330331
if (k as u16 % m == 0) {
331332
assert(is_prime(m as nat)) by { lemma_first_divisor_is_prime(k as nat, m as nat) };
@@ -354,7 +355,10 @@ pub fn factorize(n: u8) -> (factorization: Vec<u8>)
354355
assert((k as int) == ((k as int) / (m as int)) * (m as int)) by {
355356
lemma_fundamental_div_mod(k as int, m as int)
356357
};
357-
358+
proof {
359+
// Prove that we're still making progress towards termination
360+
lemma_div_decreases(k as int, m as int);
361+
}
358362
k = k / m as u8;
359363
} else {
360364
m = m + 1;

tasks/human_eval_026.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fn count_frequency(elements: &Vec<i64>, key: i64) -> (frequency: usize)
3737
0 <= index <= elements.len(),
3838
0 <= counter <= index,
3939
count_frequency_spec(elements@.subrange(0, index as int), key) == counter,
40+
decreases elements.len() - index,
4041
{
4142
if (elements[index] == key) {
4243
counter += 1;

tasks/human_eval_028.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ fn concatenate_impl(strings: Vec<Vec<char>>) -> (joined: Vec<char>)
5151
strings.deep_view(),
5252
i as nat,
5353
),
54+
decreases strings.len() - i,
5455
{
5556
assert(concatenate(strings.deep_view()) == joined@ + strings[i as int]@ + concat_helper(
5657
strings.deep_view(),

tasks/human_eval_031.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ fn is_prime_impl(n: u8) -> (res: bool)
4646
invariant
4747
2 <= k <= n,
4848
res == is_prime_so_far(n as nat, k as nat),
49+
decreases n - k,
4950
{
5051
assert((is_prime_so_far(n as nat, k as nat) && (n as nat) % (k as nat) != 0)
5152
== is_prime_so_far(n as nat, (k + 1) as nat));

tasks/human_eval_033.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ fn sort_third(l: Vec<i32>) -> (l_prime: Vec<i32>)
103103
forall|i: int, j: int|
104104
0 <= i < pos_being_set_to_smallest && i < j < l_len && i % 3 == 0 && j % 3 == 0
105105
==> l_prime[i] <= l_prime[j],
106+
decreases l_len + 3 - pos_being_set_to_smallest,
106107
{
107108
// Iterate `pos_during_scan_for_smallest` by 3 from `pos_being_set_to_smallest`
108109
// to `l_len`. Keep track of the position of the smallest element found so far
@@ -125,6 +126,7 @@ fn sort_third(l: Vec<i32>) -> (l_prime: Vec<i32>)
125126
forall|i: int, j: int|
126127
0 <= i < pos_being_set_to_smallest && i < j < l_len && i % 3 == 0 && j % 3 == 0
127128
==> l_prime[i] <= l_prime[j],
129+
decreases l_len + 3 - pos_during_scan_for_smallest,
128130
{
129131
if l_prime[pos_during_scan_for_smallest] < l_prime[pos_of_smallest_found_so_far] {
130132
pos_of_smallest_found_so_far = pos_during_scan_for_smallest;

tasks/human_eval_055a.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ fn fib(n: u32) -> (ret: Option<u32>)
4545
None => spec_fib(n as nat) > u32::MAX,
4646
Some(f) => f == spec_fib(n as nat),
4747
},
48+
decreases n,
4849
{
4950
if n > 47 {
5051
proof {

0 commit comments

Comments
 (0)