diff options
author | ArenBabikian <aren.babikian@mail.mcgill.ca> | 2019-03-06 17:26:43 -0500 |
---|---|---|
committer | ArenBabikian <aren.babikian@mail.mcgill.ca> | 2020-06-07 19:22:45 -0400 |
commit | 6cac004e4935f4cdbfaf1004c74ba7604f990ddc (patch) | |
tree | 8dff613a63e8f3125365c49d01b551f0b088fa3d /Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire | |
parent | Restructure Vampire Reasoner project (diff) | |
download | VIATRA-Generator-6cac004e4935f4cdbfaf1004c74ba7604f990ddc.tar.gz VIATRA-Generator-6cac004e4935f4cdbfaf1004c74ba7604f990ddc.tar.zst VIATRA-Generator-6cac004e4935f4cdbfaf1004c74ba7604f990ddc.zip |
Implement Enum handling and study hierarchy handling
Diffstat (limited to 'Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire')
4 files changed, 79 insertions, 16 deletions
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend index 3c672f4b..22bd4ab5 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend | |||
@@ -1,5 +1,6 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | 1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant | ||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula | 4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula |
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | 5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction |
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | 6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm |
@@ -13,6 +14,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition | |||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | 14 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type |
14 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | 15 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable |
15 | import java.util.HashMap | 16 | import java.util.HashMap |
17 | import java.util.List | ||
16 | import java.util.Map | 18 | import java.util.Map |
17 | 19 | ||
18 | interface Logic2VampireLanguageMapper_TypeMapperTrace {} | 20 | interface Logic2VampireLanguageMapper_TypeMapperTrace {} |
@@ -32,6 +34,9 @@ class Logic2VampireLanguageMapperTrace { | |||
32 | public val Map<DefinedElement, VLSFunction> element2Predicate = new HashMap | 34 | public val Map<DefinedElement, VLSFunction> element2Predicate = new HashMap |
33 | public val Map<Type, VLSTerm> type2PossibleNot = new HashMap | 35 | public val Map<Type, VLSTerm> type2PossibleNot = new HashMap |
34 | public val Map<Type, VLSTerm> type2And = new HashMap | 36 | public val Map<Type, VLSTerm> type2And = new HashMap |
37 | //Uniqueness | ||
38 | public val List<VLSConstant> uniqueInstances = newArrayList | ||
39 | |||
35 | 40 | ||
36 | public var Map<ConstantDeclaration, ConstantDefinition> constantDefinitions | 41 | public var Map<ConstantDeclaration, ConstantDefinition> constantDefinitions |
37 | public var Map<RelationDeclaration, RelationDefinition> relationDefinitions | 42 | public var Map<RelationDeclaration, RelationDefinition> relationDefinitions |
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend index 4b7ea3d0..e5dfbf08 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend | |||
@@ -19,13 +19,14 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
19 | val VLSVariable variable = createVLSVariable => [it.name = "A"] | 19 | val VLSVariable variable = createVLSVariable => [it.name = "A"] |
20 | 20 | ||
21 | // 1. make a list of constants equaling the min number of specified objects | 21 | // 1. make a list of constants equaling the min number of specified objects |
22 | val List<VLSConstant> instances = newArrayList | 22 | val localInstances = newArrayList |
23 | for (var i = 0; i < config.typeScopes.minNewElements; i++) { | 23 | for (var i = 0; i < config.typeScopes.minNewElements; i++) { |
24 | val num = i + 1 | 24 | val num = i + 1 |
25 | val cst = createVLSConstant => [ | 25 | val cst = createVLSConstant => [ |
26 | it.name = "o" + num | 26 | it.name = "o" + num |
27 | ] | 27 | ] |
28 | instances.add(cst) | 28 | trace.uniqueInstances.add(cst) |
29 | localInstances.add(cst) | ||
29 | } | 30 | } |
30 | 31 | ||
31 | // TODO: specify for the max | 32 | // TODO: specify for the max |
@@ -37,14 +38,14 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
37 | it.fofFormula = createVLSUniversalQuantifier => [ | 38 | it.fofFormula = createVLSUniversalQuantifier => [ |
38 | it.variables += support.duplicate(variable) | 39 | it.variables += support.duplicate(variable) |
39 | // check below | 40 | // check below |
40 | it.operand = createVLSEquivalent => [ | 41 | it.operand = createVLSImplies => [ |
41 | it.left = support.topLevelTypeFunc | 42 | it.left = support.unfoldOr(localInstances.map [ i | |
42 | it.right = support.unfoldOr(instances.map [ i | | ||
43 | createVLSEquality => [ | 43 | createVLSEquality => [ |
44 | it.left = createVLSVariable => [it.name = variable.name] | 44 | it.left = createVLSVariable => [it.name = variable.name] |
45 | it.right = i | 45 | it.right = i |
46 | ] | 46 | ] |
47 | ]) | 47 | ]) |
48 | it.right = support.topLevelTypeFunc | ||
48 | ] | 49 | ] |
49 | ] | 50 | ] |
50 | ] | 51 | ] |
@@ -55,7 +56,7 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
55 | val uniqueness = createVLSFofFormula => [ | 56 | val uniqueness = createVLSFofFormula => [ |
56 | it.name = "typeUniqueness" | 57 | it.name = "typeUniqueness" |
57 | it.fofRole = "axiom" | 58 | it.fofRole = "axiom" |
58 | it.fofFormula = support.establishUniqueness(instances) | 59 | it.fofFormula = support.establishUniqueness(trace.uniqueInstances) |
59 | ] | 60 | ] |
60 | trace.specification.formulas += uniqueness | 61 | trace.specification.formulas += uniqueness |
61 | } | 62 | } |
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend index d3595a73..021cb0ea 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend | |||
@@ -2,6 +2,7 @@ package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | |||
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant | 3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant |
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | 4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction |
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunctionAsTerm | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSInequality | 6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSInequality |
6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | 7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm |
7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | 8 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable |
@@ -36,6 +37,14 @@ class Logic2VampireLanguageMapper_Support { | |||
36 | def protected VLSVariable duplicate(VLSVariable term) { | 37 | def protected VLSVariable duplicate(VLSVariable term) { |
37 | return createVLSVariable => [it.name = term.name] | 38 | return createVLSVariable => [it.name = term.name] |
38 | } | 39 | } |
40 | |||
41 | def protected VLSFunctionAsTerm duplicate(VLSFunctionAsTerm term) { | ||
42 | return createVLSFunctionAsTerm => [it.functor = term.functor] | ||
43 | } | ||
44 | |||
45 | def protected VLSConstant duplicate(VLSConstant term) { | ||
46 | return createVLSConstant => [it.name = term.name] | ||
47 | } | ||
39 | 48 | ||
40 | def protected VLSFunction duplicate(VLSFunction term) { | 49 | def protected VLSFunction duplicate(VLSFunction term) { |
41 | return createVLSFunction => [ | 50 | return createVLSFunction => [ |
@@ -52,6 +61,19 @@ class Logic2VampireLanguageMapper_Support { | |||
52 | it.terms += duplicate(v) | 61 | it.terms += duplicate(v) |
53 | ] | 62 | ] |
54 | } | 63 | } |
64 | |||
65 | def protected VLSFunction duplicate(VLSFunction term, VLSFunctionAsTerm v) { | ||
66 | return createVLSFunction => [ | ||
67 | it.constant = term.constant | ||
68 | it.terms += duplicate(v) | ||
69 | ] | ||
70 | } | ||
71 | |||
72 | def protected VLSConstant toConstant(VLSFunctionAsTerm term) { | ||
73 | return createVLSConstant => [ | ||
74 | it.name = term.functor | ||
75 | ] | ||
76 | } | ||
55 | 77 | ||
56 | def protected VLSFunction topLevelTypeFunc() { | 78 | def protected VLSFunction topLevelTypeFunc() { |
57 | return createVLSFunction => [ | 79 | return createVLSFunction => [ |
@@ -61,6 +83,13 @@ class Logic2VampireLanguageMapper_Support { | |||
61 | ] | 83 | ] |
62 | ] | 84 | ] |
63 | } | 85 | } |
86 | |||
87 | def protected VLSFunction topLevelTypeFunc(VLSFunctionAsTerm v) { | ||
88 | return createVLSFunction => [ | ||
89 | it.constant = "object" | ||
90 | it.terms += duplicate(v) | ||
91 | ] | ||
92 | } | ||
64 | 93 | ||
65 | // TODO Make more general | 94 | // TODO Make more general |
66 | def establishUniqueness(List<VLSConstant> terms) { | 95 | def establishUniqueness(List<VLSConstant> terms) { |
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend index bc0b3e23..f2a7b3f2 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend | |||
@@ -14,8 +14,9 @@ import java.util.Collection | |||
14 | import java.util.List | 14 | import java.util.List |
15 | 15 | ||
16 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 16 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* |
17 | import java.util.Collections | ||
17 | 18 | ||
18 | class Logic2VampireLanguageMapper_TypeMapper { | 19 | class Logic2VampireLanguageMapper_TypeMapper { |
19 | private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE | 20 | private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE |
20 | private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support | 21 | private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support |
21 | val Logic2VampireLanguageMapper base | 22 | val Logic2VampireLanguageMapper base |
@@ -25,8 +26,9 @@ class Logic2VampireLanguageMapper_TypeMapper { | |||
25 | this.base = base | 26 | this.base = base |
26 | } | 27 | } |
27 | 28 | ||
28 | def protected transformTypes(Collection<Type> types, Collection<DefinedElement> elements, Logic2VampireLanguageMapper mapper, Logic2VampireLanguageMapperTrace trace) { | 29 | def protected transformTypes(Collection<Type> types, Collection<DefinedElement> elements, |
29 | 30 | Logic2VampireLanguageMapper mapper, Logic2VampireLanguageMapperTrace trace) { | |
31 | |||
30 | // val typeTrace = new Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes | 32 | // val typeTrace = new Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes |
31 | // trace.typeMapperTrace = typeTrace | 33 | // trace.typeMapperTrace = typeTrace |
32 | val VLSVariable variable = createVLSVariable => [it.name = "A"] | 34 | val VLSVariable variable = createVLSVariable => [it.name = "A"] |
@@ -86,14 +88,38 @@ class Logic2VampireLanguageMapper_TypeMapper { | |||
86 | 88 | ||
87 | ] | 89 | ] |
88 | trace.specification.formulas += res | 90 | trace.specification.formulas += res |
91 | |||
92 | // Create objects for the enum elements | ||
93 | val List<VLSFunction> enumScopeElems = newArrayList | ||
94 | for (var i = 0; i < type.elements.length; i++) { | ||
95 | val num = i + 1 | ||
96 | val cstTerm = createVLSFunctionAsTerm => [ | ||
97 | it.functor = "eo" + num | ||
98 | ] | ||
99 | val cst = support.toConstant(cstTerm) | ||
100 | trace.uniqueInstances.add(cst) | ||
101 | val fct = support.duplicate(type.elements.get(i).lookup(trace.element2Predicate), cstTerm) | ||
102 | enumScopeElems.add(fct) | ||
103 | // enumScopeElems.add(support.topLevelTypeFunc(cstTerm)) | ||
104 | } | ||
105 | |||
106 | |||
107 | |||
108 | val enumScope = createVLSFofFormula => [ | ||
109 | it.name = support.toIDMultiple("enumScope", type.name.split(" ").get(0)) | ||
110 | // below is temporary solution | ||
111 | it.fofRole = "axiom" | ||
112 | it.fofFormula = support.unfoldAnd(enumScopeElems) | ||
113 | ] | ||
114 | |||
115 | trace.specification.formulas += enumScope | ||
89 | } | 116 | } |
90 | 117 | ||
91 | //HIERARCHY HANDLER | 118 | // HIERARCHY HANDLER |
92 | |||
93 | |||
94 | // 3. For each non-abstract type, create an and sequence containing all typedeclaration predicates | 119 | // 3. For each non-abstract type, create an and sequence containing all typedeclaration predicates |
95 | // and store in a map | 120 | // and store in a map |
96 | for (t1 : types.filter[!isIsAbstract]) { | 121 | // println(types.filter[!isIsAbstract]) |
122 | for (t1 : types.filter[!isIsAbstract].filter(TypeDeclaration)) { | ||
97 | for (t2 : types) { | 123 | for (t2 : types) { |
98 | // possible improvement: check all supertypes and decide if negated or not based on negations/not negations of supertypes | 124 | // possible improvement: check all supertypes and decide if negated or not based on negations/not negations of supertypes |
99 | if (t1 == t2 || support.dfsSupertypeCheck(t1, t2)) { | 125 | if (t1 == t2 || support.dfsSupertypeCheck(t1, t2)) { |
@@ -121,7 +147,9 @@ class Logic2VampireLanguageMapper_TypeMapper { | |||
121 | it.operand = createVLSEquivalent => [ | 147 | it.operand = createVLSEquivalent => [ |
122 | it.left = support.topLevelTypeFunc | 148 | it.left = support.topLevelTypeFunc |
123 | // it.right = support.unfoldOr(new ArrayList<VLSTerm>(typeTrace.type2And.values)) | 149 | // it.right = support.unfoldOr(new ArrayList<VLSTerm>(typeTrace.type2And.values)) |
124 | it.right = support.unfoldOr(new ArrayList<VLSTerm>(trace.type2And.values)) | 150 | val reversedList = new ArrayList<VLSTerm>(trace.type2And.values) |
151 | // Collections.reverse(reversedList) | ||
152 | it.right = support.unfoldOr(reversedList) | ||
125 | ] | 153 | ] |
126 | ] | 154 | ] |
127 | ] | 155 | ] |
@@ -130,7 +158,7 @@ class Logic2VampireLanguageMapper_TypeMapper { | |||
130 | 158 | ||
131 | } | 159 | } |
132 | 160 | ||
133 | //below are from previous interface | 161 | // below are from previous interface |
134 | def protected transformTypeReference(Type referred, Logic2VampireLanguageMapper mapper, | 162 | def protected transformTypeReference(Type referred, Logic2VampireLanguageMapper mapper, |
135 | Logic2VampireLanguageMapperTrace trace) { | 163 | Logic2VampireLanguageMapperTrace trace) { |
136 | throw new UnsupportedOperationException("TODO: auto-generated method stub") | 164 | throw new UnsupportedOperationException("TODO: auto-generated method stub") |