diff options
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.java | 49 |
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 @@ | |||
6 | package tools.refinery.store.query.equality; | 6 | package tools.refinery.store.query.equality; |
7 | 7 | ||
8 | import tools.refinery.store.query.dnf.Dnf; | 8 | import tools.refinery.store.query.dnf.Dnf; |
9 | import tools.refinery.store.query.dnf.SymbolicParameter; | ||
10 | import tools.refinery.store.query.term.Variable; | 9 | import tools.refinery.store.query.term.Variable; |
11 | 10 | ||
12 | import java.util.HashMap; | 11 | import java.util.Objects; |
13 | import java.util.List; | ||
14 | import java.util.Map; | ||
15 | 12 | ||
16 | public class LiteralEqualityHelper { | 13 | public 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 | } |