Skip to content

Commit 935a168

Browse files
committed
VC Simplification Refactoring
1 parent d068108 commit 935a168

4 files changed

Lines changed: 41 additions & 65 deletions

File tree

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

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package liquidjava.rj_language.opt;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
3+
import static liquidjava.rj_language.opt.VCSimplificationUtils.containsVar;
4+
import static liquidjava.rj_language.opt.VCSimplificationUtils.isFalse;
5+
import static liquidjava.rj_language.opt.VCSimplificationUtils.isTrue;
56

67
import liquidjava.processor.SimplifiedVCImplication;
78
import liquidjava.processor.VCImplication;
89
import liquidjava.rj_language.Predicate;
9-
import liquidjava.rj_language.ast.Expression;
1010
import liquidjava.rj_language.ast.LiteralBoolean;
1111

1212
/**
@@ -88,31 +88,4 @@ private boolean isTrueBinder(VCImplication implication) {
8888
private boolean isFalseBinder(VCImplication implication) {
8989
return implication.hasBinder() && isFalse(implication.getRefinement().getExpression());
9090
}
91-
92-
/**
93-
* Checks whether an expression is true
94-
*/
95-
private boolean isTrue(Expression expression) {
96-
return expression instanceof LiteralBoolean literal && literal.isBooleanTrue();
97-
}
98-
99-
/**
100-
* Checks whether an expression is false
101-
*/
102-
private boolean isFalse(Expression expression) {
103-
return expression instanceof LiteralBoolean literal && !literal.isBooleanTrue();
104-
}
105-
106-
/**
107-
* Checks whether a VC suffix contains a variable name
108-
*/
109-
private boolean containsVar(VCImplication implication, String name) {
110-
for (VCImplication current = implication; current != null; current = current.getNext()) {
111-
List<String> names = new ArrayList<>();
112-
current.getRefinement().getExpression().getVariableNames(names);
113-
if (names.contains(name))
114-
return true;
115-
}
116-
return false;
117-
}
11891
}

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

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package liquidjava.rj_language.opt;
22

3+
import static liquidjava.rj_language.opt.VCSimplificationUtils.isFalse;
4+
import static liquidjava.rj_language.opt.VCSimplificationUtils.isTrue;
5+
36
import liquidjava.rj_language.ast.BinaryExpression;
47
import liquidjava.rj_language.ast.Expression;
58
import liquidjava.rj_language.ast.GroupExpression;
@@ -199,20 +202,6 @@ private Expression simplifyImplication(Expression left, Expression right) {
199202
return null;
200203
}
201204

202-
/**
203-
* Checks whether an expression is true
204-
*/
205-
private boolean isTrue(Expression expression) {
206-
return expression instanceof LiteralBoolean literal && literal.isBooleanTrue();
207-
}
208-
209-
/**
210-
* Checks whether an expression is false
211-
*/
212-
private boolean isFalse(Expression expression) {
213-
return expression instanceof LiteralBoolean literal && !literal.isBooleanTrue();
214-
}
215-
216205
/**
217206
* Checks whether an expression is unary logical negation
218207
*/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package liquidjava.rj_language.opt;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import liquidjava.processor.VCImplication;
7+
import liquidjava.rj_language.ast.Expression;
8+
import liquidjava.rj_language.ast.LiteralBoolean;
9+
10+
public final class VCSimplificationUtils {
11+
12+
public static boolean containsVar(Expression expression, String name) {
13+
List<String> names = new ArrayList<>();
14+
expression.getVariableNames(names);
15+
return names.contains(name);
16+
}
17+
18+
public static boolean containsVar(VCImplication implication, String name) {
19+
for (VCImplication current = implication; current != null; current = current.getNext()) {
20+
if (containsVar(current.getRefinement().getExpression(), name))
21+
return true;
22+
}
23+
return false;
24+
}
25+
26+
public static boolean isTrue(Expression expression) {
27+
return expression instanceof LiteralBoolean literal && literal.isBooleanTrue();
28+
}
29+
30+
public static boolean isFalse(Expression expression) {
31+
return expression instanceof LiteralBoolean literal && !literal.isBooleanTrue();
32+
}
33+
}

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

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package liquidjava.rj_language.opt;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
3+
import static liquidjava.rj_language.opt.VCSimplificationUtils.containsVar;
4+
55
import java.util.Optional;
66

77
import liquidjava.processor.SimplifiedVCImplication;
@@ -113,23 +113,4 @@ private boolean isVar(Expression expression, String name) {
113113
return expression instanceof Var var && name.equals(var.getName());
114114
}
115115

116-
/**
117-
* Checks whether an expression contains a variable name
118-
*/
119-
private boolean containsVar(Expression expression, String name) {
120-
List<String> names = new ArrayList<>();
121-
expression.getVariableNames(names);
122-
return names.contains(name);
123-
}
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-
}
135116
}

0 commit comments

Comments
 (0)