diff options
Diffstat (limited to 'subprojects')
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 @@ | |||
6 | package tools.refinery.generator; | 6 | package tools.refinery.generator; |
7 | 7 | ||
8 | import tools.refinery.language.semantics.ProblemTrace; | 8 | import tools.refinery.language.semantics.ProblemTrace; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.model.Model; | 10 | import tools.refinery.store.model.Model; |
10 | import tools.refinery.store.model.ModelStore; | 11 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.store.reasoning.ReasoningAdapter; | 12 | import 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; | |||
9 | import tools.refinery.language.model.problem.Problem; | 9 | import tools.refinery.language.model.problem.Problem; |
10 | import tools.refinery.language.semantics.ProblemTrace; | 10 | import tools.refinery.language.semantics.ProblemTrace; |
11 | import tools.refinery.language.semantics.SolutionSerializer; | 11 | import tools.refinery.language.semantics.SolutionSerializer; |
12 | import tools.refinery.logic.AbstractValue; | ||
12 | import tools.refinery.store.dse.strategy.BestFirstStoreManager; | 13 | import tools.refinery.store.dse.strategy.BestFirstStoreManager; |
13 | import tools.refinery.store.map.Version; | 14 | import tools.refinery.store.map.Version; |
14 | import tools.refinery.store.model.ModelStore; | 15 | import 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 | */ |
6 | package tools.refinery.logic; | 6 | package tools.refinery.logic; |
7 | 7 | ||
8 | import java.util.Objects; | 8 | public non-sealed interface AbstractDomain<A extends AbstractValue<A, C>, C> extends AnyAbstractDomain { |
9 | import java.util.Optional; | ||
10 | |||
11 | public 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 | */ | ||
6 | package tools.refinery.logic; | ||
7 | |||
8 | import org.jetbrains.annotations.Nullable; | ||
9 | |||
10 | public 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 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; | ||
9 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
10 | 9 | ||
11 | import 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") |
15 | public class CardinalityDomain implements AbstractDomain<CardinalityInterval, Integer> { | 12 | public 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 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; |
9 | 10 | ||
10 | public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { | 11 | public 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 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | ||
8 | import tools.refinery.logic.term.uppercardinality.UpperCardinalities; | 9 | import tools.refinery.logic.term.uppercardinality.UpperCardinalities; |
9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 10 | import 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 | */ |
6 | package tools.refinery.logic.term.cardinalityinterval; | 6 | package tools.refinery.logic.term.cardinalityinterval; |
7 | 7 | ||
8 | import org.jetbrains.annotations.NotNull; | ||
9 | import org.jetbrains.annotations.Nullable; | ||
8 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; | 10 | import tools.refinery.logic.term.uppercardinality.FiniteUpperCardinality; |
9 | import tools.refinery.logic.term.uppercardinality.UpperCardinality; | 11 | import 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 | */ |
6 | package tools.refinery.logic.term.truthvalue; | 6 | package tools.refinery.logic.term.truthvalue; |
7 | 7 | ||
8 | public enum TruthValue { | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
10 | |||
11 | public 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 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | 9 | ||
10 | import 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") |
14 | public final class TruthValueDomain implements AbstractDomain<TruthValue, Boolean> { | 12 | public 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 | */ |
6 | package tools.refinery.store.reasoning; | 6 | package tools.refinery.store.reasoning; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.adapter.ModelAdapter; | 10 | import tools.refinery.store.adapter.ModelAdapter; |
10 | import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; | 11 | import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; |
11 | import tools.refinery.store.reasoning.interpretation.AnyPartialInterpretation; | 12 | import 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 | */ |
6 | package tools.refinery.store.reasoning.actions; | 6 | package tools.refinery.store.reasoning.actions; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.dse.transition.actions.AbstractActionLiteral; | 9 | import tools.refinery.store.dse.transition.actions.AbstractActionLiteral; |
9 | import tools.refinery.store.dse.transition.actions.BoundActionLiteral; | 10 | import tools.refinery.store.dse.transition.actions.BoundActionLiteral; |
10 | import tools.refinery.store.model.Model; | 11 | import tools.refinery.store.model.Model; |
@@ -15,7 +16,7 @@ import tools.refinery.store.tuple.Tuple; | |||
15 | 16 | ||
16 | import java.util.List; | 17 | import java.util.List; |
17 | 18 | ||
18 | public class MergeActionLiteral<A, C> extends AbstractActionLiteral { | 19 | public 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 | */ |
6 | package tools.refinery.store.reasoning.actions; | 6 | package tools.refinery.store.reasoning.actions; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.logic.term.NodeVariable; | 9 | import tools.refinery.logic.term.NodeVariable; |
9 | import tools.refinery.store.reasoning.representation.PartialRelation; | 10 | import tools.refinery.store.reasoning.representation.PartialRelation; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import 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 | */ |
6 | package tools.refinery.store.reasoning.internal; | 6 | package tools.refinery.store.reasoning.internal; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.model.Interpretation; | 10 | import tools.refinery.store.model.Interpretation; |
10 | import tools.refinery.store.model.Model; | 11 | import tools.refinery.store.model.Model; |
11 | import tools.refinery.store.reasoning.ReasoningAdapter; | 12 | import 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 | */ |
6 | package tools.refinery.store.reasoning.interpretation; | 6 | package tools.refinery.store.reasoning.interpretation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.literal.Concreteness; | 10 | import tools.refinery.store.reasoning.literal.Concreteness; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | 12 | ||
12 | public abstract class AbstractPartialInterpretation<A, C> implements PartialInterpretation<A, C> { | 13 | public 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 | */ |
6 | package tools.refinery.store.reasoning.interpretation; | 6 | package tools.refinery.store.reasoning.interpretation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.model.ModelStoreBuilder; | 10 | import tools.refinery.store.model.ModelStoreBuilder; |
10 | import tools.refinery.store.reasoning.ReasoningAdapter; | 11 | import tools.refinery.store.reasoning.ReasoningAdapter; |
@@ -14,7 +15,7 @@ import tools.refinery.store.tuple.Tuple; | |||
14 | 15 | ||
15 | import java.util.Set; | 16 | import java.util.Set; |
16 | 17 | ||
17 | public non-sealed interface PartialInterpretation<A, C> extends AnyPartialInterpretation { | 18 | public 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 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | 11 | ||
11 | public abstract class AbstractPartialInterpretationRefiner<A, C> implements PartialInterpretationRefiner<A, C> { | 12 | public 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 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Interpretation; | 9 | import tools.refinery.store.model.Interpretation; |
9 | import tools.refinery.store.reasoning.ReasoningAdapter; | 10 | import tools.refinery.store.reasoning.ReasoningAdapter; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
@@ -13,7 +14,8 @@ import tools.refinery.store.tuple.Tuple; | |||
13 | 14 | ||
14 | import java.util.Objects; | 15 | import java.util.Objects; |
15 | 16 | ||
16 | public class ConcreteSymbolRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { | 17 | public 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 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | import tools.refinery.store.tuple.Tuple; | 11 | import tools.refinery.store.tuple.Tuple; |
11 | 12 | ||
12 | public non-sealed interface PartialInterpretationRefiner<A, C> extends AnyPartialInterpretationRefiner { | 13 | public 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 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
9 | import tools.refinery.store.reasoning.ReasoningAdapter; | 10 | import tools.refinery.store.reasoning.ReasoningAdapter; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | import tools.refinery.store.reasoning.seed.ModelSeed; | 12 | import tools.refinery.store.reasoning.seed.ModelSeed; |
12 | 13 | ||
13 | public class RefinementBasedInitializer<A, C> implements PartialModelInitializer { | 14 | public 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 | */ |
6 | package tools.refinery.store.reasoning.representation; | 6 | package tools.refinery.store.reasoning.representation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | 10 | ||
10 | public record PartialFunction<A, C>(String name, int arity, AbstractDomain<A, C> abstractDomain) | 11 | public 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 | */ |
6 | package tools.refinery.store.reasoning.representation; | 6 | package tools.refinery.store.reasoning.representation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | 10 | ||
10 | public sealed interface PartialSymbol<A, C> extends AnyPartialSymbol permits PartialFunction, PartialRelation { | 11 | public 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 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.reasoning.representation.AnyPartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.AnyPartialSymbol; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import 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 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | import tools.refinery.store.representation.Symbol; | 11 | import 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 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
9 | import tools.refinery.store.reasoning.refinement.PartialModelInitializer; | 10 | import tools.refinery.store.reasoning.refinement.PartialModelInitializer; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | import tools.refinery.store.representation.Symbol; | 12 | import tools.refinery.store.representation.Symbol; |
12 | 13 | ||
13 | public class SeedInitializer<T> implements PartialModelInitializer { | 14 | public 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 @@ | |||
6 | package tools.refinery.store.reasoning.translator; | 6 | package tools.refinery.store.reasoning.translator; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; | 10 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; |
10 | import tools.refinery.store.dse.transition.Rule; | 11 | import tools.refinery.store.dse.transition.Rule; |
11 | import tools.refinery.store.dse.transition.objectives.Criterion; | 12 | import tools.refinery.store.dse.transition.objectives.Criterion; |
@@ -25,8 +26,8 @@ import java.util.ArrayList; | |||
25 | import java.util.List; | 26 | import java.util.List; |
26 | 27 | ||
27 | @SuppressWarnings("UnusedReturnValue") | 28 | @SuppressWarnings("UnusedReturnValue") |
28 | public abstract sealed class PartialSymbolTranslator<A, C> implements AnyPartialSymbolTranslator | 29 | public 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 | */ |
6 | package tools.refinery.store.reasoning.translator.opposite; | 6 | package tools.refinery.store.reasoning.translator.opposite; |
7 | 7 | ||
8 | 8 | import tools.refinery.logic.AbstractValue; | |
9 | import tools.refinery.store.map.AnyVersionedMap; | 9 | import tools.refinery.store.map.AnyVersionedMap; |
10 | import tools.refinery.store.map.Cursor; | 10 | import tools.refinery.store.map.Cursor; |
11 | import tools.refinery.store.reasoning.ReasoningAdapter; | 11 | import tools.refinery.store.reasoning.ReasoningAdapter; |
@@ -17,7 +17,7 @@ import tools.refinery.store.tuple.Tuple; | |||
17 | 17 | ||
18 | import java.util.Set; | 18 | import java.util.Set; |
19 | 19 | ||
20 | class OppositeInterpretation<A, C> extends AbstractPartialInterpretation<A, C> { | 20 | class 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 | */ |
6 | package tools.refinery.store.reasoning.translator.opposite; | 6 | package tools.refinery.store.reasoning.translator.opposite; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; | 10 | import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; |
10 | import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; | 11 | import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; |
11 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 12 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
12 | import tools.refinery.store.tuple.Tuple; | 13 | import tools.refinery.store.tuple.Tuple; |
13 | 14 | ||
14 | public class OppositeRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { | 15 | public 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 | } |