aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend')
-rw-r--r--Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend491
1 files changed, 491 insertions, 0 deletions
diff --git a/Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend b/Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend
new file mode 100644
index 00000000..65eaad47
--- /dev/null
+++ b/Solvers/Alloy-Solver2/hu.bme.mit.inf.dlsreasoner.alloy.reasoner/src/hu/bme/mit/inf/dlsreasoner/alloy/reasoner/builder/Logic2AlloyLanguageMapper.xtend
@@ -0,0 +1,491 @@
1package hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder
2
3import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration
4import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSDirectProduct
5import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSDocument
6import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSEnumLiteral
7import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSMultiplicity
8import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSNumericOperator
9import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSTerm
10import hu.bme.mit.inf.dslreasoner.alloyLanguage.ALSVariableDeclaration
11import hu.bme.mit.inf.dslreasoner.alloyLanguage.AlloyLanguageFactory
12import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion
13import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion
14import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.UpperMultiplicityAssertion
15import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
16import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And
17import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Assertion
18import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolLiteral
19import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference
20import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
21import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration
22import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition
23import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
24import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Distinct
25import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Divison
26import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Equals
27import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Exists
28import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Forall
29import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration
30import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDefinition
31import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Iff
32import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Impl
33import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.InstanceOf
34import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral
35import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntTypeReference
36import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LessOrEqualThan
37import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LessThan
38import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Minus
39import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Mod
40import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.MoreOrEqualThan
41import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.MoreThan
42import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Multiply
43import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Not
44import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Or
45import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Plus
46import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral
47import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealTypeReference
48import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
49import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition
50import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringLiteral
51import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringTypeReference
52import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.SymbolicValue
53import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term
54import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TransitiveClosure
55import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
56import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.Annotation
57import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.AssertionAnnotation
58import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
59import java.util.Collection
60import java.util.Collections
61import java.util.HashMap
62import java.util.List
63import java.util.Map
64import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
65import org.eclipse.viatra.query.runtime.emf.EMFScope
66import org.eclipse.xtend.lib.annotations.Accessors
67
68import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
69
70class Logic2AlloyLanguageMapper {
71 private val extension AlloyLanguageFactory factory = AlloyLanguageFactory.eINSTANCE
72 private val Logic2AlloyLanguageMapper_Support support = new Logic2AlloyLanguageMapper_Support;
73 private val RunCommandMapper runCommandMapper
74 @Accessors(PUBLIC_GETTER) private val Logic2AlloyLanguageMapper_TypeMapper typeMapper;
75 @Accessors(PUBLIC_GETTER) private val Logic2AlloyLanguageMapper_ConstantMapper constantMapper = new Logic2AlloyLanguageMapper_ConstantMapper(this)
76 @Accessors(PUBLIC_GETTER) private val Logic2AlloyLanguageMapper_FunctionMapper functionMapper = new Logic2AlloyLanguageMapper_FunctionMapper(this)
77 @Accessors(PUBLIC_GETTER) private val Logic2AlloyLanguageMapper_RelationMapper relationMapper = new Logic2AlloyLanguageMapper_RelationMapper(this)
78 @Accessors(PUBLIC_GETTER) private val Logic2AlloyLanguageMapper_Containment containmentMapper = new Logic2AlloyLanguageMapper_Containment(this)
79
80 public new(Logic2AlloyLanguageMapper_TypeMapper typeMapper) {
81 this.typeMapper = typeMapper
82 this.runCommandMapper = new RunCommandMapper(typeMapper)
83 }
84
85 public def TracedOutput<ALSDocument,Logic2AlloyLanguageMapperTrace> transformProblem(LogicProblem problem, AlloySolverConfiguration config) {
86 val logicLanguage = createALSSignatureBody => [
87 it.multiplicity = ALSMultiplicity.ONE
88 it.declarations +=
89 createALSSignatureDeclaration => [
90 it.name = support.toID(#["util", "language"]) ]
91 ]
92
93 val specification = createALSDocument=>[
94 it.signatureBodies+=logicLanguage
95 ]
96 val trace = new Logic2AlloyLanguageMapperTrace => [
97 it.specification = specification
98 it.logicLanguage = logicLanguage.declarations.head
99 it.logicLanguageBody = logicLanguage
100
101 it.incqueryEngine = ViatraQueryEngine.on(new EMFScope(problem))
102 ]
103 specification.transformRandomisation(config.randomise)
104
105 typeMapper.transformTypes(problem.types,problem.elements,this,trace)
106
107 trace.constantDefinitions = problem.collectConstantDefinitions
108 trace.functionDefinitions = problem.collectFunctionDefinitions
109 trace.relationDefinitions = problem.collectRelationDefinitions
110 val calledInTransitiveClosure = problem.collectTransitiveRelationCalls
111
112 problem.constants.forEach[this.constantMapper.transformConstant(it, trace)]
113 problem.functions.forEach[this.functionMapper.transformFunction(it, trace)]
114 problem.relations.forEach[this.relationMapper.transformRelation(it, trace)]
115 calledInTransitiveClosure.forEach[this.relationMapper.prepareTransitiveClosure(it, trace)]
116
117 problem.constants.filter(ConstantDefinition).forEach[this.constantMapper.transformConstantDefinitionSpecification(it,trace)]
118 problem.functions.filter(FunctionDefinition).forEach[this.functionMapper.transformFunctionDefinitionSpecification(it,trace)]
119 problem.relations.filter(RelationDefinition).forEach[this.relationMapper.transformRelationDefinitionSpecification(it,trace)]
120
121 val containment = problem.getContainmentHierarchies.head
122 if(containment !== null) {
123 this.containmentMapper.transformContainmentHierarchy(containment,trace)
124 }
125
126 ////////////////////
127 // Collect EMF-specific assertions
128 ////////////////////
129 val assertion2InverseRelation = problem.annotations.collectAnnotations(InverseRelationAssertion)
130 val assertion2UpperMultiplicityAssertion = problem.annotations.collectAnnotations(UpperMultiplicityAssertion)
131 val assertion2LowerMultiplicityAssertion = problem.annotations.collectAnnotations(LowerMultiplicityAssertion)
132
133 ////////////////////
134 // Transform Assertions
135 ////////////////////
136 for(assertion : problem.assertions) {
137 if(assertion2InverseRelation.containsKey(assertion)) {
138 transformInverseAssertion(assertion.lookup(assertion2InverseRelation),trace)
139 } else if(assertion2UpperMultiplicityAssertion.containsKey(assertion)) {
140 transformUpperMultiplicityAssertion(assertion.lookup(assertion2UpperMultiplicityAssertion),trace)
141 } else if(assertion2LowerMultiplicityAssertion.containsKey(assertion)) {
142 transformLowerMultiplicityAssertion(assertion.lookup(assertion2LowerMultiplicityAssertion),trace)
143 } else {
144 transformAssertion(assertion,trace)
145 }
146 }
147
148 runCommandMapper.transformRunCommand(this, specification, trace, config)
149
150 return new TracedOutput(specification,trace)
151 }
152
153 def transformRandomisation(ALSDocument document, int randomisation) {
154 if(randomisation !== 0) {
155 document.signatureBodies += createALSSignatureBody => [
156 val declaration = createALSSignatureDeclaration => [
157 it.name = support.toID(#["language","util","randomseed"])
158 ]
159 it.declarations += declaration
160 it.multiplicity = ALSMultiplicity::ONE
161 for(i : 1..randomisation) {
162 it.fields+=createALSFieldDeclaration => [
163 it.name = support.toID(#["language","util","randomseedField",i.toString])
164 it.multiplicity = ALSMultiplicity::ONE
165 it.type = createALSReference => [referred = declaration]
166 ]
167 }
168 ]
169 }
170 }
171
172 def transformInverseAssertion(InverseRelationAssertion assertion, Logic2AlloyLanguageMapperTrace trace) {
173 val a = assertion.inverseA
174 val b = assertion.inverseB
175 if(a instanceof RelationDeclaration && b instanceof RelationDeclaration &&
176 !trace.relationDefinitions.containsKey(a) && !trace.relationDefinitions.containsKey(b))
177 {
178 val fact = createALSFactDeclaration => [
179 it.name = support.toID(assertion.target.name)
180 it.term = createALSEquals => [
181 it.leftOperand = relationMapper.transformRelationReference(a as RelationDeclaration, trace)
182 it.rightOperand = createALSInverseRelation => [it.operand = relationMapper.transformRelationReference(b as RelationDeclaration, trace) ]
183 ]
184 ]
185 trace.specification.factDeclarations += fact
186 } else {
187 return transformAssertion(assertion.target,trace)
188 }
189 }
190
191 def transformUpperMultiplicityAssertion(UpperMultiplicityAssertion assertion, Logic2AlloyLanguageMapperTrace trace) {
192 val x = assertion.relation
193 if(x instanceof RelationDeclaration && !trace.relationDefinitions.containsKey(x)) {
194 val relation = relationMapper.getRelationReference((x as RelationDeclaration),trace)
195 val type = relation.type
196
197 if(type instanceof ALSDirectProduct) {
198 type.rightMultiplicit = type.rightMultiplicit.addUpper
199 } else {
200 relation.multiplicity = relation.multiplicity.addUpper
201 }
202
203 if(assertion.upper === 1) {
204 return true
205 } else {
206 return transformAssertion(assertion.target,trace)
207 }
208
209 } else {
210 return transformAssertion(assertion.target,trace)
211 }
212 }
213
214 def transformLowerMultiplicityAssertion(LowerMultiplicityAssertion assertion, Logic2AlloyLanguageMapperTrace trace) {
215 val x = assertion.relation
216 if(x instanceof RelationDeclaration && !trace.relationDefinitions.containsKey(x)) {
217 val relation = relationMapper.getRelationReference((x as RelationDeclaration),trace)
218 val type = relation.type
219
220 if(type instanceof ALSDirectProduct) {
221 type.rightMultiplicit = type.rightMultiplicit.addLower
222 } else {
223 relation.multiplicity = relation.multiplicity.addLower
224 }
225
226 if(assertion.lower === 1) {
227 return true
228 } else {
229 return transformAssertion(assertion.target,trace)
230 }
231
232 } else {
233 return transformAssertion(assertion.target,trace)
234 }
235 }
236
237 private def addLower(ALSMultiplicity multiplicity) {
238 if(multiplicity === ALSMultiplicity::SET || multiplicity === null) {
239 return ALSMultiplicity::SOME
240 } else if(multiplicity === ALSMultiplicity::LONE) {
241 return ALSMultiplicity::ONE
242 } else if(multiplicity == ALSMultiplicity::ONE) {
243 return ALSMultiplicity::ONE
244 } else {
245 throw new IllegalArgumentException('''Lower multiplicity is already set!''')
246 }
247 }
248 private def addUpper(ALSMultiplicity multiplicity) {
249 if(multiplicity === ALSMultiplicity::ALL) {
250 return ALSMultiplicity::LONE
251 } else if(multiplicity === ALSMultiplicity::SET || multiplicity === null) {
252 return ALSMultiplicity::LONE
253 } else if(multiplicity === ALSMultiplicity::SOME) {
254 return ALSMultiplicity::ONE
255 } else if(multiplicity == ALSMultiplicity::ONE) {
256 return ALSMultiplicity::ONE
257 } else {
258 throw new IllegalArgumentException('''Upper multiplicity is already set!''')
259 }
260 }
261
262 private def <T extends AssertionAnnotation> collectAnnotations(Collection<? extends Annotation> collection, Class<T> annotationKind) {
263 val res = new HashMap
264 collection.filter(annotationKind).forEach[res.put(it.target,it)]
265 return res
266 }
267
268 private def collectConstantDefinitions(LogicProblem problem) {
269 val res = new HashMap
270 problem.constants.filter(ConstantDefinition).filter[it.defines!==null].forEach[
271 res.put(it.defines,it)
272 ]
273 return res
274 }
275 private def collectFunctionDefinitions(LogicProblem problem) {
276 val res = new HashMap
277 problem.functions.filter(FunctionDefinition).filter[it.defines!==null].forEach[
278 res.put(it.defines,it)
279 ]
280 return res
281 }
282 private def collectRelationDefinitions(LogicProblem problem) {
283 val res = new HashMap
284 problem.relations.filter(RelationDefinition).filter[it.defines!==null].forEach[
285 res.put(it.defines,it)
286 ]
287 return res
288 }
289 private def collectTransitiveRelationCalls(LogicProblem problem) {
290 return problem.eAllContents.filter(TransitiveClosure).map[it.relation].toSet
291 }
292
293 ////////////////////
294 // Type References
295 ////////////////////
296 def dispatch protected ALSTerm transformTypeReference(BoolTypeReference boolTypeReference, Logic2AlloyLanguageMapperTrace trace) {
297 return createALSReference => [ it.referred = support.getBooleanType(trace) ]
298 }
299 def dispatch protected ALSTerm transformTypeReference(IntTypeReference intTypeReference, Logic2AlloyLanguageMapperTrace trace) { createALSInt }
300 def dispatch protected ALSTerm transformTypeReference(RealTypeReference realTypeReference, Logic2AlloyLanguageMapperTrace trace) { createALSInt }
301 def dispatch protected ALSTerm transformTypeReference(StringTypeReference stringTypeReference, Logic2AlloyLanguageMapperTrace trace) { createALSString }
302 def dispatch protected ALSTerm transformTypeReference(ComplexTypeReference complexTypeReference, Logic2AlloyLanguageMapperTrace trace) {
303 val types = typeMapper.transformTypeReference(complexTypeReference.referred, this, trace)
304 return support.unfoldPlus(types.map[t|createALSReference=>[referred = t]])
305 }
306
307 //////////////
308 // Assertions + Terms
309 //////////////
310
311 def protected transformAssertion(Assertion assertion, Logic2AlloyLanguageMapperTrace trace) {
312 val res = createALSFactDeclaration => [
313 it.name = support.toID(assertion.name)
314 it.term = assertion.value.transformTerm(trace,Collections.EMPTY_MAP)
315 ]
316 trace.specification.factDeclarations += res
317 }
318
319 def dispatch protected ALSTerm transformTerm(BoolLiteral literal, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
320 var ALSEnumLiteral ref;
321 if(literal.value==true) {ref = support.getBooleanTrue(trace)}
322 else {ref = support.getBooleanFalse(trace)}
323 val refFinal = ref
324
325 return support.booleanToLogicValue((createALSReference => [referred = refFinal]),trace)
326 }
327 def dispatch protected ALSTerm transformTerm(RealLiteral literal, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
328 val v = literal.value.intValue
329 if(v>=0) { createALSNumberLiteral => [value = v]}
330 else {createALSUnaryMinus => [it.operand = createALSNumberLiteral => [value = v] ] }
331 }
332 def dispatch protected ALSTerm transformTerm(IntLiteral literal, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
333 if(literal.value>=0) { createALSNumberLiteral => [value = literal.value]}
334 else {createALSUnaryMinus => [it.operand = createALSNumberLiteral => [value = literal.value] ] }
335 }
336 def dispatch protected ALSTerm transformTerm(StringLiteral literal, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
337 createALSStringLiteral => [it.value = literal.value]
338 }
339
340 def dispatch protected ALSTerm transformTerm(Not not, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
341 createALSNot=>[operand = not.operand.transformTerm(trace,variables)] }
342 def dispatch protected ALSTerm transformTerm(And and, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
343 support.unfoldAnd(and.operands.map[transformTerm(trace,variables)]) }
344 def dispatch protected ALSTerm transformTerm(Or or, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
345 support.unfoldOr(or.operands.map[transformTerm(trace,variables)],trace) }
346 def dispatch protected ALSTerm transformTerm(Impl impl, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
347 createALSImpl => [leftOperand = impl.leftOperand.transformTerm(trace,variables) rightOperand = impl.rightOperand.transformTerm(trace,variables)] }
348 def dispatch protected ALSTerm transformTerm(Iff iff, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
349 createALSIff => [leftOperand = iff.leftOperand.transformTerm(trace,variables) rightOperand = iff.rightOperand.transformTerm(trace,variables)] }
350 def dispatch protected ALSTerm transformTerm(MoreThan moreThan, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
351 createALSMore => [leftOperand = moreThan.leftOperand.transformTerm(trace,variables) rightOperand = moreThan.rightOperand.transformTerm(trace,variables)] }
352 def dispatch protected ALSTerm transformTerm(LessThan lessThan, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
353 createALSLess => [leftOperand = lessThan.leftOperand.transformTerm(trace,variables) rightOperand = lessThan.rightOperand.transformTerm(trace,variables)] }
354 def dispatch protected ALSTerm transformTerm(MoreOrEqualThan moreThan, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
355 createALSMeq => [leftOperand = moreThan.leftOperand.transformTerm(trace,variables) rightOperand = moreThan.rightOperand.transformTerm(trace,variables)] }
356 def dispatch protected ALSTerm transformTerm(LessOrEqualThan lessThan, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
357 createALSLeq => [leftOperand = lessThan.leftOperand.transformTerm(trace,variables) rightOperand = lessThan.rightOperand.transformTerm(trace,variables)] }
358 def dispatch protected ALSTerm transformTerm(Equals equals, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
359 createALSEquals => [leftOperand = equals.leftOperand.transformTerm(trace,variables) rightOperand = equals.rightOperand.transformTerm(trace,variables)] }
360 def dispatch protected ALSTerm transformTerm(Distinct distinct, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
361 support.unfoldDistinctTerms(this,distinct.operands,trace,variables) }
362
363 def dispatch protected ALSTerm transformTerm(Plus plus, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
364 createALSFunctionCall => [it.params += plus.leftOperand.transformTerm(trace,variables) it.params += plus.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.PLUS] }
365 def dispatch protected ALSTerm transformTerm(Minus minus, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
366 createALSFunctionCall => [it.params += minus.leftOperand.transformTerm(trace,variables) it.params += minus.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.SUB] }
367 def dispatch protected ALSTerm transformTerm(Multiply multiply, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
368 createALSFunctionCall => [it.params += multiply.leftOperand.transformTerm(trace,variables) it.params += multiply.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.MUL] }
369 def dispatch protected ALSTerm transformTerm(Divison div, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
370 createALSFunctionCall => [it.params += div.leftOperand.transformTerm(trace,variables) it.params += div.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.DIV] }
371 def dispatch protected ALSTerm transformTerm(Mod mod, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
372 createALSFunctionCall => [it.params += mod.leftOperand.transformTerm(trace,variables) it.params += mod.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.REM] }
373
374 def dispatch protected ALSTerm transformTerm(Forall forall, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
375 support.createQuantifiedExpression(this,forall,ALSMultiplicity.ALL,trace,variables) }
376 def dispatch protected ALSTerm transformTerm(Exists exists, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
377 support.createQuantifiedExpression(this,exists,ALSMultiplicity.SOME,trace,variables) }
378
379 def dispatch protected ALSTerm transformTerm(InstanceOf instanceOf, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
380 return createALSSubset => [
381 it.leftOperand = instanceOf.value.transformTerm(trace,variables)
382 it.rightOperand = instanceOf.range.transformTypeReference(trace)
383 ]
384 }
385
386 def dispatch protected ALSTerm transformTerm(TransitiveClosure tc, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
387 return this.relationMapper.transformTransitiveRelationReference(
388 tc.relation,
389 tc.leftOperand.transformTerm(trace,variables),
390 tc.rightOperand.transformTerm(trace,variables),
391 trace
392 )
393 }
394
395 def dispatch protected ALSTerm transformTerm(SymbolicValue symbolicValue, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
396 symbolicValue.symbolicReference.transformSymbolicReference(symbolicValue.parameterSubstitutions,trace,variables) }
397
398 def dispatch protected ALSTerm transformSymbolicReference(DefinedElement referred, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
399 typeMapper.transformReference(referred,trace)
400 }
401 def dispatch protected ALSTerm transformSymbolicReference(ConstantDeclaration constant, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
402 if(trace.constantDefinitions.containsKey(constant)) {
403 return this.transformSymbolicReference(constant.lookup(trace.constantDefinitions),parameterSubstitutions,trace,variables)
404 } else {
405 val res = createALSJoin=> [
406 leftOperand = createALSReference => [ referred = trace.logicLanguage ]
407 rightOperand = createALSReference => [ referred = constant.lookup(trace.constantDeclaration2LanguageField) ]
408 ]
409 return support.postprocessResultOfSymbolicReference(constant.type,res,trace)
410 }
411 }
412 def dispatch protected ALSTerm transformSymbolicReference(ConstantDefinition constant, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
413 val res = createALSFunctionCall => [
414 it.referredDefinition = constant.lookup(trace.constantDefinition2Function)
415 ]
416 return support.postprocessResultOfSymbolicReference(constant.type,res,trace)
417 }
418 def dispatch protected ALSTerm transformSymbolicReference(Variable variable, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
419 val res = createALSReference => [referred = variable.lookup(variables)]
420 return support.postprocessResultOfSymbolicReference(variable.range,res,trace)
421 }
422 def dispatch protected ALSTerm transformSymbolicReference(FunctionDeclaration function, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
423 if(trace.functionDefinitions.containsKey(function)) {
424 return this.transformSymbolicReference(function.lookup(trace.functionDefinitions),parameterSubstitutions,trace,variables)
425 } else {
426 if(functionMapper.transformedToHostedField(function,trace)) {
427 val param = parameterSubstitutions.get(0).transformTerm(trace,variables)
428 val res = createALSJoin => [
429 leftOperand = support.prepareParameterOfSymbolicReference(function.parameters.get(0),param,trace)
430 rightOperand = createALSReference => [referred = function.lookup(trace.functionDeclaration2HostedField)]
431 ]
432 return support.postprocessResultOfSymbolicReference(function.range,res,trace)
433 } else {
434 val functionExpression = createALSJoin=>[
435 leftOperand = createALSReference => [referred = trace.logicLanguage]
436 rightOperand = createALSReference => [referred = function.lookup(trace.functionDeclaration2LanguageField)]
437 ]
438 val res = support.unfoldDotJoin(this,parameterSubstitutions,functionExpression,trace,variables)
439 return support.postprocessResultOfSymbolicReference(function.range,res,trace)
440 }
441 }
442 }
443 def dispatch protected ALSTerm transformSymbolicReference(FunctionDefinition function, List<Term> parameterSubstitutions, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
444 val result = createALSFunctionCall => [
445 it.referredDefinition = function.lookup(trace.functionDefinition2Function)
446 it.params += parameterSubstitutions.map[it.transformTerm(trace,variables)]
447 ]
448 return support.postprocessResultOfSymbolicReference(function.range,result,trace)
449 }
450
451 def dispatch protected ALSTerm transformSymbolicReference(RelationDeclaration relation, List<Term> parameterSubstitutions,
452 Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
453 if(trace.relationDefinitions.containsKey(relation)) {
454 this.transformSymbolicReference(relation.lookup(trace.relationDefinitions),parameterSubstitutions,trace,variables)
455 } else {
456 if(relationMapper.transformToHostedField(relation,trace)) {
457 val alsRelation = relation.lookup(trace.relationDeclaration2Field)
458 // R(a,b) =>
459 // b in a.R
460 return createALSSubset => [
461 it.leftOperand = parameterSubstitutions.get(1).transformTerm(trace,variables)
462 it.rightOperand = createALSJoin => [
463 it.leftOperand = parameterSubstitutions.get(0).transformTerm(trace,variables)
464 it.rightOperand = createALSReference => [ it.referred = alsRelation ]
465 ]
466 ]
467 } else {
468 val target = createALSJoin => [
469 leftOperand = createALSReference => [referred = trace.logicLanguage]
470 rightOperand = createALSReference => [ referred = relation.lookup(trace.relationDeclaration2Global) ]]
471 val source = support.unfoldTermDirectProduct(this,parameterSubstitutions,trace,variables)
472
473 return createALSSubset => [
474 leftOperand = source
475 rightOperand = target
476 ]
477 }
478 }
479 }
480
481
482
483 def dispatch protected ALSTerm transformSymbolicReference(RelationDefinition relation, List<Term> parameterSubstitutions,
484 Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables)
485 {
486 return createALSFunctionCall => [
487 it.referredDefinition = relation.lookup(trace.relationDefinition2Predicate)
488 it.params += parameterSubstitutions.map[p | p.transformTerm(trace,variables)]
489 ]
490 }
491} \ No newline at end of file