Skip to content

Commit fa8114a

Browse files
authored
Fix VC Substitution (#259)
1 parent 076b8fa commit fa8114a

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VCSubstitution.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ private Optional<Substitution> findSubstitution(VCImplication implication) {
7575
if (implication == null)
7676
return Optional.empty();
7777

78-
Optional<Substitution> current = getSubstitution(implication);
78+
Optional<Substitution> current = containsVar(implication.getNext(), implication.getName())
79+
? getSubstitution(implication) : Optional.empty();
7980
if (current.isPresent())
8081
return current;
8182

@@ -120,4 +121,15 @@ private boolean containsVar(Expression expression, String name) {
120121
expression.getVariableNames(names);
121122
return names.contains(name);
122123
}
124+
125+
/**
126+
* Checks whether a VC suffix contains a variable name
127+
*/
128+
private boolean containsVar(VCImplication implication, String name) {
129+
for (VCImplication current = implication; current != null; current = current.getNext()) {
130+
if (containsVar(current.getRefinement().getExpression(), name))
131+
return true;
132+
}
133+
return false;
134+
}
123135
}

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/VCSubstitutionTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,17 @@ void preservesRemainingBinderAfterSubstitution() {
5353
}
5454

5555
@Test
56-
void removesSourceNodeWhenItIsLastInChain() {
56+
void keepsSourceNodeWhenItIsLastInChain() {
5757
VCImplication implication = vc("x > 0", "∀y:int. y == 1");
5858

59-
assertSimplificationSteps(substitution::apply, implication, chain(expect("x > 0")));
59+
assertSimplificationSteps(substitution::apply, implication, chain(expect("x > 0"), expect("y == 1")));
60+
}
61+
62+
@Test
63+
void keepsReturnBinderWhenConclusionIsSeparate() {
64+
VCImplication implication = vc("∀x:int. true", "∀#ret_8:int. #ret_8 == x + 1");
65+
66+
assertSimplificationSteps(substitution::apply, implication, chain(expect("true"), expect("#ret⁸ == x + 1")));
6067
}
6168

6269
@Test

0 commit comments

Comments
 (0)