From 2e0bceb2f25989713f1baf6311d3787c3003d794 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 6 Nov 2023 00:38:12 +0100 Subject: feat: predicates as reference types Now unary predicates may be used as types for cross-references. This might create circular references between predicate, but no differently than when the user manually creates predicates with circular references. The reference types of containment and container references still have to be classes, because we use the class hierarchy to encode contained types. --- .../java/tools/refinery/language/semantics/ModelInitializer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'subprojects/language-semantics/src') 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 b3c58366..ecaa7e0d 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 @@ -63,6 +63,8 @@ public class ModelInitializer { private final Map partialRelationInfoMap = new HashMap<>(); + private final Set targetTypes = new HashSet<>(); + private final MetamodelBuilder metamodelBuilder = Metamodel.builder(); private Metamodel metamodel; @@ -285,6 +287,7 @@ public class ModelInitializer { var relation = getPartialRelation(referenceDeclaration); var source = getPartialRelation(classDeclaration); var target = getPartialRelation(referenceDeclaration.getReferenceType()); + targetTypes.add(target); boolean containment = referenceDeclaration.getKind() == ReferenceKind.CONTAINMENT; var opposite = referenceDeclaration.getOpposite(); PartialRelation oppositeRelation = null; @@ -473,17 +476,16 @@ public class ModelInitializer { private void collectPredicateDefinition(PredicateDefinition predicateDefinition, ModelStoreBuilder storeBuilder) { var partialRelation = getPartialRelation(predicateDefinition); var query = toQuery(partialRelation.name(), predicateDefinition); - boolean mutable; + boolean mutable = targetTypes.contains(partialRelation); TruthValue defaultValue; if (predicateDefinition.isError()) { - mutable = false; defaultValue = TruthValue.FALSE; } else { var seed = modelSeed.getSeed(partialRelation); defaultValue = seed.reducedValue() == TruthValue.FALSE ? TruthValue.FALSE : TruthValue.UNKNOWN; var cursor = seed.getCursor(defaultValue, problemTrace.getNodeTrace().size()); // The symbol should be mutable if there is at least one non-default entry in the seed. - mutable = cursor.move(); + mutable = mutable || cursor.move(); } var translator = new PredicateTranslator(partialRelation, query, mutable, defaultValue); storeBuilder.with(translator); -- cgit v1.2.3-70-g09d2