1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns
import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion
import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransformedViatraWellformednessConstraint
import java.util.Map
import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PQuery
import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
import java.util.LinkedHashMap
import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
class UnfinishedIndexer {
val PatternGenerator base
new(PatternGenerator patternGenerator) {
this.base = patternGenerator
}
def generateUnfinishedWfQueries(LogicProblem problem, Map<String,PQuery> fqn2PQuery) {
val wfQueries = base.wfQueries(problem)
'''
«FOR wfQuery: wfQueries»
pattern unfinishedBy_«base.canonizeName(wfQuery.target.name)»(problem:LogicProblem, interpretation:PartialInterpretation,
«FOR param : wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters SEPARATOR ', '»var_«param.name»«ENDFOR»)
{
«base.relationDefinitionIndexer.referPattern(
wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery),
wfQuery.patternFullyQualifiedName.lookup(fqn2PQuery).parameters.map['''var_«it.name»'''],
Modality.CURRENT,
true,false)»
}
«ENDFOR»
'''
}
def getUnfinishedWFQueryNames(LogicProblem problem) {
val wfQueries = base.wfQueries(problem)
val map = new LinkedHashMap
for(wfQuery : wfQueries) {
map.put(wfQuery.target,'''unfinishedBy_«base.canonizeName(wfQuery.target.name)»''')
}
return map
}
def generateUnfinishedMultiplicityQueries(LogicProblem problem, Map<String,PQuery> fqn2PQuery) {
val lowerMultiplicities = base.lowerMultiplicities(problem)
return '''
«FOR lowerMultiplicity : lowerMultiplicities»
pattern «unfinishedMultiplicityName(lowerMultiplicity)»(problem:LogicProblem, interpretation:PartialInterpretation, relationIterpretation:PartialRelationInterpretation, object:DefinedElement,missingMultiplicity) {
find interpretation(problem,interpretation);
PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation);
PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"«lowerMultiplicity.relation.name»");
«base.typeIndexer.referInstanceOf(lowerMultiplicity.firstParamTypeOfRelation,Modality::MUST,"object")»
numberOfExistingReferences == count «base.referRelation(lowerMultiplicity.relation,"object","_",Modality.MUST,fqn2PQuery)»
check(numberOfExistingReferences < «lowerMultiplicity.lower»);
missingMultiplicity == eval(«lowerMultiplicity.lower»-numberOfExistingReferences);
}
«ENDFOR»
'''
}
def String unfinishedMultiplicityName(LowerMultiplicityAssertion lowerMultiplicityAssertion)
'''unfinishedLowerMultiplicity_«base.canonizeName(lowerMultiplicityAssertion.relation.name)»'''
def public referUnfinishedMultiplicityQuery(LowerMultiplicityAssertion lowerMultiplicityAssertion)
'''find «unfinishedMultiplicityName(lowerMultiplicityAssertion)»(problem, interpretation ,object, missingMultiplicity);'''
def getFirstParamTypeOfRelation(LowerMultiplicityAssertion lowerMultiplicityAssertion) {
val parameters = lowerMultiplicityAssertion.relation.parameters
if(parameters.size == 2) {
val firstParam = parameters.get(0)
if(firstParam instanceof ComplexTypeReference) {
return firstParam.referred
}
}
}
def getUnfinishedMultiplicityQueries(LogicProblem problem) {
val lowerMultiplicities = base.lowerMultiplicities(problem)
val map = new LinkedHashMap
for(lowerMultiplicity : lowerMultiplicities) {
map.put(lowerMultiplicity.relation,unfinishedMultiplicityName(lowerMultiplicity))
}
return map
}
}
|