aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--subprojects/frontend/src/editor/EditorTheme.ts2
-rw-r--r--subprojects/frontend/src/language/problem.grammar13
-rw-r--r--subprojects/frontend/src/language/problemLanguageSupport.ts11
-rw-r--r--subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java8
-rw-r--r--subprojects/language-model/problem.aird178
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.ecore13
-rw-r--r--subprojects/language-model/src/main/resources/model/problem.genmodel15
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java120
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java7
-rw-r--r--subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java43
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java8
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java2
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java2
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe22
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/Problem.xtext17
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java10
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java4
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java6
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java20
-rw-r--r--subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java12
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java2
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java8
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java26
-rw-r--r--subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java18
-rw-r--r--subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java5
25 files changed, 391 insertions, 161 deletions
diff --git a/subprojects/frontend/src/editor/EditorTheme.ts b/subprojects/frontend/src/editor/EditorTheme.ts
index 1cad4a36..f499b0d9 100644
--- a/subprojects/frontend/src/editor/EditorTheme.ts
+++ b/subprojects/frontend/src/editor/EditorTheme.ts
@@ -126,7 +126,7 @@ export default styled('div', {
126 color: theme.palette.text.secondary, 126 color: theme.palette.text.secondary,
127 }, 127 },
128 }, 128 },
129 '.tok-problem-individual': { 129 '.tok-problem-atom': {
130 '&, & .tok-variableName': { 130 '&, & .tok-variableName': {
131 color: theme.palette.text.primary, 131 color: theme.palette.text.primary,
132 }, 132 },
diff --git a/subprojects/frontend/src/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar
index ce3baa02..b08a9c36 100644
--- a/subprojects/frontend/src/language/problem.grammar
+++ b/subprojects/frontend/src/language/problem.grammar
@@ -28,7 +28,7 @@ statement {
28 (":" Expr)? "." 28 (":" Expr)? "."
29 } | 29 } |
30 ProblemDeclaration { 30 ProblemDeclaration {
31 kw<"problem"> QualifiedName "." 31 (ckw<"module"> | kw<"problem">) QualifiedName "."
32 } | 32 } |
33 ClassDefinition { 33 ClassDefinition {
34 kw<"abstract">? kw<"class"> RelationName 34 kw<"abstract">? kw<"class"> RelationName
@@ -37,7 +37,7 @@ statement {
37 } | 37 } |
38 EnumDefinition { 38 EnumDefinition {
39 kw<"enum"> RelationName 39 kw<"enum"> RelationName
40 (EnumBody { "{" sep<",", IndividualNodeName> "}" } | ".") 40 (EnumBody { "{" sep<",", AtomNodeName> "}" } | ".")
41 } | 41 } |
42 PredicateDefinition { 42 PredicateDefinition {
43 ( 43 (
@@ -56,8 +56,11 @@ statement {
56 // RuleName ParameterList<Parameter>? 56 // RuleName ParameterList<Parameter>?
57 // RuleBody { ":" sep<OrOp, Conjunction> "==>" sep<OrOp, Consequent> "." } 57 // RuleBody { ":" sep<OrOp, Conjunction> "==>" sep<OrOp, Consequent> "." }
58 //} | 58 //} |
59 IndividualDeclaration { 59 AtomDeclaration {
60 kw<"indiv"> sep<",", IndividualNodeName> "." 60 ckw<"atom"> sep<",", AtomNodeName> "."
61 } |
62 NodeDeclaration {
63 (ckw<"node"> | ckw<"multi">) sep<",", NodeName> "."
61 } | 64 } |
62 ScopeDeclaration { 65 ScopeDeclaration {
63 kw<"scope"> sep<",", ScopeElement> "." 66 kw<"scope"> sep<",", ScopeElement> "."
@@ -161,7 +164,7 @@ RelationName { QualifiedName ~name }
161 164
162//RuleName { QualifiedName } 165//RuleName { QualifiedName }
163 166
164IndividualNodeName { QualifiedName } 167AtomNodeName { QualifiedName }
165 168
166VariableName[@dynamicPrecedence=10] { QualifiedName ~name } 169VariableName[@dynamicPrecedence=10] { QualifiedName ~name }
167 170
diff --git a/subprojects/frontend/src/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts
index 2121e05f..3847fdd8 100644
--- a/subprojects/frontend/src/language/problemLanguageSupport.ts
+++ b/subprojects/frontend/src/language/problemLanguageSupport.ts
@@ -27,7 +27,8 @@ const parserWithMetadata = parser.configure({
27 styleTags({ 27 styleTags({
28 LineComment: t.lineComment, 28 LineComment: t.lineComment,
29 BlockComment: t.blockComment, 29 BlockComment: t.blockComment,
30 'problem class enum pred fn indiv scope': t.definitionKeyword, 30 'module problem class enum pred fn scope': t.definitionKeyword,
31 'node atom multi': t.definitionKeyword,
31 'abstract extends refers contains container opposite': t.modifier, 32 'abstract extends refers contains container opposite': t.modifier,
32 'default error contained containment': t.modifier, 33 'default error contained containment': t.modifier,
33 'true false unknown error': t.keyword, 34 'true false unknown error': t.keyword,
@@ -44,7 +45,7 @@ const parserWithMetadata = parser.configure({
44 String: t.string, 45 String: t.string,
45 'RelationName/QualifiedName': t.typeName, 46 'RelationName/QualifiedName': t.typeName,
46 // 'RuleName/QualifiedName': t.typeName, 47 // 'RuleName/QualifiedName': t.typeName,
47 'IndividualNodeName/QualifiedName': t.atom, 48 'AtomNodeName/QualifiedName': t.atom,
48 'VariableName/QualifiedName': t.variableName, 49 'VariableName/QualifiedName': t.variableName,
49 '{ }': t.brace, 50 '{ }': t.brace,
50 '( )': t.paren, 51 '( )': t.paren,
@@ -54,7 +55,8 @@ const parserWithMetadata = parser.configure({
54 }), 55 }),
55 indentNodeProp.add({ 56 indentNodeProp.add({
56 ProblemDeclaration: indentDeclaration, 57 ProblemDeclaration: indentDeclaration,
57 UniqueDeclaration: indentDeclaration, 58 AtomDeclaration: indentDeclaration,
59 NodeDeclaration: indentDeclaration,
58 ScopeDeclaration: indentDeclaration, 60 ScopeDeclaration: indentDeclaration,
59 PredicateBody: indentPredicateOrRule, 61 PredicateBody: indentPredicateOrRule,
60 FunctionBody: indentPredicateOrRule, 62 FunctionBody: indentPredicateOrRule,
@@ -70,7 +72,8 @@ const parserWithMetadata = parser.configure({
70 // RuleBody: foldInside, 72 // RuleBody: foldInside,
71 Conjunction: foldConjunction, 73 Conjunction: foldConjunction,
72 // Consequent: foldWholeNode, 74 // Consequent: foldWholeNode,
73 UniqueDeclaration: foldDeclaration, 75 AtomDeclaration: foldDeclaration,
76 NodeDeclaration: foldDeclaration,
74 ScopeDeclaration: foldDeclaration, 77 ScopeDeclaration: foldDeclaration,
75 BlockComment: foldBlockComment, 78 BlockComment: foldBlockComment,
76 }), 79 }),
diff --git a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
index f64d4066..94a61c4f 100644
--- a/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
+++ b/subprojects/language-ide/src/main/java/tools/refinery/language/ide/syntaxcoloring/ProblemSemanticHighlightingCalculator.java
@@ -29,7 +29,7 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
29 private static final String CONTAINMENT_CLASS = "containment"; 29 private static final String CONTAINMENT_CLASS = "containment";
30 private static final String ERROR_CLASS = "error"; 30 private static final String ERROR_CLASS = "error";
31 private static final String NODE_CLASS = "node"; 31 private static final String NODE_CLASS = "node";
32 private static final String INDIVIDUAL_NODE_CLASS = "individual"; 32 private static final String ATOM_NODE_CLASS = "atom";
33 private static final String NEW_NODE_CLASS = "new"; 33 private static final String NEW_NODE_CLASS = "new";
34 34
35 @Inject 35 @Inject
@@ -137,10 +137,10 @@ public class ProblemSemanticHighlightingCalculator extends DefaultSemanticHighli
137 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) { 137 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE) {
138 classesBuilder.add(NODE_CLASS); 138 classesBuilder.add(NODE_CLASS);
139 } 139 }
140 if (ProblemUtil.isIndividualNode(node)) { 140 if (ProblemUtil.isAtomNode(node)) {
141 classesBuilder.add(INDIVIDUAL_NODE_CLASS); 141 classesBuilder.add(ATOM_NODE_CLASS);
142 } 142 }
143 if (ProblemUtil.isNewNode(node)) { 143 if (ProblemUtil.isMultiNode(node)) {
144 classesBuilder.add(NEW_NODE_CLASS); 144 classesBuilder.add(NEW_NODE_CLASS);
145 } 145 }
146 } 146 }
diff --git a/subprojects/language-model/problem.aird b/subprojects/language-model/problem.aird
index a307ae83..a3420a04 100644
--- a/subprojects/language-model/problem.aird
+++ b/subprojects/language-model/problem.aird
@@ -1,25 +1,25 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style"> 2<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style">
3 <viewpoint:DAnalysis uid="_CqOewKA4EeuqkpDnuik1sg" selectedViews="_CsAAYKA4EeuqkpDnuik1sg" version="15.0.0.202201261500"> 3 <viewpoint:DAnalysis uid="_CqOewKA4EeuqkpDnuik1sg" selectedViews="_CsAAYKA4EeuqkpDnuik1sg" version="15.2.0.202303281325">
4 <semanticResources>src/main/resources/model/problem.ecore</semanticResources> 4 <semanticResources>src/main/resources/model/problem.ecore</semanticResources>
5 <semanticResources>src/main/resources/model/problem.genmodel</semanticResources> 5 <semanticResources>src/main/resources/model/problem.genmodel</semanticResources>
6 <semanticResources>build/resources/main/model/problem.ecore</semanticResources> 6 <semanticResources>build/resources/main/model/problem.ecore</semanticResources>
7 <semanticResources>build/resources/main/model/problem.genmodel</semanticResources> 7 <semanticResources>build/resources/main/model/problem.genmodel</semanticResources>
8 <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg"> 8 <ownedViews xmi:type="viewpoint:DView" uid="_CsAAYKA4EeuqkpDnuik1sg">
9 <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> 9 <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="7fa3b02a-a620-4e42-87d5-b2cc35ee8070"> 10 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_CsYa4KA4EeuqkpDnuik1sg" name="declarations" repPath="#_CsUwgKA4EeuqkpDnuik1sg" changeId="1706658830410">
11 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 11 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
12 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 12 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
13 </ownedRepresentationDescriptors> 13 </ownedRepresentationDescriptors>
14 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_z1bOYF3lEe2LuOZzJ_LhLg" name="expressions" repPath="#_z1YyIF3lEe2LuOZzJ_LhLg" changeId="847d1bab-b9a3-4b3c-9007-d1ef6cbc7d2b"> 14 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_z1bOYF3lEe2LuOZzJ_LhLg" name="expressions" repPath="#_z1YyIF3lEe2LuOZzJ_LhLg" changeId="1706657349781">
15 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 15 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
16 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 16 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
17 </ownedRepresentationDescriptors> 17 </ownedRepresentationDescriptors>
18 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_xj9yMF4eEe2rXNsIDUvqhw" name="assertions" repPath="#_xj6H0F4eEe2rXNsIDUvqhw" changeId="af7c7d5e-5f27-4ef1-b9ba-f5b0e7934a73"> 18 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_xj9yMF4eEe2rXNsIDUvqhw" name="assertions" repPath="#_xj6H0F4eEe2rXNsIDUvqhw" changeId="1706657349781">
19 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 19 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
20 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 20 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
21 </ownedRepresentationDescriptors> 21 </ownedRepresentationDescriptors>
22 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_sCFokF4fEe2rXNsIDUvqhw" name="actions" repPath="#_sCFBgF4fEe2rXNsIDUvqhw" changeId="46042178-5db9-429c-bfeb-2f746d757073"> 22 <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_sCFokF4fEe2rXNsIDUvqhw" name="actions" repPath="#_sCFBgF4fEe2rXNsIDUvqhw" changeId="1706657349781">
23 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 23 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
24 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/> 24 <target xmi:type="ecore:EPackage" href="src/main/resources/model/problem.ecore#/"/>
25 </ownedRepresentationDescriptors> 25 </ownedRepresentationDescriptors>
@@ -31,6 +31,10 @@
31 <children xmi:type="notation:Node" xmi:id="_D1D6MKA4EeuqkpDnuik1sg" type="2003" element="_D05iIKA4EeuqkpDnuik1sg"> 31 <children xmi:type="notation:Node" xmi:id="_D1D6MKA4EeuqkpDnuik1sg" type="2003" element="_D05iIKA4EeuqkpDnuik1sg">
32 <children xmi:type="notation:Node" xmi:id="_D1EhQKA4EeuqkpDnuik1sg" type="5007"/> 32 <children xmi:type="notation:Node" xmi:id="_D1EhQKA4EeuqkpDnuik1sg" type="5007"/>
33 <children xmi:type="notation:Node" xmi:id="_D1FIUKA4EeuqkpDnuik1sg" type="7004"> 33 <children xmi:type="notation:Node" xmi:id="_D1FIUKA4EeuqkpDnuik1sg" type="7004">
34 <children xmi:type="notation:Node" xmi:id="_ep380L_JEe6Mo_-4--GvQg" type="3010" element="_eplB4L_JEe6Mo_-4--GvQg">
35 <styles xmi:type="notation:FontStyle" xmi:id="_ep380b_JEe6Mo_-4--GvQg" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
36 <layoutConstraint xmi:type="notation:Location" xmi:id="_ep380r_JEe6Mo_-4--GvQg"/>
37 </children>
34 <styles xmi:type="notation:SortingStyle" xmi:id="_D1FIUaA4EeuqkpDnuik1sg"/> 38 <styles xmi:type="notation:SortingStyle" xmi:id="_D1FIUaA4EeuqkpDnuik1sg"/>
35 <styles xmi:type="notation:FilteringStyle" xmi:id="_D1FIUqA4EeuqkpDnuik1sg"/> 39 <styles xmi:type="notation:FilteringStyle" xmi:id="_D1FIUqA4EeuqkpDnuik1sg"/>
36 </children> 40 </children>
@@ -216,11 +220,15 @@
216 <children xmi:type="notation:Node" xmi:id="_pdJrwAGyEey7cfH5K6RyCw" type="2003" element="_pcXBkAGyEey7cfH5K6RyCw"> 220 <children xmi:type="notation:Node" xmi:id="_pdJrwAGyEey7cfH5K6RyCw" type="2003" element="_pcXBkAGyEey7cfH5K6RyCw">
217 <children xmi:type="notation:Node" xmi:id="_pdOkQAGyEey7cfH5K6RyCw" type="5007"/> 221 <children xmi:type="notation:Node" xmi:id="_pdOkQAGyEey7cfH5K6RyCw" type="5007"/>
218 <children xmi:type="notation:Node" xmi:id="_pdOkQQGyEey7cfH5K6RyCw" type="7004"> 222 <children xmi:type="notation:Node" xmi:id="_pdOkQQGyEey7cfH5K6RyCw" type="7004">
223 <children xmi:type="notation:Node" xmi:id="_u4zNEL_KEe6Mo_-4--GvQg" type="3010" element="_u4PMYL_KEe6Mo_-4--GvQg">
224 <styles xmi:type="notation:FontStyle" xmi:id="_u4zNEb_KEe6Mo_-4--GvQg" fontColor="2697711" fontName="Noto Sans" fontHeight="8"/>
225 <layoutConstraint xmi:type="notation:Location" xmi:id="_u4zNEr_KEe6Mo_-4--GvQg"/>
226 </children>
219 <styles xmi:type="notation:SortingStyle" xmi:id="_pdOkQgGyEey7cfH5K6RyCw"/> 227 <styles xmi:type="notation:SortingStyle" xmi:id="_pdOkQgGyEey7cfH5K6RyCw"/>
220 <styles xmi:type="notation:FilteringStyle" xmi:id="_pdOkQwGyEey7cfH5K6RyCw"/> 228 <styles xmi:type="notation:FilteringStyle" xmi:id="_pdOkQwGyEey7cfH5K6RyCw"/>
221 </children> 229 </children>
222 <styles xmi:type="notation:ShapeStyle" xmi:id="_pdJrwQGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/> 230 <styles xmi:type="notation:ShapeStyle" xmi:id="_pdJrwQGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
223 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pdJrwgGyEey7cfH5K6RyCw" x="104" y="524" width="147" height="100"/> 231 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pdJrwgGyEey7cfH5K6RyCw" x="131" y="524" width="120" height="100"/>
224 </children> 232 </children>
225 <children xmi:type="notation:Node" xmi:id="_A9YrQCrZEeyyC-O0_LlY9w" type="2003" element="_A8hIkCrZEeyyC-O0_LlY9w"> 233 <children xmi:type="notation:Node" xmi:id="_A9YrQCrZEeyyC-O0_LlY9w" type="2003" element="_A8hIkCrZEeyyC-O0_LlY9w">
226 <children xmi:type="notation:Node" xmi:id="_A9c8sCrZEeyyC-O0_LlY9w" type="5007"/> 234 <children xmi:type="notation:Node" xmi:id="_A9c8sCrZEeyyC-O0_LlY9w" type="5007"/>
@@ -432,6 +440,44 @@
432 <styles xmi:type="notation:ShapeStyle" xmi:id="_pOTU4Wg8Ee25oofngfVl_A" fontName="Noto Sans" fontHeight="8"/> 440 <styles xmi:type="notation:ShapeStyle" xmi:id="_pOTU4Wg8Ee25oofngfVl_A" fontName="Noto Sans" fontHeight="8"/>
433 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pOTU4mg8Ee25oofngfVl_A" x="776" y="1280" width="120" height="100"/> 441 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pOTU4mg8Ee25oofngfVl_A" x="776" y="1280" width="120" height="100"/>
434 </children> 442 </children>
443 <children xmi:type="notation:Node" xmi:id="_ZcIsoL_JEe6Mo_-4--GvQg" type="2003" element="_ZbwSIL_JEe6Mo_-4--GvQg">
444 <children xmi:type="notation:Node" xmi:id="_ZcJTsL_JEe6Mo_-4--GvQg" type="5007"/>
445 <children xmi:type="notation:Node" xmi:id="_ZcJTsb_JEe6Mo_-4--GvQg" type="7004">
446 <children xmi:type="notation:Node" xmi:id="_cstskL_JEe6Mo_-4--GvQg" type="3010" element="_csN9UL_JEe6Mo_-4--GvQg">
447 <styles xmi:type="notation:FontStyle" xmi:id="_cstskb_JEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
448 <layoutConstraint xmi:type="notation:Location" xmi:id="_cstskr_JEe6Mo_-4--GvQg"/>
449 </children>
450 <children xmi:type="notation:Node" xmi:id="_dVoGsL_JEe6Mo_-4--GvQg" type="3010" element="_dVQTQL_JEe6Mo_-4--GvQg">
451 <styles xmi:type="notation:FontStyle" xmi:id="_dVoGsb_JEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
452 <layoutConstraint xmi:type="notation:Location" xmi:id="_dVoGsr_JEe6Mo_-4--GvQg"/>
453 </children>
454 <styles xmi:type="notation:SortingStyle" xmi:id="_ZcJTsr_JEe6Mo_-4--GvQg"/>
455 <styles xmi:type="notation:FilteringStyle" xmi:id="_ZcJTs7_JEe6Mo_-4--GvQg"/>
456 </children>
457 <styles xmi:type="notation:ShapeStyle" xmi:id="_ZcIsob_JEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
458 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZcIsor_JEe6Mo_-4--GvQg" x="131" y="20" width="120" height="100"/>
459 </children>
460 <children xmi:type="notation:Node" xmi:id="_aq0Q0L_KEe6Mo_-4--GvQg" type="2003" element="_aqfgsL_KEe6Mo_-4--GvQg">
461 <children xmi:type="notation:Node" xmi:id="_aq0Q07_KEe6Mo_-4--GvQg" type="5007"/>
462 <children xmi:type="notation:Node" xmi:id="_aq0Q1L_KEe6Mo_-4--GvQg" type="7004">
463 <children xmi:type="notation:Node" xmi:id="_cWM0kL_KEe6Mo_-4--GvQg" type="3010" element="_cV-yIL_KEe6Mo_-4--GvQg">
464 <styles xmi:type="notation:FontStyle" xmi:id="_cWM0kb_KEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
465 <layoutConstraint xmi:type="notation:Location" xmi:id="_cWM0kr_KEe6Mo_-4--GvQg"/>
466 </children>
467 <children xmi:type="notation:Node" xmi:id="_cru_sL_KEe6Mo_-4--GvQg" type="3010" element="_crhkUL_KEe6Mo_-4--GvQg">
468 <styles xmi:type="notation:FontStyle" xmi:id="_cru_sb_KEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
469 <layoutConstraint xmi:type="notation:Location" xmi:id="_cru_sr_KEe6Mo_-4--GvQg"/>
470 </children>
471 <children xmi:type="notation:Node" xmi:id="_c7vxoL_KEe6Mo_-4--GvQg" type="3010" element="_c7jkYL_KEe6Mo_-4--GvQg">
472 <styles xmi:type="notation:FontStyle" xmi:id="_c7vxob_KEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
473 <layoutConstraint xmi:type="notation:Location" xmi:id="_c7vxor_KEe6Mo_-4--GvQg"/>
474 </children>
475 <styles xmi:type="notation:SortingStyle" xmi:id="_aq0Q1b_KEe6Mo_-4--GvQg"/>
476 <styles xmi:type="notation:FilteringStyle" xmi:id="_aq0Q1r_KEe6Mo_-4--GvQg"/>
477 </children>
478 <styles xmi:type="notation:ShapeStyle" xmi:id="_aq0Q0b_KEe6Mo_-4--GvQg" fontName="Noto Sans" fontHeight="8"/>
479 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aq0Q0r_KEe6Mo_-4--GvQg" x="131" y="716" width="120" height="100"/>
480 </children>
435 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/> 481 <styles xmi:type="notation:DiagramStyle" xmi:id="_CsZB8qA4EeuqkpDnuik1sg"/>
436 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg"> 482 <edges xmi:type="notation:Edge" xmi:id="_4eaYwKA8EeuqkpDnuik1sg" type="4001" element="_4eU5TqA8EeuqkpDnuik1sg" source="_D1D6MKA4EeuqkpDnuik1sg" target="_xsq_MKA8EeuqkpDnuik1sg">
437 <children xmi:type="notation:Node" xmi:id="_4ea_06A8EeuqkpDnuik1sg" type="6001"> 483 <children xmi:type="notation:Node" xmi:id="_4ea_06A8EeuqkpDnuik1sg" type="6001">
@@ -675,18 +721,18 @@
675 </edges> 721 </edges>
676 <edges xmi:type="notation:Edge" xmi:id="_zKMY0AGyEey7cfH5K6RyCw" type="4001" element="_zJpmRgGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_xsq_MKA8EeuqkpDnuik1sg"> 722 <edges xmi:type="notation:Edge" xmi:id="_zKMY0AGyEey7cfH5K6RyCw" type="4001" element="_zJpmRgGyEey7cfH5K6RyCw" source="_pdJrwAGyEey7cfH5K6RyCw" target="_xsq_MKA8EeuqkpDnuik1sg">
677 <children xmi:type="notation:Node" xmi:id="_zKM_4AGyEey7cfH5K6RyCw" type="6001"> 723 <children xmi:type="notation:Node" xmi:id="_zKM_4AGyEey7cfH5K6RyCw" type="6001">
678 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4QGyEey7cfH5K6RyCw" x="-400" y="-16"/> 724 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4QGyEey7cfH5K6RyCw" x="-397" y="-12"/>
679 </children> 725 </children>
680 <children xmi:type="notation:Node" xmi:id="_zKM_4gGyEey7cfH5K6RyCw" type="6002"> 726 <children xmi:type="notation:Node" xmi:id="_zKM_4gGyEey7cfH5K6RyCw" type="6002">
681 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4wGyEey7cfH5K6RyCw" x="-23"/> 727 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_4wGyEey7cfH5K6RyCw" x="-43"/>
682 </children> 728 </children>
683 <children xmi:type="notation:Node" xmi:id="_zKM_5AGyEey7cfH5K6RyCw" type="6003"> 729 <children xmi:type="notation:Node" xmi:id="_zKM_5AGyEey7cfH5K6RyCw" type="6003">
684 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_5QGyEey7cfH5K6RyCw" x="-84" y="10"/> 730 <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zKM_5QGyEey7cfH5K6RyCw" x="-88" y="10"/>
685 </children> 731 </children>
686 <styles xmi:type="notation:ConnectorStyle" xmi:id="_zKMY0QGyEey7cfH5K6RyCw" routing="Rectilinear"/> 732 <styles xmi:type="notation:ConnectorStyle" xmi:id="_zKMY0QGyEey7cfH5K6RyCw" routing="Rectilinear"/>
687 <styles xmi:type="notation:FontStyle" xmi:id="_zKMY0gGyEey7cfH5K6RyCw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/> 733 <styles xmi:type="notation:FontStyle" xmi:id="_zKMY0gGyEey7cfH5K6RyCw" fontColor="7490599" fontName="Noto Sans" fontHeight="8"/>
688 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zKMY0wGyEey7cfH5K6RyCw" points="[-84, -5, -852, 120]$[-84, -53, -852, 72]$[804, -53, 36, 72]$[804, -99, 36, 26]"/> 734 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zKMY0wGyEey7cfH5K6RyCw" points="[-21, -3, -828, 120]$[-21, -51, -828, 72]$[843, -51, 36, 72]$[843, -97, 36, 26]"/>
689 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8AGyEey7cfH5K6RyCw" id="(0.8275862068965517,0.05102040816326531)"/> 735 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8AGyEey7cfH5K6RyCw" id="(0.4576271186440678,0.030612244897959183)"/>
690 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8QGyEey7cfH5K6RyCw" id="(0.0,0.7346938775510204)"/> 736 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_zKNm8QGyEey7cfH5K6RyCw" id="(0.0,0.7346938775510204)"/>
691 </edges> 737 </edges>
692 <edges xmi:type="notation:Edge" xmi:id="_vd7aQKA9EeuqkpDnuik1sg" type="4001" element="_vdptgqA9EeuqkpDnuik1sg" source="_QUDYMKA9EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg"> 738 <edges xmi:type="notation:Edge" xmi:id="_vd7aQKA9EeuqkpDnuik1sg" type="4001" element="_vdptgqA9EeuqkpDnuik1sg" source="_QUDYMKA9EeuqkpDnuik1sg" target="_e73WIKA9EeuqkpDnuik1sg">
@@ -750,7 +796,7 @@
750 <styles xmi:type="notation:ConnectorStyle" xmi:id="_s7wgoQGyEey7cfH5K6RyCw" routing="Tree"/> 796 <styles xmi:type="notation:ConnectorStyle" xmi:id="_s7wgoQGyEey7cfH5K6RyCw" routing="Tree"/>
751 <styles xmi:type="notation:FontStyle" xmi:id="_s7wgogGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/> 797 <styles xmi:type="notation:FontStyle" xmi:id="_s7wgogGyEey7cfH5K6RyCw" fontName="Noto Sans" fontHeight="8"/>
752 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_s7wgowGyEey7cfH5K6RyCw" points="[0, -6, -654, 192]$[0, -30, -654, 168]$[655, -30, 1, 168]$[655, -100, 1, 98]"/> 798 <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_s7wgowGyEey7cfH5K6RyCw" points="[0, -6, -654, 192]$[0, -30, -654, 168]$[655, -30, 1, 168]$[655, -100, 1, 98]"/>
753 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIAGyEey7cfH5K6RyCw" id="(0.5310344827586206,0.061224489795918366)"/> 799 <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIAGyEey7cfH5K6RyCw" id="(0.652542372881356,0.0)"/>
754 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIQGyEey7cfH5K6RyCw" id="(0.5,0.0)"/> 800 <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s71ZIQGyEey7cfH5K6RyCw" id="(0.5,0.0)"/>
755 </edges> 801 </edges>
756 <edges xmi:type="notation:Edge" xmi:id="_s4W8oCtaEeySS4mYSornnA" type="4001" element="_mzziwKA9EeuqkpDnuik1sg" source="_A9YrQCrZEeyyC-O0_LlY9w" target="_e73WIKA9EeuqkpDnuik1sg"> 802 <edges xmi:type="notation:Edge" xmi:id="_s4W8oCtaEeySS4mYSornnA" type="4001" element="_mzziwKA9EeuqkpDnuik1sg" source="_A9YrQCrZEeyyC-O0_LlY9w" target="_e73WIKA9EeuqkpDnuik1sg">
@@ -1332,10 +1378,18 @@
1332 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1378 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
1333 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 1379 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
1334 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 1380 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
1335 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_D06wQKA4EeuqkpDnuik1sg" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 1381 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_fPhnkb_JEe6Mo_-4--GvQg" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
1336 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> 1382 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
1337 </ownedStyle> 1383 </ownedStyle>
1338 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> 1384 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
1385 <ownedElements xmi:type="diagram:DNodeListElement" uid="_eplB4L_JEe6Mo_-4--GvQg" name="kind : ModuleKind = PROBLEM" tooltipText="">
1386 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Problem/kind"/>
1387 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//Problem/kind"/>
1388 <ownedStyle xmi:type="diagram:BundledImage" uid="_fPjcw7_JEe6Mo_-4--GvQg" labelAlignment="LEFT">
1389 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
1390 </ownedStyle>
1391 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
1392 </ownedElements>
1339 </ownedDiagramElements> 1393 </ownedDiagramElements>
1340 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_JTstIKA4EeuqkpDnuik1sg" name="ClassDeclaration" tooltipText="" outgoingEdges="_jk6-PKA4EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _-XLKltawEeuymriYTNxK2g _m2GbcmTvEe2qdtyPWAtoxA _YWqZhmTzEe2qdtyPWAtoxA" width="12" height="10"> 1394 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_JTstIKA4EeuqkpDnuik1sg" name="ClassDeclaration" tooltipText="" outgoingEdges="_jk6-PKA4EeuqkpDnuik1sg _plK3JqA9EeuqkpDnuik1sg _-XLKltawEeuymriYTNxK2g _m2GbcmTvEe2qdtyPWAtoxA _YWqZhmTzEe2qdtyPWAtoxA" width="12" height="10">
1341 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ClassDeclaration"/> 1395 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//ClassDeclaration"/>
@@ -1728,12 +1782,12 @@
1728 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_m-6OTNXtEeuF_d0WEhR3Xw" sourceNode="_D05iIKA4EeuqkpDnuik1sg" targetNode="_RzK-YKA5EeuqkpDnuik1sg"> 1782 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_m-6OTNXtEeuF_d0WEhR3Xw" sourceNode="_D05iIKA4EeuqkpDnuik1sg" targetNode="_RzK-YKA5EeuqkpDnuik1sg">
1729 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Problem"/> 1783 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Problem"/>
1730 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Problem"/> 1784 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//Problem"/>
1731 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_m-61UNXtEeuF_d0WEhR3Xw" targetArrow="InputClosedArrow" routingStyle="tree"> 1785 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_fPrYkL_JEe6Mo_-4--GvQg" targetArrow="InputClosedArrow" routingStyle="tree">
1732 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/> 1786 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
1733 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_m-61UdXtEeuF_d0WEhR3Xw" showIcon="false"> 1787 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_fPrYkb_JEe6Mo_-4--GvQg" showIcon="false">
1734 <labelFormat>italic</labelFormat> 1788 <labelFormat>italic</labelFormat>
1735 </beginLabelStyle> 1789 </beginLabelStyle>
1736 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_m-61UtXtEeuF_d0WEhR3Xw" showIcon="false"/> 1790 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_fPrYkr_JEe6Mo_-4--GvQg" showIcon="false"/>
1737 </ownedStyle> 1791 </ownedStyle>
1738 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 1792 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
1739 </ownedDiagramElements> 1793 </ownedDiagramElements>
@@ -1857,32 +1911,40 @@
1857 </ownedStyle> 1911 </ownedStyle>
1858 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 1912 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
1859 </ownedDiagramElements> 1913 </ownedDiagramElements>
1860 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_pcXBkAGyEey7cfH5K6RyCw" name="IndividualDeclaration" tooltipText="" outgoingEdges="_s68oXAGyEey7cfH5K6RyCw _zJpmRgGyEey7cfH5K6RyCw" width="12" height="10"> 1914 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_pcXBkAGyEey7cfH5K6RyCw" name="NodeDeclaration" tooltipText="" outgoingEdges="_s68oXAGyEey7cfH5K6RyCw _zJpmRgGyEey7cfH5K6RyCw" width="12" height="10">
1861 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//IndividualDeclaration"/> 1915 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NodeDeclaration"/>
1862 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//IndividualDeclaration"/> 1916 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NodeDeclaration"/>
1863 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> 1917 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
1864 <arrangeConstraints>KEEP_SIZE</arrangeConstraints> 1918 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
1865 <arrangeConstraints>KEEP_RATIO</arrangeConstraints> 1919 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
1866 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_pcYPsAGyEey7cfH5K6RyCw" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> 1920 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_vkEXpL_KEe6Mo_-4--GvQg" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
1867 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> 1921 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
1868 </ownedStyle> 1922 </ownedStyle>
1869 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> 1923 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
1924 <ownedElements xmi:type="diagram:DNodeListElement" uid="_u4PMYL_KEe6Mo_-4--GvQg" name="kind : NodeKind = NODE" tooltipText="">
1925 <target xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//NodeDeclaration/kind"/>
1926 <semanticElements xmi:type="ecore:EAttribute" href="src/main/resources/model/problem.ecore#//NodeDeclaration/kind"/>
1927 <ownedStyle xmi:type="diagram:BundledImage" uid="_vkICAb_KEe6Mo_-4--GvQg" labelAlignment="LEFT">
1928 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
1929 </ownedStyle>
1930 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
1931 </ownedElements>
1870 </ownedDiagramElements> 1932 </ownedDiagramElements>
1871 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_s68oXAGyEey7cfH5K6RyCw" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_e7ydoKA9EeuqkpDnuik1sg"> 1933 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_s68oXAGyEey7cfH5K6RyCw" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_e7ydoKA9EeuqkpDnuik1sg">
1872 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//IndividualDeclaration"/> 1934 <target xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NodeDeclaration"/>
1873 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//IndividualDeclaration"/> 1935 <semanticElements xmi:type="ecore:EClass" href="src/main/resources/model/problem.ecore#//NodeDeclaration"/>
1874 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_s69PYAGyEey7cfH5K6RyCw" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree"> 1936 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_vkQk5r_KEe6Mo_-4--GvQg" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
1875 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/> 1937 <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
1876 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_s69PYQGyEey7cfH5K6RyCw" showIcon="false"> 1938 <beginLabelStyle xmi:type="diagram:BeginLabelStyle" uid="_vkQk57_KEe6Mo_-4--GvQg" showIcon="false">
1877 <labelFormat>italic</labelFormat> 1939 <labelFormat>italic</labelFormat>
1878 </beginLabelStyle> 1940 </beginLabelStyle>
1879 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_s69PYgGyEey7cfH5K6RyCw" showIcon="false"/> 1941 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_vkQk6L_KEe6Mo_-4--GvQg" showIcon="false"/>
1880 </ownedStyle> 1942 </ownedStyle>
1881 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/> 1943 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
1882 </ownedDiagramElements> 1944 </ownedDiagramElements>
1883 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_zJpmRgGyEey7cfH5K6RyCw" name="[0..*] nodes" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_xsYrUKA8EeuqkpDnuik1sg"> 1945 <ownedDiagramElements xmi:type="diagram:DEdge" uid="_zJpmRgGyEey7cfH5K6RyCw" name="[0..*] nodes" sourceNode="_pcXBkAGyEey7cfH5K6RyCw" targetNode="_xsYrUKA8EeuqkpDnuik1sg">
1884 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//IndividualDeclaration/nodes"/> 1946 <target xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeDeclaration/nodes"/>
1885 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//IndividualDeclaration/nodes"/> 1947 <semanticElements xmi:type="ecore:EReference" href="src/main/resources/model/problem.ecore#//NodeDeclaration/nodes"/>
1886 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_zJqNUAGyEey7cfH5K6RyCw" description="_L-JhMKA4EeuqkpDnuik1sg" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0"> 1948 <ownedStyle xmi:type="diagram:EdgeStyle" uid="_zJqNUAGyEey7cfH5K6RyCw" description="_L-JhMKA4EeuqkpDnuik1sg" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
1887 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_zJqNUgGyEey7cfH5K6RyCw" showIcon="false"> 1949 <centerLabelStyle xmi:type="diagram:CenterLabelStyle" uid="_zJqNUgGyEey7cfH5K6RyCw" showIcon="false">
1888 <customFeatures>labelSize</customFeatures> 1950 <customFeatures>labelSize</customFeatures>
@@ -2560,6 +2622,68 @@
2560 </ownedStyle> 2622 </ownedStyle>
2561 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/> 2623 <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
2562 </ownedDiagramElements> 2624 </ownedDiagramElements>
2625 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_ZbwSIL_JEe6Mo_-4--GvQg" name="ModuleKind" tooltipText="" width="12" height="10">
2626 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ModuleKind"/>
2627 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//ModuleKind"/>
2628 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2629 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2630 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2631 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_Zbw5ML_JEe6Mo_-4--GvQg" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
2632 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/>
2633 </ownedStyle>
2634 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
2635 <ownedElements xmi:type="diagram:DNodeListElement" uid="_csN9UL_JEe6Mo_-4--GvQg" name="PROBLEM" tooltipText="">
2636 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ModuleKind/PROBLEM"/>
2637 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ModuleKind/PROBLEM"/>
2638 <ownedStyle xmi:type="diagram:BundledImage" uid="_csN9Ub_JEe6Mo_-4--GvQg" labelAlignment="LEFT">
2639 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2640 </ownedStyle>
2641 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2642 </ownedElements>
2643 <ownedElements xmi:type="diagram:DNodeListElement" uid="_dVQTQL_JEe6Mo_-4--GvQg" name="MODULE" tooltipText="">
2644 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ModuleKind/MODULE"/>
2645 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//ModuleKind/MODULE"/>
2646 <ownedStyle xmi:type="diagram:BundledImage" uid="_dVQ6UL_JEe6Mo_-4--GvQg" labelAlignment="LEFT">
2647 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2648 </ownedStyle>
2649 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2650 </ownedElements>
2651 </ownedDiagramElements>
2652 <ownedDiagramElements xmi:type="diagram:DNodeList" uid="_aqfgsL_KEe6Mo_-4--GvQg" name="NodeKind" tooltipText="" width="12" height="10">
2653 <target xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//NodeKind"/>
2654 <semanticElements xmi:type="ecore:EEnum" href="src/main/resources/model/problem.ecore#//NodeKind"/>
2655 <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
2656 <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
2657 <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
2658 <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_aqfgsb_KEe6Mo_-4--GvQg" borderSize="1" borderSizeComputationExpression="1" borderColor="125,125,125" backgroundStyle="Liquid" foregroundColor="221,236,202">
2659 <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@style"/>
2660 </ownedStyle>
2661 <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
2662 <ownedElements xmi:type="diagram:DNodeListElement" uid="_cV-yIL_KEe6Mo_-4--GvQg" name="NODE" tooltipText="">
2663 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/NODE"/>
2664 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/NODE"/>
2665 <ownedStyle xmi:type="diagram:BundledImage" uid="_cV-yIb_KEe6Mo_-4--GvQg" labelAlignment="LEFT">
2666 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2667 </ownedStyle>
2668 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2669 </ownedElements>
2670 <ownedElements xmi:type="diagram:DNodeListElement" uid="_crhkUL_KEe6Mo_-4--GvQg" name="ATOM" tooltipText="">
2671 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/ATOM"/>
2672 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/ATOM"/>
2673 <ownedStyle xmi:type="diagram:BundledImage" uid="_crhkUb_KEe6Mo_-4--GvQg" labelAlignment="LEFT">
2674 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2675 </ownedStyle>
2676 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2677 </ownedElements>
2678 <ownedElements xmi:type="diagram:DNodeListElement" uid="_c7jkYL_KEe6Mo_-4--GvQg" name="MULTI" tooltipText="">
2679 <target xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/MULTI"/>
2680 <semanticElements xmi:type="ecore:EEnumLiteral" href="src/main/resources/model/problem.ecore#//NodeKind/MULTI"/>
2681 <ownedStyle xmi:type="diagram:BundledImage" uid="_c7jkYb_KEe6Mo_-4--GvQg" labelAlignment="LEFT">
2682 <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
2683 </ownedStyle>
2684 <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
2685 </ownedElements>
2686 </ownedDiagramElements>
2563 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> 2687 <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
2564 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/> 2688 <filterVariableHistory xmi:type="diagram:FilterVariableHistory" uid="_CsWlsKA4EeuqkpDnuik1sg"/>
2565 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> 2689 <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
diff --git a/subprojects/language-model/src/main/resources/model/problem.ecore b/subprojects/language-model/src/main/resources/model/problem.ecore
index 74229a89..aa05a2fe 100644
--- a/subprojects/language-model/src/main/resources/model/problem.ecore
+++ b/subprojects/language-model/src/main/resources/model/problem.ecore
@@ -6,6 +6,7 @@
6 eType="#//Node" transient="true" containment="true"/> 6 eType="#//Node" transient="true" containment="true"/>
7 <eStructuralFeatures xsi:type="ecore:EReference" name="statements" upperBound="-1" 7 <eStructuralFeatures xsi:type="ecore:EReference" name="statements" upperBound="-1"
8 eType="#//Statement" containment="true"/> 8 eType="#//Statement" containment="true"/>
9 <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//ModuleKind"/>
9 </eClassifiers> 10 </eClassifiers>
10 <eClassifiers xsi:type="ecore:EClass" name="ClassDeclaration" eSuperTypes="#//Statement #//Relation"> 11 <eClassifiers xsi:type="ecore:EClass" name="ClassDeclaration" eSuperTypes="#//Statement #//Relation">
11 <eStructuralFeatures xsi:type="ecore:EAttribute" name="abstract" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/> 12 <eStructuralFeatures xsi:type="ecore:EAttribute" name="abstract" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
@@ -109,9 +110,10 @@
109 <eStructuralFeatures xsi:type="ecore:EReference" name="node" eType="#//Node"/> 110 <eStructuralFeatures xsi:type="ecore:EReference" name="node" eType="#//Node"/>
110 </eClassifiers> 111 </eClassifiers>
111 <eClassifiers xsi:type="ecore:EClass" name="AssertionArgument" abstract="true"/> 112 <eClassifiers xsi:type="ecore:EClass" name="AssertionArgument" abstract="true"/>
112 <eClassifiers xsi:type="ecore:EClass" name="IndividualDeclaration" eSuperTypes="#//Statement"> 113 <eClassifiers xsi:type="ecore:EClass" name="NodeDeclaration" eSuperTypes="#//Statement">
113 <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1" 114 <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1"
114 eType="#//Node" containment="true"/> 115 eType="#//Node" containment="true"/>
116 <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//NodeKind"/>
115 </eClassifiers> 117 </eClassifiers>
116 <eClassifiers xsi:type="ecore:EClass" name="WildcardAssertionArgument" eSuperTypes="#//AssertionArgument"/> 118 <eClassifiers xsi:type="ecore:EClass" name="WildcardAssertionArgument" eSuperTypes="#//AssertionArgument"/>
117 <eClassifiers xsi:type="ecore:EClass" name="ParametricDefinition" abstract="true" 119 <eClassifiers xsi:type="ecore:EClass" name="ParametricDefinition" abstract="true"
@@ -259,4 +261,13 @@
259 <eClassifiers xsi:type="ecore:EClass" name="LogicConstant" eSuperTypes="#//Constant"> 261 <eClassifiers xsi:type="ecore:EClass" name="LogicConstant" eSuperTypes="#//Constant">
260 <eStructuralFeatures xsi:type="ecore:EAttribute" name="logicValue" eType="#//LogicValue"/> 262 <eStructuralFeatures xsi:type="ecore:EAttribute" name="logicValue" eType="#//LogicValue"/>
261 </eClassifiers> 263 </eClassifiers>
264 <eClassifiers xsi:type="ecore:EEnum" name="ModuleKind">
265 <eLiterals name="PROBLEM"/>
266 <eLiterals name="MODULE" value="1"/>
267 </eClassifiers>
268 <eClassifiers xsi:type="ecore:EEnum" name="NodeKind">
269 <eLiterals name="NODE"/>
270 <eLiterals name="ATOM" value="1"/>
271 <eLiterals name="MULTI" value="2"/>
272 </eClassifiers>
262</ecore:EPackage> 273</ecore:EPackage>
diff --git a/subprojects/language-model/src/main/resources/model/problem.genmodel b/subprojects/language-model/src/main/resources/model/problem.genmodel
index b5aa81c4..be8b62eb 100644
--- a/subprojects/language-model/src/main/resources/model/problem.genmodel
+++ b/subprojects/language-model/src/main/resources/model/problem.genmodel
@@ -64,9 +64,19 @@
64 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PrimitiveType/REAL"/> 64 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PrimitiveType/REAL"/>
65 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PrimitiveType/STRING"/> 65 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//PrimitiveType/STRING"/>
66 </genEnums> 66 </genEnums>
67 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//ModuleKind">
68 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ModuleKind/PROBLEM"/>
69 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//ModuleKind/MODULE"/>
70 </genEnums>
71 <genEnums typeSafeEnumCompatible="false" ecoreEnum="problem.ecore#//NodeKind">
72 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//NodeKind/NODE"/>
73 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//NodeKind/ATOM"/>
74 <genEnumLiterals ecoreEnumLiteral="problem.ecore#//NodeKind/MULTI"/>
75 </genEnums>
67 <genClasses ecoreClass="problem.ecore#//Problem"> 76 <genClasses ecoreClass="problem.ecore#//Problem">
68 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/> 77 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/nodes"/>
69 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/statements"/> 78 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//Problem/statements"/>
79 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//Problem/kind"/>
70 </genClasses> 80 </genClasses>
71 <genClasses ecoreClass="problem.ecore#//ClassDeclaration"> 81 <genClasses ecoreClass="problem.ecore#//ClassDeclaration">
72 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ClassDeclaration/abstract"/> 82 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//ClassDeclaration/abstract"/>
@@ -144,8 +154,9 @@
144 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//NodeAssertionArgument/node"/> 154 <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference problem.ecore#//NodeAssertionArgument/node"/>
145 </genClasses> 155 </genClasses>
146 <genClasses ecoreClass="problem.ecore#//AssertionArgument"/> 156 <genClasses ecoreClass="problem.ecore#//AssertionArgument"/>
147 <genClasses ecoreClass="problem.ecore#//IndividualDeclaration"> 157 <genClasses ecoreClass="problem.ecore#//NodeDeclaration">
148 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//IndividualDeclaration/nodes"/> 158 <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference problem.ecore#//NodeDeclaration/nodes"/>
159 <genFeatures createChild="false" ecoreFeature="ecore:EAttribute problem.ecore#//NodeDeclaration/kind"/>
149 </genClasses> 160 </genClasses>
150 <genClasses ecoreClass="problem.ecore#//WildcardAssertionArgument"/> 161 <genClasses ecoreClass="problem.ecore#//WildcardAssertionArgument"/>
151 <genClasses ecoreClass="problem.ecore#//ParametricDefinition"> 162 <genClasses ecoreClass="problem.ecore#//ParametricDefinition">
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 38bf5a61..b462fd70 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
@@ -169,9 +169,9 @@ public class ModelInitializer {
169 169
170 private void collectNodes() { 170 private void collectNodes() {
171 for (var statement : problem.getStatements()) { 171 for (var statement : problem.getStatements()) {
172 if (statement instanceof IndividualDeclaration individualDeclaration) { 172 if (statement instanceof NodeDeclaration nodeDeclaration) {
173 for (var individual : individualDeclaration.getNodes()) { 173 for (var node : nodeDeclaration.getNodes()) {
174 collectNode(individual); 174 collectNode(node);
175 } 175 }
176 } else if (statement instanceof ClassDeclaration classDeclaration) { 176 } else if (statement instanceof ClassDeclaration classDeclaration) {
177 var newNode = classDeclaration.getNewNode(); 177 var newNode = classDeclaration.getNewNode();
@@ -355,10 +355,8 @@ public class ModelInitializer {
355 collectClassDeclarationAssertions(classDeclaration); 355 collectClassDeclarationAssertions(classDeclaration);
356 } else if (statement instanceof EnumDeclaration enumDeclaration) { 356 } else if (statement instanceof EnumDeclaration enumDeclaration) {
357 collectEnumAssertions(enumDeclaration); 357 collectEnumAssertions(enumDeclaration);
358 } else if (statement instanceof IndividualDeclaration individualDeclaration) { 358 } else if (statement instanceof NodeDeclaration nodeDeclaration) {
359 for (var individual : individualDeclaration.getNodes()) { 359 collectNodeDeclarationAssertions(nodeDeclaration);
360 collectIndividualAssertions(individual);
361 }
362 } else if (statement instanceof Assertion assertion) { 360 } else if (statement instanceof Assertion assertion) {
363 collectAssertion(assertion); 361 collectAssertion(assertion);
364 } 362 }
@@ -379,7 +377,7 @@ public class ModelInitializer {
379 private void collectEnumAssertions(EnumDeclaration enumDeclaration) { 377 private void collectEnumAssertions(EnumDeclaration enumDeclaration) {
380 var overlay = MutableSeed.of(1, null); 378 var overlay = MutableSeed.of(1, null);
381 for (var literal : enumDeclaration.getLiterals()) { 379 for (var literal : enumDeclaration.getLiterals()) {
382 collectIndividualAssertions(literal); 380 collectCardinalityAssertions(literal, TruthValue.TRUE);
383 var nodeId = getNodeId(literal); 381 var nodeId = getNodeId(literal);
384 overlay.mergeValue(Tuple.of(nodeId), TruthValue.TRUE); 382 overlay.mergeValue(Tuple.of(nodeId), TruthValue.TRUE);
385 } 383 }
@@ -387,9 +385,25 @@ public class ModelInitializer {
387 info.assertions().overwriteValues(overlay); 385 info.assertions().overwriteValues(overlay);
388 } 386 }
389 387
390 private void collectIndividualAssertions(Node node) { 388 private void collectNodeDeclarationAssertions(NodeDeclaration nodeDeclaration) {
389 var kind = nodeDeclaration.getKind();
390 TruthValue value;
391 switch (kind) {
392 case ATOM -> value = TruthValue.TRUE;
393 case MULTI -> value = TruthValue.UNKNOWN;
394 case NODE -> {
395 return;
396 }
397 default -> throw new IllegalArgumentException("Unknown node kind: " + kind);
398 }
399 for (var node : nodeDeclaration.getNodes()) {
400 collectCardinalityAssertions(node, value);
401 }
402 }
403
404 private void collectCardinalityAssertions(Node node, TruthValue value) {
391 var nodeId = getNodeId(node); 405 var nodeId = getNodeId(node);
392 collectCardinalityAssertions(nodeId, TruthValue.TRUE); 406 collectCardinalityAssertions(nodeId, value);
393 } 407 }
394 408
395 private void collectCardinalityAssertions(int nodeId, TruthValue value) { 409 private void collectCardinalityAssertions(int nodeId, TruthValue value) {
@@ -587,47 +601,51 @@ public class ModelInitializer {
587 601
588 private void toLiterals(Expr expr, Map<tools.refinery.language.model.problem.Variable, Variable> localScope, 602 private void toLiterals(Expr expr, Map<tools.refinery.language.model.problem.Variable, Variable> localScope,
589 List<Literal> literals) { 603 List<Literal> literals) {
590 if (expr instanceof LogicConstant logicConstant) { 604 switch (expr) {
591 switch (logicConstant.getLogicValue()) { 605 case LogicConstant logicConstant -> {
592 case TRUE -> literals.add(BooleanLiteral.TRUE); 606 switch (logicConstant.getLogicValue()) {
593 case FALSE -> literals.add(BooleanLiteral.FALSE); 607 case TRUE -> literals.add(BooleanLiteral.TRUE);
594 default -> throw new TracedException(logicConstant, "Unsupported literal"); 608 case FALSE -> literals.add(BooleanLiteral.FALSE);
595 } 609 default -> throw new TracedException(logicConstant, "Unsupported literal");
596 } else if (expr instanceof Atom atom) { 610 }
597 var target = getPartialRelation(atom.getRelation()); 611 }
598 var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE; 612 case Atom atom -> {
599 var argumentList = toArgumentList(atom.getArguments(), localScope, literals); 613 var target = getPartialRelation(atom.getRelation());
600 literals.add(target.call(polarity, argumentList)); 614 var polarity = atom.isTransitiveClosure() ? CallPolarity.TRANSITIVE : CallPolarity.POSITIVE;
601 } else if (expr instanceof NegationExpr negationExpr) { 615 var argumentList = toArgumentList(atom.getArguments(), localScope, literals);
602 var body = negationExpr.getBody(); 616 literals.add(target.call(polarity, argumentList));
603 if (!(body instanceof Atom atom)) { 617 }
604 throw new TracedException(body, "Cannot negate literal"); 618 case NegationExpr negationExpr -> {
605 } 619 var body = negationExpr.getBody();
606 var target = getPartialRelation(atom.getRelation()); 620 if (!(body instanceof Atom atom)) {
607 Constraint constraint; 621 throw new TracedException(body, "Cannot negate literal");
608 if (atom.isTransitiveClosure()) { 622 }
609 constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause( 623 var target = getPartialRelation(atom.getRelation());
610 target.callTransitive(p1, p2) 624 Constraint constraint;
611 )).getDnf(); 625 if (atom.isTransitiveClosure()) {
612 } else { 626 constraint = Query.of(target.name() + "#transitive", (builder, p1, p2) -> builder.clause(
613 constraint = target; 627 target.callTransitive(p1, p2)
614 } 628 )).getDnf();
615 var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables()); 629 } else {
616 var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals); 630 constraint = target;
617 literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList)); 631 }
618 } else if (expr instanceof ComparisonExpr comparisonExpr) { 632 var negatedScope = extendScope(localScope, negationExpr.getImplicitVariables());
619 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()), 633 var argumentList = toArgumentList(atom.getArguments(), negatedScope, literals);
620 localScope, literals); 634 literals.add(constraint.call(CallPolarity.NEGATIVE, argumentList));
621 boolean positive = switch (comparisonExpr.getOp()) { 635 }
622 case EQ -> true; 636 case ComparisonExpr comparisonExpr -> {
623 case NOT_EQ -> false; 637 var argumentList = toArgumentList(List.of(comparisonExpr.getLeft(), comparisonExpr.getRight()),
624 default -> throw new TracedException( 638 localScope, literals);
625 comparisonExpr, "Unsupported operator"); 639 boolean positive = switch (comparisonExpr.getOp()) {
626 }; 640 case EQ -> true;
627 literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1))); 641 case NOT_EQ -> false;
628 } else { 642 default -> throw new TracedException(
629 throw new TracedException(expr, "Unsupported literal"); 643 comparisonExpr, "Unsupported operator");
630 } 644 };
645 literals.add(new EquivalenceLiteral(positive, argumentList.get(0), argumentList.get(1)));
646 }
647 default -> throw new TracedException(expr, "Unsupported literal");
648 }
631 } 649 }
632 650
633 private List<Variable> toArgumentList( 651 private List<Variable> toArgumentList(
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
index 09ba34fc..537d94ca 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/SolutionSerializer.java
@@ -197,9 +197,10 @@ public class SolutionSerializer {
197 var originalNode = pair.getOne(); 197 var originalNode = pair.getOne();
198 int nodeId = pair.getTwo(); 198 int nodeId = pair.getTwo();
199 var newNode = findNode(originalNode); 199 var newNode = findNode(originalNode);
200 // Since all implicit nodes that do not exist has already been remove in serializeSolution, 200 // Since all implicit nodes that do not exist has already been removed in serializeSolution,
201 // we only need to add !exists assertions to ::new nodes (nodes marked as an individual must always exist). 201 // we only need to add !exists assertions to ::new nodes and explicitly declared nodes that do not exist.
202 if (ProblemUtil.isNewNode(originalNode)) { 202 if (ProblemUtil.isMultiNode(originalNode) ||
203 (ProblemUtil.isDeclaredNode(originalNode) && !isExistingNode(nodeId))) {
203 sortedNewNodes.put(nodeId, newNode); 204 sortedNewNodes.put(nodeId, newNode);
204 } else { 205 } else {
205 nodes.put(nodeId, newNode); 206 nodes.put(nodeId, newNode);
diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java
index 8ef449b0..b682a7d6 100644
--- a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java
+++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/SolutionSerializerTest.java
@@ -183,6 +183,49 @@ class SolutionSerializerTest {
183 !exists(Foo::new). 183 !exists(Foo::new).
184 Foo(a). 184 Foo(a).
185 default !ref(*, *). 185 default !ref(*, *).
186 """), Arguments.of("""
187 atom a.
188 class Foo.
189 """, """
190 Foo(a).
191 scope Foo += 0.
192 """, """
193 !exists(Foo::new).
194 Foo(a).
195 """), Arguments.of("""
196 multi a.
197 class Foo.
198 """, """
199 Foo(a).
200 !exists(Foo::new).
201 scope Foo = 2.
202 """, """
203 !exists(a).
204 !exists(Foo::new).
205 Foo(foo1).
206 Foo(foo2).
207 """), Arguments.of("""
208 node a.
209 class Foo.
210 """, """
211 Foo(a).
212 ?exists(a).
213 scope Foo = 2, Foo += 1.
214 """, """
215 !exists(Foo::new).
216 Foo(a).
217 Foo(foo1).
218 """), Arguments.of("""
219 node a.
220 class Foo.
221 """, """
222 Foo(a).
223 ?exists(a).
224 scope Foo = 1, Foo += 1.
225 """, """
226 !exists(a).
227 !exists(Foo::new).
228 Foo(foo1).
186 """)); 229 """));
187 } 230 }
188} 231}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
index f05abc45..1f49b0d0 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/metadata/MetadataCreator.java
@@ -87,14 +87,12 @@ public class MetadataCreator {
87 } 87 }
88 88
89 private NodeKind getNodeKind(Node node) { 89 private NodeKind getNodeKind(Node node) {
90 if (ProblemUtil.isImplicitNode(node)) { 90 if (ProblemUtil.isAtomNode(node)) {
91 return NodeKind.IMPLICIT;
92 } else if (ProblemUtil.isIndividualNode(node)) {
93 return NodeKind.INDIVIDUAL; 91 return NodeKind.INDIVIDUAL;
94 } else if (ProblemUtil.isNewNode(node)) { 92 } else if (ProblemUtil.isMultiNode(node)) {
95 return NodeKind.NEW; 93 return NodeKind.NEW;
96 } else { 94 } else {
97 throw new TracedException(node, "Unknown node type"); 95 return NodeKind.IMPLICIT;
98 } 96 }
99 } 97 }
100 98
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
index 889a55cb..dd5d8a03 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
@@ -129,7 +129,7 @@ class ProblemWebSocketServletIntegrationTest {
129 case 4 -> //noinspection TextBlockMigration 129 case 4 -> //noinspection TextBlockMigration
130 session.sendText( 130 session.sendText(
131 "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," + 131 "{\"id\":\"bar\",\"request\":{\"resource\":\"test.problem\",\"serviceType\":\"update\"," +
132 "\"requiredStateId\":\"-80000000\",\"deltaText\":\"indiv q.\nnode(q).\n\"," + 132 "\"requiredStateId\":\"-80000000\",\"deltaText\":\"atom q.\nnode(q).\n\"," +
133 "\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}", 133 "\"deltaOffset\":\"0\",\"deltaReplaceLength\":\"0\"}}",
134 Callback.NOOP 134 Callback.NOOP
135 ); 135 );
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java
index 22ce1b47..265723ff 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/xtext/servlet/TransactionExecutorTest.java
@@ -97,7 +97,7 @@ class TransactionExecutorTest {
97 var stateId = updateFullText(); 97 var stateId = updateFullText();
98 var responseHandler = sendRequestAndWaitForAllResponses( 98 var responseHandler = sendRequestAndWaitForAllResponses(
99 new XtextWebRequest("bar", Map.of("resource", RESOURCE_NAME, "serviceType", "update", "requiredStateId", 99 new XtextWebRequest("bar", Map.of("resource", RESOURCE_NAME, "serviceType", "update", "requiredStateId",
100 stateId, "deltaText", "indiv q.\nnode(q).\n", "deltaOffset", "0", "deltaReplaceLength", 100 stateId, "deltaText", "atom q.\nnode(q).\n", "deltaOffset", "0", "deltaReplaceLength",
101 "0"))); 101 "0")));
102 102
103 var captor = newCaptor(); 103 var captor = newCaptor();
diff --git a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
index 59eba8f7..863e55d4 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
+++ b/subprojects/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
@@ -51,7 +51,7 @@ Workflow {
51 51
52 language = StandardLanguage { 52 language = StandardLanguage {
53 name = 'tools.refinery.language.Problem' 53 name = 'tools.refinery.language.Problem'
54 fileExtensions = 'problem' 54 fileExtensions = 'refinery,problem'
55 referencedResource = 'platform:/resource/tools.refinery.refinery-language-model/model/problem.genmodel' 55 referencedResource = 'platform:/resource/tools.refinery.refinery-language-model/model/problem.genmodel'
56 serializer = { 56 serializer = {
57 generateStub = false 57 generateStub = false
diff --git a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
index 0fb96954..c5c42ebe 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
+++ b/subprojects/language/src/main/java/tools/refinery/language/Problem.xtext
@@ -9,13 +9,16 @@ import "http://www.eclipse.org/emf/2002/Ecore" as ecore
9import "https://refinery.tools/emf/2021/Problem" 9import "https://refinery.tools/emf/2021/Problem"
10 10
11Problem: 11Problem:
12 ("problem" name=Identifier ".")? 12 (kind=ModuleKind name=QualifiedName? ".")?
13 statements+=Statement*; 13 statements+=Statement*;
14 14
15enum ModuleKind:
16 PROBLEM="problem" | MODULE="module";
17
15Statement: 18Statement:
16 Assertion | ClassDeclaration | EnumDeclaration | 19 Assertion | ClassDeclaration | EnumDeclaration |
17 PredicateDefinition | /* FunctionDefinition | RuleDefinition | */ 20 PredicateDefinition | /* FunctionDefinition | RuleDefinition | */
18 ScopeDeclaration | IndividualDeclaration; 21 ScopeDeclaration | NodeDeclaration;
19 22
20ClassDeclaration: 23ClassDeclaration:
21 abstract?="abstract"? "class" 24 abstract?="abstract"? "class"
@@ -252,8 +255,11 @@ RangeMultiplicity:
252ExactMultiplicity: 255ExactMultiplicity:
253 exactValue=INT; 256 exactValue=INT;
254 257
255IndividualDeclaration: 258NodeDeclaration:
256 "indiv" nodes+=EnumLiteral ("," nodes+=EnumLiteral)* "."; 259 kind=NodeKind nodes+=EnumLiteral ("," nodes+=EnumLiteral)* ".";
260
261enum NodeKind:
262 NODE="node" | ATOM="atom" | MULTI="multi";
257 263
258UpperBound returns ecore::EInt: 264UpperBound returns ecore::EInt:
259 INT | "*"; 265 INT | "*";
@@ -268,7 +274,8 @@ Identifier:
268 NonContainmentIdentifier | "contains" | "container"; 274 NonContainmentIdentifier | "contains" | "container";
269 275
270NonContainmentIdentifier: 276NonContainmentIdentifier:
271 ID | "contained" | "sum" | "prod" | "min" | "max"; 277 ID | "node" | "atom" | "multi" | "contained" |
278 "sum" | "prod" | "min" | "max" | "problem" | "module";
272 279
273Real returns ecore::EDouble: 280Real returns ecore::EDouble:
274 EXPONENTIAL | INT "." (INT | EXPONENTIAL); 281 EXPONENTIAL | INT "." (INT | EXPONENTIAL);
diff --git a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
index 0f3bd3ee..0b87e8bb 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/formatting2/ProblemFormatter.java
@@ -23,7 +23,7 @@ public class ProblemFormatter extends AbstractJavaFormatter {
23 protected void format(Problem problem, IFormattableDocument doc) { 23 protected void format(Problem problem, IFormattableDocument doc) {
24 doc.prepend(problem, this::noSpace); 24 doc.prepend(problem, this::noSpace);
25 var region = regionFor(problem); 25 var region = regionFor(problem);
26 doc.append(region.keyword("problem"), this::oneSpace); 26 doc.append(region.feature(ProblemPackage.Literals.PROBLEM__KIND), this::oneSpace);
27 doc.prepend(region.keyword("."), this::noSpace); 27 doc.prepend(region.keyword("."), this::noSpace);
28 appendNewLines(doc, region.keyword("."), this::twoNewLines); 28 appendNewLines(doc, region.keyword("."), this::twoNewLines);
29 for (var statement : problem.getStatements()) { 29 for (var statement : problem.getStatements()) {
@@ -132,10 +132,10 @@ public class ProblemFormatter extends AbstractJavaFormatter {
132 } 132 }
133 } 133 }
134 134
135 protected void format(IndividualDeclaration individualDeclaration, IFormattableDocument doc) { 135 protected void format(NodeDeclaration nodeDeclaration, IFormattableDocument doc) {
136 surroundNewLines(doc, individualDeclaration, this::singleNewLine); 136 surroundNewLines(doc, nodeDeclaration, this::singleNewLine);
137 var region = regionFor(individualDeclaration); 137 var region = regionFor(nodeDeclaration);
138 doc.append(region.keyword("indiv"), this::oneSpace); 138 doc.append(region.feature(ProblemPackage.Literals.NODE_DECLARATION__KIND), this::oneSpace);
139 formatList(region, ",", doc); 139 formatList(region, ",", doc);
140 doc.prepend(region.keyword("."), this::noSpace); 140 doc.prepend(region.keyword("."), this::noSpace);
141 } 141 }
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
index 29eaad84..c81431e5 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemLocationInFileProvider.java
@@ -25,10 +25,10 @@ public class ProblemLocationInFileProvider extends DefaultLocationInFileProvider
25 } 25 }
26 26
27 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) { 27 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) {
28 if (ProblemUtil.isIndividualNode(node)) { 28 if (ProblemUtil.isDeclaredNode(node)) {
29 return super.doGetTextRegion(node, query); 29 return super.doGetTextRegion(node, query);
30 } 30 }
31 if (ProblemUtil.isNewNode(node)) { 31 if (ProblemUtil.isMultiNode(node)) {
32 EObject container = node.eContainer(); 32 EObject container = node.eContainer();
33 return doGetTextRegion(container, query); 33 return doGetTextRegion(container, query);
34 } 34 }
diff --git a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
index c04c7d09..79dad6e7 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/resource/ProblemResourceDescriptionStrategy.java
@@ -91,8 +91,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
91 return false; 91 return false;
92 } 92 }
93 if (eObject instanceof Node node) { 93 if (eObject instanceof Node node) {
94 // Only enum literals and new nodes are visible across problem files. 94 return !ProblemUtil.isImplicitNode(node);
95 return ProblemUtil.isIndividualNode(node) || ProblemUtil.isNewNode(node);
96 } 95 }
97 return true; 96 return true;
98 } 97 }
@@ -111,7 +110,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
111 110
112 protected boolean shouldExportSimpleName(EObject eObject) { 111 protected boolean shouldExportSimpleName(EObject eObject) {
113 if (eObject instanceof Node node) { 112 if (eObject instanceof Node node) {
114 return !ProblemUtil.isNewNode(node); 113 return !ProblemUtil.isMultiNode(node);
115 } 114 }
116 if (eObject instanceof PredicateDefinition predicateDefinition) { 115 if (eObject instanceof PredicateDefinition predicateDefinition) {
117 return !ProblemUtil.isInvalidMultiplicityConstraint(predicateDefinition); 116 return !ProblemUtil.isInvalidMultiplicityConstraint(predicateDefinition);
@@ -146,6 +145,5 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
146 return false; 145 return false;
147 } 146 }
148 return eObject instanceof ClassDeclaration || eObject instanceof EnumDeclaration; 147 return eObject instanceof ClassDeclaration || eObject instanceof EnumDeclaration;
149
150 } 148 }
151} 149}
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
index 7b6407e1..ee0e141d 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/utils/ProblemUtil.java
@@ -54,14 +54,24 @@ public final class ProblemUtil {
54 return eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError(); 54 return eObject instanceof PredicateDefinition predicateDefinition && predicateDefinition.isError();
55 } 55 }
56 56
57 public static boolean isIndividualNode(Node node) { 57 public static boolean isAtomNode(Node node) {
58 var containingFeature = node.eContainingFeature(); 58 var containingFeature = node.eContainingFeature();
59 return containingFeature == ProblemPackage.Literals.INDIVIDUAL_DECLARATION__NODES 59 if (containingFeature == ProblemPackage.Literals.NODE_DECLARATION__NODES) {
60 || containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; 60 return ((NodeDeclaration) node.eContainer()).getKind() == NodeKind.ATOM;
61 }
62 return containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS;
63 }
64
65 public static boolean isMultiNode(Node node) {
66 var containingFeature = node.eContainingFeature();
67 if (containingFeature == ProblemPackage.Literals.NODE_DECLARATION__NODES) {
68 return ((NodeDeclaration) node.eContainer()).getKind() == NodeKind.MULTI;
69 }
70 return containingFeature == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE;
61 } 71 }
62 72
63 public static boolean isNewNode(Node node) { 73 public static boolean isDeclaredNode(Node node) {
64 return node.eContainingFeature() == ProblemPackage.Literals.CLASS_DECLARATION__NEW_NODE; 74 return node.eContainingFeature() == ProblemPackage.Literals.NODE_DECLARATION__NODES;
65 } 75 }
66 76
67 public static boolean isInvalidMultiplicityConstraint(PredicateDefinition predicateDefinition) { 77 public static boolean isInvalidMultiplicityConstraint(PredicateDefinition predicateDefinition) {
diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
index 8bda4b95..a95e8b3c 100644
--- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
+++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java
@@ -84,7 +84,7 @@ public class ProblemValidator extends AbstractProblemValidator {
84 @Check 84 @Check
85 public void checkNodeConstants(VariableOrNodeExpr expr) { 85 public void checkNodeConstants(VariableOrNodeExpr expr) {
86 var variableOrNode = expr.getVariableOrNode(); 86 var variableOrNode = expr.getVariableOrNode();
87 if (variableOrNode instanceof Node node && !ProblemUtil.isIndividualNode(node)) { 87 if (variableOrNode instanceof Node node && !ProblemUtil.isAtomNode(node)) {
88 var name = node.getName(); 88 var name = node.getName();
89 var message = ("Only individuals can be referenced in predicates. " + 89 var message = ("Only individuals can be referenced in predicates. " +
90 "Mark '%s' as individual with the declaration 'indiv %s.'").formatted(name, name); 90 "Mark '%s' as individual with the declaration 'indiv %s.'").formatted(name, name);
@@ -96,16 +96,16 @@ public class ProblemValidator extends AbstractProblemValidator {
96 @Check 96 @Check
97 public void checkUniqueDeclarations(Problem problem) { 97 public void checkUniqueDeclarations(Problem problem) {
98 var relations = new ArrayList<Relation>(); 98 var relations = new ArrayList<Relation>();
99 var individuals = new ArrayList<Node>(); 99 var nodes = new ArrayList<Node>();
100 for (var statement : problem.getStatements()) { 100 for (var statement : problem.getStatements()) {
101 if (statement instanceof Relation relation) { 101 if (statement instanceof Relation relation) {
102 relations.add(relation); 102 relations.add(relation);
103 } else if (statement instanceof IndividualDeclaration individualDeclaration) { 103 } else if (statement instanceof NodeDeclaration nodeDeclaration) {
104 individuals.addAll(individualDeclaration.getNodes()); 104 nodes.addAll(nodeDeclaration.getNodes());
105 } 105 }
106 } 106 }
107 checkUniqueSimpleNames(relations); 107 checkUniqueSimpleNames(relations);
108 checkUniqueSimpleNames(individuals); 108 checkUniqueSimpleNames(nodes);
109 } 109 }
110 110
111 @Check 111 @Check
@@ -362,7 +362,7 @@ public class ProblemValidator extends AbstractProblemValidator {
362 return; 362 return;
363 } 363 }
364 var node = getNodeArgumentForMultiObjectAssertion(arguments.get(0)); 364 var node = getNodeArgumentForMultiObjectAssertion(arguments.get(0));
365 if (node != null && !node.eIsProxy() && ProblemUtil.isIndividualNode(node)) { 365 if (node != null && !node.eIsProxy() && ProblemUtil.isAtomNode(node)) {
366 acceptError("Individual nodes must exist.", assertion, null, 0, UNSUPPORTED_ASSERTION_ISSUE); 366 acceptError("Individual nodes must exist.", assertion, null, 0, UNSUPPORTED_ASSERTION_ISSUE);
367 } 367 }
368 } 368 }
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java
index 72d57f54..17ae5fbb 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/ProblemParsingTest.java
@@ -42,7 +42,7 @@ class ProblemParsingTest {
42 error invalidTaxStatus(Person p) <-> 42 error invalidTaxStatus(Person p) <->
43 taxStatus(p, CHILD), children(p, _q). 43 taxStatus(p, CHILD), children(p, _q).
44 44
45 indiv family. 45 atom family.
46 Family(family). 46 Family(family).
47 members(family, anne): true. 47 members(family, anne): true.
48 members(family, bob). 48 members(family, bob).
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java
index f688d970..4a15f9de 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/formatting2/ProblemFormatterTest.java
@@ -183,8 +183,8 @@ class ProblemFormatterTest {
183 } 183 }
184 184
185 @Test 185 @Test
186 void individualDeclarationTest() { 186 void atomDeclarationTest() {
187 testFormatter(" indiv a , b . ", "indiv a, b.\n"); 187 testFormatter(" atom a , b . ", "atom a, b.\n");
188 } 188 }
189 189
190 @Test 190 @Test
@@ -194,7 +194,7 @@ class ProblemFormatterTest {
194 pred foo(node a). 194 pred foo(node a).
195 class Foo. 195 class Foo.
196 foo(n1, n2). 196 foo(n1, n2).
197 indiv i1. 197 atom i1.
198 !foo(i1, n1). 198 !foo(i1, n1).
199 pred bar(node a, node b). 199 pred bar(node a, node b).
200 pred quux(). 200 pred quux().
@@ -207,7 +207,7 @@ class ProblemFormatterTest {
207 class Foo. 207 class Foo.
208 208
209 foo(n1, n2). 209 foo(n1, n2).
210 indiv i1. 210 atom i1.
211 !foo(i1, n1). 211 !foo(i1, n1).
212 212
213 pred bar(node a, node b). 213 pred bar(node a, node b).
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java
index e76d2993..bc0320a6 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/scoping/NodeScopingTest.java
@@ -69,35 +69,35 @@ class NodeScopingTest {
69 } 69 }
70 70
71 @ParameterizedTest 71 @ParameterizedTest
72 @MethodSource("individualNodeReferenceSource") 72 @MethodSource("atomNodeReferenceSource")
73 void individualNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) { 73 void atomNodeInAssertionTest(String qualifiedNamePrefix, boolean namedProblem) {
74 var problem = parse(""" 74 var problem = parse("""
75 indiv a, b. 75 atom a, b.
76 pred predicate(node x, node y) <-> node(x). 76 pred predicate(node x, node y) <-> node(x).
77 predicate({PARAM}a, {PARAM}a). 77 predicate({PARAM}a, {PARAM}a).
78 ?predicate({PARAM}a, {PARAM}b). 78 ?predicate({PARAM}a, {PARAM}b).
79 """, qualifiedNamePrefix, namedProblem); 79 """, qualifiedNamePrefix, namedProblem);
80 assertThat(problem.getResourceErrors(), empty()); 80 assertThat(problem.getResourceErrors(), empty());
81 assertThat(problem.nodeNames(), empty()); 81 assertThat(problem.nodeNames(), empty());
82 assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.individualNode("a"))); 82 assertThat(problem.assertion(0).arg(0).node(), equalTo(problem.atomNode("a")));
83 assertThat(problem.assertion(0).arg(1).node(), equalTo(problem.individualNode("a"))); 83 assertThat(problem.assertion(0).arg(1).node(), equalTo(problem.atomNode("a")));
84 assertThat(problem.assertion(1).arg(0).node(), equalTo(problem.individualNode("a"))); 84 assertThat(problem.assertion(1).arg(0).node(), equalTo(problem.atomNode("a")));
85 assertThat(problem.assertion(1).arg(1).node(), equalTo(problem.individualNode("b"))); 85 assertThat(problem.assertion(1).arg(1).node(), equalTo(problem.atomNode("b")));
86 } 86 }
87 87
88 @ParameterizedTest 88 @ParameterizedTest
89 @MethodSource("individualNodeReferenceSource") 89 @MethodSource("atomNodeReferenceSource")
90 void individualNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) { 90 void atomNodeInPredicateTest(String qualifiedNamePrefix, boolean namedProblem) {
91 var problem = parse(""" 91 var problem = parse("""
92 indiv b. 92 atom b.
93 pred predicate(node a) <-> node({PARAM}b). 93 pred predicate(node a) <-> node({PARAM}b).
94 """); 94 """, qualifiedNamePrefix, namedProblem);
95 assertThat(problem.getResourceErrors(), empty()); 95 assertThat(problem.getResourceErrors(), empty());
96 assertThat(problem.nodeNames(), empty()); 96 assertThat(problem.nodeNames(), empty());
97 assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.individualNode("b"))); 97 assertThat(problem.pred("predicate").conj(0).lit(0).arg(0).node(), equalTo(problem.atomNode("b")));
98 } 98 }
99 99
100 static Stream<Arguments> individualNodeReferenceSource() { 100 static Stream<Arguments> atomNodeReferenceSource() {
101 return Stream.of(Arguments.of("", false), Arguments.of("", true), Arguments.of("test::", true)); 101 return Stream.of(Arguments.of("", false), Arguments.of("", true), Arguments.of("test::", true));
102 } 102 }
103 103
diff --git a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java
index 65675b6b..ad583f8e 100644
--- a/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java
+++ b/subprojects/language/src/test/java/tools/refinery/language/tests/serializer/ProblemSerializerTest.java
@@ -56,15 +56,16 @@ class ProblemSerializerTest {
56 var pred = createPred(); 56 var pred = createPred();
57 var node = ProblemFactory.eINSTANCE.createNode(); 57 var node = ProblemFactory.eINSTANCE.createNode();
58 node.setName("a"); 58 node.setName("a");
59 var individualDeclaration = ProblemFactory.eINSTANCE.createIndividualDeclaration(); 59 var atomDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration();
60 individualDeclaration.getNodes().add(node); 60 atomDeclaration.setKind(NodeKind.ATOM);
61 problem.getStatements().add(individualDeclaration); 61 atomDeclaration.getNodes().add(node);
62 problem.getStatements().add(atomDeclaration);
62 createAssertion(pred, node, value); 63 createAssertion(pred, node, value);
63 64
64 assertSerializedResult(""" 65 assertSerializedResult("""
65 pred foo(node p). 66 pred foo(node p).
66 67
67 indiv a. 68 atom a.
68 """ + serializedAssertion + "\n"); 69 """ + serializedAssertion + "\n");
69 } 70 }
70 71
@@ -79,15 +80,16 @@ class ProblemSerializerTest {
79 var pred = createPred(); 80 var pred = createPred();
80 var node = ProblemFactory.eINSTANCE.createNode(); 81 var node = ProblemFactory.eINSTANCE.createNode();
81 node.setName("a"); 82 node.setName("a");
82 var individualDeclaration = ProblemFactory.eINSTANCE.createIndividualDeclaration(); 83 var atomDeclaration = ProblemFactory.eINSTANCE.createNodeDeclaration();
83 individualDeclaration.getNodes().add(node); 84 atomDeclaration.setKind(NodeKind.ATOM);
84 problem.getStatements().add(individualDeclaration); 85 atomDeclaration.getNodes().add(node);
86 problem.getStatements().add(atomDeclaration);
85 createAssertion(pred, node, value, true); 87 createAssertion(pred, node, value, true);
86 88
87 assertSerializedResult(""" 89 assertSerializedResult("""
88 pred foo(node p). 90 pred foo(node p).
89 91
90 indiv a. 92 atom a.
91 default\040""" + serializedAssertion + "\n"); 93 default\040""" + serializedAssertion + "\n");
92 } 94 }
93 95
diff --git a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
index fc51ff57..58bfce44 100644
--- a/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
+++ b/subprojects/language/src/testFixtures/java/tools/refinery/language/model/tests/utils/WrappedProblem.java
@@ -67,8 +67,9 @@ public record WrappedProblem(Problem problem) {
67 return ProblemNavigationUtil.named(problem.getNodes(), name); 67 return ProblemNavigationUtil.named(problem.getNodes(), name);
68 } 68 }
69 69
70 public Node individualNode(String name) { 70 public Node atomNode(String name) {
71 var uniqueNodes = statementsOfType(IndividualDeclaration.class) 71 var uniqueNodes = statementsOfType(NodeDeclaration.class)
72 .filter(declaration -> declaration.getKind() == NodeKind.ATOM)
72 .flatMap(declaration -> declaration.getNodes().stream()); 73 .flatMap(declaration -> declaration.getNodes().stream());
73 return ProblemNavigationUtil.named(uniqueNodes, name); 74 return ProblemNavigationUtil.named(uniqueNodes, name);
74 } 75 }