From ee902fa6ad7de0bfe08c5a4b62878915426d20d5 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Wed, 16 Aug 2017 20:49:08 +0200 Subject: Transitive closure support --- .../patterns/RelationDefinitionIndexer.xtend | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'Solvers') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend index b400652f..1e86f826 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDefinitionIndexer.xtend @@ -45,10 +45,30 @@ class RelationDefinitionIndexer { «relation.transformPattern(relation.lookup(relation2PQuery), Modality.MUST)» «relation.transformPattern(relation.lookup(relation2PQuery), Modality.MAY)» «relation.transformPattern(relation.lookup(relation2PQuery), Modality.CURRENT)» + «IF fqn2PQuery.values.relationDefinitionIsUsedInTransitiveClosure(relation.lookup(relation2PQuery))» + «relation.transformPatternWithTwoParameters(relation.lookup(relation2PQuery), Modality.MUST)» + «relation.transformPatternWithTwoParameters(relation.lookup(relation2PQuery), Modality.MAY)» + «relation.transformPatternWithTwoParameters(relation.lookup(relation2PQuery), Modality.CURRENT)» + «ENDIF» «ENDFOR» ''' } + private def relationDefinitionIsUsedInTransitiveClosure(Iterable all, PQuery r) { + all.exists[ + it.disjunctBodies.bodies.exists[ + it.constraints.exists[ + val constraint = it + if(constraint instanceof BinaryTransitiveClosure) { + return constraint.referredQuery === r + } else { + return false + } + ] + ] + ] + } + private def relationDefinitionName(RelationDefinition relation, Modality modality) '''«modality.name.toLowerCase»InRelation_«base.canonizeName(relation.name)»''' @@ -73,6 +93,13 @@ class RelationDefinitionIndexer { throw new UnsupportedOperationException('''Can not transform pattern "«p.fullyQualifiedName»"!''',e) } } + private def transformPatternWithTwoParameters(RelationDefinition relation, PQuery p, Modality modality) { + return ''' + private pattern twoParam_«relationDefinitionName(relation,modality)»(«FOR param : p.parameters SEPARATOR ', '»var_«param.name»«ENDFOR») { + find «relationDefinitionName(relation,modality)»(_,_,«FOR param : p.parameters SEPARATOR ', '»var_«param.name»«ENDFOR»); + } + ''' + } private def toMustMay(Modality modality) { if(modality == Modality::MAY) return Modality::MAY @@ -80,7 +107,7 @@ class RelationDefinitionIndexer { } def public referPattern(PQuery p, String[] variables, Modality modality, boolean positive, boolean transitive) ''' - «IF !positive»neg «ENDIF»find «modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(problem,interpretation,«variables.join(',')»); + «IF !positive»neg «ENDIF»find «IF transitive»twoParam_«ENDIF»«modality.name.toLowerCase»InRelation_pattern_«p.fullyQualifiedName.replace('.','_')»«IF transitive»+«ENDIF»(«IF !transitive»problem,interpretation,«ENDIF»«variables.join(',')»); ''' private dispatch def transformConstraint(TypeConstraint constraint, Modality modality) { -- cgit v1.2.3-54-g00ecf