aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java')
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java
new file mode 100644
index 00000000..5e1ae94d
--- /dev/null
+++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java
@@ -0,0 +1,66 @@
1package tools.refinery.store.query.literal;
2
3import tools.refinery.store.query.DnfUtils;
4import tools.refinery.store.query.RelationLike;
5import tools.refinery.store.query.Variable;
6
7import java.util.List;
8import java.util.Map;
9import java.util.Objects;
10import java.util.Set;
11
12public abstract class CallLiteral<T extends RelationLike> implements Literal {
13 private final CallPolarity polarity;
14 private final T target;
15 private final List<Variable> arguments;
16
17 protected CallLiteral(CallPolarity polarity, T target, List<Variable> arguments) {
18 if (arguments.size() != target.arity()) {
19 throw new IllegalArgumentException("%s needs %d arguments, but got %s".formatted(target.name(),
20 target.arity(), arguments.size()));
21 }
22 if (polarity.isTransitive() && target.arity() != 2) {
23 throw new IllegalArgumentException("Transitive closures can only take binary relations");
24 }
25 this.polarity = polarity;
26 this.target = target;
27 this.arguments = arguments;
28 }
29
30 public CallPolarity getPolarity() {
31 return polarity;
32 }
33
34 public T getTarget() {
35 return target;
36 }
37
38 public List<Variable> getArguments() {
39 return arguments;
40 }
41
42 @Override
43 public void collectAllVariables(Set<Variable> variables) {
44 if (polarity.isPositive()) {
45 variables.addAll(arguments);
46 }
47 }
48
49 protected List<Variable> substituteArguments(Map<Variable, Variable> substitution) {
50 return arguments.stream().map(variable -> DnfUtils.maybeSubstitute(variable, substitution)).toList();
51 }
52
53 @Override
54 public boolean equals(Object o) {
55 if (this == o) return true;
56 if (o == null || getClass() != o.getClass()) return false;
57 CallLiteral<?> callAtom = (CallLiteral<?>) o;
58 return polarity == callAtom.polarity && Objects.equals(target, callAtom.target) &&
59 Objects.equals(arguments, callAtom.arguments);
60 }
61
62 @Override
63 public int hashCode() {
64 return Objects.hash(polarity, target, arguments);
65 }
66}