Skip to content

Commit

Permalink
Merge pull request #21 from JetBrains-Research/6th-mode
Browse files Browse the repository at this point in the history
6th mode
  • Loading branch information
alex28sh authored Jan 6, 2025
2 parents 854a5b4 + 692d7ee commit c1e8ddb
Show file tree
Hide file tree
Showing 54 changed files with 1,160 additions and 42 deletions.
2 changes: 1 addition & 1 deletion prompts/humaneval-nagini-few-shot/ask_for_fixed.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The following errors occurred during verification:
{error}

Please fix the error by adding, removing or modifying the invariants and return the fixed program.
Please fix the error by adding, removing or modifying the invariants and asserts and return the fixed program.
Don't add any additional text comments, your response must contain only program with invariants.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
The following errors occurred during verification:
{error}

Please fix the error by adding, removing or modifying the preconditions, postconditions, invariants or assertions and return the fixed program.
You should not modify implementation and helper functions.
Don't add any additional text comments, your response must contain only program with invariants.
Remember, your preconditions, postconditions and implementations should be aligned with text description.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
There are still some errors:
{error}

Please fix the error by adding, removing or modifying the preconditions, postconditions, invariants or assertions and return the fixed program.
You should not modify implementation and helper functions.
Don't add any additional text comments, your response must contain only program with invariants.
Remember, your preconditions, postconditions and implementations should be aligned with text description.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
We detected an improper usage of helper functions. Here is the list of helper functions used in a wrong way:
{invalid_helpers}
You should use helper functions only in invariants, asserts and conditions (in `if` or `while` conditions), not in the plain code.
The following helper functions you can use anywhere: {helpers}.
We replaced all improper usages with `invalid_call()` and got the following program:
{program}
You should rewrite this program without changing helper functions (denoted with @Pure).
After rewriting your code should verify.
Your code should not contain any `invalid_call()` invocations.
80 changes: 80 additions & 0 deletions prompts/humaneval-nagini-without-conditions-few-shot/rewrite.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
Rewrite the following Nagini code. It does not contain any preconditions, postconditions, invariants, or assertions. Rewrite the program to add those in a way that makes it verify.
Do not change the code, only add invariants, assertions and conditions. Don't remove any helper functions, they are there to help you.
Ensure that the invariants are as comprehensive as they can be.
Even if you think some invariant is not totally necessary, better add it than not.
Don't add any additional text comments, your response must contain only program with invariants.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.


You remember the following aspects of Nagini syntax:

1. Nagini DOES NOT SUPPORT some Python features as list comprehensions (k + 1 for k in range(5)), as double inequalities (a <= b <= c).
Instead of double inequalities it's customary to use two separate inequalities (a <= b and b <= c).

2. In Nagini method preconditions (Requires) and postconditions (Ensures) placed right after method signature, like here:
"
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))
Ensures(Acc(list_pred(a)))
...
"

3. Invariant are placed right after `while` statement and before the code of `while` body:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
s = s + numbers[i]
"
Invariants CANNOT be placed in any other position.
You remember that each invariant (and each expression) should contain equal number of opening and closing brackets, so that it is valid.
You should sustain balanced parentheses.

4. Nagini requires special annotations for working with lists `Acc(list_pred(..))`. You can use these constructs only inside `Invariant`,
anywhere else you should not use `Acc()` or `list_pred()`:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
"

5. Nagini contains `Forall` and `Exists` constructs that can be used in invariants. First argument of Forall/Exists is typically a type (i.e `int`),
second argument is a lambda. `Forall(type, lambda x : a)` denotes that assertion `a` is true for every element `x` of type `type`.

6. In Nagini `Implies(e1, a2)` plays role of implication. `Implies(e1, a2)` denotes that assertion a2 holds if boolean expression e1 is true.
You can use it inside invariants and asserts.

You might need to work with accumulating functions, such as sum, so here's an example of how to do that:
```
from typing import cast, List, Dict, Set, Optional, Union
from nagini_contracts.contracts import *

@Pure
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))

if s == t:
return 0
else:
return (a)[t - 1] + (Sum(a, s, t - 1))

def sum_loop(numbers: List[int]) -> int:
Requires(Acc(list_pred(numbers)))
Ensures(Acc(list_pred(numbers)))
Ensures(Result() == Sum(numbers, 0, len(numbers)))
s = int(0)
i = int(0)
while (i) < (len(numbers)):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
Invariant(Forall(int, lambda d_1_p_:
(Implies(0 <= d_1_p_ and d_1_p_ < len(numbers), Sum(numbers, 0, d_1_p_ + 1) == Sum(numbers, 0, d_1_p_) + numbers[d_1_p_]), [[Sum(numbers, 0, d_1_p_ + 1)]])))
Invariant(s == Sum(numbers, 0, i))
Assert(Sum(numbers, 0, i + 1) == Sum(numbers, 0, i) + numbers[i])
s = s + (numbers)[i]
i = i + 1
return s
```
The program:
{program}
4 changes: 4 additions & 0 deletions prompts/humaneval-nagini-without-conditions-few-shot/sys.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
You are an expert in a Python verification framework Nagini.
You will be given tasks dealing with Python programs including precise annotations.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
You respond only with code blocks.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The verifier timed out during the verification.
This usually means that the provided invariants were too broad or were difficult to check.
Could you please try to improve the invariants and try again?
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
The following errors occurred during verification:
{error}

Please fix the error by adding, removing or modifying the preconditions, postconditions, helpers, implementations, invariants or assertions and return the fixed program.
Don't add any additional text comments, your response must contain only program with invariants.
Remember, your preconditions, postconditions and implementations should be aligned with text description.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
There are still some errors:
{error}

Please fix the error by adding, removing or modifying the helpers, preconditions, postconditions, implementations, invariants or assertions and return the fixed program.
Don't add any additional text comments, your response must contain only program with invariants.
Remember, your preconditions, postconditions and implementations should be aligned with text description.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
2 changes: 2 additions & 0 deletions prompts/humaneval-nagini-without-helpers-few-shot/helpers.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Generally, you should use helper functions (marked with @Pure annotation) only in invariants, asserts and conditions (in `if` or `while` conditions), not in the plain code.
But, the following helper functions you can use anywhere: {helpers}.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
We detected an improper usage of helper functions. Here is the list of helper functions used in a wrong way:
{invalid_helpers}
You should use helper functions only in invariants, asserts and conditions (in `if` or `while` conditions), not in the plain code.
The following helper functions you can use anywhere: {helpers}.
We replaced all improper usages with `invalid_call()` and got the following program:
{program}
You should rewrite this program, so that pre/postconditions will correspond text description.
After rewriting your code should verify.
Your code should not contain any `invalid_call()` invocations.
86 changes: 86 additions & 0 deletions prompts/humaneval-nagini-without-helpers-few-shot/rewrite.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
The following Nagini code contains no implementations of functions, pre/postconditions, invariants and assertions.
Using text description you should add implementations and relevant pre/postconditions. Prefer loops to recursion. You should also add invariants/assertions and helper functions (annotated with @Pure).
Use helper functions only in preconditions, postconditions, invariants, assertions and conditions (in `if` or `while` conditions). Don't use helpers in the plain code.
Ensure that the invariants are as comprehensive as they can be.
Even if you think some invariant is not totally necessary, better add it than not.
Don't add any additional text comments, your response must contain only program with invariants, helpers and pre/postconditions.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.


You remember the following aspects of Nagini syntax:

1. Nagini DOES NOT SUPPORT some Python features as list comprehensions (k + 1 for k in range(5)), as double inequalities (a <= b <= c).
Instead of double inequalities it's customary to use two separate inequalities (a <= b and b <= c).

2. In Nagini method preconditions (Requires) and postconditions (Ensures) placed right after method signature, like here:
"
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))
Ensures(Acc(list_pred(a)))
...
"

3. Invariant are placed right after `while` statement and before the code of `while` body:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
s = s + numbers[i]
"
Invariants CANNOT be placed in any other position.
You remember that each invariant (and each expression) should contain equal number of opening and closing brackets, so that it is valid.
You should sustain balanced parentheses.

4. Nagini requires special annotations for working with lists `Acc(list_pred(..))`. You can use these constructs only inside `Invariant`,
anywhere else you should not use `Acc()` or `list_pred()`:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
"

5. Nagini contains `Forall` and `Exists` constructs that can be used in invariants. First argument of Forall/Exists is typically a type (i.e `int`),
second argument is a lambda. `Forall(type, lambda x : a)` denotes that assertion `a` is true for every element `x` of type `type`.

6. In Nagini `Implies(e1, a2)` plays role of implication. `Implies(e1, a2)` denotes that assertion a2 holds if boolean expression e1 is true.
You can use it inside invariants and asserts.

You might need to work with accumulating functions, such as sum, so here's an example of how to do that:
```
from typing import cast, List, Dict, Set, Optional, Union
from nagini_contracts.contracts import *

@Pure
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))

if s == t:
return 0
else:
return (a)[t - 1] + (Sum(a, s, t - 1))

def sum_loop(numbers: List[int]) -> int:
Requires(Acc(list_pred(numbers)))
Ensures(Acc(list_pred(numbers)))
Ensures(Result() == Sum(numbers, 0, len(numbers)))
s = int(0)
i = int(0)
while (i) < (len(numbers)):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
Invariant(Forall(int, lambda d_1_p_:
(Implies(0 <= d_1_p_ and d_1_p_ < len(numbers), Sum(numbers, 0, d_1_p_ + 1) == Sum(numbers, 0, d_1_p_) + numbers[d_1_p_]), [[Sum(numbers, 0, d_1_p_ + 1)]])))
Invariant(s == Sum(numbers, 0, i))
Assert(Sum(numbers, 0, i + 1) == Sum(numbers, 0, i) + numbers[i])
s = s + (numbers)[i]
i = i + 1
return s
```

To help you, here's a text description given to a person who wrote this program:

{text_description}

The program:
{program}
4 changes: 4 additions & 0 deletions prompts/humaneval-nagini-without-helpers-few-shot/sys.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
You are an expert in a Python verification framework Nagini.
You will be given tasks dealing with Python programs including precise annotations.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
You respond only with code blocks.
3 changes: 3 additions & 0 deletions prompts/humaneval-nagini-without-helpers-few-shot/timeout.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The verifier timed out during the verification.
This usually means that the provided invariants were too broad or were difficult to check.
Could you please try to improve the invariants and try again?
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
The following errors occurred during verification:
{error}

Please fix the error by adding, removing or modifying the implementation, preconditions, postconditions, invariants or assertions and return the fixed program.
You should not modify any helper functions (annotated with @Pure), remember they are here to help you with verification.
Don't add any additional text comments, your response must contain only program with invariants.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
There are still some errors:
{error}

Please fix the error by adding, removing or modifying the preconditions, postconditions, implementations, invariants or assertions and return the fixed program.
Don't add any additional text comments, your response must contain only program with invariants.
Remember, your preconditions, postconditions and implementations should be aligned with text description.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Generally, you should use helper functions (marked with @Pure annotation) only in invariants, asserts and conditions (in `if` or `while` conditions), not in the plain code.
But, the following helper functions you can use anywhere: {helpers}.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
We detected an improper usage of helper functions. Here is the list of helper functions used in a wrong way:
{invalid_helpers}
You should use helper functions only in invariants, asserts and conditions (in `if` or `while` conditions), not in the plain code.
The following helper functions you can use anywhere: {helpers}.
We replaced all improper usages with `invalid_call()` and got the following program:
{program}
You should rewrite this program without changing pre/postconditions and helper functions (denoted with @Pure).
After rewriting your code should verify.
Your code should not contain any `invalid_call()` invocations.
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
The following Nagini code contains no implementations of functions, pre/postconditions, invariants and assertions.
Using text description and helper functions you should add implementations and relevant pre/postconditions. Prefer loops to recursion. You should also add invariants/assertions.
Use helper functions only in preconditions, postconditions, invariants, asserts and conditions (in `if` or `while` conditions). Don't use helpers in the plain code.
Do not change helper functions.
Add code and invariants to other functions.
Ensure that the invariants are as comprehensive as they can be.
Even if you think some invariant is not totally necessary, better add it than not.
Don't add any additional text comments, your response must contain only program with invariants.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.


You remember the following aspects of Nagini syntax:

1. Nagini DOES NOT SUPPORT some Python features as list comprehensions (k + 1 for k in range(5)), as double inequalities (a <= b <= c).
Instead of double inequalities it's customary to use two separate inequalities (a <= b and b <= c).

2. In Nagini method preconditions (Requires) and postconditions (Ensures) placed right after method signature, like here:
"
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))
Ensures(Acc(list_pred(a)))
...
"

3. Invariant are placed right after `while` statement and before the code of `while` body:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
s = s + numbers[i]
"
Invariants CANNOT be placed in any other position.
You remember that each invariant (and each expression) should contain equal number of opening and closing brackets, so that it is valid.
You should sustain balanced parentheses.

4. Nagini requires special annotations for working with lists `Acc(list_pred(..))`. You can use these constructs only inside `Invariant`,
anywhere else you should not use `Acc()` or `list_pred()`:
"
while i < len(numbers):
Invariant(Acc(list_pred(numbers)))
"

5. Nagini contains `Forall` and `Exists` constructs that can be used in invariants. First argument of Forall/Exists is typically a type (i.e `int`),
second argument is a lambda. `Forall(type, lambda x : a)` denotes that assertion `a` is true for every element `x` of type `type`.

6. In Nagini `Implies(e1, a2)` plays role of implication. `Implies(e1, a2)` denotes that assertion a2 holds if boolean expression e1 is true.
You can use it inside invariants and asserts.

You might need to work with accumulating functions, such as sum, so here's an example of how to do that:
```
from typing import cast, List, Dict, Set, Optional, Union
from nagini_contracts.contracts import *

@Pure
def Sum(a : List[int], s : int, t : int) -> int :
Requires(Acc(list_pred(a)))
Requires(((0) <= (s)) and ((s) <= (t)) and ((t) <= (len(a))))

if s == t:
return 0
else:
return (a)[t - 1] + (Sum(a, s, t - 1))

def sum_loop(numbers: List[int]) -> int:
Requires(Acc(list_pred(numbers)))
Ensures(Acc(list_pred(numbers)))
Ensures(Result() == Sum(numbers, 0, len(numbers)))
s = int(0)
i = int(0)
while (i) < (len(numbers)):
Invariant(Acc(list_pred(numbers)))
Invariant(0 <= i and i <= len(numbers))
Invariant(Forall(int, lambda d_1_p_:
(Implies(0 <= d_1_p_ and d_1_p_ < len(numbers), Sum(numbers, 0, d_1_p_ + 1) == Sum(numbers, 0, d_1_p_) + numbers[d_1_p_]), [[Sum(numbers, 0, d_1_p_ + 1)]])))
Invariant(s == Sum(numbers, 0, i))
Assert(Sum(numbers, 0, i + 1) == Sum(numbers, 0, i) + numbers[i])
s = s + (numbers)[i]
i = i + 1
return s
```

To help you, here's a text description given to a person who wrote this program:

{text_description}

The program:
{program}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
You are an expert in a Python verification framework Nagini.
You will be given tasks dealing with Python programs including precise annotations.
Do not provide ANY explanations. Don't include markdown backticks. Respond only in Python code, nothing else.
You respond only with code blocks.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The verifier timed out during the verification.
This usually means that the provided invariants were too broad or were difficult to check.
Could you please try to improve the invariants and try again?
Loading

0 comments on commit c1e8ddb

Please sign in to comment.