aboutsummaryrefslogtreecommitdiffstats
path: root/language/src/main/java/org/eclipse/viatra/solver
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-06-27 23:21:42 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-06-27 23:30:25 +0200
commit7febe0b4781c5bb0fab34895ad642040ae143a8b (patch)
tree5bc49f9195b18a938382f2527ee4ab273527a07a /language/src/main/java/org/eclipse/viatra/solver
parentElectric semicolons (diff)
downloadrefinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.tar.gz
refinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.tar.zst
refinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.zip
Add data constant support
Diffstat (limited to 'language/src/main/java/org/eclipse/viatra/solver')
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext52
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java4
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java76
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java8
4 files changed, 100 insertions, 40 deletions
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
index 466988d8..7e253ef5 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext
@@ -8,7 +8,7 @@ Problem:
8 statements+=Statement*; 8 statements+=Statement*;
9 9
10Statement: 10Statement:
11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | ScopeDeclaration; 11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration;
12 12
13ClassDeclaration: 13ClassDeclaration:
14 abstract?="abstract"? "class" 14 abstract?="abstract"? "class"
@@ -56,23 +56,53 @@ Atom:
56 "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; 56 "(" (arguments+=Argument ("," arguments+=Argument)*)? ")";
57 57
58Argument: 58Argument:
59 VariableOrNodeArgument | ConstantArgument;
60
61VariableOrNodeArgument:
59 variableOrNode=[VariableOrNode|QualifiedName]; 62 variableOrNode=[VariableOrNode|QualifiedName];
60 63
64ConstantArgument:
65 constant=Constant;
66
61Assertion: 67Assertion:
62 (relation=[Relation|QualifiedName] 68 (relation=[Relation|QualifiedName]
63 "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")" 69 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")"
64 ":" value=LogicValue | 70 ":" value=LogicValue |
65 value=ShortLogicValue? 71 value=ShortLogicValue?
66 relation=[Relation|QualifiedName] 72 relation=[Relation|QualifiedName]
67 "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")") 73 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")")
68 "."; 74 ".";
69 75
76AssertionArgument:
77 NodeAssertionArgument | ConstantAssertionArgument;
78
79NodeAssertionArgument:
80 node=[Node|QualifiedName];
81
82ConstantAssertionArgument:
83 constant=Constant;
84
70enum LogicValue: 85enum LogicValue:
71 TRUE="true" | FALSE="false" | UNKNOWN="unknown"; 86 TRUE="true" | FALSE="false" | UNKNOWN="unknown";
72 87
73enum ShortLogicValue returns LogicValue: 88enum ShortLogicValue returns LogicValue:
74 FALSE="!" | UNKNOWN="?"; 89 FALSE="!" | UNKNOWN="?";
75 90
91NodeValueAssertion:
92 node=[Node|QualifiedName] ":" value=Constant ".";
93
94Constant:
95 IntConstant | RealConstant | StringConstant;
96
97IntConstant:
98 intValue=Integer;
99
100RealConstant:
101 realValue=Real;
102
103StringConstant:
104 stringValue=STRING;
105
76ScopeDeclaration: 106ScopeDeclaration:
77 "scope" typeScopes+=TypeScope ("," typeScopes+=TypeScope)* "."; 107 "scope" typeScopes+=TypeScope ("," typeScopes+=TypeScope)* ".";
78 108
@@ -102,11 +132,21 @@ UpperBound returns ecore::EInt:
102QuotedOrUnquotedId: 132QuotedOrUnquotedId:
103 QUOTED_ID | Identifier; 133 QUOTED_ID | Identifier;
104 134
105QualifiedName: 135QualifiedName hidden():
106 QUOTED_ID | Identifier ("::" Identifier)* ("::" QUOTED_ID)?; 136 QUOTED_ID | Identifier ("::" Identifier)* ("::" QUOTED_ID)?;
107 137
108Identifier: 138Identifier:
109 ID | "true" | "false"; 139 ID | "true" | "false" | "e" | "E";
140
141Integer returns ecore::EInt hidden():
142 "-"? INT;
143
144Real returns ecore::EDouble hidden():
145 "-"? INT ("." INT | ("." INT)? ("e" | "E") ("-" | "+")? INT);
146
147@Override
148terminal ID:
149 ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
110 150
111@Override 151@Override
112terminal STRING: 152terminal STRING:
@@ -117,4 +157,4 @@ terminal QUOTED_ID:
117 157
118@Override 158@Override
119terminal SL_COMMENT: 159terminal SL_COMMENT:
120 ('%' | '//') !('\n'|'\r')* ('\r'? '\n')?; 160 ('%' | '//') !('\n' | '\r')* ('\r'? '\n')?;
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
index 09f062f5..e0a72687 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java
@@ -38,13 +38,13 @@ public final class ProblemUtil {
38 } 38 }
39 39
40 public static boolean isSingletonVariable(Variable variable) { 40 public static boolean isSingletonVariable(Variable variable) {
41 return variable.eContainingFeature() == ProblemPackage.Literals.ARGUMENT__SINGLETON_VARIABLE; 41 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE;
42 } 42 }
43 43
44 public static boolean isEnumLiteral(Node node) { 44 public static boolean isEnumLiteral(Node node) {
45 return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; 45 return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS;
46 } 46 }
47 47
48 public static boolean isEnumNode(Node node) { 48 public static boolean isEnumNode(Node node) {
49 String name = node.getName(); 49 String name = node.getName();
50 boolean isNameQuoted = name != null && name.startsWith(ENUM_NODE_NAME_QUOTE) 50 boolean isNameQuoted = name != null && name.startsWith(ENUM_NODE_NAME_QUOTE)
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
index b885ce0e..fc03fa87 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java
@@ -11,6 +11,7 @@ import org.eclipse.emf.ecore.EStructuralFeature;
11import org.eclipse.viatra.solver.language.ProblemUtil; 11import org.eclipse.viatra.solver.language.ProblemUtil;
12import org.eclipse.viatra.solver.language.model.problem.Argument; 12import org.eclipse.viatra.solver.language.model.problem.Argument;
13import org.eclipse.viatra.solver.language.model.problem.Assertion; 13import org.eclipse.viatra.solver.language.model.problem.Assertion;
14import org.eclipse.viatra.solver.language.model.problem.AssertionArgument;
14import org.eclipse.viatra.solver.language.model.problem.Atom; 15import org.eclipse.viatra.solver.language.model.problem.Atom;
15import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; 16import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration;
16import org.eclipse.viatra.solver.language.model.problem.Conjunction; 17import org.eclipse.viatra.solver.language.model.problem.Conjunction;
@@ -19,12 +20,15 @@ import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable;
19import org.eclipse.viatra.solver.language.model.problem.Literal; 20import org.eclipse.viatra.solver.language.model.problem.Literal;
20import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; 21import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
21import org.eclipse.viatra.solver.language.model.problem.Node; 22import org.eclipse.viatra.solver.language.model.problem.Node;
23import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument;
24import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion;
22import org.eclipse.viatra.solver.language.model.problem.Parameter; 25import org.eclipse.viatra.solver.language.model.problem.Parameter;
23import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; 26import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
24import org.eclipse.viatra.solver.language.model.problem.Problem; 27import org.eclipse.viatra.solver.language.model.problem.Problem;
25import org.eclipse.viatra.solver.language.model.problem.ProblemFactory; 28import org.eclipse.viatra.solver.language.model.problem.ProblemFactory;
26import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; 29import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
27import org.eclipse.viatra.solver.language.model.problem.Statement; 30import org.eclipse.viatra.solver.language.model.problem.Statement;
31import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument;
28import org.eclipse.xtext.linking.impl.LinkingHelper; 32import org.eclipse.xtext.linking.impl.LinkingHelper;
29import org.eclipse.xtext.naming.IQualifiedNameConverter; 33import org.eclipse.xtext.naming.IQualifiedNameConverter;
30import org.eclipse.xtext.naming.QualifiedName; 34import org.eclipse.xtext.naming.QualifiedName;
@@ -97,7 +101,16 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
97 Set<String> nodeNames = new HashSet<>(); 101 Set<String> nodeNames = new HashSet<>();
98 for (Statement statement : problem.getStatements()) { 102 for (Statement statement : problem.getStatements()) {
99 if (statement instanceof Assertion) { 103 if (statement instanceof Assertion) {
100 addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.ASSERTION__ARGUMENTS, 104 Assertion assertion = (Assertion) statement;
105 for (AssertionArgument argument : assertion.getArguments()) {
106 if (argument instanceof NodeAssertionArgument) {
107 addNodeNames(nodeNames, nodeScope, argument,
108 ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE,
109 ProblemDerivedStateComputer::validNodeName);
110 }
111 }
112 } else if (statement instanceof NodeValueAssertion) {
113 addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE,
101 ProblemDerivedStateComputer::validNodeName); 114 ProblemDerivedStateComputer::validNodeName);
102 } else if (statement instanceof PredicateDefinition) { 115 } else if (statement instanceof PredicateDefinition) {
103 PredicateDefinition predicateDefinition = (PredicateDefinition) statement; 116 PredicateDefinition predicateDefinition = (PredicateDefinition) statement;
@@ -114,9 +127,11 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
114 continue; 127 continue;
115 } 128 }
116 for (Argument argument : atom.getArguments()) { 129 for (Argument argument : atom.getArguments()) {
117 addNodeNames(nodeNames, nodeScope, argument, 130 if (argument instanceof VariableOrNodeArgument) {
118 ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE, 131 addNodeNames(nodeNames, nodeScope, argument,
119 ProblemDerivedStateComputer::validQuotedId); 132 ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE,
133 ProblemDerivedStateComputer::validQuotedId);
134 }
120 } 135 }
121 } 136 }
122 } 137 }
@@ -189,29 +204,31 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
189 204
190 protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables, 205 protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables,
191 Set<String> newVariables) { 206 Set<String> newVariables) {
192 IScope scope = scopeProvider.getScope(atom, ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE); 207 for (Argument argument : atom.getArguments()) {
193 List<INode> nodes = NodeModelUtils.findNodesForFeature(atom, ProblemPackage.Literals.ATOM__ARGUMENTS); 208 if (argument instanceof VariableOrNodeArgument) {
194 int nodesSize = nodes.size(); 209 VariableOrNodeArgument variableOrNodeArgument = (VariableOrNodeArgument) argument;
195 List<Argument> arguments = atom.getArguments(); 210 IScope scope = scopeProvider.getScope(variableOrNodeArgument,
196 int argumentsSize = arguments.size(); 211 ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE);
197 for (int i = 0; i < nodesSize; i++) { 212 List<INode> nodes = NodeModelUtils.findNodesForFeature(variableOrNodeArgument,
198 INode node = nodes.get(i); 213 ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE);
199 String variableName = linkingHelper.getCrossRefNodeAsString(node, true); 214 for (INode node : nodes) {
200 if (!validId(variableName)) { 215 String variableName = linkingHelper.getCrossRefNodeAsString(node, true);
201 continue; 216 if (!validId(variableName)) {
202 } 217 continue;
203 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(variableName); 218 }
204 if (scope.getSingleElement(qualifiedName) != null) { 219 QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(variableName);
205 continue; 220 if (scope.getSingleElement(qualifiedName) != null) {
206 } 221 continue;
207 if (ProblemUtil.isSingletonVariableName(variableName)) { 222 }
208 if (i < argumentsSize) { 223 if (ProblemUtil.isSingletonVariableName(variableName)) {
209 createSingletonVariable(arguments.get(i), variableName); 224 createSingletonVariable(variableOrNodeArgument, variableName);
225 break;
226 }
227 if (!knownVariables.contains(variableName)) {
228 newVariables.add(variableName);
229 break;
230 }
210 } 231 }
211 continue;
212 }
213 if (!knownVariables.contains(variableName)) {
214 newVariables.add(variableName);
215 } 232 }
216 } 233 }
217 } 234 }
@@ -229,7 +246,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
229 } 246 }
230 } 247 }
231 248
232 protected void createSingletonVariable(Argument argument, String variableName) { 249 protected void createSingletonVariable(VariableOrNodeArgument argument, String variableName) {
233 if (validId(variableName)) { 250 if (validId(variableName)) {
234 ImplicitVariable variable = createNamedVariable(variableName); 251 ImplicitVariable variable = createNamedVariable(variableName);
235 argument.setSingletonVariable(variable); 252 argument.setSingletonVariable(variable);
@@ -281,7 +298,10 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer {
281 return; 298 return;
282 } 299 }
283 for (Argument argument : atom.getArguments()) { 300 for (Argument argument : atom.getArguments()) {
284 argument.setSingletonVariable(null); 301 if (argument instanceof VariableOrNodeArgument) {
302 VariableOrNodeArgument variableOrNodeArgument = (VariableOrNodeArgument) argument;
303 variableOrNodeArgument.setSingletonVariable(null);
304 }
285 } 305 }
286 } 306 }
287 307
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java b/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java
index fc4034ae..3748e81d 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java
@@ -10,7 +10,6 @@ import java.util.List;
10import org.eclipse.emf.ecore.EObject; 10import org.eclipse.emf.ecore.EObject;
11import org.eclipse.emf.ecore.EReference; 11import org.eclipse.emf.ecore.EReference;
12import org.eclipse.viatra.solver.language.ProblemUtil; 12import org.eclipse.viatra.solver.language.ProblemUtil;
13import org.eclipse.viatra.solver.language.model.problem.Argument;
14import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; 13import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration;
15import org.eclipse.viatra.solver.language.model.problem.ExistentialQuantifier; 14import org.eclipse.viatra.solver.language.model.problem.ExistentialQuantifier;
16import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; 15import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
@@ -18,6 +17,7 @@ import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
18import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; 17import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration;
19import org.eclipse.viatra.solver.language.model.problem.Relation; 18import org.eclipse.viatra.solver.language.model.problem.Relation;
20import org.eclipse.viatra.solver.language.model.problem.Variable; 19import org.eclipse.viatra.solver.language.model.problem.Variable;
20import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument;
21import org.eclipse.xtext.EcoreUtil2; 21import org.eclipse.xtext.EcoreUtil2;
22import org.eclipse.xtext.scoping.IScope; 22import org.eclipse.xtext.scoping.IScope;
23import org.eclipse.xtext.scoping.Scopes; 23import org.eclipse.xtext.scoping.Scopes;
@@ -34,7 +34,7 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider {
34 @Override 34 @Override
35 public IScope getScope(EObject context, EReference reference) { 35 public IScope getScope(EObject context, EReference reference) {
36 IScope scope = super.getScope(context, reference); 36 IScope scope = super.getScope(context, reference);
37 if (reference == ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE) { 37 if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE) {
38 return getVariableScope(context, scope); 38 return getVariableScope(context, scope);
39 } else if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { 39 } else if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) {
40 return getOppositeScope(context, scope); 40 return getOppositeScope(context, scope);
@@ -45,8 +45,8 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider {
45 protected IScope getVariableScope(EObject context, IScope delegateScope) { 45 protected IScope getVariableScope(EObject context, IScope delegateScope) {
46 List<Variable> variables = new ArrayList<>(); 46 List<Variable> variables = new ArrayList<>();
47 EObject currentContext = context; 47 EObject currentContext = context;
48 if (context instanceof Argument) { 48 if (context instanceof VariableOrNodeArgument) {
49 Argument argument = (Argument) context; 49 VariableOrNodeArgument argument = (VariableOrNodeArgument) context;
50 Variable singletonVariable = argument.getSingletonVariable(); 50 Variable singletonVariable = argument.getSingletonVariable();
51 if (singletonVariable != null) { 51 if (singletonVariable != null) {
52 variables.add(singletonVariable); 52 variables.add(singletonVariable);