-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rework postprocessing, add rewrite step
- Loading branch information
Showing
10 changed files
with
198 additions
and
29 deletions.
There are no files selected for viewing
83 changes: 83 additions & 0 deletions
83
prompts/humaneval-dafny-cot/rewrite/examples/001/answer.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
During the previous steps, we've found that the `sum_loop` function has a loop that goes over the elements of the array `numbers` and adds them to the `s` variable, which is equal to the `sum(numbers[..i])` for all `i`, such that `0 <= i <= |numbers|`. This means that during the execution of the loop the following invariant holds: | ||
1. `0 <= i <= |numbers|` | ||
2. `s == sum(numbers[..i])` | ||
|
||
Let's put them in: | ||
```dafny | ||
method sum_loop(numbers: seq<int>) returns (s: int) | ||
ensures s == sum(numbers) | ||
{ | ||
s := 0; | ||
var i := 0; | ||
while (i < |numbers|) | ||
invariant 0 <= i <= |numbers| | ||
invariant s == sum(numbers[..i]) | ||
{ | ||
s := s + numbers[i]; | ||
|
||
i := i + 1; | ||
} | ||
} | ||
``` | ||
|
||
We've also worked out how to prove the second invariant. For that we need to prove to the verifier that `sum(numbers[..i + 1]) == sum(numbers[..i]) + numbers[i]`. For that we need to use the `sum_prop` function, as follows: | ||
```dafny | ||
assert numbers[..i + 1][..i] == numbers[..i]; // assert that taking a slice of a slice is the same as taking a slice of the original array | ||
sum_prop(numbers[..i + 1]); // use a lemma to prove the invariant | ||
assert sum(numbers[..i + 1]) == sum(numbers[..i + 1][..i]) + numbers[i]; | ||
``` | ||
Let's add these lines to the code: | ||
```dafny | ||
method sum_loop(numbers: seq<int>) returns (s: int) | ||
ensures s == sum(numbers) | ||
{ | ||
s := 0; | ||
var i := 0; | ||
while (i < |numbers|) | ||
invariant 0 <= i <= |numbers| | ||
invariant s == sum(numbers[..i]) | ||
{ | ||
s := s + numbers[i]; | ||
|
||
assert numbers[..i + 1][..i] == numbers[..i]; // assert that taking a slice of a slice is the same as taking a slice of the original array | ||
sum_prop(numbers[..i + 1]); // use a lemma to prove the invariant | ||
assert sum(numbers[..i + 1]) == sum(numbers[..i + 1][..i]) + numbers[i]; | ||
|
||
i := i + 1; | ||
} | ||
} | ||
``` | ||
|
||
Other than that, we didn't find any other invariants or patterns that hold during the execution of the program. Therefore, the resulting program is (notice the lack of backticks): | ||
<answer> | ||
function sum(s: seq<int>) : int { | ||
if |s| == 0 then 0 else s[0] + sum(s[1..]) | ||
} | ||
|
||
lemma sum_prop(s: seq<int>) | ||
requires |s| > 0 | ||
ensures sum(s) == sum(s[..|s| - 1]) + s[ |s| - 1 ] | ||
{ | ||
if (|s| > 1) { | ||
assert (s[1..][..|s[1..]| - 1]) == s[1..|s| - 1]; | ||
} | ||
} | ||
method sum_loop(numbers: seq<int>) returns (s: int) | ||
ensures s == sum(numbers) | ||
{ | ||
s := 0; | ||
var i := 0; | ||
while (i < |numbers|) | ||
invariant 0 <= i <= |numbers| | ||
invariant s == sum(numbers[..i]) | ||
{ | ||
s := s + numbers[i]; | ||
|
||
assert numbers[..i + 1][..i] == numbers[..i]; // assert that taking a slice of a slice is the same as taking a slice of the original array | ||
sum_prop(numbers[..i + 1]); // use a lemma to prove the invariant | ||
assert sum(numbers[..i + 1]) == sum(numbers[..i + 1][..i]) + numbers[i]; | ||
|
||
i := i + 1; | ||
} | ||
} | ||
</answer> |
28 changes: 28 additions & 0 deletions
28
prompts/humaneval-dafny-cot/rewrite/examples/001/question.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
It's time to rewrite the program to contain the invariants and assertions that we've found. Work on the following program and go step by step through the reasoning process. After that, output the rewritten program in the `<answer>` tag without backticks. | ||
|
||
```dafny | ||
function sum(s: seq<int>) : int { | ||
if |s| == 0 then 0 else s[0] + sum(s[1..]) | ||
} | ||
|
||
lemma sum_prop(s: seq<int>) | ||
requires |s| > 0 | ||
ensures sum(s) == sum(s[..|s| - 1]) + s[ |s| - 1 ] | ||
{ | ||
if (|s| > 1) { | ||
assert (s[1..][..|s[1..]| - 1]) == s[1..|s| - 1]; | ||
} | ||
} | ||
method sum_loop(numbers: seq<int>) returns (s: int) | ||
ensures s == sum(numbers) | ||
{ | ||
s := 0; | ||
var i := 0; | ||
while (i < |numbers|) | ||
{ | ||
s := s + numbers[i]; | ||
|
||
i := i + 1; | ||
} | ||
} | ||
``` |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters