Skip to content

Commit ab21fe2

Browse files
committed
fix while loops onow require a decreases clause
1 parent 25afa53 commit ab21fe2

File tree

6 files changed

+14
-2
lines changed

6 files changed

+14
-2
lines changed

tasks/human_eval_034.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,15 @@ fn sort_seq(s: &Vec<i32>) -> (ret: Vec<i32>)
9090
forall|j: int, k: int|
9191
0 <= j < i <= k < sorted@.len() ==> sorted@.index(j) <= sorted@.index(k),
9292
sorted@.len() == s@.len(),
93+
decreases (sorted.len() - i),
9394
{
9495
let mut min_index: usize = i;
9596
let mut j: usize = i + 1;
9697
while j < sorted.len()
9798
invariant
9899
i <= min_index < j <= sorted.len(),
99100
forall|k: int| i <= k < j ==> sorted@.index(min_index as int) <= sorted@.index(k),
101+
decreases (sorted.len() - j),
100102
{
101103
if sorted[j] < sorted[min_index] {
102104
min_index = j;

tasks/human_eval_043.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ fn pairs_sum_to_zero(nums: &[i32], target: i32) -> (found: bool)
2525
invariant
2626
0 <= i <= nums.len(),
2727
forall|u: int, v: int| 0 <= u < v < nums.len() && u < i ==> nums[u] + nums[v] != target,
28+
decreases nums.len() - i,
2829
{
2930
let mut j = i + 1;
3031
while j < nums.len()
@@ -33,6 +34,7 @@ fn pairs_sum_to_zero(nums: &[i32], target: i32) -> (found: bool)
3334
forall|u: int, v: int|
3435
0 <= u < v < nums.len() && u < i ==> nums[u] + nums[v] != target,
3536
forall|u: int| i < u < j ==> nums[i as int] + nums[u] != target,
37+
decreases nums.len() - j,
3638
{
3739
if nums[i] + nums[j] == target {
3840
return true;

tasks/human_eval_070.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,15 @@ fn sort_seq(s: &Vec<i32>) -> (ret: Vec<i32>)
8989
forall|j: int, k: int|
9090
0 <= j < i <= k < sorted@.len() ==> sorted@.index(j) <= sorted@.index(k),
9191
sorted@.len() == s@.len(),
92+
decreases sorted.len() - i,
9293
{
9394
let mut min_index: usize = i;
9495
let mut j: usize = i + 1;
9596
while j < sorted.len()
9697
invariant
9798
i <= min_index < j <= sorted.len(),
9899
forall|k: int| i <= k < j ==> sorted@.index(min_index as int) <= sorted@.index(k),
100+
decreases sorted.len() - j,
99101
{
100102
if sorted[j] < sorted[min_index] {
101103
min_index = j;
@@ -144,6 +146,7 @@ fn strange_sort_list_helper(s: &Vec<i32>) -> (ret: (Vec<i32>, Vec<i32>))
144146
0 < j < i && j % 2 == 1 ==> strange@.index(j) == sorted@.index(
145147
sorted@.len() - (j / 2) - 1,
146148
),
149+
decreases sorted.len() - i,
147150
{
148151
if i % 2 == 0 {
149152
strange.push(sorted[i / 2]);

tasks/human_eval_075.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ fn checked_mul_thrice(x: u32, y: u32, z: u32) -> (ret: Option<u32>)
4040
{
4141
// x,y,z == 0 done separately to invoke lemma_mul_increases which requires x > 0
4242
if (x == 0 || y == 0 || z == 0) {
43+
assert (0 == x * y * z);
4344
return Some(0);
4445
}
4546
assert(x > 0 && y > 0 && z > 0);
@@ -76,6 +77,7 @@ fn is_multiply_prime(x: u32) -> (ans: bool)
7677
(spec_prime(i) && spec_prime(j) && spec_prime(k) && i <= a && j <= x && k <= x)
7778
==> x != i * j * k,
7879
a <= x,
80+
decreases x - a,
7981
{
8082
a += 1;
8183
if prime(a) {
@@ -88,6 +90,7 @@ fn is_multiply_prime(x: u32) -> (ans: bool)
8890
spec_prime(a as int),
8991
a <= x,
9092
b <= x,
93+
decreases x - b,
9194
{
9295
b += 1;
9396
if prime(b) {
@@ -100,6 +103,7 @@ fn is_multiply_prime(x: u32) -> (ans: bool)
100103
a <= x,
101104
b <= x,
102105
c <= x,
106+
decreases x - c,
103107
{
104108
c += 1;
105109
let prod = checked_mul_thrice(a, b, c);

tasks/human_eval_134.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use vstd::prelude::*;
99

1010
verus! {
1111

12-
pub spec fn is_alphabetic(c: char) -> (result: bool);
12+
pub uninterp spec fn is_alphabetic(c: char) -> (result: bool);
1313

1414
#[verifier::external_fn_specification]
1515
#[verifier::when_used_as_spec(is_alphabetic)]
@@ -20,7 +20,7 @@ pub fn ex_is_alphabetic(c: char) -> (result: bool)
2020
c.is_alphabetic()
2121
}
2222

23-
pub spec fn is_whitespace(c: char) -> (result: bool);
23+
pub uninterp spec fn is_whitespace(c: char) -> (result: bool);
2424

2525
#[verifier::external_fn_specification]
2626
#[verifier::when_used_as_spec(is_whitespace)]

tasks/human_eval_136.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fn largest_smallest_integers(arr: &Vec<i32>) -> (res: (Option<i32>, Option<i32>)
3737
b.is_none() ==> forall|j: int| 0 <= j < i ==> arr@[j] <= 0,
3838
b.is_some() ==> arr@.contains(b.unwrap()) && b.unwrap() > 0,
3939
b.is_some() ==> forall|j: int| 0 <= j < i && arr@[j] > 0 ==> arr@[j] >= b.unwrap(),
40+
decreases arr.len() - i,
4041
{
4142
if arr[i] < 0 && (a.is_none() || arr[i] >= a.unwrap()) {
4243
a = Some(arr[i]);

0 commit comments

Comments
 (0)