diff options
Diffstat (limited to 'Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend')
-rw-r--r-- | Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend new file mode 100644 index 00000000..7221f3ff --- /dev/null +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend | |||
@@ -0,0 +1,158 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage | ||
7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
8 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
9 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
10 | import java.util.ArrayList | ||
11 | import java.util.Collection | ||
12 | |||
13 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
14 | |||
15 | class Logic2VampireLanguageMapper_TypeMapper_FilteredTypes implements Logic2VampireLanguageMapper_TypeMapper { | ||
16 | private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support | ||
17 | private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE | ||
18 | |||
19 | new() { | ||
20 | LogicproblemPackage.eINSTANCE.class | ||
21 | } | ||
22 | |||
23 | override transformTypes(Collection<Type> types, Collection<DefinedElement> elements, | ||
24 | Logic2VampireLanguageMapper mapper, Logic2VampireLanguageMapperTrace trace) { | ||
25 | val typeTrace = new Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes | ||
26 | trace.typeMapperTrace = typeTrace | ||
27 | |||
28 | val VLSVariable variable = createVLSVariable => [it.name = "A"] // did not work | ||
29 | // 1. store predicates for declarations in trace | ||
30 | for (type : types) { | ||
31 | val typePred = createVLSFunction => [ | ||
32 | it.constant = support.toIDMultiple("type", type.name) | ||
33 | it.terms += createVLSVariable => [it.name = variable.name] | ||
34 | ] | ||
35 | typeTrace.type2Predicate.put(type, typePred) | ||
36 | } | ||
37 | |||
38 | // 2. Map each type definition to fof formula | ||
39 | for (type : types.filter(TypeDefinition)) { | ||
40 | |||
41 | val res = createVLSFofFormula => [ | ||
42 | it.name = support.toIDMultiple("typeDef", type.name) | ||
43 | // below is temporary solution | ||
44 | it.fofRole = "axiom" | ||
45 | it.fofFormula = createVLSUniversalQuantifier => [ | ||
46 | it.variables += createVLSVariable => [it.name = variable.name] | ||
47 | it.operand = createVLSEquivalent => [ | ||
48 | it.left = createVLSFunction => [ | ||
49 | it.constant = type.lookup(typeTrace.type2Predicate).constant | ||
50 | it.terms += createVLSVariable => [it.name = "A"] | ||
51 | ] | ||
52 | |||
53 | type.lookup(typeTrace.type2Predicate) | ||
54 | it.right = support.unfoldOr(type.elements.map [ e | | ||
55 | createVLSEquality => [ | ||
56 | it.left = createVLSVariable => [it.name = variable.name] | ||
57 | // it.right = createVLSDoubleQuote => [ | ||
58 | // it.value = "\"" + e.name + "\"" | ||
59 | // ] | ||
60 | it.right = createVLSDoubleQuote => [ | ||
61 | it.value = "\"a" + e.name + "\"" | ||
62 | ] | ||
63 | ] | ||
64 | ]) | ||
65 | ] | ||
66 | ] | ||
67 | |||
68 | ] | ||
69 | trace.specification.formulas += res | ||
70 | } | ||
71 | // 2.5. Currently allowing duplicate types. Not problematic cuz strings are by def unique | ||
72 | // 3. For each non-abstract type, create an and sequence containing all typedeclaration predicates | ||
73 | // and store in a map | ||
74 | // val List<VLSTerm> type2PossibleNot = new ArrayList | ||
75 | // val List<VLSTerm> type2And = new ArrayList | ||
76 | for (type : types.filter[!isIsAbstract]) { | ||
77 | for (type2 : types) { | ||
78 | // possible improvement: check all supertypes and decide if negated or not based on negations/not negations of supertypes | ||
79 | if (type == type2 || dfsSupertypeCheck(type, type2)) { | ||
80 | typeTrace.type2PossibleNot.put(type2, createVLSFunction => [ | ||
81 | it.constant = type2.lookup(typeTrace.type2Predicate).constant | ||
82 | it.terms += createVLSVariable => [it.name = "A"] | ||
83 | ]) | ||
84 | } else { | ||
85 | typeTrace.type2PossibleNot.put(type2, createVLSUnaryNegation => [ | ||
86 | it.operand = createVLSFunction => [ | ||
87 | it.constant = type2.lookup(typeTrace.type2Predicate).constant | ||
88 | it.terms += createVLSVariable => [it.name = "A"] | ||
89 | ] | ||
90 | ]) | ||
91 | } | ||
92 | // typeTrace.type2PossibleNot.put(type2, type2.lookup(typeTrace.type2Predicate)) | ||
93 | } | ||
94 | typeTrace.type2And.put(type, support.unfoldAnd(new ArrayList<VLSTerm>(typeTrace.type2PossibleNot.values))) | ||
95 | // typeTrace.type2And.put(type, type.lookup(typeTrace.type2Predicate) ) | ||
96 | typeTrace.type2PossibleNot.clear | ||
97 | } | ||
98 | |||
99 | // 5. create fof function that is an or with all the elements in map | ||
100 | val hierarch = createVLSFofFormula => [ | ||
101 | it.name = "hierarchyHandler" | ||
102 | it.fofRole = "axiom" | ||
103 | it.fofFormula = createVLSUniversalQuantifier => [ | ||
104 | it.variables += createVLSVariable => [it.name = "A"] | ||
105 | it.operand = createVLSEquivalent => [ | ||
106 | it.left = createVLSFunction => [ | ||
107 | it.constant = "Object" | ||
108 | it.terms += createVLSVariable => [ | ||
109 | it.name = "A" | ||
110 | ] | ||
111 | ] | ||
112 | it.right = support.unfoldOr(new ArrayList<VLSTerm>(typeTrace.type2And.values)) | ||
113 | ] | ||
114 | ] | ||
115 | ] | ||
116 | |||
117 | trace.specification.formulas += hierarch | ||
118 | } | ||
119 | |||
120 | def boolean dfsSupertypeCheck(Type type, Type type2) { | ||
121 | // There is surely a better way to do this | ||
122 | if (type.supertypes.isEmpty) | ||
123 | return false | ||
124 | else { | ||
125 | if (type.supertypes.contains(type2)) | ||
126 | return true | ||
127 | else { | ||
128 | for (supertype : type.supertypes) { | ||
129 | if(dfsSupertypeCheck(supertype, type2)) return true | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | } | ||
134 | |||
135 | override transformTypeReference(Type referred, Logic2VampireLanguageMapper mapper, | ||
136 | Logic2VampireLanguageMapperTrace trace) { | ||
137 | throw new UnsupportedOperationException("TODO: auto-generated method stub") | ||
138 | } | ||
139 | |||
140 | override getUndefinedSupertype(Logic2VampireLanguageMapperTrace trace) { | ||
141 | throw new UnsupportedOperationException("TODO: auto-generated method stub") | ||
142 | } | ||
143 | |||
144 | override getUndefinedSupertypeScope(int undefinedScope, Logic2VampireLanguageMapperTrace trace) { | ||
145 | throw new UnsupportedOperationException("TODO: auto-generated method stub") | ||
146 | } | ||
147 | |||
148 | override transformReference(DefinedElement referred, Logic2VampireLanguageMapperTrace trace) { | ||
149 | createVLSDoubleQuote => [ | ||
150 | it.value = "\"a" + referred.name + "\"" | ||
151 | ] | ||
152 | } | ||
153 | |||
154 | override getTypeInterpreter() { | ||
155 | throw new UnsupportedOperationException("TODO: auto-generated method stub") | ||
156 | } | ||
157 | |||
158 | } | ||