Skip to content

Commit 5c92086

Browse files
committed
Simplify Boolean Expressions By Removing Redundant Literals
Remove boolean literals from expressions like (true && x) and (false || x)
1 parent 471cb54 commit 5c92086

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

liquidjava-verifier/src/main/java/liquidjava/errors/ErrorHandler.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ public static <T> void printError(CtElement var, Predicate expectedType, Predica
2727

2828
public static <T> void printError(CtElement var, String moreInfo, Predicate expectedType, Predicate cSMT,
2929
HashMap<String, PlacementInCode> map, ErrorEmitter errorl) {
30-
String resumeMessage = "Type expected:" + expectedType.toString(); // + "; " +"Refinement found:" +
30+
String resumeMessage = "Type expected: " + expectedType.toString(); // + "; " +"Refinement found:" +
3131
// cSMT.toString();
3232

3333
StringBuilder sb = new StringBuilder();
3434
sb.append("______________________________________________________\n");
3535
// title
3636
StringBuilder sbtitle = new StringBuilder();
37-
sbtitle.append("Failed to check refinement at: \n\n");
37+
sbtitle.append("Failed to check refinement at:\n\n");
3838
if (moreInfo != null)
3939
sbtitle.append(moreInfo + "\n");
4040
sbtitle.append(var.toString());
4141
// all message
4242
sb.append(sbtitle.toString() + "\n\n");
43-
sb.append("Type expected:" + expectedType.toString() + "\n");
44-
sb.append("Refinement found:" + cSMT.toString() + "\n");
43+
sb.append("Type expected: " + expectedType.toString() + "\n");
44+
sb.append("Refinement found: " + cSMT.toString() + "\n");
4545
sb.append(printMap(map));
4646
sb.append("Location: " + var.getPosition() + "\n");
4747
sb.append("______________________________________________________\n");
@@ -65,7 +65,7 @@ public static void printStateMismatch(CtElement element, String method, VCImplic
6565
sbtitle.append(element + "\n\n");
6666

6767
sb.append(sbtitle.toString());
68-
sb.append("Expected possible states:" + states + "\n");
68+
sb.append("Expected possible states: " + states + "\n");
6969
sb.append("\nState found:\n");
7070
sb.append(printLine());
7171
sb.append("\n" + constraintForErrorMsg /* .toConjunctions() */.toString() + "\n");
@@ -120,7 +120,7 @@ public static <T> void printErrorArgs(CtElement var, Predicate expectedType, Str
120120
sb.append("______________________________________________________\n");
121121
String title = "Error in ghost invocation: " + msg + "\n";
122122
sb.append(title);
123-
sb.append(var + "\nError in refinement:" + expectedType.toString() + "\n");
123+
sb.append(var + "\nError in refinement: " + expectedType.toString() + "\n");
124124
sb.append(printMap(map));
125125
sb.append("Location: " + var.getPosition() + "\n");
126126
sb.append("______________________________________________________\n");
@@ -151,8 +151,8 @@ public static void printSameStateSetError(CtElement element, Predicate p, String
151151
sbtitle.append("Error found multiple disjoint states from a State Set in a refinement\n\n");
152152
sbtitle.append(element + "\n\n");
153153
sb.append(sbtitle.toString());
154-
sb.append("In predicate:" + p.toString() + "\n");
155-
sb.append("In class:" + name + "\n");
154+
sb.append("In predicate: " + p.toString() + "\n");
155+
sb.append("In class: " + name + "\n");
156156
sb.append(printMap(map));
157157
sb.append("Location: " + element.getPosition() + "\n");
158158
sb.append("______________________________________________________\n");
@@ -163,10 +163,10 @@ public static void printSameStateSetError(CtElement element, Predicate p, String
163163
public static void printErrorConstructorFromState(CtElement element, CtLiteral<String> from, ErrorEmitter errorl) {
164164
StringBuilder sb = new StringBuilder();
165165
sb.append("______________________________________________________\n");
166-
String s = " Error found constructor with FROM state (Constructor's should only have a TO state)\n\n";
166+
String s = "Error found constructor with 'from' state (Constructors must only have a 'to' state)\n\n";
167167
sb.append(s);
168168
sb.append(element + "\n\n");
169-
sb.append("State found:" + from + "\n");
169+
sb.append("State found: " + from + "\n");
170170
sb.append("Location: " + element.getPosition() + "\n");
171171
sb.append("______________________________________________________\n");
172172

liquidjava-verifier/src/main/java/liquidjava/rj_language/Predicate.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import liquidjava.processor.facade.AliasDTO;
1414
import liquidjava.rj_language.ast.BinaryExpression;
1515
import liquidjava.rj_language.ast.Expression;
16+
import liquidjava.rj_language.ast.LiteralBoolean;
1617
import liquidjava.rj_language.ast.FunctionInvocation;
1718
import liquidjava.rj_language.ast.GroupExpression;
1819
import liquidjava.rj_language.ast.Ite;
@@ -189,11 +190,25 @@ public Expression getExpression() {
189190
return exp;
190191
}
191192

193+
private static boolean isBooleanLiteral(Expression expr, boolean value) {
194+
return expr instanceof LiteralBoolean && ((LiteralBoolean) expr).isBooleanTrue() == value;
195+
}
196+
192197
public static Predicate createConjunction(Predicate c1, Predicate c2) {
198+
// simplification: (true && x) = x, (false && x) = false
199+
if (isBooleanLiteral(c1.getExpression(), true)) return c2;
200+
if (isBooleanLiteral(c2.getExpression(), true)) return c1;
201+
if (isBooleanLiteral(c1.getExpression(), false)) return c1;
202+
if (isBooleanLiteral(c2.getExpression(), false)) return c2;
193203
return new Predicate(new BinaryExpression(c1.getExpression(), Utils.AND, c2.getExpression()));
194204
}
195205

196206
public static Predicate createDisjunction(Predicate c1, Predicate c2) {
207+
// simplification: (false || x) = x, (true || x) = true
208+
if (isBooleanLiteral(c1.getExpression(), false)) return c2;
209+
if (isBooleanLiteral(c2.getExpression(), false)) return c1;
210+
if (isBooleanLiteral(c1.getExpression(), true)) return c1;
211+
if (isBooleanLiteral(c2.getExpression(), true)) return c2;
197212
return new Predicate(new BinaryExpression(c1.getExpression(), Utils.OR, c2.getExpression()));
198213
}
199214

0 commit comments

Comments
 (0)