Skip to content

Commit bac167d

Browse files
authored
Merge pull request #159 from VariantSync/use-FormulaUtils
Use `FormulaUtils` where appropriate
2 parents afccf8e + 77a9c02 commit bac167d

11 files changed

Lines changed: 237 additions & 203 deletions

File tree

src/main/java/org/variantsync/diffdetective/analysis/logic/SAT.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.HashMap;
1010

1111
import static org.variantsync.diffdetective.util.fide.FormulaUtils.negate;
12+
import static org.variantsync.diffdetective.util.fide.FormulaUtils.and;
1213

1314
/**
1415
* Class with static functions for satisfiability solving, potentially with some optimizations.
@@ -123,7 +124,7 @@ public static boolean implies(final Node left, final Node right) {
123124
/// = TAUT(!left || right)
124125
/// = !SAT(!(!left || right))
125126
/// = !SAT(left && !right))
126-
return !isSatisfiable(new And(left, negate(right)));
127+
return !isSatisfiable(and(left, negate(right)));
127128
}
128129

129130
/**
@@ -134,6 +135,6 @@ public static boolean implies(final Node left, final Node right) {
134135
* @return True iff <code>left</code> &lt;=&gt; <code>right</code> is a tautology.
135136
*/
136137
public static boolean equivalent(final Node left, final Node right) {
137-
return isTautology(new Equals(left, right));
138+
return isTautology(FormulaUtils.equivalent(left, right));
138139
}
139-
}
140+
}

src/main/java/org/variantsync/diffdetective/feature/cpp/ControllingCExpressionVisitor.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
55
import org.antlr.v4.runtime.tree.ParseTree;
66
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
7-
import org.prop4j.And;
8-
import org.prop4j.Literal;
97
import org.prop4j.Node;
10-
import org.prop4j.Not;
11-
import org.prop4j.Or;
128
import org.variantsync.diffdetective.feature.antlr.CExpressionParser;
139
import org.variantsync.diffdetective.feature.antlr.CExpressionVisitor;
10+
import org.variantsync.diffdetective.util.fide.FormulaUtils;
1411

1512
import java.util.List;
1613
import java.util.function.Function;
1714

15+
import static org.variantsync.diffdetective.util.fide.FormulaUtils.negate;
16+
import static org.variantsync.diffdetective.util.fide.FormulaUtils.var;
17+
1818
/**
1919
* Visitor that controls how formulas given as an ANTLR parse tree are abstracted.
2020
* To this end, the visitor traverses the parse tree, searching for subtrees that should be abstracted.
@@ -73,7 +73,7 @@ public Node visitPrimaryExpression(CExpressionParser.PrimaryExpressionContext ct
7373
// Negation can be modeled in the formula.
7474
// All other unary operators need to be abstracted.
7575
if (ctx.unaryOperator().getText().equals("!")) {
76-
return new Not(ctx.primaryExpression().accept(this));
76+
return negate(ctx.primaryExpression().accept(this));
7777
} else {
7878
return abstractToLiteral(ctx);
7979
}
@@ -250,15 +250,15 @@ public Node visitInclusiveOrExpression(CExpressionParser.InclusiveOrExpressionCo
250250
// ;
251251
@Override
252252
public Node visitLogicalAndExpression(CExpressionParser.LogicalAndExpressionContext ctx) {
253-
return visitLogicalExpression(ctx, And::new);
253+
return visitLogicalExpression(ctx, FormulaUtils::and);
254254
}
255255

256256
// logicalOrExpression
257257
// : logicalAndExpression ( '||' logicalAndExpression)*
258258
// ;
259259
@Override
260260
public Node visitLogicalOrExpression(CExpressionParser.LogicalOrExpressionContext ctx) {
261-
return visitLogicalExpression(ctx, Or::new);
261+
return visitLogicalExpression(ctx, FormulaUtils::or);
262262
}
263263

264264
// logicalOperand
@@ -302,6 +302,6 @@ private Node recurseOnSingleChild(ParserRuleContext ctx) {
302302
}
303303

304304
private Node abstractToLiteral(ParserRuleContext ctx) {
305-
return new Literal(ctx.accept(abstractingVisitor).toString());
305+
return var(ctx.accept(abstractingVisitor).toString());
306306
}
307307
}

src/main/java/org/variantsync/diffdetective/feature/jpp/ControllingJPPExpressionVisitor.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
import org.antlr.v4.runtime.ParserRuleContext;
44
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
55
import org.antlr.v4.runtime.tree.ParseTree;
6-
import org.prop4j.And;
7-
import org.prop4j.Literal;
86
import org.prop4j.Node;
9-
import org.prop4j.Or;
107
import org.variantsync.diffdetective.feature.antlr.JPPExpressionParser;
118
import org.variantsync.diffdetective.feature.antlr.JPPExpressionVisitor;
9+
import org.variantsync.diffdetective.util.fide.FormulaUtils;
1210

1311
import java.util.List;
1412
import java.util.function.Function;
1513

14+
import static org.variantsync.diffdetective.util.fide.FormulaUtils.negate;
15+
import static org.variantsync.diffdetective.util.fide.FormulaUtils.var;
16+
1617
/**
1718
* Transform a parse tree into a {@link org.prop4j.Node formula}.
1819
* Non-boolean sub-expressions are abstracted using
@@ -33,15 +34,15 @@ public Node visitExpression(JPPExpressionParser.ExpressionContext ctx) {
3334
// ;
3435
@Override
3536
public Node visitLogicalOrExpression(JPPExpressionParser.LogicalOrExpressionContext ctx) {
36-
return visitLogicalExpression(ctx, Or::new);
37+
return visitLogicalExpression(ctx, FormulaUtils::or);
3738
}
3839

3940
// logicalAndExpression
4041
// : primaryExpression (AND primaryExpression)*
4142
// ;
4243
@Override
4344
public Node visitLogicalAndExpression(JPPExpressionParser.LogicalAndExpressionContext ctx) {
44-
return visitLogicalExpression(ctx, And::new);
45+
return visitLogicalExpression(ctx, FormulaUtils::and);
4546
}
4647

4748
// primaryExpression
@@ -68,7 +69,7 @@ public Node visitPrimaryExpression(JPPExpressionParser.PrimaryExpressionContext
6869
// ;
6970
@Override
7071
public Node visitComparisonExpression(JPPExpressionParser.ComparisonExpressionContext ctx) {
71-
return new Literal(ctx.getText());
72+
return var(ctx.getText());
7273
}
7374

7475
// operand
@@ -79,23 +80,23 @@ public Node visitComparisonExpression(JPPExpressionParser.ComparisonExpressionCo
7980
// ;
8081
@Override
8182
public Node visitOperand(JPPExpressionParser.OperandContext ctx) {
82-
return new Literal(ctx.getText());
83+
return var(ctx.getText());
8384
}
8485

8586
// definedExpression
8687
// : 'defined' '(' Identifier ')'
8788
// ;
8889
@Override
8990
public Node visitDefinedExpression(JPPExpressionParser.DefinedExpressionContext ctx) {
90-
return new Literal(String.format("defined(%s)", ctx.Identifier().getText()));
91+
return var(String.format("defined(%s)", ctx.Identifier().getText()));
9192
}
9293

9394
// undefinedExpression
9495
// : NOT 'defined' '(' Identifier ')'
9596
// ;
9697
@Override
9798
public Node visitUndefinedExpression(JPPExpressionParser.UndefinedExpressionContext ctx) {
98-
return new Literal(String.format("defined(%s)", ctx.Identifier().getText()), false);
99+
return negate(var(String.format("defined(%s)", ctx.Identifier().getText())));
99100
}
100101

101102
// propertyExpression

src/main/java/org/variantsync/diffdetective/util/fide/FormulaUtils.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.variantsync.diffdetective.util.fide;
22

33
import org.prop4j.And;
4+
import org.prop4j.Equals;
5+
import org.prop4j.Implies;
46
import org.prop4j.Literal;
57
import org.prop4j.Node;
68
import org.prop4j.Not;
9+
import org.prop4j.Or;
710
import org.variantsync.diffdetective.analysis.logic.SAT;
811
import org.variantsync.diffdetective.util.Assert;
912
import org.variantsync.functjonal.Cast;
@@ -45,6 +48,18 @@ public static And and(Node... nodes) {
4548
return new And(nodes);
4649
}
4750

51+
public static Or or(Node... nodes) {
52+
return new Or(nodes);
53+
}
54+
55+
public static Implies implies(Node a, Node b) {
56+
return new Implies(a, b);
57+
}
58+
59+
public static Equals equivalent(Node a, Node b) {
60+
return new Equals(a, b);
61+
}
62+
4863
/** Recursively counts the number of instances of {@link Literal} in {@code formula}. */
4964
public static int numberOfLiterals(final Node formula) {
5065
if (formula instanceof Literal) {

0 commit comments

Comments
 (0)