summaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-07-02 22:24:46 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-07-03 21:15:38 +0200
commitbb358231316b2803bd382114b97621dcda16989d (patch)
tree9735a131b4aedb64e89c25fa6c82c394e65ec913 /subprojects
parentfix(reasoning): do not propagate invalidated objects (diff)
downloadrefinery-bb358231316b2803bd382114b97621dcda16989d.tar.gz
refinery-bb358231316b2803bd382114b97621dcda16989d.tar.zst
refinery-bb358231316b2803bd382114b97621dcda16989d.zip
feat: container type propagation
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java2
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java6
-rw-r--r--subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery2
-rw-r--r--subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java114
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java1
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java1
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java11
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java3
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java8
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java6
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java3
-rw-r--r--subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java8
-rw-r--r--subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java7
-rw-r--r--subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java4
18 files changed, 177 insertions, 14 deletions
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
index fbcbe6ce..1a9100c9 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java
@@ -122,6 +122,8 @@ public class ModelInitializer {
122 putRelationInfo(builtinSymbols.equals(), new RelationInfo(ReasoningAdapter.EQUALS_SYMBOL, 122 putRelationInfo(builtinSymbols.equals(), new RelationInfo(ReasoningAdapter.EQUALS_SYMBOL,
123 (TruthValue) null, 123 (TruthValue) null,
124 null)); 124 null));
125 putRelationInfo(builtinSymbols.container(),
126 new RelationInfo(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, null, TruthValue.UNKNOWN));
125 putRelationInfo(builtinSymbols.contained(), 127 putRelationInfo(builtinSymbols.contained(),
126 new RelationInfo(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, null, TruthValue.UNKNOWN)); 128 new RelationInfo(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, null, TruthValue.UNKNOWN));
127 putRelationInfo(builtinSymbols.contains(), new RelationInfo(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, 129 putRelationInfo(builtinSymbols.contains(), new RelationInfo(ContainmentHierarchyTranslator.CONTAINS_SYMBOL,
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
index 72f23e85..3b2ae707 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java
@@ -12,6 +12,7 @@ public final class BuiltinSymbols {
12 private final ClassDeclaration node; 12 private final ClassDeclaration node;
13 private final PredicateDefinition equals; 13 private final PredicateDefinition equals;
14 private final PredicateDefinition exists; 14 private final PredicateDefinition exists;
15 private final ClassDeclaration container;
15 private final ClassDeclaration contained; 16 private final ClassDeclaration contained;
16 private final PredicateDefinition contains; 17 private final PredicateDefinition contains;
17 private final PredicateDefinition invalidContainer; 18 private final PredicateDefinition invalidContainer;
@@ -21,6 +22,7 @@ public final class BuiltinSymbols {
21 node = getDeclaration(ClassDeclaration.class, "node"); 22 node = getDeclaration(ClassDeclaration.class, "node");
22 equals = getDeclaration(PredicateDefinition.class, "equals"); 23 equals = getDeclaration(PredicateDefinition.class, "equals");
23 exists = getDeclaration(PredicateDefinition.class, "exists"); 24 exists = getDeclaration(PredicateDefinition.class, "exists");
25 container = getDeclaration(ClassDeclaration.class, "container");
24 contained = getDeclaration(ClassDeclaration.class, "contained"); 26 contained = getDeclaration(ClassDeclaration.class, "contained");
25 contains = getDeclaration(PredicateDefinition.class, "contains"); 27 contains = getDeclaration(PredicateDefinition.class, "contains");
26 invalidContainer = getDeclaration(PredicateDefinition.class, "invalidContainer"); 28 invalidContainer = getDeclaration(PredicateDefinition.class, "invalidContainer");
@@ -42,6 +44,10 @@ public final class BuiltinSymbols {
42 return exists; 44 return exists;
43 } 45 }
44 46
47 public ClassDeclaration container() {
48 return container;
49 }
50
45 public ClassDeclaration contained() { 51 public ClassDeclaration contained() {
46 return contained; 52 return contained;
47 } 53 }
diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
index 09c7d92b..6ae6beb1 100644
--- a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
+++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery
@@ -8,6 +8,8 @@ pred exists(node).
8 8
9pred equals(left, right). 9pred equals(left, right).
10 10
11abstract class container extends node.
12
11abstract class contained extends node. 13abstract class contained extends node.
12 14
13pred contains(container, contained contained). 15pred contains(container, contained contained).
diff --git a/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java
index f4d5fb60..c39e603b 100644
--- a/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java
+++ b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java
@@ -56,6 +56,8 @@ class PredicateScopeTest {
56 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder 56 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
57 .reducedValue(CardinalityIntervals.ONE) 57 .reducedValue(CardinalityIntervals.ONE)
58 .put(newIndex, CardinalityIntervals.SET)) 58 .put(newIndex, CardinalityIntervals.SET))
59 .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL,
60 builder -> builder.reducedValue(TruthValue.UNKNOWN))
59 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, 61 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL,
60 builder -> builder.reducedValue(TruthValue.UNKNOWN)) 62 builder -> builder.reducedValue(TruthValue.UNKNOWN))
61 .seed(index, builder -> builder 63 .seed(index, builder -> builder
@@ -81,6 +83,8 @@ class PredicateScopeTest {
81 var store = createStore(); 83 var store = createStore();
82 var modelSeed = ModelSeed.builder(8) 84 var modelSeed = ModelSeed.builder(8)
83 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) 85 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
86 .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL,
87 builder -> builder.reducedValue(TruthValue.UNKNOWN))
84 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, 88 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL,
85 builder -> builder.reducedValue(TruthValue.UNKNOWN)) 89 builder -> builder.reducedValue(TruthValue.UNKNOWN))
86 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, 90 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL,
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java
new file mode 100644
index 00000000..76e4b5d1
--- /dev/null
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java
@@ -0,0 +1,114 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.reasoning.translator.containment;
7
8import tools.refinery.logic.literal.Literal;
9import tools.refinery.logic.term.Variable;
10import tools.refinery.store.dse.propagation.PropagationBuilder;
11import tools.refinery.store.dse.transition.Rule;
12import tools.refinery.store.model.ModelStoreBuilder;
13import tools.refinery.store.model.ModelStoreConfiguration;
14import tools.refinery.store.reasoning.representation.PartialRelation;
15import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchy;
16
17import java.util.*;
18
19import static tools.refinery.logic.literal.Literals.not;
20import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove;
21import static tools.refinery.store.reasoning.literal.PartialLiterals.may;
22import static tools.refinery.store.reasoning.literal.PartialLiterals.must;
23import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*;
24
25public class ContainerTypeInferenceTranslator implements ModelStoreConfiguration {
26 private final TypeHierarchy typeHierarchy;
27 private final Map<PartialRelation, Set<PartialRelation>> possibleContents = new LinkedHashMap<>();
28 private final Map<PartialRelation, Set<PartialRelation>> possibleContainers = new LinkedHashMap<>();
29
30 public ContainerTypeInferenceTranslator(TypeHierarchy typeHierarchy,
31 Map<PartialRelation, ContainmentInfo> containmentInfoMap) {
32 this.typeHierarchy = typeHierarchy;
33 for (var containedType : typeHierarchy.getAnalysisResult(CONTAINER_SYMBOL).getConcreteSubtypesAndSelf()) {
34 possibleContents.put(containedType, new LinkedHashSet<>());
35 }
36 for (var containedType : typeHierarchy.getAnalysisResult(CONTAINED_SYMBOL).getConcreteSubtypesAndSelf()) {
37 possibleContainers.put(containedType, new LinkedHashSet<>());
38 }
39 for (var entry : containmentInfoMap.entrySet()) {
40 var containmentLink = entry.getKey();
41 var containmentInfo = entry.getValue();
42 var sourceType = containmentInfo.sourceType();
43 for (var subtype : typeHierarchy.getAnalysisResult(sourceType).getConcreteSubtypesAndSelf()) {
44 possibleContents.get(subtype).add(containmentLink);
45 }
46 var targetType = containmentInfo.targetType();
47 for (var subtype : typeHierarchy.getAnalysisResult(targetType).getConcreteSubtypesAndSelf()) {
48 possibleContainers.get(subtype).add(containmentLink);
49 }
50 }
51 }
52
53 @Override
54 public void apply(ModelStoreBuilder storeBuilder) {
55 storeBuilder.tryGetAdapter(PropagationBuilder.class).ifPresent(this::configurePropagationBuilder);
56 }
57
58 private void configurePropagationBuilder(PropagationBuilder propagationBuilder) {
59 configureContainerPropagator(propagationBuilder);
60 configureContainedPropagator(propagationBuilder);
61 }
62
63 private void configureContainerPropagator(PropagationBuilder propagationBuilder) {
64 for (var entry : possibleContents.entrySet()) {
65 var sourceType = entry.getKey();
66 var contents = entry.getValue();
67 propagationBuilder.rule(Rule.of(sourceType.name() + "#notContainer", (builder, source) -> builder
68 .clause(target -> {
69 var literals = new ArrayList<Literal>();
70 literals.add(may(sourceType.call(source)));
71 literals.add(not(must(sourceType.call(source))));
72 literals.add(must(CONTAINS_SYMBOL.call(source, target)));
73 var typeInfo = typeHierarchy.getAnalysisResult(sourceType);
74 for (var subtype : typeInfo.getDirectSubtypes()) {
75 literals.add(not(may(subtype.call(source))));
76 }
77 for (var content : contents) {
78 literals.add(not(may(content.call(source, target))));
79 }
80 return literals;
81 })
82 .action(
83 remove(sourceType, source)
84 )
85 ));
86 }
87 }
88
89 private void configureContainedPropagator(PropagationBuilder propagationBuilder) {
90 for (var entry : possibleContainers.entrySet()) {
91 var targetType = entry.getKey();
92 var containers = entry.getValue();
93 propagationBuilder.rule(Rule.of(targetType.name() + "#notContent", (builder, target) -> builder
94 .clause(() -> {
95 var literals = new ArrayList<Literal>();
96 literals.add(may(targetType.call(target)));
97 literals.add(not(must(targetType.call(target))));
98 literals.add(must(CONTAINED_SYMBOL.call(target)));
99 var typeInfo = typeHierarchy.getAnalysisResult(targetType);
100 for (var subtype : typeInfo.getDirectSubtypes()) {
101 literals.add(not(may(subtype.call(target))));
102 }
103 for (var container : containers) {
104 literals.add(not(may(container.call(Variable.of(), target))));
105 }
106 return literals;
107 })
108 .action(
109 remove(targetType, target)
110 )
111 ));
112 }
113 }
114}
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java
index c862bc33..b15a2576 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java
@@ -50,6 +50,7 @@ import static tools.refinery.store.reasoning.actions.PartialActionLiterals.focus
50import static tools.refinery.store.reasoning.literal.PartialLiterals.*; 50import static tools.refinery.store.reasoning.literal.PartialLiterals.*;
51 51
52public class ContainmentHierarchyTranslator implements ModelStoreConfiguration { 52public class ContainmentHierarchyTranslator implements ModelStoreConfiguration {
53 public static final PartialRelation CONTAINER_SYMBOL = new PartialRelation("container", 1);
53 public static final PartialRelation CONTAINED_SYMBOL = new PartialRelation("contained", 1); 54 public static final PartialRelation CONTAINED_SYMBOL = new PartialRelation("contained", 1);
54 public static final PartialRelation INVALID_CONTAINER = new PartialRelation("invalidContainer", 55 public static final PartialRelation INVALID_CONTAINER = new PartialRelation("invalidContainer",
55 1); 56 1);
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 00820040..024774bc 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
@@ -30,12 +30,14 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B
30 } 30 }
31 31
32 private final Interpretation<InferredContainment> interpretation; 32 private final Interpretation<InferredContainment> interpretation;
33 private final PartialInterpretationRefiner<TruthValue, Boolean> containerRefiner;
33 private final PartialInterpretationRefiner<TruthValue, Boolean> containedRefiner; 34 private final PartialInterpretationRefiner<TruthValue, Boolean> containedRefiner;
34 35
35 private ContainsRefiner(ReasoningAdapter adapter, PartialSymbol<TruthValue, Boolean> partialSymbol, 36 private ContainsRefiner(ReasoningAdapter adapter, PartialSymbol<TruthValue, Boolean> partialSymbol,
36 Symbol<InferredContainment> containsStorage) { 37 Symbol<InferredContainment> containsStorage) {
37 super(adapter, partialSymbol); 38 super(adapter, partialSymbol);
38 interpretation = adapter.getModel().getInterpretation(containsStorage); 39 interpretation = adapter.getModel().getInterpretation(containsStorage);
40 containerRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINER_SYMBOL);
39 containedRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINED_SYMBOL); 41 containedRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINED_SYMBOL);
40 } 42 }
41 43
@@ -47,7 +49,8 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B
47 interpretation.put(key, newValue); 49 interpretation.put(key, newValue);
48 } 50 }
49 if (value.must()) { 51 if (value.must()) {
50 return containedRefiner.merge(Tuple.of(key.get(1)), TruthValue.TRUE); 52 return containerRefiner.merge(Tuple.of(key.get(0)), TruthValue.TRUE) &&
53 containedRefiner.merge(Tuple.of(key.get(1)), TruthValue.TRUE);
51 } 54 }
52 return true; 55 return true;
53 } 56 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
index 41d185d7..b322513d 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java
@@ -30,7 +30,6 @@ import static tools.refinery.logic.literal.Literals.check;
30import static tools.refinery.logic.literal.Literals.not; 30import static tools.refinery.logic.literal.Literals.not;
31import static tools.refinery.logic.term.int_.IntTerms.constant; 31import static tools.refinery.logic.term.int_.IntTerms.constant;
32import static tools.refinery.logic.term.int_.IntTerms.less; 32import static tools.refinery.logic.term.int_.IntTerms.less;
33import static tools.refinery.store.reasoning.ReasoningAdapter.EQUALS_SYMBOL;
34import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add; 33import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add;
35import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove; 34import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove;
36import static tools.refinery.store.reasoning.literal.PartialLiterals.*; 35import static tools.refinery.store.reasoning.literal.PartialLiterals.*;
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java
index a21da3d4..1cd564bd 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java
@@ -20,6 +20,17 @@ public class ContainedTypeHierarchyBuilder extends TypeHierarchyBuilder {
20 return !typeInfoMap.containsKey(type); 20 return !typeInfoMap.containsKey(type);
21 } 21 }
22 22
23 void setContainerTypes(Collection<PartialRelation> containerTypes) {
24 for (var containerType : containerTypes) {
25 var currentInfo = typeInfoMap.get(containerType);
26 if (currentInfo == null) {
27 throw new TranslationException(containerType, "Invalid container type: " + containerType);
28 }
29 var newInfo = currentInfo.addSupertype(ContainmentHierarchyTranslator.CONTAINER_SYMBOL);
30 typeInfoMap.put(containerType, newInfo);
31 }
32 }
33
23 void setContainedTypes(Collection<PartialRelation> containedTypes) { 34 void setContainedTypes(Collection<PartialRelation> containedTypes) {
24 for (var containedType : containedTypes) { 35 for (var containedType : containedTypes) {
25 var currentInfo = typeInfoMap.get(containedType); 36 var currentInfo = typeInfoMap.get(containedType);
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 94bf1c5d..740fe231 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
@@ -21,6 +21,7 @@ import java.util.function.Consumer;
21public class MetamodelBuilder { 21public class MetamodelBuilder {
22 private final ContainedTypeHierarchyBuilder typeHierarchyBuilder = new ContainedTypeHierarchyBuilder(); 22 private final ContainedTypeHierarchyBuilder typeHierarchyBuilder = new ContainedTypeHierarchyBuilder();
23 private final Map<PartialRelation, ReferenceInfo> referenceInfoMap = new LinkedHashMap<>(); 23 private final Map<PartialRelation, ReferenceInfo> referenceInfoMap = new LinkedHashMap<>();
24 private final Set<PartialRelation> containerTypes = new HashSet<>();
24 private final Set<PartialRelation> containedTypes = new HashSet<>(); 25 private final Set<PartialRelation> containedTypes = new HashSet<>();
25 private final Map<PartialRelation, ContainmentInfo> containmentHierarchy = new LinkedHashMap<>(); 26 private final Map<PartialRelation, ContainmentInfo> containmentHierarchy = new LinkedHashMap<>();
26 private final Map<PartialRelation, DirectedCrossReferenceInfo> directedCrossReferences = new LinkedHashMap<>(); 27 private final Map<PartialRelation, DirectedCrossReferenceInfo> directedCrossReferences = new LinkedHashMap<>();
@@ -28,6 +29,7 @@ public class MetamodelBuilder {
28 private final Map<PartialRelation, PartialRelation> oppositeReferences = new LinkedHashMap<>(); 29 private final Map<PartialRelation, PartialRelation> oppositeReferences = new LinkedHashMap<>();
29 30
30 MetamodelBuilder() { 31 MetamodelBuilder() {
32 typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, true);
31 typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, true); 33 typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, true);
32 } 34 }
33 35
@@ -105,6 +107,7 @@ public class MetamodelBuilder {
105 var info = entry.getValue(); 107 var info = entry.getValue();
106 processReferenceInfo(linkType, info); 108 processReferenceInfo(linkType, info);
107 } 109 }
110 typeHierarchyBuilder.setContainerTypes(containerTypes);
108 typeHierarchyBuilder.setContainedTypes(containedTypes); 111 typeHierarchyBuilder.setContainedTypes(containedTypes);
109 var typeHierarchy = typeHierarchyBuilder.build(); 112 var typeHierarchy = typeHierarchyBuilder.build();
110 return new Metamodel(typeHierarchy, Collections.unmodifiableMap(containmentHierarchy), 113 return new Metamodel(typeHierarchy, Collections.unmodifiableMap(containmentHierarchy),
@@ -169,6 +172,7 @@ public class MetamodelBuilder {
169 throw new TranslationException(opposite, "Invalid opposite %s with multiplicity %s of containment %s" 172 throw new TranslationException(opposite, "Invalid opposite %s with multiplicity %s of containment %s"
170 .formatted(opposite, targetMultiplicity, linkType)); 173 .formatted(opposite, targetMultiplicity, linkType));
171 } 174 }
175 containerTypes.add(sourceType);
172 containedTypes.add(targetType); 176 containedTypes.add(targetType);
173 containmentHierarchy.put(linkType, new ContainmentInfo(sourceType, info.multiplicity(), targetType)); 177 containmentHierarchy.put(linkType, new ContainmentInfo(sourceType, info.multiplicity(), targetType));
174 } 178 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java
index 5afa58f2..36b2d9a1 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java
@@ -7,6 +7,7 @@ package tools.refinery.store.reasoning.translator.metamodel;
7 7
8import tools.refinery.store.model.ModelStoreBuilder; 8import tools.refinery.store.model.ModelStoreBuilder;
9import tools.refinery.store.model.ModelStoreConfiguration; 9import tools.refinery.store.model.ModelStoreConfiguration;
10import tools.refinery.store.reasoning.translator.containment.ContainerTypeInferenceTranslator;
10import tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator; 11import tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator;
11import tools.refinery.store.reasoning.translator.crossreference.DirectedCrossReferenceTranslator; 12import tools.refinery.store.reasoning.translator.crossreference.DirectedCrossReferenceTranslator;
12import tools.refinery.store.reasoning.translator.crossreference.UndirectedCrossReferenceTranslator; 13import tools.refinery.store.reasoning.translator.crossreference.UndirectedCrossReferenceTranslator;
@@ -24,6 +25,8 @@ public class MetamodelTranslator implements ModelStoreConfiguration {
24 public void apply(ModelStoreBuilder storeBuilder) { 25 public void apply(ModelStoreBuilder storeBuilder) {
25 storeBuilder.with(new TypeHierarchyTranslator(metamodel.typeHierarchy())); 26 storeBuilder.with(new TypeHierarchyTranslator(metamodel.typeHierarchy()));
26 storeBuilder.with(new ContainmentHierarchyTranslator(metamodel.containmentHierarchy())); 27 storeBuilder.with(new ContainmentHierarchyTranslator(metamodel.containmentHierarchy()));
28 storeBuilder.with(new ContainerTypeInferenceTranslator(metamodel.typeHierarchy(),
29 metamodel.containmentHierarchy()));
27 for (var entry : metamodel.directedCrossReferences().entrySet()) { 30 for (var entry : metamodel.directedCrossReferences().entrySet()) {
28 storeBuilder.with(new DirectedCrossReferenceTranslator(entry.getKey(), entry.getValue())); 31 storeBuilder.with(new DirectedCrossReferenceTranslator(entry.getKey(), entry.getValue()));
29 } 32 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java
index 7a917dcf..f2de384f 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java
@@ -51,7 +51,7 @@ final class ExtendedTypeInfo implements Comparable<ExtendedTypeInfo> {
51 } 51 }
52 52
53 public Set<PartialRelation> getAllSupertypesAndSelf() { 53 public Set<PartialRelation> getAllSupertypesAndSelf() {
54 var allSubtypesAndSelf = new HashSet<PartialRelation>(allSupertypes.size() + 1); 54 var allSubtypesAndSelf = HashSet.<PartialRelation>newHashSet(allSupertypes.size() + 1);
55 addMust(allSubtypesAndSelf); 55 addMust(allSubtypesAndSelf);
56 return allSubtypesAndSelf; 56 return allSubtypesAndSelf;
57 } 57 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java
index 324e2b9e..d20b4f4a 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java
@@ -13,12 +13,14 @@ import java.util.*;
13public final class TypeAnalysisResult { 13public final class TypeAnalysisResult {
14 private final ExtendedTypeInfo extendedTypeInfo; 14 private final ExtendedTypeInfo extendedTypeInfo;
15 private final List<PartialRelation> directSubtypes; 15 private final List<PartialRelation> directSubtypes;
16 private final Set<PartialRelation> concreteSubtypesAndSelf;
16 private final List<ExtendedTypeInfo> allExternalTypeInfoList; 17 private final List<ExtendedTypeInfo> allExternalTypeInfoList;
17 private final InferredType inferredType; 18 private final InferredType inferredType;
18 19
19 public TypeAnalysisResult(ExtendedTypeInfo extendedTypeInfo, List<ExtendedTypeInfo> allExternalTypeInfoList) { 20 TypeAnalysisResult(ExtendedTypeInfo extendedTypeInfo, List<ExtendedTypeInfo> allExternalTypeInfoList) {
20 this.extendedTypeInfo = extendedTypeInfo; 21 this.extendedTypeInfo = extendedTypeInfo;
21 directSubtypes = List.copyOf(extendedTypeInfo.getDirectSubtypes()); 22 directSubtypes = List.copyOf(extendedTypeInfo.getDirectSubtypes());
23 concreteSubtypesAndSelf = Collections.unmodifiableSet(extendedTypeInfo.getConcreteSubtypesAndSelf());
22 this.allExternalTypeInfoList = allExternalTypeInfoList; 24 this.allExternalTypeInfoList = allExternalTypeInfoList;
23 inferredType = propagateMust(extendedTypeInfo.getAllSupertypesAndSelf(), 25 inferredType = propagateMust(extendedTypeInfo.getAllSupertypesAndSelf(),
24 extendedTypeInfo.getConcreteSubtypesAndSelf()); 26 extendedTypeInfo.getConcreteSubtypesAndSelf());
@@ -32,6 +34,10 @@ public final class TypeAnalysisResult {
32 return directSubtypes; 34 return directSubtypes;
33 } 35 }
34 36
37 public Set<PartialRelation> getConcreteSubtypesAndSelf() {
38 return concreteSubtypesAndSelf;
39 }
40
35 public boolean isAbstractType() { 41 public boolean isAbstractType() {
36 return extendedTypeInfo.isAbstractType(); 42 return extendedTypeInfo.isAbstractType();
37 } 43 }
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java
index 3f918c97..ec74ed14 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java
@@ -20,7 +20,7 @@ public class TypeHierarchy {
20 TypeHierarchy(Map<PartialRelation, TypeInfo> typeInfoMap) { 20 TypeHierarchy(Map<PartialRelation, TypeInfo> typeInfoMap) {
21 int size = typeInfoMap.size(); 21 int size = typeInfoMap.size();
22 allTypes = Collections.unmodifiableSet(new LinkedHashSet<>(typeInfoMap.keySet())); 22 allTypes = Collections.unmodifiableSet(new LinkedHashSet<>(typeInfoMap.keySet()));
23 extendedTypeInfoMap = new LinkedHashMap<>(size); 23 extendedTypeInfoMap = LinkedHashMap.newLinkedHashMap(size);
24 var concreteTypes = new LinkedHashSet<PartialRelation>(); 24 var concreteTypes = new LinkedHashSet<PartialRelation>();
25 int index = 0; 25 int index = 0;
26 for (var entry : typeInfoMap.entrySet()) { 26 for (var entry : typeInfoMap.entrySet()) {
@@ -118,7 +118,7 @@ public class TypeHierarchy {
118 for (var extendedTypeInfo : extendedTypeInfoMap.values()) { 118 for (var extendedTypeInfo : extendedTypeInfoMap.values()) {
119 var allSubtypes = extendedTypeInfo.getAllSubtypes(); 119 var allSubtypes = extendedTypeInfo.getAllSubtypes();
120 var directSubtypes = new LinkedHashSet<>(allSubtypes); 120 var directSubtypes = new LinkedHashSet<>(allSubtypes);
121 var indirectSubtypes = new LinkedHashSet<PartialRelation>(allSubtypes.size()); 121 var indirectSubtypes = LinkedHashSet.<PartialRelation>newLinkedHashSet(allSubtypes.size());
122 for (var subtype : allSubtypes) { 122 for (var subtype : allSubtypes) {
123 indirectSubtypes.addAll(extendedTypeInfoMap.get(subtype).getAllSubtypes()); 123 indirectSubtypes.addAll(extendedTypeInfoMap.get(subtype).getAllSubtypes());
124 } 124 }
@@ -203,7 +203,7 @@ public class TypeHierarchy {
203 203
204 private Map<PartialRelation, TypeAnalysisResult> computeAnalysisResults() { 204 private Map<PartialRelation, TypeAnalysisResult> computeAnalysisResults() {
205 var allExtendedTypeInfoList = sortTypes(); 205 var allExtendedTypeInfoList = sortTypes();
206 var preservedResults = new LinkedHashMap<PartialRelation, TypeAnalysisResult>( 206 var preservedResults = LinkedHashMap.<PartialRelation, TypeAnalysisResult>newLinkedHashMap(
207 allExtendedTypeInfoList.size()); 207 allExtendedTypeInfoList.size());
208 for (var extendedTypeInfo : allExtendedTypeInfoList) { 208 for (var extendedTypeInfo : allExtendedTypeInfoList) {
209 var type = extendedTypeInfo.getType(); 209 var type = extendedTypeInfo.getType();
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java
index 700bbe88..168d78df 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java
@@ -22,6 +22,7 @@ import tools.refinery.store.representation.Symbol;
22import java.util.ArrayList; 22import java.util.ArrayList;
23 23
24import static tools.refinery.logic.literal.Literals.not; 24import static tools.refinery.logic.literal.Literals.not;
25import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add;
25import static tools.refinery.store.reasoning.literal.PartialLiterals.candidateMust; 26import static tools.refinery.store.reasoning.literal.PartialLiterals.candidateMust;
26import static tools.refinery.store.reasoning.literal.PartialLiterals.may; 27import static tools.refinery.store.reasoning.literal.PartialLiterals.may;
27 28
@@ -92,7 +93,7 @@ public class TypeHierarchyTranslator implements ModelStoreConfiguration {
92 ) 93 )
93 .action(() -> { 94 .action(() -> {
94 var actionLiterals = new ArrayList<ActionLiteral>(); 95 var actionLiterals = new ArrayList<ActionLiteral>();
95 actionLiterals.add(PartialActionLiterals.add(type, instance)); 96 actionLiterals.add(add(type, instance));
96 for (var subtype : result.getDirectSubtypes()) { 97 for (var subtype : result.getDirectSubtypes()) {
97 actionLiterals.add(PartialActionLiterals.remove(subtype, instance)); 98 actionLiterals.add(PartialActionLiterals.remove(subtype, instance));
98 } 99 }
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java
index e889b80d..4d46ea63 100644
--- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java
+++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java
@@ -26,8 +26,7 @@ import java.util.Map;
26 26
27import static org.hamcrest.MatcherAssert.assertThat; 27import static org.hamcrest.MatcherAssert.assertThat;
28import static org.hamcrest.Matchers.is; 28import static org.hamcrest.Matchers.is;
29import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINED_SYMBOL; 29import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*;
30import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINS_SYMBOL;
31import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; 30import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL;
32 31
33class ContainmentHierarchyTranslatorTest { 32class ContainmentHierarchyTranslatorTest {
@@ -41,8 +40,9 @@ class ContainmentHierarchyTranslatorTest {
41 void beforeEach() { 40 void beforeEach() {
42 41
43 var typeHierarchy = TypeHierarchy.builder() 42 var typeHierarchy = TypeHierarchy.builder()
43 .type(CONTAINER_SYMBOL, true)
44 .type(CONTAINED_SYMBOL, true) 44 .type(CONTAINED_SYMBOL, true)
45 .type(c1) 45 .type(c1, CONTAINER_SYMBOL)
46 .type(c2, c1, CONTAINED_SYMBOL) 46 .type(c2, c1, CONTAINED_SYMBOL)
47 .build(); 47 .build();
48 48
@@ -64,6 +64,7 @@ class ContainmentHierarchyTranslatorTest {
64 void treeTest() { 64 void treeTest() {
65 var modelSeed = ModelSeed.builder(3) 65 var modelSeed = ModelSeed.builder(3)
66 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) 66 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
67 .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
67 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 68 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
68 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 69 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
69 .seed(c1, builder -> builder 70 .seed(c1, builder -> builder
@@ -97,6 +98,7 @@ class ContainmentHierarchyTranslatorTest {
97 void loopTest() { 98 void loopTest() {
98 var modelSeed = ModelSeed.builder(3) 99 var modelSeed = ModelSeed.builder(3)
99 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) 100 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
101 .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
100 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 102 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
101 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 103 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
102 .seed(c1, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 104 .seed(c1, builder -> builder.reducedValue(TruthValue.UNKNOWN))
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java
index e80f9744..2f814b58 100644
--- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java
+++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java
@@ -27,8 +27,7 @@ import java.util.LinkedHashMap;
27 27
28import static org.hamcrest.MatcherAssert.assertThat; 28import static org.hamcrest.MatcherAssert.assertThat;
29import static org.hamcrest.Matchers.is; 29import static org.hamcrest.Matchers.is;
30import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINED_SYMBOL; 30import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*;
31import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINS_SYMBOL;
32import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; 31import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL;
33 32
34class DefaultContainmentTest { 33class DefaultContainmentTest {
@@ -42,8 +41,9 @@ class DefaultContainmentTest {
42 @ValueSource(booleans = {false, true}) 41 @ValueSource(booleans = {false, true})
43 void defaultContainmentTest(boolean reverse) { 42 void defaultContainmentTest(boolean reverse) {
44 var typeHierarchy = TypeHierarchy.builder() 43 var typeHierarchy = TypeHierarchy.builder()
44 .type(CONTAINER_SYMBOL, true)
45 .type(CONTAINED_SYMBOL, true) 45 .type(CONTAINED_SYMBOL, true)
46 .type(c1) 46 .type(c1, CONTAINER_SYMBOL)
47 .type(c2, CONTAINED_SYMBOL) 47 .type(c2, CONTAINED_SYMBOL)
48 .type(c3, CONTAINED_SYMBOL) 48 .type(c3, CONTAINED_SYMBOL)
49 .build(); 49 .build();
@@ -60,6 +60,7 @@ class DefaultContainmentTest {
60 60
61 var modelSeed = ModelSeed.builder(3) 61 var modelSeed = ModelSeed.builder(3)
62 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) 62 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
63 .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
63 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 64 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
64 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) 65 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
65 .seed(c1, builder -> builder 66 .seed(c1, builder -> builder
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java
index f8e9e1b5..f619d7dd 100644
--- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java
+++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java
@@ -68,6 +68,8 @@ class MetamodelTest {
68 .reducedValue(CardinalityIntervals.ONE) 68 .reducedValue(CardinalityIntervals.ONE)
69 .put(Tuple.of(1), CardinalityIntervals.SET) 69 .put(Tuple.of(1), CardinalityIntervals.SET)
70 .put(Tuple.of(4), CardinalityIntervals.SET)) 70 .put(Tuple.of(4), CardinalityIntervals.SET))
71 .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, builder -> builder
72 .reducedValue(TruthValue.UNKNOWN))
71 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder 73 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder
72 .reducedValue(TruthValue.UNKNOWN)) 74 .reducedValue(TruthValue.UNKNOWN))
73 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder 75 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder
@@ -126,6 +128,8 @@ class MetamodelTest {
126 .reducedValue(CardinalityIntervals.ONE) 128 .reducedValue(CardinalityIntervals.ONE)
127 .put(Tuple.of(0), CardinalityIntervals.SET) 129 .put(Tuple.of(0), CardinalityIntervals.SET)
128 .put(Tuple.of(1), CardinalityIntervals.SET)) 130 .put(Tuple.of(1), CardinalityIntervals.SET))
131 .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, builder -> builder
132 .reducedValue(TruthValue.UNKNOWN))
129 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder 133 .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder
130 .reducedValue(TruthValue.UNKNOWN)) 134 .reducedValue(TruthValue.UNKNOWN))
131 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder 135 .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder