aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java
diff options
context:
space:
mode:
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.java56
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 */
6package tools.refinery.store.query.dnf; 6package tools.refinery.store.query.dnf;
7 7
8import tools.refinery.store.query.Constraint;
8import tools.refinery.store.query.equality.DnfEqualityChecker; 9import tools.refinery.store.query.equality.DnfEqualityChecker;
9import tools.refinery.store.query.equality.LiteralEqualityHelper; 10import tools.refinery.store.query.equality.LiteralEqualityHelper;
10import tools.refinery.store.query.Constraint;
11import tools.refinery.store.query.literal.LiteralReduction; 11import tools.refinery.store.query.literal.LiteralReduction;
12import tools.refinery.store.query.term.Sort; 12import tools.refinery.store.query.term.Parameter;
13import tools.refinery.store.query.term.Variable; 13import tools.refinery.store.query.term.Variable;
14 14
15import java.util.Collection; 15import java.util.Collection;
16import java.util.HashSet; 16import java.util.Collections;
17import java.util.List; 17import java.util.List;
18import java.util.Set; 18import java.util.Set;
19import java.util.function.Consumer; 19import java.util.function.Consumer;
20import java.util.stream.Collectors;
20 21
21public final class Dnf implements Constraint { 22public 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()) {