From 419e76265ecbdf65e960e0624be006d31ed1e191 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 8 May 2020 18:28:19 +0200 Subject: Update solver language grammar First version, still needs TokenSource and Linker to work. --- .../outputs/debug/errors.txt | 24 +- .../outputs/debug/generated3valued.vql_deactivated | 1464 ++++++++------- .../case.study.familyTree.run/outputs/log.txt | 2 +- .../case.study.familyTree.run/outputs/models/1.gml | 1889 ++++++++++---------- .../case.study.familyTree.run/outputs/models/1.png | Bin 97536 -> 90845 bytes .../case.study.familyTree.run/outputs/models/1.xmi | 16 +- 6 files changed, 1732 insertions(+), 1663 deletions(-) (limited to 'Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs') diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/errors.txt b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/errors.txt index 637be9c5..87a7ed57 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/errors.txt +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/errors.txt @@ -1,13 +1,19 @@ -Error occured (NullPointerException): - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PConstraintTransformer.hasValueExpression(PConstraintTransformer.java:487) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PConstraintTransformer._transformConstraint(PConstraintTransformer.java:614) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PConstraintTransformer.transformConstraint(PConstraintTransformer.java:689) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.RelationDefinitionIndexer.transformPattern(RelationDefinitionIndexer.java:169) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.RelationDefinitionIndexer.generateRelationDefinitions(RelationDefinitionIndexer.java:51) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternGenerator.transformBaseProperties(PatternGenerator.java:747) - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternProvider.generateQueries(PatternProvider.java:59) +Error occured (IllegalArgumentException): TypeConstraint applicable for enumerable input keys only; received instead org.eclipse.viatra.query.patternlanguage.emf.types.BottomTypeKey@3ba3f40d + org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint.(TypeConstraint.java:42) + org.eclipse.viatra.query.patternlanguage.emf.specification.internal.EPMToPBody.acceptTypeConstraint(EPMToPBody.java:115) + org.eclipse.viatra.query.patternlanguage.emf.specification.internal.PatternBodyTransformer.preprocessParameters(PatternBodyTransformer.java:168) + org.eclipse.viatra.query.patternlanguage.emf.specification.internal.PatternBodyTransformer.transform(PatternBodyTransformer.java:123) + org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder.getBodies(SpecificationBuilder.java:300) + org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder.buildBodies(SpecificationBuilder.java:286) + org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder.buildSpecification(SpecificationBuilder.java:197) + org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder.lambda$4(SpecificationBuilder.java:157) + java.util.Optional.orElseGet(Optional.java:267) + org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder.getOrCreateSpecification(SpecificationBuilder.java:157) + hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util.ParseUtil.createSpecification(ParseUtil.java:114) + hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util.ParseUtil.parse(ParseUtil.java:101) + hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.PatternProvider.generateQueries(PatternProvider.java:66) hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationMethodProvider.createModelGenerationMethod(ModelGenerationMethodProvider.java:57) - hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner.solve(ViatraReasoner.java:96) + hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner.solve(ViatraReasoner.java:97) hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:316) hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor._execute(ScriptExecutor.java:129) hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.execute(ScriptExecutor.java:338) diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/generated3valued.vql_deactivated b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/generated3valued.vql_deactivated index bbaa6a26..315a1e15 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/generated3valued.vql_deactivated +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/debug/generated3valued.vql_deactivated @@ -1,672 +1,792 @@ -import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" -import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" -import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/language" - -////////// -// 0. Util -////////// -private pattern interpretation(problem:LogicProblem, interpretation:PartialInterpretation) { - PartialInterpretation.problem(interpretation,problem); -} - -///////////////////////// -// 0.1 Existence -///////////////////////// -/** [[exist(element)]]=1 */ -private pattern mustExist(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { - find interpretation(problem,interpretation); - LogicProblem.elements(problem,element); -} or { - find interpretation(problem,interpretation); - PartialInterpretation.newElements(interpretation,element); -} - -/** [[exist(element)]]>=1/2 */ -private pattern mayExist(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { - find mustExist(problem,interpretation,element); -} or { - find interpretation(problem,interpretation); - neg find elementCloseWorld(element); - PartialInterpretation.openWorldElements(interpretation,element); -} - -private pattern elementCloseWorld(element:DefinedElement) { - PartialInterpretation.openWorldElements(i,element); - PartialInterpretation.maxNewElements(i,0); -} or { - Scope.targetTypeInterpretation(scope,interpretation); - PartialTypeInterpratation.elements(interpretation,element); - Scope.maxNewElements(scope,0); -} - -//////////////////////// -// 0.2 Equivalence -//////////////////////// -pattern mayEquivalent(problem:LogicProblem, interpretation:PartialInterpretation, a: DefinedElement, b: DefinedElement) -// For non-primitive type. Boolean types always must equivalent or cannot equivalent -{ - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - a == b; -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - IntegerElement(a); - IntegerElement(b); - PrimitiveElement.valueSet(a,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - IntegerElement(a); - IntegerElement(b); - PrimitiveElement.valueSet(b,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - RealElement(a); - RealElement(b); - PrimitiveElement.valueSet(a,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - RealElement(a); - RealElement(b); - PrimitiveElement.valueSet(b,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - RealElement(a); - IntegerElement(b); - PrimitiveElement.valueSet(a,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - RealElement(a); - IntegerElement(b); - PrimitiveElement.valueSet(b,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - IntegerElement(a); - RealElement(b); - PrimitiveElement.valueSet(a,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - IntegerElement(a); - RealElement(b); - PrimitiveElement.valueSet(b,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - StringElement(a); - StringElement(b); - PrimitiveElement.valueSet(a,false); -} or { - find mayExist(problem,interpretation,a); - find mayExist(problem,interpretation,b); - StringElement(a); - StringElement(b); - PrimitiveElement.valueSet(b,false); -} - -pattern mustEquivalent(problem:LogicProblem, interpretation:PartialInterpretation, a: DefinedElement, b: DefinedElement) { -// For non-primitive and Boolean primitive type - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - a == b; -} or { - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - PrimitiveElement.valueSet(a,true); - PrimitiveElement.valueSet(b,true); - IntegerElement.value(a,value); - IntegerElement.value(b,value); -} or { - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - PrimitiveElement.valueSet(a,true); - PrimitiveElement.valueSet(b,true); - RealElement.value(a,value); - RealElement.value(b,value); -} or { - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - PrimitiveElement.valueSet(a,true); - PrimitiveElement.valueSet(b,true); - RealElement.value(a,value); - IntegerElement.value(b,value); -} or { - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - PrimitiveElement.valueSet(a,true); - PrimitiveElement.valueSet(b,true); - IntegerElement.value(a,value); - RealElement.value(b,value); -} or { - find mustExist(problem,interpretation,a); - find mustExist(problem,interpretation,b); - PrimitiveElement.valueSet(a,true); - PrimitiveElement.valueSet(b,true); - StringElement.value(a,value); - StringElement.value(b,value); -} - -////////// -// 1. Problem-Specific Base Indexers -////////// -// 1.1 Type Indexers -////////// -// 1.1.1 Required Patterns by TypeIndexer -////////// -private pattern typeInterpretation(problem:LogicProblem, interpretation:PartialInterpretation, type:TypeDeclaration, typeInterpretation:PartialComplexTypeInterpretation) { - find interpretation(problem,interpretation); - LogicProblem.types(problem,type); - PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); - PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); -} - -private pattern directInstanceOf(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement, type:Type) { - find interpretation(problem,interpretation); - LogicProblem.types(problem,type); - TypeDefinition.elements(type,element); -} or { - find interpretation(problem,interpretation); - find typeInterpretation(problem,interpretation,type,typeInterpretation); - PartialComplexTypeInterpretation.elements(typeInterpretation,element); -} - -private pattern isPrimitive(element: PrimitiveElement) { - PrimitiveElement(element); -} -////////// -// 1.1.2 primitive Type Indexers -////////// -// Currently unused. Refer primitive types as: -// > PrimitiveElement(element) -// specific types are referred as: -// > BooleanElement(variableName) -// > IntegerElement(variableName) -// > RealElement(variableName) -// > StringElement(variableName) -// And their value as -// > BooleanElement.value(variableName,value) -// > IntegerElement.value(variableName,value) -// > RealElement.value(variableName,value) -// > StringElement.value(variableName,value) -// Whether a value is set is defined by: -// > PrimitiveElement.valueSet(variableName,isFilled); -////////// -// 1.1.3 domain-specific Type Indexers -////////// -/** - * An element must be an instance of type "FamilyTree class". - */ -private pattern mustInstanceOfFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { - Type.name(type,"FamilyTree class"); - find directInstanceOf(problem,interpretation,element,type); -} -private pattern scopeDisallowsNewFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation) { - find interpretation(problem,interpretation); - PartialInterpretation.scopes(interpretation,scope); - Scope.targetTypeInterpretation(scope,typeInterpretation); - Scope.maxNewElements(scope,0); - PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); - Type.name(type,"FamilyTree class"); -} - -/** - * An element may be an instance of type "FamilyTree class". - */ -private pattern mayInstanceOfFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.newElements(interpretation,element); - neg find mustInstanceOfMember_class(problem,interpretation,element); - neg find scopeDisallowsNewFamilyTree_class(problem, interpretation); - neg find isPrimitive(element); -} or { - find interpretation(problem,interpretation); - PartialInterpretation.openWorldElements(interpretation,element); - neg find mustInstanceOfMember_class(problem,interpretation,element); - neg find scopeDisallowsNewFamilyTree_class(problem, interpretation); - neg find isPrimitive(element); -} or -{ find mustInstanceOfFamilyTree_class(problem,interpretation,element); } -/** - * An element must be an instance of type "Member class". - */ -private pattern mustInstanceOfMember_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { - Type.name(type,"Member class"); - find directInstanceOf(problem,interpretation,element,type); -} -private pattern scopeDisallowsNewMember_class(problem:LogicProblem, interpretation:PartialInterpretation) { - find interpretation(problem,interpretation); - PartialInterpretation.scopes(interpretation,scope); - Scope.targetTypeInterpretation(scope,typeInterpretation); - Scope.maxNewElements(scope,0); - PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); - Type.name(type,"Member class"); -} - -/** - * An element may be an instance of type "Member class". - */ -private pattern mayInstanceOfMember_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.newElements(interpretation,element); - neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); - neg find scopeDisallowsNewMember_class(problem, interpretation); - neg find isPrimitive(element); -} or { - find interpretation(problem,interpretation); - PartialInterpretation.openWorldElements(interpretation,element); - neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); - neg find scopeDisallowsNewMember_class(problem, interpretation); - neg find isPrimitive(element); -} or -{ find mustInstanceOfMember_class(problem,interpretation,element); } - -////////// -// 1.2 Relation Declaration Indexers -////////// -/** - * Matcher for detecting tuples t where []members reference FamilyTree(source,target) - */ -private pattern mustInRelationmembers_reference_FamilyTree( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"members reference FamilyTree"); - PartialRelationInterpretation.relationlinks(relationIterpretation,link); - BinaryElementRelationLink.param1(link,source); - BinaryElementRelationLink.param2(link,target); -} -/** - * Matcher for detecting tuples t where <>members reference FamilyTree(source,target) - */ -private pattern mayInRelationmembers_reference_FamilyTree( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - find mayInstanceOfFamilyTree_class(problem,interpretation,source); - find mayInstanceOfMember_class(problem,interpretation,target); - // The reference is containment, then a new reference cannot be create if: - // 1. Multiple parents - neg find mustContains4(problem,interpretation,_,target); - // 2. Circle in the containment hierarchy - neg find mustTransitiveContains(source,target); -} or { - find mustInRelationmembers_reference_FamilyTree(problem,interpretation,source,target); -} -/** - * Matcher for detecting tuples t where []children reference Member(source,target) - */ -private pattern mustInRelationchildren_reference_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"children reference Member"); - PartialRelationInterpretation.relationlinks(relationIterpretation,link); - BinaryElementRelationLink.param1(link,source); - BinaryElementRelationLink.param2(link,target); -} -/** - * Matcher for detecting tuples t where <>children reference Member(source,target) - */ -private pattern mayInRelationchildren_reference_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - find mayInstanceOfMember_class(problem,interpretation,source); - find mayInstanceOfMember_class(problem,interpretation,target); - // There are "numberOfExistingReferences" currently existing instances of the reference to the target, - // the upper bound of the opposite reference multiplicity should be considered. - numberOfExistingOppositeReferences == count find mustInRelationparents_reference_Member(problem,interpretation,target,_); - check(numberOfExistingOppositeReferences < 2); -} or { - find mustInRelationchildren_reference_Member(problem,interpretation,source,target); -} -/** - * Matcher for detecting tuples t where []parents reference Member(source,target) - */ -private pattern mustInRelationparents_reference_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"parents reference Member"); - PartialRelationInterpretation.relationlinks(relationIterpretation,link); - BinaryElementRelationLink.param1(link,source); - BinaryElementRelationLink.param2(link,target); -} -/** - * Matcher for detecting tuples t where <>parents reference Member(source,target) - */ -private pattern mayInRelationparents_reference_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - find mayInstanceOfMember_class(problem,interpretation,source); - find mayInstanceOfMember_class(problem,interpretation,target); - // There are "numberOfExistingReferences" currently existing instances of the reference from the source, - // the upper bound of the multiplicity should be considered. - numberOfExistingReferences == count find mustInRelationparents_reference_Member(problem,interpretation,source,_); - check(numberOfExistingReferences < 2); -} or { - find mustInRelationparents_reference_Member(problem,interpretation,source,target); -} -/** - * Matcher for detecting tuples t where []name attribute Member(source,target) - */ -private pattern mustInRelationname_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"name attribute Member"); - PartialRelationInterpretation.relationlinks(relationIterpretation,link); - BinaryElementRelationLink.param1(link,source); - BinaryElementRelationLink.param2(link,target); -} -/** - * Matcher for detecting tuples t where <>name attribute Member(source,target) - */ -private pattern mayInRelationname_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - find mayInstanceOfMember_class(problem,interpretation,source); - StringElement(target); - // There are "numberOfExistingReferences" currently existing instances of the reference from the source, - // the upper bound of the multiplicity should be considered. - numberOfExistingReferences == count find mustInRelationname_attribute_Member(problem,interpretation,source,_); - check(numberOfExistingReferences < 1); -} or { - find mustInRelationname_attribute_Member(problem,interpretation,source,target); -} -/** - * Matcher for detecting tuples t where []age attribute Member(source,target) - */ -private pattern mustInRelationage_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"age attribute Member"); - PartialRelationInterpretation.relationlinks(relationIterpretation,link); - BinaryElementRelationLink.param1(link,source); - BinaryElementRelationLink.param2(link,target); -} -/** - * Matcher for detecting tuples t where <>age attribute Member(source,target) - */ -private pattern mayInRelationage_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target:DefinedElement) -{ - find interpretation(problem,interpretation); - // The two endpoint of the link have to exist - find mayExist(problem, interpretation, source); - find mayExist(problem, interpretation, target); - // Type consistency - find mayInstanceOfMember_class(problem,interpretation,source); - IntegerElement(target); - // There are "numberOfExistingReferences" currently existing instances of the reference from the source, - // the upper bound of the multiplicity should be considered. - numberOfExistingReferences == count find mustInRelationage_attribute_Member(problem,interpretation,source,_); - check(numberOfExistingReferences < 1); -} or { - find mustInRelationage_attribute_Member(problem,interpretation,source,target); -} - -////////// -// 1.3 Relation Definition Indexers -////////// -// Must, May and Current queries for pattern queries memberIsItsOwnParent -private pattern mustInRelation_pattern_queries_memberIsItsOwnParent( - problem:LogicProblem, interpretation:PartialInterpretation, - var_m) -{ - find interpretation(problem,interpretation); - find mustInstanceOfMember_class(problem,interpretation,var_m); - // m is exported - find mustInstanceOfFamilyTree_class(problem,interpretation,var__0); - find mustInRelationmembers_reference_FamilyTree(problem,interpretation,var__0,var_virtual0); - find mustInstanceOfMember_class(problem,interpretation,var_virtual0); - find mustEquivalent(problem, interpretation, var_virtual0, var_m); - find mustInstanceOfMember_class(problem,interpretation,var_m); - find mustInRelationparents_reference_Member(problem,interpretation,var_m,var_virtual1); - find mustInstanceOfMember_class(problem,interpretation,var_virtual1); - find mustEquivalent(problem, interpretation, var_virtual1, var_p); - find mustEquivalent(problem, interpretation, var_m, var_p); -} -private pattern mayInRelation_pattern_queries_memberIsItsOwnParent( - problem:LogicProblem, interpretation:PartialInterpretation, - var_m) -{ - find interpretation(problem,interpretation); - find mayInstanceOfMember_class(problem,interpretation,var_m); - // m is exported - find mayInstanceOfFamilyTree_class(problem,interpretation,var__0); - find mayInRelationmembers_reference_FamilyTree(problem,interpretation,var__0,var_virtual0); - find mayInstanceOfMember_class(problem,interpretation,var_virtual0); - find mayEquivalent(problem, interpretation, var_virtual0, var_m); - find mayInstanceOfMember_class(problem,interpretation,var_m); - find mayInRelationparents_reference_Member(problem,interpretation,var_m,var_virtual1); - find mayInstanceOfMember_class(problem,interpretation,var_virtual1); - find mayEquivalent(problem, interpretation, var_virtual1, var_p); - find mayEquivalent(problem, interpretation, var_m, var_p); -} -private pattern currentInRelation_pattern_queries_memberIsItsOwnParent( - problem:LogicProblem, interpretation:PartialInterpretation, - var_m) -{ - find interpretation(problem,interpretation); - find mustInstanceOfMember_class(problem,interpretation,var_m); - // m is exported - find mustInstanceOfFamilyTree_class(problem,interpretation,var__0); - find mustInRelationmembers_reference_FamilyTree(problem,interpretation,var__0,var_virtual0); - find mustInstanceOfMember_class(problem,interpretation,var_virtual0); - find mustEquivalent(problem, interpretation, var_virtual0, var_m); - find mustInstanceOfMember_class(problem,interpretation,var_m); - find mustInRelationparents_reference_Member(problem,interpretation,var_m,var_virtual1); - find mustInstanceOfMember_class(problem,interpretation,var_virtual1); - find mustEquivalent(problem, interpretation, var_virtual1, var_p); - find mustEquivalent(problem, interpretation, var_m, var_p); -} - -////////// -// 1.4 Containment Indexer -////////// -private pattern mustContains2(source: DefinedElement, target: DefinedElement) { - find mustContains4(_,_,source,target); -} - -private pattern mustContains4(problem:LogicProblem, interpretation:PartialInterpretation, - source: DefinedElement, target: DefinedElement) - { find mustInRelationmembers_reference_FamilyTree(problem,interpretation,source,target); } - -private pattern mustTransitiveContains(source,target) { - find mustContains2+(source,target); -} - -////////// -// 2. Invalidation Indexers -////////// -// 2.1 Invalidated by WF Queries -////////// -pattern invalidatedBy_pattern_queries_memberIsItsOwnParent(problem:LogicProblem, interpretation:PartialInterpretation, - var_m) -{ - find mustInRelation_pattern_queries_memberIsItsOwnParent(problem,interpretation,var_m); -} - -////////// -// 3. Unfinishedness Indexers -////////// -// 3.1 Unfinishedness Measured by Multiplicity -////////// - -////////// -// 3.2 Unfinishedness Measured by WF Queries -////////// -pattern unfinishedBy_pattern_queries_memberIsItsOwnParent(problem:LogicProblem, interpretation:PartialInterpretation, - var_m) -{ - find currentInRelation_pattern_queries_memberIsItsOwnParent(problem,interpretation,var_m); -} - -////////// -// 4. Refinement Indexers -////////// -// 4.1 Object constructors -////////// -private pattern hasElementInContainment(problem:LogicProblem, interpretation:PartialInterpretation) -{ - find interpretation(problem,interpretation); - find mustInstanceOfFamilyTree_class(problem,interpretation,root); - find mustExist(problem, interpretation, root); -}or{ - find interpretation(problem,interpretation); - find mustInstanceOfMember_class(problem,interpretation,root); - find mustExist(problem, interpretation, root); -} -pattern createObject_FamilyTree_class( - problem:LogicProblem, interpretation:PartialInterpretation, - typeInterpretation:PartialComplexTypeInterpretation) -{ - find interpretation(problem,interpretation); - neg find hasElementInContainment(problem,interpretation); - PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); - PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"FamilyTree class"); - find mayInstanceOfFamilyTree_class(problem,interpretation,newObject); - find mayExist(problem, interpretation, newObject); - neg find mustExist(problem, interpretation, newObject); -} -pattern createObject_Member_class_by_members_reference_FamilyTree( - problem:LogicProblem, interpretation:PartialInterpretation, - relationInterpretation:PartialRelationInterpretation, typeInterpretation:PartialComplexTypeInterpretation, - container:DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); - PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"Member class"); - PartialInterpretation.partialrelationinterpretation(interpretation,relationInterpretation); - PartialRelationInterpretation.interpretationOf.name(relationInterpretation,"members reference FamilyTree"); - find mustInstanceOfFamilyTree_class(problem,interpretation,container); - find mayInstanceOfMember_class(problem,interpretation,newObject); - find mayInRelationmembers_reference_FamilyTree(problem,interpretation,container,newObject); - find mustExist(problem, interpretation, container); - neg find mustExist(problem, interpretation, newObject); -} -pattern createObject_Member_class( - problem:LogicProblem, interpretation:PartialInterpretation, - typeInterpretation:PartialComplexTypeInterpretation) -{ - find interpretation(problem,interpretation); - neg find hasElementInContainment(problem,interpretation); - PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); - PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"Member class"); - find mayInstanceOfMember_class(problem,interpretation,newObject); - find mayExist(problem, interpretation, newObject); - neg find mustExist(problem, interpretation, newObject); -} - -////////// -// 4.2 Type refinement -////////// -pattern refineTypeTo_FamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element: DefinedElement) { - find interpretation(problem,interpretation); - PartialInterpretation.newElements(interpretation,element); - find mayInstanceOfFamilyTree_class(problem,interpretation,element); - neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); - neg find mustInstanceOfMember_class(problem,interpretation,element); -} -pattern refineTypeTo_Member_class(problem:LogicProblem, interpretation:PartialInterpretation, element: DefinedElement) { - find interpretation(problem,interpretation); - PartialInterpretation.newElements(interpretation,element); - find mayInstanceOfMember_class(problem,interpretation,element); - neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); - neg find mustInstanceOfMember_class(problem,interpretation,element); -} - -////////// -// 4.3 Relation refinement -////////// -pattern refineRelation_children_reference_Member_and_parents_reference_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - relationIterpretation:PartialRelationInterpretation, oppositeInterpretation:PartialRelationInterpretation, - from: DefinedElement, to: DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"children reference Member"); - PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); - PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"parents reference Member"); - find mustExist(problem, interpretation, from); - find mustExist(problem, interpretation, to); - find mustInstanceOfMember_class(problem,interpretation,from); - find mustInstanceOfMember_class(problem,interpretation,to); - find mayInRelationchildren_reference_Member(problem,interpretation,from,to); - neg find mustInRelationchildren_reference_Member(problem,interpretation,from,to); -} -pattern refineRelation_name_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - relationIterpretation:PartialRelationInterpretation, - from: DefinedElement, to: DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"name attribute Member"); - find mustExist(problem, interpretation, from); - find mustExist(problem, interpretation, to); - find mustInstanceOfMember_class(problem,interpretation,from); - StringElement(to); - find mayInRelationname_attribute_Member(problem,interpretation,from,to); - neg find mustInRelationname_attribute_Member(problem,interpretation,from,to); -} -pattern refineRelation_age_attribute_Member( - problem:LogicProblem, interpretation:PartialInterpretation, - relationIterpretation:PartialRelationInterpretation, - from: DefinedElement, to: DefinedElement) -{ - find interpretation(problem,interpretation); - PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); - PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"age attribute Member"); - find mustExist(problem, interpretation, from); - find mustExist(problem, interpretation, to); - find mustInstanceOfMember_class(problem,interpretation,from); - IntegerElement(to); - find mayInRelationage_attribute_Member(problem,interpretation,from,to); - neg find mustInRelationage_attribute_Member(problem,interpretation,from,to); -} - +import epackage "http://www.bme.hu/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage" +import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/problem" +import epackage "http://www.bme.hu/mit/inf/dslreasoner/logic/model/language" + +////////// +// 0. Util +////////// +private pattern interpretation(problem:LogicProblem, interpretation:PartialInterpretation) { + PartialInterpretation.problem(interpretation,problem); +} + +///////////////////////// +// 0.1 Existence +///////////////////////// +/** [[exist(element)]]=1 */ +private pattern mustExist(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { + find interpretation(problem,interpretation); + LogicProblem.elements(problem,element); +} or { + find interpretation(problem,interpretation); + PartialInterpretation.newElements(interpretation,element); +} + +/** [[exist(element)]]>=1/2 */ +private pattern mayExist(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { + find mustExist(problem,interpretation,element); +} or { + find interpretation(problem,interpretation); + neg find elementCloseWorld(element); + PartialInterpretation.openWorldElements(interpretation,element); +} + +private pattern elementCloseWorld(element:DefinedElement) { + PartialInterpretation.openWorldElements(i,element); + PartialInterpretation.maxNewElements(i,0); +} or { + Scope.targetTypeInterpretation(scope,interpretation); + PartialTypeInterpratation.elements(interpretation,element); + Scope.maxNewElements(scope,0); +} + +//////////////////////// +// 0.2 Equivalence +//////////////////////// +pattern mayEquivalent(problem:LogicProblem, interpretation:PartialInterpretation, a: DefinedElement, b: DefinedElement) +// For non-primitive type. Boolean types always must equivalent or cannot equivalent +{ + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + a == b; +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + IntegerElement(a); + IntegerElement(b); + PrimitiveElement.valueSet(a,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + IntegerElement(a); + IntegerElement(b); + PrimitiveElement.valueSet(b,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + RealElement(a); + RealElement(b); + PrimitiveElement.valueSet(a,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + RealElement(a); + RealElement(b); + PrimitiveElement.valueSet(b,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + RealElement(a); + IntegerElement(b); + PrimitiveElement.valueSet(a,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + RealElement(a); + IntegerElement(b); + PrimitiveElement.valueSet(b,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + IntegerElement(a); + RealElement(b); + PrimitiveElement.valueSet(a,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + IntegerElement(a); + RealElement(b); + PrimitiveElement.valueSet(b,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + StringElement(a); + StringElement(b); + PrimitiveElement.valueSet(a,false); +} or { + find mayExist(problem,interpretation,a); + find mayExist(problem,interpretation,b); + StringElement(a); + StringElement(b); + PrimitiveElement.valueSet(b,false); +} + +pattern mustEquivalent(problem:LogicProblem, interpretation:PartialInterpretation, a: DefinedElement, b: DefinedElement) { +// For non-primitive and Boolean primitive type + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + a == b; +} or { + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + PrimitiveElement.valueSet(a,true); + PrimitiveElement.valueSet(b,true); + IntegerElement.value(a,value); + IntegerElement.value(b,value); +} or { + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + PrimitiveElement.valueSet(a,true); + PrimitiveElement.valueSet(b,true); + RealElement.value(a,value); + RealElement.value(b,value); +} or { + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + PrimitiveElement.valueSet(a,true); + PrimitiveElement.valueSet(b,true); + RealElement.value(a,value); + IntegerElement.value(b,value); +} or { + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + PrimitiveElement.valueSet(a,true); + PrimitiveElement.valueSet(b,true); + IntegerElement.value(a,value); + RealElement.value(b,value); +} or { + find mustExist(problem,interpretation,a); + find mustExist(problem,interpretation,b); + PrimitiveElement.valueSet(a,true); + PrimitiveElement.valueSet(b,true); + StringElement.value(a,value); + StringElement.value(b,value); +} + +////////// +// 1. Problem-Specific Base Indexers +////////// +// 1.1 Type Indexers +////////// +// 1.1.1 Required Patterns by TypeIndexer +////////// +private pattern typeInterpretation(problem:LogicProblem, interpretation:PartialInterpretation, type:TypeDeclaration, typeInterpretation:PartialComplexTypeInterpretation) { + find interpretation(problem,interpretation); + LogicProblem.types(problem,type); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); +} + +private pattern directInstanceOf(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement, type:Type) { + find interpretation(problem,interpretation); + LogicProblem.types(problem,type); + TypeDefinition.elements(type,element); +} or { + find interpretation(problem,interpretation); + find typeInterpretation(problem,interpretation,type,typeInterpretation); + PartialComplexTypeInterpretation.elements(typeInterpretation,element); +} + +private pattern isPrimitive(element: PrimitiveElement) { + PrimitiveElement(element); +} +////////// +// 1.1.2 primitive Type Indexers +////////// +// Currently unused. Refer primitive types as: +// > PrimitiveElement(element) +// specific types are referred as: +// > BooleanElement(variableName) +// > IntegerElement(variableName) +// > RealElement(variableName) +// > StringElement(variableName) +// And their value as +// > BooleanElement.value(variableName,value) +// > IntegerElement.value(variableName,value) +// > RealElement.value(variableName,value) +// > StringElement.value(variableName,value) +// Whether a value is set is defined by: +// > PrimitiveElement.valueSet(variableName,isFilled); +////////// +// 1.1.3 domain-specific Type Indexers +////////// +/** + * An element must be an instance of type "FamilyTree class". + */ +private pattern mustInstanceOfFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { + Type.name(type,"FamilyTree class"); + find directInstanceOf(problem,interpretation,element,type); +} +private pattern scopeDisallowsNewFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation) { + find interpretation(problem,interpretation); + PartialInterpretation.scopes(interpretation,scope); + Scope.targetTypeInterpretation(scope,typeInterpretation); + Scope.maxNewElements(scope,0); + PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); + Type.name(type,"FamilyTree class"); +} + +/** + * An element may be an instance of type "FamilyTree class". + */ +private pattern mayInstanceOfFamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.newElements(interpretation,element); + neg find mustInstanceOfMember_class(problem,interpretation,element); + neg find scopeDisallowsNewFamilyTree_class(problem, interpretation); + neg find isPrimitive(element); +} or { + find interpretation(problem,interpretation); + PartialInterpretation.openWorldElements(interpretation,element); + neg find mustInstanceOfMember_class(problem,interpretation,element); + neg find scopeDisallowsNewFamilyTree_class(problem, interpretation); + neg find isPrimitive(element); +} or +{ find mustInstanceOfFamilyTree_class(problem,interpretation,element); } +/** + * An element must be an instance of type "Member class". + */ +private pattern mustInstanceOfMember_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) { + Type.name(type,"Member class"); + find directInstanceOf(problem,interpretation,element,type); +} +private pattern scopeDisallowsNewMember_class(problem:LogicProblem, interpretation:PartialInterpretation) { + find interpretation(problem,interpretation); + PartialInterpretation.scopes(interpretation,scope); + Scope.targetTypeInterpretation(scope,typeInterpretation); + Scope.maxNewElements(scope,0); + PartialComplexTypeInterpretation.interpretationOf(typeInterpretation,type); + Type.name(type,"Member class"); +} + +/** + * An element may be an instance of type "Member class". + */ +private pattern mayInstanceOfMember_class(problem:LogicProblem, interpretation:PartialInterpretation, element:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.newElements(interpretation,element); + neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); + neg find scopeDisallowsNewMember_class(problem, interpretation); + neg find isPrimitive(element); +} or { + find interpretation(problem,interpretation); + PartialInterpretation.openWorldElements(interpretation,element); + neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); + neg find scopeDisallowsNewMember_class(problem, interpretation); + neg find isPrimitive(element); +} or +{ find mustInstanceOfMember_class(problem,interpretation,element); } + +////////// +// 1.2 Relation Declaration Indexers +////////// +/** + * Matcher for detecting tuples t where []members reference FamilyTree(source,target) + */ +private pattern mustInRelationmembers_reference_FamilyTree( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"members reference FamilyTree"); + PartialRelationInterpretation.relationlinks(relationIterpretation,link); + BinaryElementRelationLink.param1(link,source); + BinaryElementRelationLink.param2(link,target); +} +/** + * Matcher for detecting tuples t where <>members reference FamilyTree(source,target) + */ +private pattern mayInRelationmembers_reference_FamilyTree( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + find mayInstanceOfFamilyTree_class(problem,interpretation,source); + find mayInstanceOfMember_class(problem,interpretation,target); + // The reference is containment, then a new reference cannot be create if: + // 1. Multiple parents + neg find mustContains4(problem,interpretation,_,target); + // 2. Circle in the containment hierarchy + neg find mustTransitiveContains(source,target); +} or { + find mustInRelationmembers_reference_FamilyTree(problem,interpretation,source,target); +} +/** + * Matcher for detecting tuples t where []children reference Member(source,target) + */ +private pattern mustInRelationchildren_reference_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"children reference Member"); + PartialRelationInterpretation.relationlinks(relationIterpretation,link); + BinaryElementRelationLink.param1(link,source); + BinaryElementRelationLink.param2(link,target); +} +/** + * Matcher for detecting tuples t where <>children reference Member(source,target) + */ +private pattern mayInRelationchildren_reference_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + find mayInstanceOfMember_class(problem,interpretation,source); + find mayInstanceOfMember_class(problem,interpretation,target); + // There are "numberOfExistingReferences" currently existing instances of the reference to the target, + // the upper bound of the opposite reference multiplicity should be considered. + numberOfExistingOppositeReferences == count find mustInRelationparents_reference_Member(problem,interpretation,target,_); + check(numberOfExistingOppositeReferences < 2); +} or { + find mustInRelationchildren_reference_Member(problem,interpretation,source,target); +} +/** + * Matcher for detecting tuples t where []parents reference Member(source,target) + */ +private pattern mustInRelationparents_reference_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"parents reference Member"); + PartialRelationInterpretation.relationlinks(relationIterpretation,link); + BinaryElementRelationLink.param1(link,source); + BinaryElementRelationLink.param2(link,target); +} +/** + * Matcher for detecting tuples t where <>parents reference Member(source,target) + */ +private pattern mayInRelationparents_reference_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + find mayInstanceOfMember_class(problem,interpretation,source); + find mayInstanceOfMember_class(problem,interpretation,target); + // There are "numberOfExistingReferences" currently existing instances of the reference from the source, + // the upper bound of the multiplicity should be considered. + numberOfExistingReferences == count find mustInRelationparents_reference_Member(problem,interpretation,source,_); + check(numberOfExistingReferences < 2); +} or { + find mustInRelationparents_reference_Member(problem,interpretation,source,target); +} +/** + * Matcher for detecting tuples t where []name attribute Member(source,target) + */ +private pattern mustInRelationname_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"name attribute Member"); + PartialRelationInterpretation.relationlinks(relationIterpretation,link); + BinaryElementRelationLink.param1(link,source); + BinaryElementRelationLink.param2(link,target); +} +/** + * Matcher for detecting tuples t where <>name attribute Member(source,target) + */ +private pattern mayInRelationname_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + find mayInstanceOfMember_class(problem,interpretation,source); + StringElement(target); + // There are "numberOfExistingReferences" currently existing instances of the reference from the source, + // the upper bound of the multiplicity should be considered. + numberOfExistingReferences == count find mustInRelationname_attribute_Member(problem,interpretation,source,_); + check(numberOfExistingReferences < 1); +} or { + find mustInRelationname_attribute_Member(problem,interpretation,source,target); +} +/** + * Matcher for detecting tuples t where []age attribute Member(source,target) + */ +private pattern mustInRelationage_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"age attribute Member"); + PartialRelationInterpretation.relationlinks(relationIterpretation,link); + BinaryElementRelationLink.param1(link,source); + BinaryElementRelationLink.param2(link,target); +} +/** + * Matcher for detecting tuples t where <>age attribute Member(source,target) + */ +private pattern mayInRelationage_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target:DefinedElement) +{ + find interpretation(problem,interpretation); + // The two endpoint of the link have to exist + find mayExist(problem, interpretation, source); + find mayExist(problem, interpretation, target); + // Type consistency + find mayInstanceOfMember_class(problem,interpretation,source); + IntegerElement(target); + // There are "numberOfExistingReferences" currently existing instances of the reference from the source, + // the upper bound of the multiplicity should be considered. + numberOfExistingReferences == count find mustInRelationage_attribute_Member(problem,interpretation,source,_); + check(numberOfExistingReferences < 1); +} or { + find mustInRelationage_attribute_Member(problem,interpretation,source,target); +} + +////////// +// 1.3 Relation Definition Indexers +////////// +// Must, May and Current queries for pattern queries memberIsItsOwnParent +private pattern mustInRelation_pattern_queries_memberIsItsOwnParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + var_m == var_p; + find mustInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_p); + find mustInRelationparents_reference_Member(problem,interpretation,var_p,var_p); +} +private pattern mayInRelation_pattern_queries_memberIsItsOwnParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + var_m == var_p; + find mayInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_p); + find mayInRelationparents_reference_Member(problem,interpretation,var_p,var_p); +} +private pattern currentInRelation_pattern_queries_memberIsItsOwnParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + var_m == var_p; + find mustInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_p); + find mustInRelationparents_reference_Member(problem,interpretation,var_p,var_p); +} +// Must, May and Current queries for pattern queries twoMembersHaveNoParent +private pattern mustInRelation_pattern_queries_twoMembersHaveNoParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m1, var_m2) +{ + find interpretation(problem,interpretation); + // var_m1 exported + // var_m2 exported + find mustInstanceOfMember_class(problem,interpretation,var_m1); + find mustInstanceOfMember_class(problem,interpretation,var_m2); + neg find mayInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m1); + neg find mayInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m2); + neg find mayEquivalent(problem, interpretation, var_m1, var_m2); +} +private pattern mayInRelation_pattern_queries_twoMembersHaveNoParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m1, var_m2) +{ + find interpretation(problem,interpretation); + // var_m1 exported + // var_m2 exported + find mayInstanceOfMember_class(problem,interpretation,var_m1); + find mayInstanceOfMember_class(problem,interpretation,var_m2); + neg find mustInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m1); + neg find mustInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m2); + neg find mustEquivalent(problem, interpretation, var_m1, var_m2); +} +private pattern currentInRelation_pattern_queries_twoMembersHaveNoParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m1, var_m2) +{ + find interpretation(problem,interpretation); + // var_m1 exported + // var_m2 exported + find mustInstanceOfMember_class(problem,interpretation,var_m1); + find mustInstanceOfMember_class(problem,interpretation,var_m2); + neg find currentInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m1); + neg find currentInRelation_pattern_queries_memberHasParent(problem,interpretation,var_m2); + neg find mustEquivalent(problem, interpretation, var_m1, var_m2); +} +// Must, May and Current queries for pattern queries memberHasParent +private pattern mustInRelation_pattern_queries_memberHasParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + // var_m exported + find mustInRelationparents_reference_Member(problem,interpretation,var_m,var__0); + find mustInstanceOfMember_class(problem,interpretation,var__0); +} +private pattern mayInRelation_pattern_queries_memberHasParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + // var_m exported + find mayInRelationparents_reference_Member(problem,interpretation,var_m,var__0); + find mayInstanceOfMember_class(problem,interpretation,var__0); +} +private pattern currentInRelation_pattern_queries_memberHasParent( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find interpretation(problem,interpretation); + // var_m exported + find mustInRelationparents_reference_Member(problem,interpretation,var_m,var__0); + find mustInstanceOfMember_class(problem,interpretation,var__0); +} +// Must, May and Current queries for pattern queries parentTooYoung +private pattern mustInRelation_pattern_queries_parentTooYoung( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m, var_p) +{ + find interpretation(problem,interpretation); + // var_m exported + // var_p exported + find mustInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_m); + find mustInRelationparents_reference_Member(problem,interpretation,var_m,var_p); + find mustInRelationage_attribute_Member(problem,interpretation,var_m,var_mAge); + find mustInRelationage_attribute_Member(problem,interpretation,var_p,var_pAge); + PrimitiveElement.valueSet(var_mAge,true); IntegerElement.value(var_mAge,value_var_mAge); + PrimitiveElement.valueSet(var_pAge,true); IntegerElement.value(var_pAge,value_var_pAge); + check((value_var_mAge<=(value_var_pAge+12))); +} +private pattern mayInRelation_pattern_queries_parentTooYoung( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m, var_p) +{ + find interpretation(problem,interpretation); + // var_m exported + // var_p exported + find mayInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_m); + find mayInRelationparents_reference_Member(problem,interpretation,var_m,var_p); + find mayInRelationage_attribute_Member(problem,interpretation,var_m,var_mAge); + find mayInRelationage_attribute_Member(problem,interpretation,var_p,var_pAge); + PrimitiveElement.valueSet(var_mAge,setted_var_mAge); IntegerElement.value(var_mAge,value_var_mAge); + PrimitiveElement.valueSet(var_pAge,setted_var_pAge); IntegerElement.value(var_pAge,value_var_pAge); + check( + !setted_var_mAge || !setted_var_pAge + || + ((value_var_mAge<=(value_var_pAge+12))) + ); +} +private pattern currentInRelation_pattern_queries_parentTooYoung( + problem:LogicProblem, interpretation:PartialInterpretation, + var_m, var_p) +{ + find interpretation(problem,interpretation); + // var_m exported + // var_p exported + find mustInRelationmembers_reference_FamilyTree(problem,interpretation,_var__0,var_m); + find mustInRelationparents_reference_Member(problem,interpretation,var_m,var_p); + find mustInRelationage_attribute_Member(problem,interpretation,var_m,var_mAge); + find mustInRelationage_attribute_Member(problem,interpretation,var_p,var_pAge); + PrimitiveElement.valueSet(var_mAge,true); IntegerElement.value(var_mAge,value_var_mAge); + PrimitiveElement.valueSet(var_pAge,true); IntegerElement.value(var_pAge,value_var_pAge); + check((value_var_mAge<=(value_var_pAge+12))); +} + +////////// +// 1.4 Containment Indexer +////////// +private pattern mustContains2(source: DefinedElement, target: DefinedElement) { + find mustContains4(_,_,source,target); +} + +private pattern mustContains4(problem:LogicProblem, interpretation:PartialInterpretation, + source: DefinedElement, target: DefinedElement) + { find mustInRelationmembers_reference_FamilyTree(problem,interpretation,source,target); } + +private pattern mustTransitiveContains(source,target) { + find mustContains2+(source,target); +} + +////////// +// 2. Invalidation Indexers +////////// +// 2.1 Invalidated by WF Queries +////////// +pattern invalidatedBy_pattern_queries_memberIsItsOwnParent(problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find mustInRelation_pattern_queries_memberIsItsOwnParent(problem,interpretation,var_m); +} +pattern invalidatedBy_pattern_queries_twoMembersHaveNoParent(problem:LogicProblem, interpretation:PartialInterpretation, + var_m1, var_m2) +{ + find mustInRelation_pattern_queries_twoMembersHaveNoParent(problem,interpretation,var_m1,var_m2); +} +pattern invalidatedBy_pattern_queries_parentTooYoung(problem:LogicProblem, interpretation:PartialInterpretation, + var_m, var_p) +{ + find mustInRelation_pattern_queries_parentTooYoung(problem,interpretation,var_m,var_p); +} + +////////// +// 3. Unfinishedness Indexers +////////// +// 3.1 Unfinishedness Measured by Multiplicity +////////// + +////////// +// 3.2 Unfinishedness Measured by WF Queries +////////// +pattern unfinishedBy_pattern_queries_memberIsItsOwnParent(problem:LogicProblem, interpretation:PartialInterpretation, + var_m) +{ + find currentInRelation_pattern_queries_memberIsItsOwnParent(problem,interpretation,var_m); +} +pattern unfinishedBy_pattern_queries_twoMembersHaveNoParent(problem:LogicProblem, interpretation:PartialInterpretation, + var_m1, var_m2) +{ + find currentInRelation_pattern_queries_twoMembersHaveNoParent(problem,interpretation,var_m1,var_m2); +} +pattern unfinishedBy_pattern_queries_parentTooYoung(problem:LogicProblem, interpretation:PartialInterpretation, + var_m, var_p) +{ + find currentInRelation_pattern_queries_parentTooYoung(problem,interpretation,var_m,var_p); +} + +////////// +// 4. Refinement Indexers +////////// +// 4.1 Object constructors +////////// +private pattern hasElementInContainment(problem:LogicProblem, interpretation:PartialInterpretation) +{ + find interpretation(problem,interpretation); + find mustInstanceOfFamilyTree_class(problem,interpretation,root); + find mustExist(problem, interpretation, root); +}or{ + find interpretation(problem,interpretation); + find mustInstanceOfMember_class(problem,interpretation,root); + find mustExist(problem, interpretation, root); +} +pattern createObject_Member_class_by_members_reference_FamilyTree( + problem:LogicProblem, interpretation:PartialInterpretation, + relationInterpretation:PartialRelationInterpretation, typeInterpretation:PartialComplexTypeInterpretation, + container:DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"Member class"); + PartialInterpretation.partialrelationinterpretation(interpretation,relationInterpretation); + PartialRelationInterpretation.interpretationOf.name(relationInterpretation,"members reference FamilyTree"); + find mustInstanceOfFamilyTree_class(problem,interpretation,container); + find mayInstanceOfMember_class(problem,interpretation,newObject); + find mayInRelationmembers_reference_FamilyTree(problem,interpretation,container,newObject); + find mustExist(problem, interpretation, container); + neg find mustExist(problem, interpretation, newObject); +} +pattern createObject_Member_class( + problem:LogicProblem, interpretation:PartialInterpretation, + typeInterpretation:PartialComplexTypeInterpretation) +{ + find interpretation(problem,interpretation); + neg find hasElementInContainment(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"Member class"); + find mayInstanceOfMember_class(problem,interpretation,newObject); + find mayExist(problem, interpretation, newObject); + neg find mustExist(problem, interpretation, newObject); +} +pattern createObject_FamilyTree_class( + problem:LogicProblem, interpretation:PartialInterpretation, + typeInterpretation:PartialComplexTypeInterpretation) +{ + find interpretation(problem,interpretation); + neg find hasElementInContainment(problem,interpretation); + PartialInterpretation.partialtypeinterpratation(interpretation,typeInterpretation); + PartialComplexTypeInterpretation.interpretationOf.name(typeInterpretation,"FamilyTree class"); + find mayInstanceOfFamilyTree_class(problem,interpretation,newObject); + find mayExist(problem, interpretation, newObject); + neg find mustExist(problem, interpretation, newObject); +} + +////////// +// 4.2 Type refinement +////////// +pattern refineTypeTo_Member_class(problem:LogicProblem, interpretation:PartialInterpretation, element: DefinedElement) { + find interpretation(problem,interpretation); + PartialInterpretation.newElements(interpretation,element); + find mayInstanceOfMember_class(problem,interpretation,element); + neg find mustInstanceOfMember_class(problem,interpretation,element); + neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); +} +pattern refineTypeTo_FamilyTree_class(problem:LogicProblem, interpretation:PartialInterpretation, element: DefinedElement) { + find interpretation(problem,interpretation); + PartialInterpretation.newElements(interpretation,element); + find mayInstanceOfFamilyTree_class(problem,interpretation,element); + neg find mustInstanceOfMember_class(problem,interpretation,element); + neg find mustInstanceOfFamilyTree_class(problem,interpretation,element); +} + +////////// +// 4.3 Relation refinement +////////// +pattern refineRelation_children_reference_Member_and_parents_reference_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation, oppositeInterpretation:PartialRelationInterpretation, + from: DefinedElement, to: DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"children reference Member"); + PartialInterpretation.partialrelationinterpretation(interpretation,oppositeInterpretation); + PartialRelationInterpretation.interpretationOf.name(oppositeInterpretation,"parents reference Member"); + find mustExist(problem, interpretation, from); + find mustExist(problem, interpretation, to); + find mustInstanceOfMember_class(problem,interpretation,from); + find mustInstanceOfMember_class(problem,interpretation,to); + find mayInRelationchildren_reference_Member(problem,interpretation,from,to); + neg find mustInRelationchildren_reference_Member(problem,interpretation,from,to); +} +pattern refineRelation_name_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation, + from: DefinedElement, to: DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"name attribute Member"); + find mustExist(problem, interpretation, from); + find mustExist(problem, interpretation, to); + find mustInstanceOfMember_class(problem,interpretation,from); + StringElement(to); + find mayInRelationname_attribute_Member(problem,interpretation,from,to); + neg find mustInRelationname_attribute_Member(problem,interpretation,from,to); +} +pattern refineRelation_age_attribute_Member( + problem:LogicProblem, interpretation:PartialInterpretation, + relationIterpretation:PartialRelationInterpretation, + from: DefinedElement, to: DefinedElement) +{ + find interpretation(problem,interpretation); + PartialInterpretation.partialrelationinterpretation(interpretation,relationIterpretation); + PartialRelationInterpretation.interpretationOf.name(relationIterpretation,"age attribute Member"); + find mustExist(problem, interpretation, from); + find mustExist(problem, interpretation, to); + find mustInstanceOfMember_class(problem,interpretation,from); + IntegerElement(to); + find mayInRelationage_attribute_Member(problem,interpretation,from,to); + neg find mustInRelationage_attribute_Member(problem,interpretation,from,to); +} + +////////// +// 5 Unit Propagations +////////// + +// Main propagations: + diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/log.txt b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/log.txt index 1d3c9f62..67589bd9 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/log.txt +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/log.txt @@ -1 +1 @@ -Model generation started +Model generation finished diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.gml b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.gml index 88392428..a187635b 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.gml +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.gml @@ -1,973 +1,916 @@ -graph -[ - node - [ - id 0 - graphics - [ - w 41.800000000000004 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "true" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 1 - graphics - [ - w 50.6 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "false" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 2 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "1" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 3 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "2" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 4 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "3" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 5 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "4" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 6 - graphics - [ - w 15.400000000000002 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "5" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 7 - graphics - [ - w 138.60000000000002 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - FamilyTree class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 8 - graphics - [ - w 107.80000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Member class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 9 - graphics - [ - w 107.80000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Member class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 10 - graphics - [ - w 107.80000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Member class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 11 - graphics - [ - w 107.80000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Member class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 12 - graphics - [ - w 107.80000000000001 - h 40 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "null" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - Member class - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 13 - graphics - [ - w 85.80000000000001 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "New Reals" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 14 - graphics - [ - w 103.4 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "New Strings" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - - node - [ - id 15 - graphics - [ - w 103.4 - h 26 - type "rectangle" - fill "#FFFFFF" - fill2 "#FFFFFF" - outline "#000000" - ] - LabelGraphics - [ - text "New Objects" - outline "#000000" - fill "#FFFFFF" - fontSize 16 - fontName "Monospace" - autoSizePolicy "node_width" - anchor "t" - borderDistance 0.0 - ] - LabelGraphics - [ - text " - " - fontSize 14 - fontName "Consolas" - alignment "left" - anchor "tl" - borderDistance 6 - ] - ] - edge - [ - source 7 - target 8 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "members reference FamilyTree" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 9 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "members reference FamilyTree" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 10 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "members reference FamilyTree" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 11 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "members reference FamilyTree" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 7 - target 12 - graphics - [ - fill "#000000" - width 3 - targetArrow "standard" - ] - LabelGraphics - [ - text "members reference FamilyTree" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 8 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 8 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 8 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 10 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 11 - target 10 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "children reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 8 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 8 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 10 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 8 - target 10 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 9 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 11 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "parents reference Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 9 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "age attribute Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 8 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "age attribute Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 10 - target 5 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "age attribute Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] - edge - [ - source 11 - target 6 - graphics - [ - fill "#000000" - targetArrow "standard" - ] - LabelGraphics - [ - text "age attribute Member" - fontSize 14 - fontName "Consolas" - configuration "AutoFlippingLabel" - model "six_pos" - position "thead" - ] - ] -] - +graph +[ + node + [ + id 0 + graphics + [ + w 41.800000000000004 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "true" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 1 + graphics + [ + w 50.6 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "false" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 2 + graphics + [ + w 15.400000000000002 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "1" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 3 + graphics + [ + w 15.400000000000002 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "2" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 4 + graphics + [ + w 15.400000000000002 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "3" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 5 + graphics + [ + w 15.400000000000002 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "4" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 6 + graphics + [ + w 15.400000000000002 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "5" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 7 + graphics + [ + w 138.60000000000002 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + FamilyTree class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 8 + graphics + [ + w 107.80000000000001 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + Member class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 9 + graphics + [ + w 107.80000000000001 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + Member class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 10 + graphics + [ + w 107.80000000000001 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + Member class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 11 + graphics + [ + w 107.80000000000001 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + Member class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 12 + graphics + [ + w 107.80000000000001 + h 40 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "null" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + Member class + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 13 + graphics + [ + w 85.80000000000001 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "New Reals" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 14 + graphics + [ + w 103.4 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "New Strings" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + + node + [ + id 15 + graphics + [ + w 103.4 + h 26 + type "rectangle" + fill "#FFFFFF" + fill2 "#FFFFFF" + outline "#000000" + ] + LabelGraphics + [ + text "New Objects" + outline "#000000" + fill "#FFFFFF" + fontSize 16 + fontName "Monospace" + autoSizePolicy "node_width" + anchor "t" + borderDistance 0.0 + ] + LabelGraphics + [ + text " + " + fontSize 14 + fontName "Consolas" + alignment "left" + anchor "tl" + borderDistance 6 + ] + ] + edge + [ + source 7 + target 8 + graphics + [ + fill "#000000" + width 3 + targetArrow "standard" + ] + LabelGraphics + [ + text "members reference FamilyTree" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 7 + target 9 + graphics + [ + fill "#000000" + width 3 + targetArrow "standard" + ] + LabelGraphics + [ + text "members reference FamilyTree" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 7 + target 10 + graphics + [ + fill "#000000" + width 3 + targetArrow "standard" + ] + LabelGraphics + [ + text "members reference FamilyTree" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 7 + target 11 + graphics + [ + fill "#000000" + width 3 + targetArrow "standard" + ] + LabelGraphics + [ + text "members reference FamilyTree" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 7 + target 12 + graphics + [ + fill "#000000" + width 3 + targetArrow "standard" + ] + LabelGraphics + [ + text "members reference FamilyTree" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 9 + target 8 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "children reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 8 + target 9 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "children reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 9 + target 10 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "children reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 11 + target 9 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "children reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 9 + target 11 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "children reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 8 + target 9 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "parents reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 9 + target 8 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "parents reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 10 + target 9 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "parents reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 9 + target 11 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "parents reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 11 + target 9 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "parents reference Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 8 + target 6 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "age attribute Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 10 + target 3 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "age attribute Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] + edge + [ + source 11 + target 3 + graphics + [ + fill "#000000" + targetArrow "standard" + ] + LabelGraphics + [ + text "age attribute Member" + fontSize 14 + fontName "Consolas" + configuration "AutoFlippingLabel" + model "six_pos" + position "thead" + ] + ] +] + diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.png b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.png index 4c0da9fb..e99dc418 100644 Binary files a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.png and b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.png differ diff --git a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.xmi b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.xmi index 25c5bfed..c3ca6161 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.xmi +++ b/Tests/MODELS2020-CaseStudies/case.study.familyTree.run/outputs/models/1.xmi @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + -- cgit v1.2.3-54-g00ecf