Repository navigation
Expand file tree
/
Copy pathVCSimplificationUtils.java
More file actions
101 lines (85 loc) · 3.71 KB
/
Copy pathVCSimplificationUtils.java
File metadata and controls
101 lines (85 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package liquidjava.rj_language.opt;
import java.util.ArrayList;
import java.util.List;
import liquidjava.processor.VCImplication;
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.ast.Expression;
import liquidjava.rj_language.ast.FunctionInvocation;
import liquidjava.rj_language.ast.LiteralBoolean;
import liquidjava.rj_language.ast.Var;
public final class VCSimplificationUtils {
public static VCImplication copyWithRefinement(VCImplication implication, Predicate refinement) {
return new VCImplication(implication, refinement);
}
public static boolean containsVar(Expression expression, String name) {
List<String> names = new ArrayList<>();
expression.getVariableNames(names);
return names.contains(name);
}
public static boolean containsVar(VCImplication implication, String name) {
for (VCImplication current = implication; current != null; current = current.getNext()) {
if (containsVar(current.getRefinement().getExpression(), name))
return true;
}
return false;
}
public static boolean containsExpression(Expression expression, Expression target) {
if (expression.equals(target))
return true;
for (Expression child : expression.getChildren())
if (containsExpression(child, target))
return true;
return false;
}
public static boolean containsExpression(VCImplication implication, Expression target) {
for (VCImplication current = implication; current != null; current = current.getNext())
if (containsExpression(current.getRefinement().getExpression(), target))
return true;
return false;
}
public static boolean isTrue(Expression expression) {
return expression instanceof LiteralBoolean literal && literal.isBooleanTrue();
}
public static boolean isFalse(Expression expression) {
return expression instanceof LiteralBoolean literal && !literal.isBooleanTrue();
}
/**
* Variable names of an expression
*/
public static List<String> variablesOf(Expression expression) {
List<String> names = new ArrayList<>();
expression.getVariableNames(names);
return names;
}
/**
* Terms an expression constrains: its variables and its ghost and state applications such as {@code size(x)}
*/
public static List<String> termsOf(Expression expression) {
List<String> terms = variablesOf(expression);
addApplications(expression, terms);
return terms;
}
private static void addApplications(Expression expression, List<String> terms) {
if (expression instanceof FunctionInvocation && !terms.contains(expression.toString()))
terms.add(expression.toString());
for (Expression child : expression.getChildren())
addApplications(child, terms);
}
/**
* Variables whose own value an expression constrains: those outside the arguments of ghost and state applications.
* In {@code b == size(x)} that is {@code b}, while {@code x} only names the object whose size is meant
*/
public static List<String> valueVariablesOf(Expression expression) {
List<String> names = new ArrayList<>();
addValueVariables(expression, names);
return names;
}
private static void addValueVariables(Expression expression, List<String> names) {
if (expression instanceof FunctionInvocation)
return;
if (expression instanceof Var var && !names.contains(var.getName()))
names.add(var.getName());
for (Expression child : expression.getChildren())
addValueVariables(child, names);
}
}