Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: substitution of binding guards does not crash if splits present #2968

Merged
merged 19 commits into from
Nov 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
4dc0827
Add test for issue #2748
MikaelMayer Nov 1, 2022
3b656e8
Fix: substitution of binding guards does not crash if splits present
MikaelMayer Nov 1, 2022
ae3ccca
Removed useless parameter
MikaelMayer Nov 1, 2022
8048867
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 2, 2022
493c519
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 2, 2022
803ab4f
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 2, 2022
42a5512
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 3, 2022
c88a2cb
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 3, 2022
ae9b6dd
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 3, 2022
8be7cda
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 3, 2022
a074883
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 4, 2022
7229954
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 7, 2022
74a4e20
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 7, 2022
5e73d5d
Refactoring to make it more understandable
MikaelMayer Nov 9, 2022
e50aded
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 10, 2022
1ff80f2
More general solution
MikaelMayer Nov 10, 2022
c70089a
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 10, 2022
a491a97
Merge branch 'master' into fix-2748-split-quantifier-substitute
MikaelMayer Nov 10, 2022
d9ff89e
Merge branch 'master' into fix-2748-split-quantifier-substitute
keyboardDrummer Nov 14, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Source/DafnyCore/Triggers/QuantifierSplitter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ protected override void VisitOneExpr(Expression expr) {
splits[quantifier] = SplitQuantifier(quantifier).ToList();
}
}

if (expr is ITEExpr iteExpr && iteExpr.IsBindingGuard) {
splits.Remove((ExistsExpr)iteExpr.Test);
}
}

protected override void VisitOneStmt(Statement stmt) {
Expand All @@ -119,6 +123,10 @@ protected override void VisitOneStmt(Statement stmt) {
}
}
}

if (stmt is IfStmt ifStatement && ifStatement.IsBindingGuard) {
splits.Remove((ExistsExpr)ifStatement.Guard);
}
}

/// <summary>
Expand Down
21 changes: 21 additions & 0 deletions Test/git-issues/git-issue-2748.dfy
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// RUN: %dafny_0 /compile:0 "%s" > "%t"
// RUN: %diff "%s.expect" "%t"

function method f(x: int): int { 10 - x * x }

function method BindingGuardTestStmt(): int {
var x: nat := 1;
assert true by {
if i :| 0 <= i < 10 && (f(i) == f(i+1) || f(i) == f(i+2)) {
}
}
2
}

function method BindingGuardTestExpr(): int {
var x: nat := 1;
assert true by {
var x := if i :| 0 <= i < 10 && (f(i) == f(i+1) || f(i) == f(i+2)) then 1 else 0;
}
2
}
2 changes: 2 additions & 0 deletions Test/git-issues/git-issue-2748.dfy.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

Dafny program verifier finished with 2 verified, 0 errors
1 change: 1 addition & 0 deletions docs/dev/news/2748.fix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
substitution of binding guards does not crash if splits present