Skip to content

Commit 6e4e1cd

Browse files
committed
Code Refactoring
1 parent d55680d commit 6e4e1cd

5 files changed

Lines changed: 64 additions & 64 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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.Predicate;
8+
import liquidjava.rj_language.SimplifiedPredicate;
9+
import liquidjava.rj_language.SimplifiedPredicate.Binder;
10+
import liquidjava.rj_language.ast.Expression;
11+
12+
class VCSimplificationUtils {
13+
14+
private VCSimplificationUtils() {
15+
}
16+
17+
static Expression activeExpression(Predicate refinement) {
18+
if (refinement instanceof SimplifiedPredicate simplified)
19+
return simplified.getSimplifiedPredicate().getExpression().clone();
20+
return refinement.getExpression().clone();
21+
}
22+
23+
static Predicate originPredicate(Predicate refinement) {
24+
if (refinement instanceof SimplifiedPredicate simplified)
25+
return simplified.getOrigin().clone();
26+
return refinement.clone();
27+
}
28+
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) {
36+
if (implication.hasBinder())
37+
return new VCImplication(implication.getName(), implication.getType(), refinement);
38+
return new VCImplication(refinement);
39+
}
40+
41+
static boolean sameVc(VCImplication left, VCImplication right) {
42+
if (left == null || right == null)
43+
return left == right;
44+
return left.toString().equals(right.toString());
45+
}
46+
}

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,7 @@ public class VCSimplifier {
1111
* Applies all available simplification steps to a VC chain
1212
*/
1313
public static VCImplication simplify(VCImplication implication) {
14-
// TODO: implement remaining simplification steps
15-
return VCSubstitution.apply(implication);
16-
}
17-
18-
/**
19-
* Applies one simplification step to a VC chain
20-
*/
21-
public static VCImplication simplifyOnce(VCImplication implication) {
22-
// TODO: implement remaining simplification steps
14+
// TODO: implement remaining simplification steps with fixed point iteration
2315
return VCSubstitution.applyOnce(implication);
2416
}
2517
}

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

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,6 @@ public class VCSubstitution {
2323
private record Substitution(VCImplication source, Expression value) {
2424
}
2525

26-
/**
27-
* Applies all available binder equality substitutions in a VC chain
28-
*/
29-
public static VCImplication apply(VCImplication implication) {
30-
if (implication == null)
31-
return null;
32-
33-
VCImplication result = implication.clone();
34-
Optional<VCSubstitution.Substitution> substitutionOpt = VCSubstitution.findSubstitution(result);
35-
36-
// keep applying substitutions until there are no more substitutions available
37-
while (substitutionOpt.isPresent()) {
38-
VCSubstitution.Substitution substitution = substitutionOpt.get();
39-
result = VCSubstitution.substitute(result, substitution.source(), substitution.value());
40-
substitutionOpt = VCSubstitution.findSubstitution(result);
41-
}
42-
return result;
43-
}
44-
4526
/**
4627
* Applies one substitution in a VC chain
4728
*/
@@ -72,7 +53,7 @@ private static VCImplication substitute(VCImplication implication, VCImplication
7253
return substitute(implication.getNext(), source, value);
7354

7455
Predicate refinement = substituteRefinement(implication.getRefinement(), source, value);
75-
VCImplication result = copyWithRefinement(implication, refinement);
56+
VCImplication result = VCSimplificationUtils.copyWithRefinement(implication, refinement);
7657
result.setNext(substitute(implication.getNext(), source, value));
7758
return result;
7859
}
@@ -85,28 +66,10 @@ private static Predicate substituteRefinement(Predicate refinement, VCImplicatio
8566
Binder binder = new Binder(source.getName(), source.getType());
8667
Expression substituted = active.substitute(new Var(binder.getName()), value.clone());
8768

88-
return new SimplifiedPredicate(new Predicate(substituted), originPredicate(refinement),
69+
return new SimplifiedPredicate(new Predicate(substituted), VCSimplificationUtils.originPredicate(refinement),
8970
bindersAfterSubstitution(refinement, active, binder));
9071
}
9172

92-
/**
93-
* Copies an implication node with a replacement refinement
94-
*/
95-
private static VCImplication copyWithRefinement(VCImplication implication, Predicate refinement) {
96-
if (implication.hasBinder())
97-
return new VCImplication(implication.getName(), implication.getType(), refinement);
98-
return new VCImplication(refinement);
99-
}
100-
101-
/**
102-
* Returns the expression that should be shown as the original formula
103-
*/
104-
private static Predicate originPredicate(Predicate refinement) {
105-
if (refinement instanceof SimplifiedPredicate simplified)
106-
return simplified.getOrigin().clone();
107-
return refinement.clone();
108-
}
109-
11073
/**
11174
* Builds the binder metadata after one substitution
11275
*/
@@ -176,8 +139,6 @@ public static boolean containsVariable(Expression expression, String name) {
176139
* Returns the expression used for matching and substitution
177140
*/
178141
public static Expression activeExpression(Predicate refinement) {
179-
if (refinement instanceof SimplifiedPredicate simplified)
180-
return simplified.getSimplifiedPredicate().getExpression().clone();
181-
return refinement.getExpression().clone();
142+
return VCSimplificationUtils.activeExpression(refinement);
182143
}
183144
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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.simplifyOnce(current);
32+
VCImplication simplified = VCSimplifier.simplify(current);
3333
if (sameVc(current, simplified))
3434
break;
3535

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
class VCSubstitutionTest {
1111

1212
@Test
13-
void applyReturnsNullForNullImplication() {
14-
assertNull(VCSubstitution.apply(null));
13+
void applyOnceReturnsNullForNullImplication() {
14+
assertNull(VCSubstitution.applyOnce(null));
1515
}
1616

1717
@Test
1818
void substitutesBinderEqualityIntoWholeChain() {
1919
VCImplication implication = vc("∀x:int. x == 3", "x > 0");
2020

21-
VCImplication result = VCSubstitution.apply(implication);
21+
VCImplication result = VCSubstitution.applyOnce(implication);
2222

2323
assertSimplifiedVC(result, simplified("3 > 0", "x > 0", "x:int"));
2424
}
@@ -27,7 +27,7 @@ void substitutesBinderEqualityIntoWholeChain() {
2727
void substitutesReverseBinderEquality() {
2828
VCImplication implication = vc("∀x:int. 3 == x", "x > 0");
2929

30-
VCImplication result = VCSubstitution.apply(implication);
30+
VCImplication result = VCSubstitution.applyOnce(implication);
3131

3232
assertSimplifiedVC(result, simplified("3 > 0", "x > 0", "x:int"));
3333
}
@@ -36,7 +36,7 @@ void substitutesReverseBinderEquality() {
3636
void substitutesCompoundKnownValue() {
3737
VCImplication implication = vc("∀x:int. x == y + 1", "x > y");
3838

39-
VCImplication result = VCSubstitution.apply(implication);
39+
VCImplication result = VCSubstitution.applyOnce(implication);
4040

4141
assertSimplifiedVC(result, simplified("y + 1 > y", "x > y", "x:int"));
4242
}
@@ -45,7 +45,7 @@ void substitutesCompoundKnownValue() {
4545
void usesFirstSubstitutionFoundInChain() {
4646
VCImplication implication = vc("∀x:int. x > 0", "∀y:int. y == 4", "x + y > 0");
4747

48-
VCImplication result = VCSubstitution.apply(implication);
48+
VCImplication result = VCSubstitution.applyOnce(implication);
4949

5050
assertSimplifiedVC(result, simplified("x > 0", "x > 0", ""), simplified("x + 4 > 0", "x + y > 0", "y:int"));
5151
}
@@ -54,7 +54,7 @@ void usesFirstSubstitutionFoundInChain() {
5454
void substitutesInnerKnownValueAcrossNestedImplications() {
5555
VCImplication implication = vc("∀x:int. true", "∀y:int. y == 1", "∀z:int. z > y", "y + z > 0");
5656

57-
VCImplication result = VCSubstitution.apply(implication);
57+
VCImplication result = VCSubstitution.applyOnce(implication);
5858

5959
assertSimplifiedVC(result, simplified("true", "true", ""), simplified("z > 1", "z > y", "y:int"),
6060
simplified("1 + z > 0", "y + z > 0", "y:int"));
@@ -64,16 +64,17 @@ void substitutesInnerKnownValueAcrossNestedImplications() {
6464
void substitutesOuterKnownValueIntoNestedBinderRefinements() {
6565
VCImplication implication = vc("∀x:int. x == 3", "∀y:int. y == x + 1", "y > x");
6666

67-
VCImplication result = VCSubstitution.apply(implication);
67+
VCImplication result = VCSubstitution.applyOnce(implication);
6868

69-
assertSimplifiedVC(result, simplified("3 + 1 > 3", "y > x", "x:int, y:int"));
69+
assertSimplifiedVC(result, simplified("y == 3 + 1", "y == x + 1", "x:int"),
70+
simplified("y > 3", "y > x", "x:int"));
7071
}
7172

7273
@Test
7374
void ignoresRecursiveBinderEquality() {
7475
VCImplication implication = vc("∀x:int. x == x + 1", "x > 0");
7576

76-
VCImplication result = VCSubstitution.apply(implication);
77+
VCImplication result = VCSubstitution.applyOnce(implication);
7778

7879
assertNotSame(implication, result);
7980
assertVC(result, "x == x + 1", "x > 0");
@@ -83,7 +84,7 @@ void ignoresRecursiveBinderEquality() {
8384
void ignoresNonEqualityBinderRefinement() {
8485
VCImplication implication = vc("∀x:int. x > 3", "x > 0");
8586

86-
VCImplication result = VCSubstitution.apply(implication);
87+
VCImplication result = VCSubstitution.applyOnce(implication);
8788

8889
assertNotSame(implication, result);
8990
assertVC(result, "x > 3", "x > 0");
@@ -93,7 +94,7 @@ void ignoresNonEqualityBinderRefinement() {
9394
void ignoresEqualityWithoutBinder() {
9495
VCImplication implication = vc("x == 3", "x > 0");
9596

96-
VCImplication result = VCSubstitution.apply(implication);
97+
VCImplication result = VCSubstitution.applyOnce(implication);
9798

9899
assertVC(result, "x == 3", "x > 0");
99100
}

0 commit comments

Comments
 (0)