Skip to content

Commit 39e54c4

Browse files
committed
Add Fixed Point Iteration
1 parent 6e4e1cd commit 39e54c4

5 files changed

Lines changed: 52 additions & 43 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package liquidjava.rj_language.opt;
2+
3+
import liquidjava.processor.VCImplication;
4+
5+
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
6+
7+
/**
8+
* Simplifies VCImplication chains by applying various simplification steps
9+
*/
10+
public class VCSimplification {
11+
12+
/**
13+
* Applies all available simplification steps to a VC chain
14+
*/
15+
public static VCImplication simplify(VCImplication implication) {
16+
if (implication == null)
17+
return null;
18+
19+
// keep applying simplification steps until a fixed point is reached
20+
VCImplication current = implication.clone();
21+
while (true) {
22+
VCImplication simplified = simplifyOnce(current);
23+
if (sameVc(current, simplified)) // fixed point reached
24+
return simplified;
25+
current = simplified;
26+
}
27+
}
28+
29+
/**
30+
* Applies one simplification step to a VC chain
31+
*/
32+
public static VCImplication simplifyOnce(VCImplication implication) {
33+
if (implication == null)
34+
return null;
35+
36+
// first try to apply substitution, then folding
37+
VCImplication substituted = VCSubstitution.applyOnce(implication);
38+
if (!sameVc(implication, substituted))
39+
return substituted;
40+
41+
// TODO: add more simplification steps here (e.g., folding)
42+
return substituted;
43+
}
44+
}

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

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,25 @@
1111

1212
class VCSimplificationUtils {
1313

14-
private VCSimplificationUtils() {
15-
}
16-
17-
static Expression activeExpression(Predicate refinement) {
14+
public static Expression activeExpression(Predicate refinement) {
1815
if (refinement instanceof SimplifiedPredicate simplified)
1916
return simplified.getSimplifiedPredicate().getExpression().clone();
2017
return refinement.getExpression().clone();
2118
}
2219

23-
static Predicate originPredicate(Predicate refinement) {
20+
public static Predicate originPredicate(Predicate refinement) {
2421
if (refinement instanceof SimplifiedPredicate simplified)
2522
return simplified.getOrigin().clone();
2623
return refinement.clone();
2724
}
2825

29-
static List<Binder> binders(Predicate refinement) {
30-
if (refinement instanceof SimplifiedPredicate simplified)
31-
return new ArrayList<>(simplified.getBinders());
32-
return new ArrayList<>();
33-
}
34-
35-
static VCImplication copyWithRefinement(VCImplication implication, Predicate refinement) {
26+
public static VCImplication copyWithRefinement(VCImplication implication, Predicate refinement) {
3627
if (implication.hasBinder())
3728
return new VCImplication(implication.getName(), implication.getType(), refinement);
3829
return new VCImplication(refinement);
3930
}
4031

41-
static boolean sameVc(VCImplication left, VCImplication right) {
32+
public static boolean sameVc(VCImplication left, VCImplication right) {
4233
if (left == null || right == null)
4334
return left == right;
4435
return left.toString().equals(right.toString());

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

Lines changed: 0 additions & 17 deletions
This file was deleted.

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import liquidjava.rj_language.ast.Expression;
1313
import liquidjava.rj_language.ast.Var;
1414

15+
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
16+
1517
/**
1618
* Simplifies VCImplication chains by replacing binder equalities with their known values
1719
*/
@@ -134,11 +136,4 @@ public static boolean containsVariable(Expression expression, String name) {
134136
expression.getVariableNames(names);
135137
return names.contains(name);
136138
}
137-
138-
/**
139-
* Returns the expression used for matching and substitution
140-
*/
141-
public static Expression activeExpression(Predicate refinement) {
142-
return VCSimplificationUtils.activeExpression(refinement);
143-
}
144139
}

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

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

3-
import static liquidjava.rj_language.opt.VCSubstitution.activeExpression;
3+
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
44
import static liquidjava.rj_language.opt.VCSubstitution.containsVariable;
55
import static liquidjava.rj_language.opt.VCSubstitution.isVar;
66
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -29,7 +29,7 @@ public void eachSimplificationStepPreservesVcSemantics(@From(VCImplicationGenera
2929
VCImplication current = vc;
3030

3131
for (int step = 0; step < VCImplicationGenerator.BINDERS.length; step++) {
32-
VCImplication simplified = VCSimplifier.simplify(current);
32+
VCImplication simplified = VCSimplification.simplify(current);
3333
if (sameVc(current, simplified))
3434
break;
3535

@@ -47,10 +47,6 @@ private static void setUpContext() {
4747
TestUtils.addIntVariableToContext(variable);
4848
}
4949

50-
private static boolean sameVc(VCImplication left, VCImplication right) {
51-
return left.toString().equals(right.toString());
52-
}
53-
5450
private static void assertEquivalent(VCImplication unsimplified, VCImplication simplified, int step) {
5551
Predicate premises = substitutionPremises(unsimplified);
5652
Predicate unsimplifiedFormula = Predicate.createConjunction(premises, new Predicate(vcFormula(unsimplified)));

0 commit comments

Comments
 (0)