diff options
Diffstat (limited to 'subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java')
-rw-r--r-- | subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java | 56 |
1 files changed, 27 insertions, 29 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java index 8de5079d..7e68d4a0 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java | |||
@@ -5,59 +5,57 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.dnf; | 6 | package tools.refinery.store.query.dnf; |
7 | 7 | ||
8 | import tools.refinery.store.query.Constraint; | ||
8 | import tools.refinery.store.query.equality.DnfEqualityChecker; | 9 | import tools.refinery.store.query.equality.DnfEqualityChecker; |
9 | import tools.refinery.store.query.equality.LiteralEqualityHelper; | 10 | import tools.refinery.store.query.equality.LiteralEqualityHelper; |
10 | import tools.refinery.store.query.Constraint; | ||
11 | import tools.refinery.store.query.literal.LiteralReduction; | 11 | import tools.refinery.store.query.literal.LiteralReduction; |
12 | import tools.refinery.store.query.term.Sort; | 12 | import tools.refinery.store.query.term.Parameter; |
13 | import tools.refinery.store.query.term.Variable; | 13 | import tools.refinery.store.query.term.Variable; |
14 | 14 | ||
15 | import java.util.Collection; | 15 | import java.util.Collection; |
16 | import java.util.HashSet; | 16 | import java.util.Collections; |
17 | import java.util.List; | 17 | import java.util.List; |
18 | import java.util.Set; | 18 | import java.util.Set; |
19 | import java.util.function.Consumer; | 19 | import java.util.function.Consumer; |
20 | import java.util.stream.Collectors; | ||
20 | 21 | ||
21 | public final class Dnf implements Constraint { | 22 | public final class Dnf implements Constraint { |
22 | private static final String INDENTATION = " "; | 23 | private static final String INDENTATION = " "; |
23 | 24 | ||
24 | private final String name; | 25 | private final String name; |
25 | |||
26 | private final String uniqueName; | 26 | private final String uniqueName; |
27 | 27 | private final List<SymbolicParameter> symbolicParameters; | |
28 | private final List<Variable> parameters; | ||
29 | |||
30 | private final List<FunctionalDependency<Variable>> functionalDependencies; | 28 | private final List<FunctionalDependency<Variable>> functionalDependencies; |
31 | |||
32 | private final List<DnfClause> clauses; | 29 | private final List<DnfClause> clauses; |
33 | 30 | ||
34 | Dnf(String name, List<Variable> parameters, List<FunctionalDependency<Variable>> functionalDependencies, | 31 | Dnf(String name, List<SymbolicParameter> symbolicParameters, |
35 | List<DnfClause> clauses) { | 32 | List<FunctionalDependency<Variable>> functionalDependencies, List<DnfClause> clauses) { |
36 | validateFunctionalDependencies(parameters, functionalDependencies); | 33 | validateFunctionalDependencies(symbolicParameters, functionalDependencies); |
37 | this.name = name; | 34 | this.name = name; |
38 | this.uniqueName = DnfUtils.generateUniqueName(name); | 35 | this.uniqueName = DnfUtils.generateUniqueName(name); |
39 | this.parameters = parameters; | 36 | this.symbolicParameters = symbolicParameters; |
40 | this.functionalDependencies = functionalDependencies; | 37 | this.functionalDependencies = functionalDependencies; |
41 | this.clauses = clauses; | 38 | this.clauses = clauses; |
42 | } | 39 | } |
43 | 40 | ||
44 | private static void validateFunctionalDependencies( | 41 | private static void validateFunctionalDependencies( |
45 | Collection<Variable> parameters, Collection<FunctionalDependency<Variable>> functionalDependencies) { | 42 | Collection<SymbolicParameter> symbolicParameters, |
46 | var parameterSet = new HashSet<>(parameters); | 43 | Collection<FunctionalDependency<Variable>> functionalDependencies) { |
44 | var parameterSet = symbolicParameters.stream().map(SymbolicParameter::getVariable).collect(Collectors.toSet()); | ||
47 | for (var functionalDependency : functionalDependencies) { | 45 | for (var functionalDependency : functionalDependencies) { |
48 | validateParameters(parameters, parameterSet, functionalDependency.forEach(), functionalDependency); | 46 | validateParameters(symbolicParameters, parameterSet, functionalDependency.forEach(), functionalDependency); |
49 | validateParameters(parameters, parameterSet, functionalDependency.unique(), functionalDependency); | 47 | validateParameters(symbolicParameters, parameterSet, functionalDependency.unique(), functionalDependency); |
50 | } | 48 | } |
51 | } | 49 | } |
52 | 50 | ||
53 | private static void validateParameters(Collection<Variable> parameters, Set<Variable> parameterSet, | 51 | private static void validateParameters(Collection<SymbolicParameter> symbolicParameters, |
54 | Collection<Variable> toValidate, | 52 | Set<Variable> parameterSet, Collection<Variable> toValidate, |
55 | FunctionalDependency<Variable> functionalDependency) { | 53 | FunctionalDependency<Variable> functionalDependency) { |
56 | for (var variable : toValidate) { | 54 | for (var variable : toValidate) { |
57 | if (!parameterSet.contains(variable)) { | 55 | if (!parameterSet.contains(variable)) { |
58 | throw new IllegalArgumentException( | 56 | throw new IllegalArgumentException( |
59 | "Variable %s of functional dependency %s does not appear in the parameter list %s" | 57 | "Variable %s of functional dependency %s does not appear in the parameter list %s" |
60 | .formatted(variable, functionalDependency, parameters)); | 58 | .formatted(variable, functionalDependency, symbolicParameters)); |
61 | } | 59 | } |
62 | } | 60 | } |
63 | } | 61 | } |
@@ -75,13 +73,12 @@ public final class Dnf implements Constraint { | |||
75 | return uniqueName; | 73 | return uniqueName; |
76 | } | 74 | } |
77 | 75 | ||
78 | public List<Variable> getParameters() { | 76 | public List<SymbolicParameter> getSymbolicParameters() { |
79 | return parameters; | 77 | return symbolicParameters; |
80 | } | 78 | } |
81 | 79 | ||
82 | @Override | 80 | public List<Parameter> getParameters() { |
83 | public List<Sort> getSorts() { | 81 | return Collections.unmodifiableList(symbolicParameters); |
84 | return parameters.stream().map(Variable::getSort).toList(); | ||
85 | } | 82 | } |
86 | 83 | ||
87 | public List<FunctionalDependency<Variable>> getFunctionalDependencies() { | 84 | public List<FunctionalDependency<Variable>> getFunctionalDependencies() { |
@@ -90,7 +87,7 @@ public final class Dnf implements Constraint { | |||
90 | 87 | ||
91 | @Override | 88 | @Override |
92 | public int arity() { | 89 | public int arity() { |
93 | return parameters.size(); | 90 | return symbolicParameters.size(); |
94 | } | 91 | } |
95 | 92 | ||
96 | public List<DnfClause> getClauses() { | 93 | public List<DnfClause> getClauses() { |
@@ -127,7 +124,8 @@ public final class Dnf implements Constraint { | |||
127 | return false; | 124 | return false; |
128 | } | 125 | } |
129 | for (int i = 0; i < numClauses; i++) { | 126 | for (int i = 0; i < numClauses; i++) { |
130 | var literalEqualityHelper = new LiteralEqualityHelper(callEqualityChecker, parameters, other.parameters); | 127 | var literalEqualityHelper = new LiteralEqualityHelper(callEqualityChecker, symbolicParameters, |
128 | other.symbolicParameters); | ||
131 | if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { | 129 | if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { |
132 | return false; | 130 | return false; |
133 | } | 131 | } |
@@ -145,18 +143,18 @@ public final class Dnf implements Constraint { | |||
145 | 143 | ||
146 | @Override | 144 | @Override |
147 | public String toString() { | 145 | public String toString() { |
148 | return "%s/%d".formatted(name, arity()); | 146 | return "%s/%d".formatted(name(), arity()); |
149 | } | 147 | } |
150 | 148 | ||
151 | @Override | 149 | @Override |
152 | public String toReferenceString() { | 150 | public String toReferenceString() { |
153 | return "@Dnf " + name; | 151 | return "@Dnf " + name(); |
154 | } | 152 | } |
155 | 153 | ||
156 | public String toDefinitionString() { | 154 | public String toDefinitionString() { |
157 | var builder = new StringBuilder(); | 155 | var builder = new StringBuilder(); |
158 | builder.append("pred ").append(name()).append("("); | 156 | builder.append("pred ").append(name()).append("("); |
159 | var parameterIterator = parameters.iterator(); | 157 | var parameterIterator = symbolicParameters.iterator(); |
160 | if (parameterIterator.hasNext()) { | 158 | if (parameterIterator.hasNext()) { |
161 | builder.append(parameterIterator.next()); | 159 | builder.append(parameterIterator.next()); |
162 | while (parameterIterator.hasNext()) { | 160 | while (parameterIterator.hasNext()) { |