aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java')
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java49
1 files changed, 11 insertions, 38 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java
index 9315fb30..5abc76ce 100644
--- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java
+++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java
@@ -6,49 +6,22 @@
6package tools.refinery.store.query.equality; 6package tools.refinery.store.query.equality;
7 7
8import tools.refinery.store.query.dnf.Dnf; 8import tools.refinery.store.query.dnf.Dnf;
9import tools.refinery.store.query.dnf.SymbolicParameter;
10import tools.refinery.store.query.term.Variable; 9import tools.refinery.store.query.term.Variable;
11 10
12import java.util.HashMap; 11import java.util.Objects;
13import java.util.List;
14import java.util.Map;
15 12
16public class LiteralEqualityHelper { 13public interface LiteralEqualityHelper extends DnfEqualityChecker {
17 private final DnfEqualityChecker dnfEqualityChecker; 14 LiteralEqualityHelper DEFAULT = new LiteralEqualityHelper() {
18 private final Map<Variable, Variable> leftToRight; 15 @Override
19 private final Map<Variable, Variable> rightToLeft; 16 public boolean variableEqual(Variable left, Variable right) {
20 17 return Objects.equals(left, right);
21 public LiteralEqualityHelper(DnfEqualityChecker dnfEqualityChecker, List<SymbolicParameter> leftParameters,
22 List<SymbolicParameter> rightParameters) {
23 this.dnfEqualityChecker = dnfEqualityChecker;
24 var arity = leftParameters.size();
25 if (arity != rightParameters.size()) {
26 throw new IllegalArgumentException("Parameter lists have unequal length");
27 }
28 leftToRight = new HashMap<>(arity);
29 rightToLeft = new HashMap<>(arity);
30 for (int i = 0; i < arity; i++) {
31 if (!variableEqual(leftParameters.get(i).getVariable(), rightParameters.get(i).getVariable())) {
32 throw new IllegalArgumentException("Parameter lists cannot be unified: duplicate parameter " + i);
33 }
34 } 18 }
35 }
36
37 public boolean dnfEqual(Dnf left, Dnf right) {
38 return dnfEqualityChecker.dnfEqual(left, right);
39 }
40 19
41 public boolean variableEqual(Variable left, Variable right) { 20 @Override
42 if (checkMapping(leftToRight, left, right) && checkMapping(rightToLeft, right, left)) { 21 public boolean dnfEqual(Dnf left, Dnf right) {
43 leftToRight.put(left, right); 22 return DnfEqualityChecker.DEFAULT.dnfEqual(left, right);
44 rightToLeft.put(right, left);
45 return true;
46 } 23 }
47 return false; 24 };
48 }
49 25
50 private static boolean checkMapping(Map<Variable, Variable> map, Variable key, Variable expectedValue) { 26 boolean variableEqual(Variable left, Variable right);
51 var currentValue = map.get(key);
52 return currentValue == null || currentValue.equals(expectedValue);
53 }
54} 27}