aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper_FilteredTypes.xtend
diff options
context:
space:
mode:
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.xtend158
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 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
6import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
7import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
8import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
9import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
10import java.util.ArrayList
11import java.util.Collection
12
13import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
14
15class 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}