aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-10 02:11:15 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-07 14:58:40 +0200
commita636a86accf0ed00d0700e04ac0e1ce4f8cadf64 (patch)
treec11c8df3dca1653643b3941de19e5dbb0cef85b1
parentchore(deps): bump dependencies (diff)
downloadrefinery-a636a86accf0ed00d0700e04ac0e1ce4f8cadf64.tar.gz
refinery-a636a86accf0ed00d0700e04ac0e1ce4f8cadf64.tar.zst
refinery-a636a86accf0ed00d0700e04ac0e1ce4f8cadf64.zip
refactor(logic): abstract domain interface
Require all abstract domain elements to implement the AbstractValue interface.
-rw-r--r--subprojects/generator/src/main/java/tools/refinery/generator/ModelFacade.java4
-rw-r--r--subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java6
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/DecisionTreeValue.java2
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/TerminalNode.java2
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java27
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java32
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java39
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java10
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java21
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java32
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java56
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java41
-rw-r--r--subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java4
-rw-r--r--subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/ScopePropagator.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java15
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java18
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java7
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java6
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java10
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java8
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java10
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java9
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java13
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java6
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java8
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java7
41 files changed, 255 insertions, 192 deletions
diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ModelFacade.java b/subprojects/generator/src/main/java/tools/refinery/generator/ModelFacade.java
index a00ddc46..eaf60082 100644
--- a/subprojects/generator/src/main/java/tools/refinery/generator/ModelFacade.java
+++ b/subprojects/generator/src/main/java/tools/refinery/generator/ModelFacade.java
@@ -6,6 +6,7 @@
6package tools.refinery.generator; 6package tools.refinery.generator;
7 7
8import tools.refinery.language.semantics.ProblemTrace; 8import tools.refinery.language.semantics.ProblemTrace;
9import tools.refinery.logic.AbstractValue;
9import tools.refinery.store.model.Model; 10import tools.refinery.store.model.Model;
10import tools.refinery.store.model.ModelStore; 11import tools.refinery.store.model.ModelStore;
11import tools.refinery.store.reasoning.ReasoningAdapter; 12import tools.refinery.store.reasoning.ReasoningAdapter;
@@ -52,7 +53,8 @@ public abstract class ModelFacade {
52 return concreteness; 53 return concreteness;
53 } 54 }
54 55
55 public <A, C> PartialInterpretation<A, C> getPartialInterpretation(PartialSymbol<A, C> partialSymbol) { 56 public <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation(
57 PartialSymbol<A, C> partialSymbol) {
56 return reasoningAdapter.getPartialInterpretation(concreteness, partialSymbol); 58 return reasoningAdapter.getPartialInterpretation(concreteness, partialSymbol);
57 } 59 }
58} 60}
diff --git a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java
index 1515dceb..36190b76 100644
--- a/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java
+++ b/subprojects/generator/src/main/java/tools/refinery/generator/ModelGenerator.java
@@ -9,6 +9,7 @@ import com.google.inject.Provider;
9import tools.refinery.language.model.problem.Problem; 9import tools.refinery.language.model.problem.Problem;
10import tools.refinery.language.semantics.ProblemTrace; 10import tools.refinery.language.semantics.ProblemTrace;
11import tools.refinery.language.semantics.SolutionSerializer; 11import tools.refinery.language.semantics.SolutionSerializer;
12import tools.refinery.logic.AbstractValue;
12import tools.refinery.store.dse.strategy.BestFirstStoreManager; 13import tools.refinery.store.dse.strategy.BestFirstStoreManager;
13import tools.refinery.store.map.Version; 14import tools.refinery.store.map.Version;
14import tools.refinery.store.model.ModelStore; 15import tools.refinery.store.model.ModelStore;
@@ -24,7 +25,7 @@ public class ModelGenerator extends ModelFacade {
24 private boolean lastGenerationSuccessful; 25 private boolean lastGenerationSuccessful;
25 26
26 ModelGenerator(ProblemTrace problemTrace, ModelStore store, ModelSeed modelSeed, 27 ModelGenerator(ProblemTrace problemTrace, ModelStore store, ModelSeed modelSeed,
27 Provider<SolutionSerializer> solutionSerializerProvider) { 28 Provider<SolutionSerializer> solutionSerializerProvider) {
28 super(problemTrace, store, modelSeed, Concreteness.CANDIDATE); 29 super(problemTrace, store, modelSeed, Concreteness.CANDIDATE);
29 this.solutionSerializerProvider = solutionSerializerProvider; 30 this.solutionSerializerProvider = solutionSerializerProvider;
30 initialVersion = getModel().commit(); 31 initialVersion = getModel().commit();
@@ -66,7 +67,8 @@ public class ModelGenerator extends ModelFacade {
66 } 67 }
67 68
68 @Override 69 @Override
69 public <A, C> PartialInterpretation<A, C> getPartialInterpretation(PartialSymbol<A, C> partialSymbol) { 70 public <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation(
71 PartialSymbol<A, C> partialSymbol) {
70 checkSuccessfulGeneration(); 72 checkSuccessfulGeneration();
71 return super.getPartialInterpretation(partialSymbol); 73 return super.getPartialInterpretation(partialSymbol);
72 } 74 }
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/DecisionTreeValue.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/DecisionTreeValue.java
index 3260ef3d..a6b55989 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/DecisionTreeValue.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/DecisionTreeValue.java
@@ -25,7 +25,7 @@ public enum DecisionTreeValue {
25 } 25 }
26 26
27 public TruthValue merge(TruthValue other) { 27 public TruthValue merge(TruthValue other) {
28 return truthValue == null ? other : truthValue.merge(other); 28 return truthValue == null ? other : truthValue.meet(other);
29 } 29 }
30 30
31 public DecisionTreeValue overwrite(DecisionTreeValue other) { 31 public DecisionTreeValue overwrite(DecisionTreeValue other) {
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/TerminalNode.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/TerminalNode.java
index 2ebaecef..75933fe4 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/TerminalNode.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/internal/TerminalNode.java
@@ -48,7 +48,7 @@ class TerminalNode extends DecisionTreeNode {
48 protected void mergeAllValues(int nextLevel, Tuple tuple, TruthValue value) { 48 protected void mergeAllValues(int nextLevel, Tuple tuple, TruthValue value) {
49 otherwise = DecisionTreeValue.fromTruthValue(otherwise.merge(value)); 49 otherwise = DecisionTreeValue.fromTruthValue(otherwise.merge(value));
50 children = IntObjectMaps.mutable.from(children.keyValuesView(), IntObjectPair::getOne, 50 children = IntObjectMaps.mutable.from(children.keyValuesView(), IntObjectPair::getOne,
51 pair -> pair.getTwo().merge(value)); 51 pair -> pair.getTwo().meet(value));
52 reduceChildren(); 52 reduceChildren();
53 } 53 }
54 54
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java
index 607caa48..0b4d87d2 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractDomain.java
@@ -1,37 +1,20 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.logic; 6package tools.refinery.logic;
7 7
8import java.util.Objects; 8public non-sealed interface AbstractDomain<A extends AbstractValue<A, C>, C> extends AnyAbstractDomain {
9import java.util.Optional;
10
11public non-sealed interface AbstractDomain<A, C> extends AnyAbstractDomain {
12 @Override 9 @Override
13 Class<A> abstractType(); 10 Class<A> abstractType();
14 11
15 @Override 12 @Override
16 Class<C> concreteType(); 13 Class<C> concreteType();
17 14
18 A toAbstract(C concreteValue);
19
20 Optional<C> toConcrete(A abstractValue);
21
22 default boolean isConcrete(A abstractValue) {
23 return toConcrete(abstractValue).isPresent();
24 }
25
26 default boolean isRefinement(A originalValue, A refinedValue) {
27 return Objects.equals(commonRefinement(originalValue, refinedValue), refinedValue);
28 }
29
30 A commonRefinement(A leftValue, A rightValue);
31
32 A commonAncestor(A leftValue, A rightValue);
33
34 A unknown(); 15 A unknown();
35 16
36 boolean isError(A abstractValue); 17 A error();
18
19 A toAbstract(C concreteValue);
37} 20}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java
new file mode 100644
index 00000000..0b5e0d01
--- /dev/null
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/AbstractValue.java
@@ -0,0 +1,32 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.logic;
7
8import org.jetbrains.annotations.Nullable;
9
10public interface AbstractValue<A extends AbstractValue<A, C>, C> {
11 @Nullable
12 C getConcrete();
13
14 default boolean isConcrete() {
15 return getConcrete() == null;
16 }
17
18 @Nullable
19 C getArbitrary();
20
21 default boolean isError() {
22 return getArbitrary() == null;
23 }
24
25 A join(A other);
26
27 A meet(A other);
28
29 default boolean isRefinementOf(A other) {
30 return equals(meet(other));
31 }
32}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java
index 508a454b..29775615 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityDomain.java
@@ -5,11 +5,8 @@
5 */ 5 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality;
9import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
10 9
11import java.util.Optional;
12
13// Singleton pattern, because there is only one domain for truth values. 10// Singleton pattern, because there is only one domain for truth values.
14@SuppressWarnings("squid:S6548") 11@SuppressWarnings("squid:S6548")
15public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> { 12public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> {
@@ -29,41 +26,17 @@ public class CardinalityDomain implements AbstractDomain<CardinalityInterval, In
29 } 26 }
30 27
31 @Override 28 @Override
32 public CardinalityInterval toAbstract(Integer concreteValue) { 29 public CardinalityInterval unknown() {
33 return CardinalityIntervals.exactly(concreteValue); 30 return CardinalityIntervals.SET;
34 }
35
36 @Override
37 public Optional<Integer> toConcrete(CardinalityInterval abstractValue) {
38 return isConcrete(abstractValue) ? Optional.of(abstractValue.lowerBound()) : Optional.empty();
39 }
40
41 @Override
42 public boolean isConcrete(CardinalityInterval abstractValue) {
43 if (!(abstractValue instanceof NonEmptyCardinalityInterval nonEmptyValue) ||
44 !((nonEmptyValue.upperBound()) instanceof FiniteUpperCardinality finiteUpperCardinality)) {
45 return false;
46 }
47 return nonEmptyValue.lowerBound() == finiteUpperCardinality.finiteUpperBound();
48 }
49
50 @Override
51 public CardinalityInterval commonRefinement(CardinalityInterval leftValue, CardinalityInterval rightValue) {
52 return leftValue.meet(rightValue);
53 }
54
55 @Override
56 public CardinalityInterval commonAncestor(CardinalityInterval leftValue, CardinalityInterval rightValue) {
57 return leftValue.join(rightValue);
58 } 31 }
59 32
60 @Override 33 @Override
61 public CardinalityInterval unknown() { 34 public CardinalityInterval error() {
62 return CardinalityIntervals.SET; 35 return CardinalityIntervals.ERROR;
63 } 36 }
64 37
65 @Override 38 @Override
66 public boolean isError(CardinalityInterval abstractValue) { 39 public CardinalityInterval toAbstract(Integer concreteValue) {
67 return abstractValue.isEmpty(); 40 return CardinalityIntervals.exactly(concreteValue);
68 } 41 }
69} 42}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java
index dbf30def..996ebde5 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/CardinalityInterval.java
@@ -5,15 +5,15 @@
5 */ 5 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.logic.term.uppercardinality.UpperCardinality; 9import tools.refinery.logic.term.uppercardinality.UpperCardinality;
9 10
10public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { 11public sealed interface CardinalityInterval extends AbstractValue<CardinalityInterval, Integer>
12 permits NonEmptyCardinalityInterval, EmptyCardinalityInterval {
11 int lowerBound(); 13 int lowerBound();
12 14
13 UpperCardinality upperBound(); 15 UpperCardinality upperBound();
14 16
15 boolean isEmpty();
16
17 CardinalityInterval min(CardinalityInterval other); 17 CardinalityInterval min(CardinalityInterval other);
18 18
19 CardinalityInterval max(CardinalityInterval other); 19 CardinalityInterval max(CardinalityInterval other);
@@ -23,8 +23,4 @@ public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval,
23 CardinalityInterval take(int count); 23 CardinalityInterval take(int count);
24 24
25 CardinalityInterval multiply(CardinalityInterval other); 25 CardinalityInterval multiply(CardinalityInterval other);
26
27 CardinalityInterval meet(CardinalityInterval other);
28
29 CardinalityInterval join(CardinalityInterval other);
30} 26}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java
index 29a7f69d..8892b278 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/EmptyCardinalityInterval.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import org.jetbrains.annotations.Nullable;
8import tools.refinery.logic.term.uppercardinality.UpperCardinalities; 9import tools.refinery.logic.term.uppercardinality.UpperCardinalities;
9import tools.refinery.logic.term.uppercardinality.UpperCardinality; 10import tools.refinery.logic.term.uppercardinality.UpperCardinality;
10 11
@@ -18,16 +19,28 @@ public final class EmptyCardinalityInterval implements CardinalityInterval {
18 } 19 }
19 20
20 @Override 21 @Override
21 public int lowerBound() { 22 @Nullable
22 return 1; 23 public Integer getConcrete() {
24 return null;
25 }
26
27 @Override
28 @Nullable
29 public Integer getArbitrary() {
30 return null;
23 } 31 }
24 32
25 @Override 33 @Override
26 public boolean isEmpty() { 34 public boolean isRefinementOf(CardinalityInterval other) {
27 return true; 35 return true;
28 } 36 }
29 37
30 @Override 38 @Override
39 public int lowerBound() {
40 return 1;
41 }
42
43 @Override
31 public UpperCardinality upperBound() { 44 public UpperCardinality upperBound() {
32 return UpperCardinalities.ZERO; 45 return UpperCardinalities.ZERO;
33 } 46 }
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java
index 0919fc36..efe1464e 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/cardinalityinterval/NonEmptyCardinalityInterval.java
@@ -1,10 +1,12 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.logic.term.cardinalityinterval; 6package tools.refinery.logic.term.cardinalityinterval;
7 7
8import org.jetbrains.annotations.NotNull;
9import org.jetbrains.annotations.Nullable;
8import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; 10import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality;
9import tools.refinery.logic.term.uppercardinality.UpperCardinality; 11import tools.refinery.logic.term.uppercardinality.UpperCardinality;
10 12
@@ -23,11 +25,37 @@ public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upper
23 } 25 }
24 26
25 @Override 27 @Override
26 public boolean isEmpty() { 28 @Nullable
29 public Integer getConcrete() {
30 return isConcrete() ? lowerBound : null;
31 }
32
33 @Override
34 public boolean isConcrete() {
35 return upperBound instanceof FiniteUpperCardinality finiteUpperCardinality &&
36 finiteUpperCardinality.finiteUpperBound() == lowerBound;
37 }
38
39 @Override
40 @NotNull
41 public Integer getArbitrary() {
42 return lowerBound;
43 }
44
45 @Override
46 public boolean isError() {
27 return false; 47 return false;
28 } 48 }
29 49
30 @Override 50 @Override
51 public boolean isRefinementOf(CardinalityInterval other) {
52 if (!(other instanceof NonEmptyCardinalityInterval nonEmptyOther)) {
53 return false;
54 }
55 return lowerBound >= nonEmptyOther.lowerBound() && upperBound.compareTo(nonEmptyOther.upperBound()) <= 0;
56 }
57
58 @Override
31 public CardinalityInterval min(CardinalityInterval other) { 59 public CardinalityInterval min(CardinalityInterval other) {
32 return lift(other, Math::min, UpperCardinality::min); 60 return lift(other, Math::min, UpperCardinality::min);
33 } 61 }
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java
index bbdd3f97..59bdeab3 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValue.java
@@ -1,11 +1,14 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.logic.term.truthvalue; 6package tools.refinery.logic.term.truthvalue;
7 7
8public enum TruthValue { 8import org.jetbrains.annotations.Nullable;
9import tools.refinery.logic.AbstractValue;
10
11public enum TruthValue implements AbstractValue<TruthValue, Boolean> {
9 TRUE("true"), 12 TRUE("true"),
10 13
11 FALSE("false"), 14 FALSE("false"),
@@ -28,14 +31,41 @@ public enum TruthValue {
28 return value ? TRUE : FALSE; 31 return value ? TRUE : FALSE;
29 } 32 }
30 33
34 @Override
35 @Nullable
36 public Boolean getArbitrary() {
37 return switch (this) {
38 case TRUE -> true;
39 case FALSE, UNKNOWN -> false;
40 case ERROR -> null;
41 };
42 }
43
44 @Override
45 public boolean isError() {
46 return this == ERROR;
47 }
48
31 public boolean isConsistent() { 49 public boolean isConsistent() {
32 return this != ERROR; 50 return !isError();
33 } 51 }
34 52
53
35 public boolean isComplete() { 54 public boolean isComplete() {
36 return this != UNKNOWN; 55 return this != UNKNOWN;
37 } 56 }
38 57
58 @Override
59 @Nullable
60 public Boolean getConcrete() {
61 return switch (this) {
62 case TRUE -> true;
63 case FALSE -> false;
64 default -> null;
65 };
66 }
67
68 @Override
39 public boolean isConcrete() { 69 public boolean isConcrete() {
40 return this == TRUE || this == FALSE; 70 return this == TRUE || this == FALSE;
41 } 71 }
@@ -56,15 +86,7 @@ public enum TruthValue {
56 }; 86 };
57 } 87 }
58 88
59 public TruthValue merge(TruthValue other) { 89 @Override
60 return switch (this) {
61 case TRUE -> other == UNKNOWN || other == TRUE ? TRUE : ERROR;
62 case FALSE -> other == UNKNOWN || other == FALSE ? FALSE : ERROR;
63 case UNKNOWN -> other;
64 case ERROR -> ERROR;
65 };
66 }
67
68 public TruthValue join(TruthValue other) { 90 public TruthValue join(TruthValue other) {
69 return switch (this) { 91 return switch (this) {
70 case TRUE -> other == ERROR || other == TRUE ? TRUE : UNKNOWN; 92 case TRUE -> other == ERROR || other == TRUE ? TRUE : UNKNOWN;
@@ -73,4 +95,14 @@ public enum TruthValue {
73 case ERROR -> other; 95 case ERROR -> other;
74 }; 96 };
75 } 97 }
98
99 @Override
100 public TruthValue meet(TruthValue other) {
101 return switch (this) {
102 case TRUE -> other == UNKNOWN || other == TRUE ? TRUE : ERROR;
103 case FALSE -> other == UNKNOWN || other == FALSE ? FALSE : ERROR;
104 case UNKNOWN -> other;
105 case ERROR -> ERROR;
106 };
107 }
76} 108}
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java
index 443f744f..de8a89be 100644
--- a/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/truthvalue/TruthValueDomain.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -7,8 +7,6 @@ package tools.refinery.logic.term.truthvalue;
7 7
8import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
9 9
10import java.util.Optional;
11
12// Singleton pattern, because there is only one domain for truth values. 10// Singleton pattern, because there is only one domain for truth values.
13@SuppressWarnings("squid:S6548") 11@SuppressWarnings("squid:S6548")
14public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> { 12public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> {
@@ -28,42 +26,17 @@ public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolea
28 } 26 }
29 27
30 @Override 28 @Override
31 public TruthValue toAbstract(Boolean concreteValue) { 29 public TruthValue unknown() {
32 return TruthValue.toTruthValue(concreteValue); 30 return TruthValue.UNKNOWN;
33 }
34
35 @Override
36 public Optional<Boolean> toConcrete(TruthValue abstractValue) {
37 return switch (abstractValue) {
38 case TRUE -> Optional.of(true);
39 case FALSE -> Optional.of(false);
40 default -> Optional.empty();
41 };
42 }
43
44 @Override
45 public boolean isConcrete(TruthValue abstractValue) {
46 return abstractValue.isConcrete();
47 }
48
49 @Override
50 public TruthValue commonRefinement(TruthValue leftValue, TruthValue rightValue) {
51 return leftValue.merge(rightValue);
52 } 31 }
53 32
54 @Override 33 @Override
55 public TruthValue commonAncestor(TruthValue leftValue, TruthValue rightValue) { 34 public TruthValue error() {
56 return leftValue.join(rightValue); 35 return TruthValue.ERROR;
57 } 36 }
58 37
59 @Override 38 @Override
60 public TruthValue unknown() { 39 public TruthValue toAbstract(Boolean concreteValue) {
61 return TruthValue.UNKNOWN; 40 return TruthValue.toTruthValue(concreteValue);
62 }
63
64 @Override
65 public boolean isError(TruthValue abstractValue) {
66 return !abstractValue.isConsistent();
67 } 41 }
68} 42}
69
diff --git a/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java b/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java
index 5441c837..d68df335 100644
--- a/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java
+++ b/subprojects/logic/src/test/java/tools/refinery/logic/term/cardinalityinterval/CardinalityIntervalsTest.java
@@ -15,13 +15,13 @@ class CardinalityIntervalsTest {
15 @Test 15 @Test
16 void betweenEmptyTest() { 16 void betweenEmptyTest() {
17 var interval = CardinalityIntervals.between(2, 1); 17 var interval = CardinalityIntervals.between(2, 1);
18 assertThat(interval.isEmpty(), equalTo(true)); 18 assertThat(interval.isError(), equalTo(true));
19 } 19 }
20 20
21 @Test 21 @Test
22 void betweenNegativeUpperBoundTest() { 22 void betweenNegativeUpperBoundTest() {
23 var interval = CardinalityIntervals.between(0, -1); 23 var interval = CardinalityIntervals.between(0, -1);
24 assertThat(interval.upperBound(), equalTo(UpperCardinalities.UNBOUNDED)); 24 assertThat(interval.upperBound(), equalTo(UpperCardinalities.UNBOUNDED));
25 assertThat(interval.isEmpty(), equalTo(false)); 25 assertThat(interval.isError(), equalTo(false));
26 } 26 }
27} 27}
diff --git a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/ScopePropagator.java b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/ScopePropagator.java
index bfe2ca41..94e6bbd7 100644
--- a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/ScopePropagator.java
+++ b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/ScopePropagator.java
@@ -48,7 +48,7 @@ public class ScopePropagator implements ModelStoreConfiguration {
48 } 48 }
49 var newValue = scopes.compute(type, (ignoredKey, oldValue) -> 49 var newValue = scopes.compute(type, (ignoredKey, oldValue) ->
50 oldValue == null ? interval : oldValue.meet(interval)); 50 oldValue == null ? interval : oldValue.meet(interval));
51 if (newValue.isEmpty()) { 51 if (newValue.isError()) {
52 throw new TranslationException(type, "Unsatisfiable scope for type %s".formatted(type)); 52 throw new TranslationException(type, "Unsatisfiable scope for type %s".formatted(type));
53 } 53 }
54 return this; 54 return this;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java
index 7f0ef8b4..a9b3141a 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java
@@ -1,11 +1,12 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning; 6package tools.refinery.store.reasoning;
7 7
8import org.jetbrains.annotations.Nullable; 8import org.jetbrains.annotations.Nullable;
9import tools.refinery.logic.AbstractValue;
9import tools.refinery.store.adapter.ModelAdapter; 10import tools.refinery.store.adapter.ModelAdapter;
10import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; 11import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl;
11import tools.refinery.store.reasoning.interpretation.AnyPartialInterpretation; 12import tools.refinery.store.reasoning.interpretation.AnyPartialInterpretation;
@@ -27,17 +28,19 @@ public interface ReasoningAdapter extends ModelAdapter {
27 28
28 default AnyPartialInterpretation getPartialInterpretation(Concreteness concreteness, 29 default AnyPartialInterpretation getPartialInterpretation(Concreteness concreteness,
29 AnyPartialSymbol partialSymbol) { 30 AnyPartialSymbol partialSymbol) {
30 return getPartialInterpretation(concreteness, (PartialSymbol<?, ?>) partialSymbol); 31 var typedPartialSymbol = (PartialSymbol<?, ?>) partialSymbol;
32 return getPartialInterpretation(concreteness, typedPartialSymbol);
31 } 33 }
32 34
33 <A, C> PartialInterpretation<A, C> getPartialInterpretation(Concreteness concreteness, 35 <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation(
34 PartialSymbol<A, C> partialSymbol); 36 Concreteness concreteness, PartialSymbol<A, C> partialSymbol);
35 37
36 default AnyPartialInterpretationRefiner getRefiner(AnyPartialSymbol partialSymbol) { 38 default AnyPartialInterpretationRefiner getRefiner(AnyPartialSymbol partialSymbol) {
37 return getRefiner((PartialSymbol<?, ?>) partialSymbol); 39 var typedPartialSymbol = (PartialSymbol<?, ?>) partialSymbol;
40 return getRefiner(typedPartialSymbol);
38 } 41 }
39 42
40 <A, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol); 43 <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol);
41 44
42 @Nullable 45 @Nullable
43 Tuple1 split(int parentMultiObject); 46 Tuple1 split(int parentMultiObject);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java
index 79e0237c..86256331 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.actions; 6package tools.refinery.store.reasoning.actions;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.dse.transition.actions.AbstractActionLiteral; 9import tools.refinery.store.dse.transition.actions.AbstractActionLiteral;
9import tools.refinery.store.dse.transition.actions.BoundActionLiteral; 10import tools.refinery.store.dse.transition.actions.BoundActionLiteral;
10import tools.refinery.store.model.Model; 11import tools.refinery.store.model.Model;
@@ -15,7 +16,7 @@ import tools.refinery.store.tuple.Tuple;
15 16
16import java.util.List; 17import java.util.List;
17 18
18public class MergeActionLiteral<A, C> extends AbstractActionLiteral { 19public class MergeActionLiteral<A extends AbstractValue<A, C>, C> extends AbstractActionLiteral {
19 private final PartialSymbol<A, C> partialSymbol; 20 private final PartialSymbol<A, C> partialSymbol;
20 private final List<NodeVariable> parameters; 21 private final List<NodeVariable> parameters;
21 private final A value; 22 private final A value;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java
index 7b4c5446..e8e6880a 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java
@@ -5,6 +5,7 @@
5 */ 5 */
6package tools.refinery.store.reasoning.actions; 6package tools.refinery.store.reasoning.actions;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.logic.term.NodeVariable; 9import tools.refinery.logic.term.NodeVariable;
9import tools.refinery.store.reasoning.representation.PartialRelation; 10import tools.refinery.store.reasoning.representation.PartialRelation;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
@@ -17,8 +18,8 @@ public final class PartialActionLiterals {
17 throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); 18 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
18 } 19 }
19 20
20 public static <A, C> MergeActionLiteral<A, C> merge(PartialSymbol<A, C> partialSymbol, A value, 21 public static <A extends AbstractValue<A, C>, C> MergeActionLiteral<A, C> merge(
21 NodeVariable... parameters) { 22 PartialSymbol<A, C> partialSymbol, A value, NodeVariable... parameters) {
22 return new MergeActionLiteral<>(partialSymbol, value, List.of(parameters)); 23 return new MergeActionLiteral<>(partialSymbol, value, List.of(parameters));
23 } 24 }
24 25
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java
index a287cce3..386ae1d8 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java
@@ -1,11 +1,12 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.internal; 6package tools.refinery.store.reasoning.internal;
7 7
8import org.jetbrains.annotations.Nullable; 8import org.jetbrains.annotations.Nullable;
9import tools.refinery.logic.AbstractValue;
9import tools.refinery.store.model.Interpretation; 10import tools.refinery.store.model.Interpretation;
10import tools.refinery.store.model.Model; 11import tools.refinery.store.model.Model;
11import tools.refinery.store.reasoning.ReasoningAdapter; 12import tools.refinery.store.reasoning.ReasoningAdapter;
@@ -49,7 +50,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
49 createPartialInterpretations(); 50 createPartialInterpretations();
50 51
51 var refinerFactories = storeAdapter.getSymbolRefiners(); 52 var refinerFactories = storeAdapter.getSymbolRefiners();
52 refiners = new HashMap<>(refinerFactories.size()); 53 refiners = HashMap.newHashMap(refinerFactories.size());
53 createRefiners(); 54 createRefiners();
54 55
55 storageRefiners = storeAdapter.createStorageRefiner(model); 56 storageRefiners = storeAdapter.createStorageRefiner(model);
@@ -69,7 +70,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
69 for (int i = 0; i < concretenessLength; i++) { 70 for (int i = 0; i < concretenessLength; i++) {
70 var concreteness = Concreteness.values()[i]; 71 var concreteness = Concreteness.values()[i];
71 if (supportedInterpretations.contains(concreteness)) { 72 if (supportedInterpretations.contains(concreteness)) {
72 partialInterpretations[i] = new HashMap<>(interpretationFactories.size()); 73 partialInterpretations[i] = HashMap.newHashMap(interpretationFactories.size());
73 } 74 }
74 } 75 }
75 // Create the partial interpretations in order so that factories may refer to interpretations of symbols 76 // Create the partial interpretations in order so that factories may refer to interpretations of symbols
@@ -87,7 +88,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
87 } 88 }
88 } 89 }
89 90
90 private <A, C> PartialInterpretation<A, C> createPartialInterpretation( 91 private <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> createPartialInterpretation(
91 Concreteness concreteness, PartialInterpretation.Factory<A, C> interpreter, AnyPartialSymbol symbol) { 92 Concreteness concreteness, PartialInterpretation.Factory<A, C> interpreter, AnyPartialSymbol symbol) {
92 // The builder only allows well-typed assignment of interpreters to symbols. 93 // The builder only allows well-typed assignment of interpreters to symbols.
93 @SuppressWarnings("unchecked") 94 @SuppressWarnings("unchecked")
@@ -107,7 +108,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
107 } 108 }
108 } 109 }
109 110
110 private <A, C> PartialInterpretationRefiner<A, C> createRefiner( 111 private <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> createRefiner(
111 PartialInterpretationRefiner.Factory<A, C> factory, AnyPartialSymbol symbol) { 112 PartialInterpretationRefiner.Factory<A, C> factory, AnyPartialSymbol symbol) {
112 // The builder only allows well-typed assignment of interpreters to symbols. 113 // The builder only allows well-typed assignment of interpreters to symbols.
113 @SuppressWarnings("unchecked") 114 @SuppressWarnings("unchecked")
@@ -126,8 +127,8 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
126 } 127 }
127 128
128 @Override 129 @Override
129 public <A, C> PartialInterpretation<A, C> getPartialInterpretation(Concreteness concreteness, 130 public <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation(
130 PartialSymbol<A, C> partialSymbol) { 131 Concreteness concreteness, PartialSymbol<A, C> partialSymbol) {
131 var map = partialInterpretations[concreteness.ordinal()]; 132 var map = partialInterpretations[concreteness.ordinal()];
132 if (map == null) { 133 if (map == null) {
133 throw new IllegalArgumentException("No interpretation for concreteness: " + concreteness); 134 throw new IllegalArgumentException("No interpretation for concreteness: " + concreteness);
@@ -143,7 +144,8 @@ class ReasoningAdapterImpl implements ReasoningAdapter {
143 } 144 }
144 145
145 @Override 146 @Override
146 public <A, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol) { 147 public <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> getRefiner(
148 PartialSymbol<A, C> partialSymbol) {
147 var refiner = refiners.get(partialSymbol); 149 var refiner = refiners.get(partialSymbol);
148 if (refiner == null) { 150 if (refiner == null) {
149 throw new IllegalArgumentException("No refiner for partial symbol: " + partialSymbol); 151 throw new IllegalArgumentException("No refiner for partial symbol: " + partialSymbol);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java
index ed291eac..4f51957b 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java
@@ -5,11 +5,13 @@
5 */ 5 */
6package tools.refinery.store.reasoning.interpretation; 6package tools.refinery.store.reasoning.interpretation;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.reasoning.ReasoningAdapter; 9import tools.refinery.store.reasoning.ReasoningAdapter;
9import tools.refinery.store.reasoning.literal.Concreteness; 10import tools.refinery.store.reasoning.literal.Concreteness;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
11 12
12public abstract class AbstractPartialInterpretation<A, C> implements PartialInterpretation<A, C> { 13public abstract class AbstractPartialInterpretation<A extends AbstractValue<A, C>, C>
14 implements PartialInterpretation<A, C> {
13 private final ReasoningAdapter adapter; 15 private final ReasoningAdapter adapter;
14 private final PartialSymbol<A, C> partialSymbol; 16 private final PartialSymbol<A, C> partialSymbol;
15 private final Concreteness concreteness; 17 private final Concreteness concreteness;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java
index 86ffe751..5a304030 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.interpretation; 6package tools.refinery.store.reasoning.interpretation;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.map.Cursor; 9import tools.refinery.store.map.Cursor;
9import tools.refinery.store.model.ModelStoreBuilder; 10import tools.refinery.store.model.ModelStoreBuilder;
10import tools.refinery.store.reasoning.ReasoningAdapter; 11import tools.refinery.store.reasoning.ReasoningAdapter;
@@ -14,7 +15,7 @@ import tools.refinery.store.tuple.Tuple;
14 15
15import java.util.Set; 16import java.util.Set;
16 17
17public non-sealed interface PartialInterpretation<A, C> extends AnyPartialInterpretation { 18public non-sealed interface PartialInterpretation<A extends AbstractValue<A, C>, C> extends AnyPartialInterpretation {
18 @Override 19 @Override
19 PartialSymbol<A, C> getPartialSymbol(); 20 PartialSymbol<A, C> getPartialSymbol();
20 21
@@ -23,7 +24,7 @@ public non-sealed interface PartialInterpretation<A, C> extends AnyPartialInterp
23 Cursor<Tuple, A> getAll(); 24 Cursor<Tuple, A> getAll();
24 25
25 @FunctionalInterface 26 @FunctionalInterface
26 interface Factory<A, C> { 27 interface Factory<A extends AbstractValue<A, C>, C> {
27 PartialInterpretation<A, C> create(ReasoningAdapter adapter, Concreteness concreteness, 28 PartialInterpretation<A, C> create(ReasoningAdapter adapter, Concreteness concreteness,
28 PartialSymbol<A, C> partialSymbol); 29 PartialSymbol<A, C> partialSymbol);
29 30
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java
index a7fc5b7e..42943490 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java
@@ -1,14 +1,16 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.refinement; 6package tools.refinery.store.reasoning.refinement;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.reasoning.ReasoningAdapter; 9import tools.refinery.store.reasoning.ReasoningAdapter;
9import tools.refinery.store.reasoning.representation.PartialSymbol; 10import tools.refinery.store.reasoning.representation.PartialSymbol;
10 11
11public abstract class AbstractPartialInterpretationRefiner<A, C> implements PartialInterpretationRefiner<A, C> { 12public abstract class AbstractPartialInterpretationRefiner<A extends AbstractValue<A, C>, C>
13 implements PartialInterpretationRefiner<A, C> {
12 private final ReasoningAdapter adapter; 14 private final ReasoningAdapter adapter;
13 private final PartialSymbol<A, C> partialSymbol; 15 private final PartialSymbol<A, C> partialSymbol;
14 16
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java
index ebb9b824..d6ac0e9d 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.refinement; 6package tools.refinery.store.reasoning.refinement;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.model.Interpretation; 9import tools.refinery.store.model.Interpretation;
9import tools.refinery.store.reasoning.ReasoningAdapter; 10import tools.refinery.store.reasoning.ReasoningAdapter;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
@@ -13,7 +14,8 @@ import tools.refinery.store.tuple.Tuple;
13 14
14import java.util.Objects; 15import java.util.Objects;
15 16
16public class ConcreteSymbolRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { 17public class ConcreteSymbolRefiner<A extends AbstractValue<A, C>, C>
18 extends AbstractPartialInterpretationRefiner<A, C> {
17 private final Interpretation<A> interpretation; 19 private final Interpretation<A> interpretation;
18 20
19 public ConcreteSymbolRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, 21 public ConcreteSymbolRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol,
@@ -25,14 +27,14 @@ public class ConcreteSymbolRefiner<A, C> extends AbstractPartialInterpretationRe
25 @Override 27 @Override
26 public boolean merge(Tuple key, A value) { 28 public boolean merge(Tuple key, A value) {
27 var currentValue = interpretation.get(key); 29 var currentValue = interpretation.get(key);
28 var mergedValue = getPartialSymbol().abstractDomain().commonRefinement(currentValue, value); 30 var mergedValue = currentValue.meet(value);
29 if (!Objects.equals(currentValue, mergedValue)) { 31 if (!Objects.equals(currentValue, mergedValue)) {
30 interpretation.put(key, mergedValue); 32 interpretation.put(key, mergedValue);
31 } 33 }
32 return true; 34 return true;
33 } 35 }
34 36
35 public static <A1, C1> Factory<A1, C1> of(Symbol<A1> concreteSymbol) { 37 public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(Symbol<A1> concreteSymbol) {
36 return (adapter, partialSymbol) -> new ConcreteSymbolRefiner<>(adapter, partialSymbol, concreteSymbol); 38 return (adapter, partialSymbol) -> new ConcreteSymbolRefiner<>(adapter, partialSymbol, concreteSymbol);
37 } 39 }
38} 40}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java
index f48d1d1f..c8b182b8 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java
@@ -1,22 +1,24 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.refinement; 6package tools.refinery.store.reasoning.refinement;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.reasoning.ReasoningAdapter; 9import tools.refinery.store.reasoning.ReasoningAdapter;
9import tools.refinery.store.reasoning.representation.PartialSymbol; 10import tools.refinery.store.reasoning.representation.PartialSymbol;
10import tools.refinery.store.tuple.Tuple; 11import tools.refinery.store.tuple.Tuple;
11 12
12public non-sealed interface PartialInterpretationRefiner<A, C> extends AnyPartialInterpretationRefiner { 13public non-sealed interface PartialInterpretationRefiner<A extends AbstractValue<A, C>, C>
14 extends AnyPartialInterpretationRefiner {
13 @Override 15 @Override
14 PartialSymbol<A, C> getPartialSymbol(); 16 PartialSymbol<A, C> getPartialSymbol();
15 17
16 boolean merge(Tuple key, A value); 18 boolean merge(Tuple key, A value);
17 19
18 @FunctionalInterface 20 @FunctionalInterface
19 interface Factory<A, C> { 21 interface Factory<A extends AbstractValue<A, C>, C> {
20 PartialInterpretationRefiner<A, C> create(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol); 22 PartialInterpretationRefiner<A, C> create(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol);
21 } 23 }
22} 24}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java
index b6bccb01..1a2c03a6 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java
@@ -1,16 +1,17 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.refinement; 6package tools.refinery.store.reasoning.refinement;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.model.Model; 9import tools.refinery.store.model.Model;
9import tools.refinery.store.reasoning.ReasoningAdapter; 10import tools.refinery.store.reasoning.ReasoningAdapter;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
11import tools.refinery.store.reasoning.seed.ModelSeed; 12import tools.refinery.store.reasoning.seed.ModelSeed;
12 13
13public class RefinementBasedInitializer<A, C> implements PartialModelInitializer { 14public class RefinementBasedInitializer<A extends AbstractValue<A, C>, C> implements PartialModelInitializer {
14 private final PartialSymbol<A, C> partialSymbol; 15 private final PartialSymbol<A, C> partialSymbol;
15 16
16 public RefinementBasedInitializer(PartialSymbol<A, C> partialSymbol) { 17 public RefinementBasedInitializer(PartialSymbol<A, C> partialSymbol) {
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java
index 236be7f8..88b98da8 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java
@@ -1,14 +1,16 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.representation; 6package tools.refinery.store.reasoning.representation;
7 7
8import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
9import tools.refinery.logic.AbstractValue;
9 10
10public record PartialFunction<A, C>(String name, int arity, AbstractDomain<A, C> abstractDomain) 11public record PartialFunction<A extends AbstractValue<A, C>, C>(
11 implements AnyPartialFunction, PartialSymbol<A, C> { 12 String name, int arity, AbstractDomain<A, C> abstractDomain) implements AnyPartialFunction,
13 PartialSymbol<A, C> {
12 @Override 14 @Override
13 public A defaultValue() { 15 public A defaultValue() {
14 return null; 16 return null;
@@ -21,7 +23,7 @@ public record PartialFunction<A, C>(String name, int arity, AbstractDomain<A, C>
21 23
22 @Override 24 @Override
23 public int hashCode() { 25 public int hashCode() {
24 // Compare by identity to make hash table lookups more efficient. 26 // Compare by identity to make hash table look-ups more efficient.
25 return System.identityHashCode(this); 27 return System.identityHashCode(this);
26 } 28 }
27 29
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java
index 6986d518..21cbfefa 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java
@@ -1,13 +1,15 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.representation; 6package tools.refinery.store.reasoning.representation;
7 7
8import tools.refinery.logic.AbstractDomain; 8import tools.refinery.logic.AbstractDomain;
9import tools.refinery.logic.AbstractValue;
9 10
10public sealed interface PartialSymbol<A, C> extends AnyPartialSymbol permits PartialFunction, PartialRelation { 11public sealed interface PartialSymbol<A extends AbstractValue<A, C>, C> extends AnyPartialSymbol
12 permits PartialFunction, PartialRelation {
11 @Override 13 @Override
12 AbstractDomain<A, C> abstractDomain(); 14 AbstractDomain<A, C> abstractDomain();
13 15
@@ -17,7 +19,8 @@ public sealed interface PartialSymbol<A, C> extends AnyPartialSymbol permits Par
17 return new PartialRelation(name, arity); 19 return new PartialRelation(name, arity);
18 } 20 }
19 21
20 static <A, C> PartialFunction<A, C> of(String name, int arity, AbstractDomain<A, C> abstractDomain) { 22 static <A extends AbstractValue<A, C>, C> PartialFunction<A, C> of(
23 String name, int arity, AbstractDomain<A, C> abstractDomain) {
21 return new PartialFunction<>(name, arity, abstractDomain); 24 return new PartialFunction<>(name, arity, abstractDomain);
22 } 25 }
23} 26}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java
index e6b3eaf9..9cd4862b 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.seed; 6package tools.refinery.store.reasoning.seed;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.map.Cursor; 9import tools.refinery.store.map.Cursor;
9import tools.refinery.store.reasoning.representation.AnyPartialSymbol; 10import tools.refinery.store.reasoning.representation.AnyPartialSymbol;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
@@ -29,7 +30,7 @@ public class ModelSeed {
29 return nodeCount; 30 return nodeCount;
30 } 31 }
31 32
32 public <A> Seed<A> getSeed(PartialSymbol<A, ?> partialSymbol) { 33 public <A extends AbstractValue<A, ?>> Seed<A> getSeed(PartialSymbol<A, ?> partialSymbol) {
33 var seed = seeds.get(partialSymbol); 34 var seed = seeds.get(partialSymbol);
34 if (seed == null) { 35 if (seed == null) {
35 throw new IllegalArgumentException("No seed for partial symbol " + partialSymbol); 36 throw new IllegalArgumentException("No seed for partial symbol " + partialSymbol);
@@ -48,7 +49,8 @@ public class ModelSeed {
48 return Collections.unmodifiableSet(seeds.keySet()); 49 return Collections.unmodifiableSet(seeds.keySet());
49 } 50 }
50 51
51 public <A> Cursor<Tuple, A> getCursor(PartialSymbol<A, ?> partialSymbol, A defaultValue) { 52 public <A extends AbstractValue<A, ?>> Cursor<Tuple, A> getCursor(PartialSymbol<A, ?> partialSymbol,
53 A defaultValue) {
52 return getSeed(partialSymbol).getCursor(defaultValue, nodeCount); 54 return getSeed(partialSymbol).getCursor(defaultValue, nodeCount);
53 } 55 }
54 56
@@ -67,7 +69,7 @@ public class ModelSeed {
67 this.nodeCount = nodeCount; 69 this.nodeCount = nodeCount;
68 } 70 }
69 71
70 public <A> Builder seed(PartialSymbol<A, ?> partialSymbol, Seed<A> seed) { 72 public <A extends AbstractValue<A, ?>> Builder seed(PartialSymbol<A, ?> partialSymbol, Seed<A> seed) {
71 if (seed.arity() != partialSymbol.arity()) { 73 if (seed.arity() != partialSymbol.arity()) {
72 throw new IllegalStateException("Expected seed of arity %d for partial symbol %s, but got %d instead" 74 throw new IllegalStateException("Expected seed of arity %d for partial symbol %s, but got %d instead"
73 .formatted(partialSymbol.arity(), partialSymbol, seed.arity())); 75 .formatted(partialSymbol.arity(), partialSymbol, seed.arity()));
@@ -82,7 +84,8 @@ public class ModelSeed {
82 return this; 84 return this;
83 } 85 }
84 86
85 public <A> Builder seed(PartialSymbol<A, ?> partialSymbol, Consumer<Seed.Builder<A>> callback) { 87 public <A extends AbstractValue<A, ?>> Builder seed(PartialSymbol<A, ?> partialSymbol,
88 Consumer<Seed.Builder<A>> callback) {
86 var builder = Seed.builder(partialSymbol); 89 var builder = Seed.builder(partialSymbol);
87 callback.accept(builder); 90 callback.accept(builder);
88 return seed(partialSymbol, builder.build()); 91 return seed(partialSymbol, builder.build());
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java
index d9bad866..32562f01 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java
@@ -1,10 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.seed; 6package tools.refinery.store.reasoning.seed;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.map.Cursor; 9import tools.refinery.store.map.Cursor;
9import tools.refinery.store.reasoning.representation.PartialSymbol; 10import tools.refinery.store.reasoning.representation.PartialSymbol;
10import tools.refinery.store.representation.Symbol; 11import tools.refinery.store.representation.Symbol;
@@ -33,7 +34,7 @@ public interface Seed<T> {
33 return builder(symbol.arity(), symbol.valueType(), symbol.defaultValue()); 34 return builder(symbol.arity(), symbol.valueType(), symbol.defaultValue());
34 } 35 }
35 36
36 static <T> Builder<T> builder(PartialSymbol<T, ?> partialSymbol) { 37 static <T extends AbstractValue<T, ?>> Builder<T> builder(PartialSymbol<T, ?> partialSymbol) {
37 return builder(partialSymbol.arity(), partialSymbol.abstractDomain().abstractType(), 38 return builder(partialSymbol.arity(), partialSymbol.abstractDomain().abstractType(),
38 partialSymbol.defaultValue()); 39 partialSymbol.defaultValue());
39 } 40 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java
index 9af457d8..138e3a64 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java
@@ -1,16 +1,17 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.seed; 6package tools.refinery.store.reasoning.seed;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.model.Model; 9import tools.refinery.store.model.Model;
9import tools.refinery.store.reasoning.refinement.PartialModelInitializer; 10import tools.refinery.store.reasoning.refinement.PartialModelInitializer;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 11import tools.refinery.store.reasoning.representation.PartialSymbol;
11import tools.refinery.store.representation.Symbol; 12import tools.refinery.store.representation.Symbol;
12 13
13public class SeedInitializer<T> implements PartialModelInitializer { 14public class SeedInitializer<T extends AbstractValue<T, ?>> implements PartialModelInitializer {
14 private final Symbol<T> symbol; 15 private final Symbol<T> symbol;
15 private final PartialSymbol<T, ?> partialSymbol; 16 private final PartialSymbol<T, ?> partialSymbol;
16 17
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java
index 6cdb287d..f2583098 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java
@@ -6,6 +6,7 @@
6package tools.refinery.store.reasoning.translator; 6package tools.refinery.store.reasoning.translator;
7 7
8import org.jetbrains.annotations.Nullable; 8import org.jetbrains.annotations.Nullable;
9import tools.refinery.logic.AbstractValue;
9import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; 10import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder;
10import tools.refinery.store.dse.transition.Rule; 11import tools.refinery.store.dse.transition.Rule;
11import tools.refinery.store.dse.transition.objectives.Criterion; 12import tools.refinery.store.dse.transition.objectives.Criterion;
@@ -25,8 +26,8 @@ import java.util.ArrayList;
25import java.util.List; 26import java.util.List;
26 27
27@SuppressWarnings("UnusedReturnValue") 28@SuppressWarnings("UnusedReturnValue")
28public abstract sealed class PartialSymbolTranslator<A, C> implements AnyPartialSymbolTranslator 29public abstract sealed class PartialSymbolTranslator<A extends AbstractValue<A, C>, C>
29 permits PartialRelationTranslator { 30 implements AnyPartialSymbolTranslator permits PartialRelationTranslator {
30 private final PartialSymbol<A, C> partialSymbol; 31 private final PartialSymbol<A, C> partialSymbol;
31 private boolean configured = false; 32 private boolean configured = false;
32 protected PartialInterpretationRefiner.Factory<A, C> interpretationRefiner; 33 protected PartialInterpretationRefiner.Factory<A, C> interpretationRefiner;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
index ef007efc..e83c33ac 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
@@ -64,7 +64,7 @@ class ContainmentLinkRefiner extends AbstractPartialInterpretationRefiner<TruthV
64 if (mustLinks.contains(factory.linkType)) { 64 if (mustLinks.contains(factory.linkType)) {
65 return oldValue; 65 return oldValue;
66 } 66 }
67 return new InferredContainment(oldValue.contains().merge(TruthValue.TRUE), 67 return new InferredContainment(oldValue.contains().meet(TruthValue.TRUE),
68 addToSet(mustLinks, factory.linkType), oldValue.forbiddenLinks()); 68 addToSet(mustLinks, factory.linkType), oldValue.forbiddenLinks());
69 } 69 }
70 70
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java
index 3fe63339..00820040 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
@@ -23,7 +23,7 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B
23 23
24 static { 24 static {
25 var values = TruthValue.values(); 25 var values = TruthValue.values();
26 EMPTY_VALUES = new LinkedHashMap<>(values.length); 26 EMPTY_VALUES = LinkedHashMap.newLinkedHashMap(values.length);
27 for (var value : values) { 27 for (var value : values) {
28 EMPTY_VALUES.put(value, new InferredContainment(value, Set.of(), Set.of())); 28 EMPTY_VALUES.put(value, new InferredContainment(value, Set.of(), Set.of()));
29 } 29 }
@@ -53,7 +53,7 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B
53 } 53 }
54 54
55 public InferredContainment mergeLink(InferredContainment oldValue, TruthValue toMerge) { 55 public InferredContainment mergeLink(InferredContainment oldValue, TruthValue toMerge) {
56 var newContains = oldValue.contains().merge(toMerge); 56 var newContains = oldValue.contains().meet(toMerge);
57 if (newContains.equals(oldValue.contains())) { 57 if (newContains.equals(oldValue.contains())) {
58 return oldValue; 58 return oldValue;
59 } 59 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java
index 77c7aaf4..0b6503c3 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java
@@ -31,11 +31,11 @@ final class InferredContainment {
31 Set<PartialRelation> forbiddenLinks) { 31 Set<PartialRelation> forbiddenLinks) {
32 var result = contains; 32 var result = contains;
33 if (!mustLinks.isEmpty()) { 33 if (!mustLinks.isEmpty()) {
34 result = result.merge(TruthValue.TRUE); 34 result = result.meet(TruthValue.TRUE);
35 } 35 }
36 boolean hasErrorLink = mustLinks.stream().anyMatch(forbiddenLinks::contains); 36 boolean hasErrorLink = mustLinks.stream().anyMatch(forbiddenLinks::contains);
37 if (mustLinks.size() >= 2 || hasErrorLink) { 37 if (mustLinks.size() >= 2 || hasErrorLink) {
38 result = result.merge(TruthValue.ERROR); 38 result = result.meet(TruthValue.ERROR);
39 } 39 }
40 return result; 40 return result;
41 } 41 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java
index 5bb1b967..84dcfdc5 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java
@@ -73,7 +73,7 @@ class UndirectedCrossReferenceInitializer implements PartialModelInitializer {
73 // Already processed entry. 73 // Already processed entry.
74 continue; 74 continue;
75 } 75 }
76 var mergedValue = value.merge(oppositeValue == null ? defaultValue : oppositeValue); 76 var mergedValue = value.meet(oppositeValue == null ? defaultValue : oppositeValue);
77 mergedMap.put(key, mergedValue); 77 mergedMap.put(key, mergedValue);
78 if (first != second) { 78 if (first != second) {
79 mergedMap.put(oppositeKey, mergedValue); 79 mergedMap.put(oppositeKey, mergedValue);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java
index a5047768..d1979b8c 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java
@@ -131,7 +131,7 @@ public class MetamodelBuilder {
131 var oppositeInfo = referenceInfoMap.get(opposite); 131 var oppositeInfo = referenceInfoMap.get(opposite);
132 validateOpposite(linkType, info, opposite, oppositeInfo); 132 validateOpposite(linkType, info, opposite, oppositeInfo);
133 targetMultiplicity = oppositeInfo.multiplicity(); 133 targetMultiplicity = oppositeInfo.multiplicity();
134 defaultValue = defaultValue.merge(oppositeInfo.defaultValue()); 134 defaultValue = defaultValue.meet(oppositeInfo.defaultValue());
135 if (oppositeInfo.containment()) { 135 if (oppositeInfo.containment()) {
136 // Skip processing this reference and process it once we encounter its containment opposite. 136 // Skip processing this reference and process it once we encounter its containment opposite.
137 return; 137 return;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java
index 0b89ec58..07595932 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java
@@ -51,7 +51,7 @@ public class EqualsRefiner extends AbstractPartialInterpretationRefiner<TruthVal
51 return false; 51 return false;
52 } 52 }
53 var newCount = currentCount.meet(CardinalityIntervals.LONE); 53 var newCount = currentCount.meet(CardinalityIntervals.LONE);
54 if (newCount.isEmpty()) { 54 if (newCount.isError()) {
55 return false; 55 return false;
56 } 56 }
57 countInterpretation.put(unaryKey, newCount); 57 countInterpretation.put(unaryKey, newCount);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java
index 3908fedb..83fa4377 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java
@@ -42,7 +42,7 @@ public class ExistsRefiner extends AbstractPartialInterpretationRefiner<TruthVal
42 } 42 }
43 default -> throw new IllegalArgumentException("Unknown TruthValue: " + value); 43 default -> throw new IllegalArgumentException("Unknown TruthValue: " + value);
44 } 44 }
45 if (newCount.isEmpty()) { 45 if (newCount.isError()) {
46 return false; 46 return false;
47 } 47 }
48 countInterpretation.put(key, newCount); 48 countInterpretation.put(key, newCount);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java
index 694a800b..eb13174c 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java
@@ -37,7 +37,7 @@ class MultiObjectInitializer implements PartialModelInitializer {
37 var uniqueTable = new HashMap<CardinalityInterval, CardinalityInterval>(); 37 var uniqueTable = new HashMap<CardinalityInterval, CardinalityInterval>();
38 for (int i = 0; i < intervals.length; i++) { 38 for (int i = 0; i < intervals.length; i++) {
39 var interval = intervals[i]; 39 var interval = intervals[i];
40 if (interval.isEmpty()) { 40 if (interval.isError()) {
41 throw new TranslationException(ReasoningAdapter.EXISTS_SYMBOL, 41 throw new TranslationException(ReasoningAdapter.EXISTS_SYMBOL,
42 "Inconsistent existence or equality for node " + i); 42 "Inconsistent existence or equality for node " + i);
43 } 43 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java
index 147ae486..ab401f9e 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java
@@ -28,7 +28,7 @@ class MultiObjectStorageRefiner implements StorageRefiner {
28 return false; 28 return false;
29 } 29 }
30 var newParentCount = parentCount.take(1); 30 var newParentCount = parentCount.take(1);
31 if (newParentCount.isEmpty()) { 31 if (newParentCount.isError()) {
32 return false; 32 return false;
33 } 33 }
34 var childKey = Tuple.of(childNode); 34 var childKey = Tuple.of(childNode);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java
index 7290ab40..75828086 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java
@@ -1,11 +1,11 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.translator.opposite; 6package tools.refinery.store.reasoning.translator.opposite;
7 7
8 8import tools.refinery.logic.AbstractValue;
9import tools.refinery.store.map.AnyVersionedMap; 9import tools.refinery.store.map.AnyVersionedMap;
10import tools.refinery.store.map.Cursor; 10import tools.refinery.store.map.Cursor;
11import tools.refinery.store.reasoning.ReasoningAdapter; 11import tools.refinery.store.reasoning.ReasoningAdapter;
@@ -17,7 +17,7 @@ import tools.refinery.store.tuple.Tuple;
17 17
18import java.util.Set; 18import java.util.Set;
19 19
20class OppositeInterpretation<A, C> extends AbstractPartialInterpretation<A, C> { 20class OppositeInterpretation<A extends AbstractValue<A, C>, C> extends AbstractPartialInterpretation<A, C> {
21 private final PartialInterpretation<A, C> opposite; 21 private final PartialInterpretation<A, C> opposite;
22 22
23 private OppositeInterpretation(ReasoningAdapter adapter, Concreteness concreteness, 23 private OppositeInterpretation(ReasoningAdapter adapter, Concreteness concreteness,
@@ -36,7 +36,7 @@ class OppositeInterpretation<A, C> extends AbstractPartialInterpretation<A, C> {
36 return new OppositeCursor<>(opposite.getAll()); 36 return new OppositeCursor<>(opposite.getAll());
37 } 37 }
38 38
39 public static <A1, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { 39 public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) {
40 return (adapter, concreteness, partialSymbol) -> { 40 return (adapter, concreteness, partialSymbol) -> {
41 var opposite = adapter.getPartialInterpretation(concreteness, oppositeSymbol); 41 var opposite = adapter.getPartialInterpretation(concreteness, oppositeSymbol);
42 return new OppositeInterpretation<>(adapter, concreteness, partialSymbol, opposite); 42 return new OppositeInterpretation<>(adapter, concreteness, partialSymbol, opposite);
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java
index d09684df..47e3ac6a 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java
@@ -1,17 +1,18 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> 2 * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/>
3 * 3 *
4 * SPDX-License-Identifier: EPL-2.0 4 * SPDX-License-Identifier: EPL-2.0
5 */ 5 */
6package tools.refinery.store.reasoning.translator.opposite; 6package tools.refinery.store.reasoning.translator.opposite;
7 7
8import tools.refinery.logic.AbstractValue;
8import tools.refinery.store.reasoning.ReasoningAdapter; 9import tools.refinery.store.reasoning.ReasoningAdapter;
9import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; 10import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner;
10import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; 11import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner;
11import tools.refinery.store.reasoning.representation.PartialSymbol; 12import tools.refinery.store.reasoning.representation.PartialSymbol;
12import tools.refinery.store.tuple.Tuple; 13import tools.refinery.store.tuple.Tuple;
13 14
14public class OppositeRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { 15public class OppositeRefiner<A extends AbstractValue<A, C>, C> extends AbstractPartialInterpretationRefiner<A, C> {
15 private final PartialInterpretationRefiner<A, C> opposite; 16 private final PartialInterpretationRefiner<A, C> opposite;
16 17
17 protected OppositeRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, 18 protected OppositeRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol,
@@ -26,7 +27,7 @@ public class OppositeRefiner<A, C> extends AbstractPartialInterpretationRefiner<
26 return opposite.merge(oppositeKey, value); 27 return opposite.merge(oppositeKey, value);
27 } 28 }
28 29
29 public static <A1, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { 30 public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) {
30 return (adapter, partialSymbol) -> new OppositeRefiner<>(adapter, partialSymbol, oppositeSymbol); 31 return (adapter, partialSymbol) -> new OppositeRefiner<>(adapter, partialSymbol, oppositeSymbol);
31 } 32 }
32} 33}