aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse')
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireAnalyzerConfiguration.xtend21
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireSolver.xtend104
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper.xtend387
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend58
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ConstantMapper.xtend42
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ContainmentMapper.xtend123
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_RelationMapper.xtend160
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend162
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend242
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend197
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes.xtend18
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Vampire2LogicMapper.xtend67
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireHandler.xtend214
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation.xtend5
-rw-r--r--Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation_FilteredTypes.xtend5
15 files changed, 1805 insertions, 0 deletions
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireAnalyzerConfiguration.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireAnalyzerConfiguration.xtend
new file mode 100644
index 00000000..618980a3
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireAnalyzerConfiguration.xtend
@@ -0,0 +1,21 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner
2
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
4
5class VampireSolverConfiguration extends LogicSolverConfiguration {
6
7 //public var int symmetry = 0 // by default
8 //choose needed backend solver
9// public var VampireBackendSolver solver = VampireBackendSolver.SAT4J
10}
11
12
13enum VampireBackendSolver {
14 //add needed things
15}
16
17
18enum TypeMappingTechnique {
19 //default
20 FilteredTypes
21} \ No newline at end of file
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireSolver.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireSolver.xtend
new file mode 100644
index 00000000..1d56892e
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/VampireSolver.xtend
@@ -0,0 +1,104 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner
2
3import ca.mcgill.ecse.dslreasoner.VampireLanguageStandaloneSetup
4import ca.mcgill.ecse.dslreasoner.VampireLanguageStandaloneSetupGenerated
5import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Logic2VampireLanguageMapper
6import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Vampire2LogicMapper
7import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.VampireHandler
8import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguagePackage
9import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
10import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner
11import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasonerException
12import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
13import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
14import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
15import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
16import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Logic2VampireLanguageMapper_TypeMapper
17
18class VampireSolver extends LogicReasoner {
19
20 new() {
21 VampireLanguagePackage.eINSTANCE.eClass
22 val x = new VampireLanguageStandaloneSetupGenerated
23 VampireLanguageStandaloneSetup::doSetup()
24 }
25
26 val Logic2VampireLanguageMapper forwardMapper = new Logic2VampireLanguageMapper
27 val Vampire2LogicMapper backwardMapper = new Vampire2LogicMapper
28 val VampireHandler handler = new VampireHandler
29
30 val fileName = "vampireProblem.tptp"
31
32 override solve(LogicProblem problem, LogicSolverConfiguration config,
33 ReasonerWorkspace workspace) throws LogicReasonerException {
34 val vampireConfig = config.asConfig
35
36 // Start: Logic -> Vampire mapping
37 val transformationStart = System.currentTimeMillis
38 // TODO
39 val result = forwardMapper.transformProblem(problem, vampireConfig)
40 val vampireProblem = result.output
41 val forwardTrace = result.trace
42
43 var String fileURI = null;
44 var String vampireCode = null;
45 vampireCode = workspace.writeModelToString(vampireProblem, fileName)
46
47 val writeFile = (
48 vampireConfig.documentationLevel === DocumentationLevel::NORMAL ||
49 vampireConfig.documentationLevel === DocumentationLevel::FULL)
50 if (writeFile) {
51 fileURI = workspace.writeModel(vampireProblem, fileName).toFileString
52 }
53
54 // Result as String
55 val transformationTime = System.currentTimeMillis - transformationStart
56 // Finish: Logic -> Vampire mapping
57 /*
58 * // Start: Solving Alloy problem
59 * val solverStart = System.currentTimeMillis
60 * //Calling Solver (Currently Manually)
61 * val result2 = handler.callSolver(vampireProblem,workspace,vampireConfig,vampireCode)
62 * // val result2 = null
63 * //TODO
64 * //Backwards Mapper
65 * val logicResult = backwardMapper.transformOutput(problem,config.solutionScope.numberOfRequiredSolution,result2,forwardTrace,transformationTime)
66 *
67 * val solverFinish = System.currentTimeMillis-solverStart
68 * // Finish: Solving Alloy problem
69 *
70 * if(vampireConfig.writeToFile) workspace.deactivateModel(fileName)
71 *
72 * return logicResult
73 *
74 /*/
75 return null // for now
76 // */
77 }
78
79 def asConfig(LogicSolverConfiguration configuration) {
80 if (configuration instanceof VampireSolverConfiguration) {
81 return configuration
82 } else {
83 throw new IllegalArgumentException('''The configuration have to be an «VampireSolverConfiguration.simpleName»!''')
84 }
85 }
86
87// /*
88// * not for now
89// *
90 override getInterpretations(ModelResult modelResult) {
91 // val answers = (modelResult.representation as MonitoredAlloySolution).aswers.map[key]
92// val sols = modelResult.representation// as List<A4Solution>
93// //val res = answers.map
94// sols.map[
95// new VampireModelInterpretation(
96// forwardMapper.typeMapper.typeInterpreter,
97// it as A4Solution,
98// forwardMapper,
99// modelResult.trace as Logic2AlloyLanguageMapperTrace
100// )
101// ]
102 }
103// */
104}
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper.xtend
new file mode 100644
index 00000000..b7ad8f3d
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper.xtend
@@ -0,0 +1,387 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Assertion
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolLiteral
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference
8import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration
10import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition
11import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
12import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Distinct
13import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Equals
14import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Exists
15import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Forall
16import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration
17import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDefinition
18import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Iff
19import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Impl
20import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.InstanceOf
21import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral
22import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Not
23import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Or
24import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral
25import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
26import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition
27import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.SymbolicValue
28import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term
29import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
30import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
31import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration
32import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
33import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
34import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
35import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel
36import java.util.Collections
37import java.util.HashMap
38import java.util.List
39import java.util.Map
40import org.eclipse.xtend.lib.annotations.Accessors
41
42import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
43import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
44
45class Logic2VampireLanguageMapper {
46 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
47 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support;
48 @Accessors(PUBLIC_GETTER) private val Logic2VampireLanguageMapper_ConstantMapper constantMapper = new Logic2VampireLanguageMapper_ConstantMapper(
49 this)
50 @Accessors(PUBLIC_GETTER) private val Logic2VampireLanguageMapper_ContainmentMapper containmentMapper = new Logic2VampireLanguageMapper_ContainmentMapper(
51 this)
52 @Accessors(PUBLIC_GETTER) private val Logic2VampireLanguageMapper_RelationMapper relationMapper = new Logic2VampireLanguageMapper_RelationMapper(
53 this)
54 @Accessors(PUBLIC_GETTER) private val Logic2VampireLanguageMapper_ScopeMapper scopeMapper = new Logic2VampireLanguageMapper_ScopeMapper(
55 this)
56 @Accessors(PUBLIC_GETTER) private val Logic2VampireLanguageMapper_TypeMapper typeMapper = new Logic2VampireLanguageMapper_TypeMapper(
57 this)
58
59 public def TracedOutput<VampireModel, Logic2VampireLanguageMapperTrace> transformProblem(LogicProblem problem,
60 VampireSolverConfiguration config) {
61 // create model bases
62 // TODO
63 val initialComment = createVLSComment => [
64 it.comment = "This is an initial Test Comment"
65 ]
66
67 val specification = createVampireModel => [
68 it.comments += initialComment
69 ]
70
71 val trace = new Logic2VampireLanguageMapperTrace => [
72 it.specification = specification
73
74// it.incQueryEngine = viatraQueryEngine.on(new EMFScope(problem))
75 ]
76
77 // TYPE MAPPER
78 if (!problem.types.isEmpty) {
79 typeMapper.transformTypes(problem.types, problem.elements, this, trace)
80 }
81
82 // SCOPE MAPPER
83 scopeMapper.transformScope(config, trace)
84
85 // RELATION MAPPER
86 trace.relationDefinitions = problem.collectRelationDefinitions
87 problem.relations.forEach[this.relationMapper.transformRelation(it, trace)]
88
89 // CONTAINMENT MAPPER
90 containmentMapper.transformContainment(problem.containmentHierarchies, trace)
91
92 // CONSTANT MAPPER
93 // only transforms definitions
94 trace.constantDefinitions = problem.collectConstantDefinitions
95 // problem.constants.filter(ConstantDefinition).forEach[this.constantMapper.transformConstant(it, trace)]
96 problem.constants.filter(ConstantDefinition).forEach [
97 this.constantMapper.transformConstantDefinitionSpecification(it, trace)
98 ]
99
100 // ASSERTION MAPPER
101 for (assertion : problem.assertions) {
102 transformAssertion(assertion, trace)
103 }
104 // OUTPUT
105 return new TracedOutput(specification, trace)
106 }
107
108 // End of transformProblem
109 // ////////////
110 // Type References
111 // ////////////
112 def dispatch protected VLSTerm transformTypeReference(BoolTypeReference boolTypeReference,
113 Logic2VampireLanguageMapperTrace trace) {
114 // TODO, Not Now
115 // return createALSReference => [ it.referred = support.getBooleanType(trace) ]
116 }
117
118 // ////////////
119 // Collectors
120 // ////////////
121 // exact Same as for Alloy
122 private def collectConstantDefinitions(LogicProblem problem) {
123 val res = new HashMap
124 problem.constants.filter(ConstantDefinition).filter[it.defines !== null].forEach [
125 res.put(it.defines, it)
126 ]
127 return res
128 }
129
130 private def collectRelationDefinitions(LogicProblem problem) {
131 val res = new HashMap
132 problem.relations.filter(RelationDefinition).filter[it.defines !== null].forEach [
133 res.put(it.defines, it)
134 ]
135 return res
136 }
137
138 // ////////////
139 // Assertions + Terms
140 // ////////////
141 def protected transformAssertion(Assertion assertion, Logic2VampireLanguageMapperTrace trace) {
142 val res = createVLSFofFormula => [
143 it.name = support.toID(assertion.name)
144 // below is temporary solution
145 it.fofRole = "axiom"
146 it.fofFormula = assertion.value.transformTerm(trace, Collections.EMPTY_MAP)
147 // it.annotation = nothing
148 ]
149 trace.specification.formulas += res
150 }
151
152 def dispatch protected VLSTerm transformTerm(BoolLiteral literal, Logic2VampireLanguageMapperTrace trace,
153 Map<Variable, VLSVariable> variables) {
154 if (literal.value == true) {
155 createVLSTrue
156 } else {
157 createVLSFalse
158 }
159 }
160
161 def dispatch protected VLSTerm transformTerm(IntLiteral literal, Logic2VampireLanguageMapperTrace trace,
162 Map<Variable, VLSVariable> variables) {
163 createVLSInt => [it.value = literal.value.toString()]
164 }
165
166 def dispatch protected VLSTerm transformTerm(RealLiteral literal, Logic2VampireLanguageMapperTrace trace,
167 Map<Variable, VLSVariable> variables) {
168 createVLSReal => [it.value = literal.value.toString()]
169 }
170
171 def dispatch protected VLSTerm transformTerm(Not not, Logic2VampireLanguageMapperTrace trace,
172 Map<Variable, VLSVariable> variables) {
173 createVLSUnaryNegation => [operand = not.operand.transformTerm(trace, variables)]
174 }
175
176 def dispatch protected VLSTerm transformTerm(And and, Logic2VampireLanguageMapperTrace trace,
177 Map<Variable, VLSVariable> variables) { support.unfoldAnd(and.operands.map[transformTerm(trace, variables)]) }
178
179 def dispatch protected VLSTerm transformTerm(Or or, Logic2VampireLanguageMapperTrace trace,
180 Map<Variable, VLSVariable> variables) { support.unfoldOr(or.operands.map[transformTerm(trace, variables)]) }
181
182 def dispatch protected VLSTerm transformTerm(Impl impl, Logic2VampireLanguageMapperTrace trace,
183 Map<Variable, VLSVariable> variables) {
184 createVLSImplies => [
185 left = impl.leftOperand.transformTerm(trace, variables)
186 right = impl.rightOperand.transformTerm(trace, variables)
187 ]
188 }
189
190 def dispatch protected VLSTerm transformTerm(Iff iff, Logic2VampireLanguageMapperTrace trace,
191 Map<Variable, VLSVariable> variables) {
192 createVLSEquivalent => [
193 left = iff.leftOperand.transformTerm(trace, variables)
194 right = iff.rightOperand.transformTerm(trace, variables)
195 ]
196 }
197
198// def dispatch protected VLSTerm transformTerm(MoreThan moreThan, Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
199// createALSMore => [leftOperand = moreThan.leftOperand.transformTerm(trace,variables) rightOperand = moreThan.rightOperand.transformTerm(trace,variables)] }
200// def dispatch protected VLSTerm transformTerm(LessThan lessThan, Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
201// createALSLess => [leftOperand = lessThan.leftOperand.transformTerm(trace,variables) rightOperand = lessThan.rightOperand.transformTerm(trace,variables)] }
202// def dispatch protected VLSTerm transformTerm(MoreOrEqualThan moreThan, Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
203// createALSMeq => [leftOperand = moreThan.leftOperand.transformTerm(trace,variables) rightOperand = moreThan.rightOperand.transformTerm(trace,variables)] }
204// def dispatch protected VLSTerm transformTerm(LessOrEqualThan lessThan, Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
205// createALSLeq => [leftOperand = lessThan.leftOperand.transformTerm(trace,variables) rightOperand = lessThan.rightOperand.transformTerm(trace,variables)] }
206 def dispatch protected VLSTerm transformTerm(Equals equals, Logic2VampireLanguageMapperTrace trace,
207 Map<Variable, VLSVariable> variables) {
208 createVLSEquality => [
209 left = equals.leftOperand.transformTerm(trace, variables)
210 right = equals.rightOperand.transformTerm(trace, variables)
211 ]
212 }
213
214 def dispatch protected VLSTerm transformTerm(Distinct distinct, Logic2VampireLanguageMapperTrace trace,
215 Map<Variable, VLSVariable> variables) { support.unfoldDistinctTerms(this, distinct.operands, trace, variables) }
216
217//
218// def dispatch protected ALSTerm transformTerm(Plus plus, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
219// createALSFunctionCall => [it.params += plus.leftOperand.transformTerm(trace,variables) it.params += plus.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.PLUS] }
220// def dispatch protected ALSTerm transformTerm(Minus minus, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
221// createALSFunctionCall => [it.params += minus.leftOperand.transformTerm(trace,variables) it.params += minus.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.SUB] }
222// def dispatch protected ALSTerm transformTerm(Multiply multiply, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
223// createALSFunctionCall => [it.params += multiply.leftOperand.transformTerm(trace,variables) it.params += multiply.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.MUL] }
224// def dispatch protected ALSTerm transformTerm(Divison div, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
225// createALSFunctionCall => [it.params += div.leftOperand.transformTerm(trace,variables) it.params += div.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.DIV] }
226// def dispatch protected ALSTerm transformTerm(Mod mod, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
227// createALSFunctionCall => [it.params += mod.leftOperand.transformTerm(trace,variables) it.params += mod.rightOperand.transformTerm(trace,variables) it.referredNumericOperator = ALSNumericOperator.REM] }
228//
229 def dispatch protected VLSTerm transformTerm(Forall forall, Logic2VampireLanguageMapperTrace trace,
230 Map<Variable, VLSVariable> variables) {
231 support.createQuantifiedExpression(this, forall, trace, variables, true)
232 }
233
234 def dispatch protected VLSTerm transformTerm(Exists exists, Logic2VampireLanguageMapperTrace trace,
235 Map<Variable, VLSVariable> variables) {
236 support.createQuantifiedExpression(this, exists, trace, variables, false)
237 }
238
239 def dispatch protected VLSTerm transformTerm(InstanceOf instanceOf, Logic2VampireLanguageMapperTrace trace,
240 Map<Variable, VLSVariable> variables) {
241 return createVLSFunction => [
242 it.constant = (instanceOf.range as ComplexTypeReference).referred.lookup(trace.type2Predicate).constant
243 it.terms += instanceOf.value.transformTerm(trace, variables)
244 ]
245 }
246
247//
248// def dispatch protected ALSTerm transformTerm(TransitiveClosure tc, Logic2AlloyLanguageMapperTrace trace, Map<Variable, ALSVariableDeclaration> variables) {
249// return this.relationMapper.transformTransitiveRelationReference(
250// tc.relation,
251// tc.leftOperand.transformTerm(trace,variables),
252// tc.rightOperand.transformTerm(trace,variables),
253// trace
254// )
255// }
256//
257 def dispatch protected VLSTerm transformTerm(SymbolicValue symbolicValue, Logic2VampireLanguageMapperTrace trace,
258 Map<Variable, VLSVariable> variables) {
259 symbolicValue.symbolicReference.transformSymbolicReference(symbolicValue.parameterSubstitutions, trace,
260 variables)
261 }
262
263 def dispatch protected VLSTerm transformSymbolicReference(DefinedElement referred,
264 List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
265 Map<Variable, VLSVariable> variables) {
266 typeMapper.transformReference(referred, trace)
267 }
268
269 def dispatch protected VLSTerm transformSymbolicReference(ConstantDeclaration constant,
270 List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
271 Map<Variable, VLSVariable> variables) {
272 // might need to make sure that only declared csts get transformed. see for Alloy
273 val res = createVLSConstant => [
274 // ask if necessary VLSConstantDeclaration and not just directly strng
275 it.name = support.toID(constant.name)
276 ]
277 // no postprocessing cuz booleans are accepted
278 return res
279 }
280
281 // NOT NEEDED FOR NOW
282 // TODO
283 def dispatch protected VLSTerm transformSymbolicReference(ConstantDefinition constant,
284 List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
285 Map<Variable, VLSVariable> variables) {
286// val res = createVLSFunctionCall => [
287// it.referredDefinition = constant.lookup(trace.constantDefinition2Function)
288// ]
289// return support.postprocessResultOfSymbolicReference(constant.type,res,trace)
290 }
291
292 def dispatch protected VLSTerm transformSymbolicReference(Variable variable, List<Term> parameterSubstitutions,
293 Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
294
295 // cannot treat variable as function (constant) because of name ID not being the same
296 // no need for potprocessing cuz booleans are supported
297 return support.duplicate(variable.lookup(variables))
298 }
299
300 // TODO
301 def dispatch protected VLSTerm transformSymbolicReference(FunctionDeclaration function,
302 List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
303 Map<Variable, VLSVariable> variables) {
304// if(trace.functionDefinitions.containsKey(function)) {
305// return this.transformSymbolicReference(function.lookup(trace.functionDefinitions),parameterSubstitutions,trace,variables)
306// } else {
307// if(functionMapper.transformedToHostedField(function,trace)) {
308// val param = parameterSubstitutions.get(0).transformTerm(trace,variables)
309// val res = createVLSJoin => [
310// leftOperand = support.prepareParameterOfSymbolicReference(function.parameters.get(0),param,trace)
311// rightOperand = createVLSReference => [referred = function.lookup(trace.functionDeclaration2HostedField)]
312// ]
313// return support.postprocessResultOfSymbolicReference(function.range,res,trace)
314// } else {
315// val functionExpression = createVLSJoin=>[
316// leftOperand = createVLSReference => [referred = trace.logicLanguage]
317// rightOperand = createVLSReference => [referred = function.lookup(trace.functionDeclaration2LanguageField)]
318// ]
319// val res = support.unfoldDotJoin(this,parameterSubstitutions,functionExpression,trace,variables)
320// return support.postprocessResultOfSymbolicReference(function.range,res,trace)
321// }
322// }
323 }
324
325 // TODO
326 def dispatch protected VLSTerm transformSymbolicReference(FunctionDefinition function,
327 List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
328 Map<Variable, VLSVariable> variables) {
329// val result = createVLSFunctionCall => [
330// it.referredDefinition = function.lookup(trace.functionDefinition2Function)
331// it.params += parameterSubstitutions.map[it.transformTerm(trace,variables)]
332// ]
333// return support.postprocessResultOfSymbolicReference(function.range,result,trace)
334 }
335
336 // TODO
337 /*
338 * def dispatch protected VLSTerm transformSymbolicReference(Relation relation,
339 * List<Term> parameterSubstitutions, Logic2VampireLanguageMapperTrace trace,
340 * Map<Variable, VLSVariable> variables) {
341 * if (trace.relationDefinitions.containsKey(relation)) {
342 * this.transformSymbolicReference(relation.lookup(trace.relationDefinitions),
343 * parameterSubstitutions, trace, variables)
344 * }
345 * else {
346 * // if (relationMapper.transformToHostedField(relation, trace)) {
347 * // val VLSRelation = relation.lookup(trace.relationDeclaration2Field)
348 * // // R(a,b) =>
349 * // // b in a.R
350 * // return createVLSSubset => [
351 * // it.leftOperand = parameterSubstitutions.get(1).transformTerm(trace, variables)
352 * // it.rightOperand = createVLSJoin => [
353 * // it.leftOperand = parameterSubstitutions.get(0).transformTerm(trace, variables)
354 * // it.rightOperand = createVLSReference => [it.referred = VLSRelation]
355 * // ]
356 * // ]
357 * // } else {
358 * // val target = createVLSJoin => [
359 * // leftOperand = createVLSReference => [referred = trace.logicLanguage]
360 * // rightOperand = createVLSReference => [
361 * // referred = relation.lookup(trace.relationDeclaration2Global)
362 * // ]
363 * // ]
364 * // val source = support.unfoldTermDirectProduct(this, parameterSubstitutions, trace, variables)
365 * //
366 * // return createVLSSubset => [
367 * // leftOperand = source
368 * // rightOperand = target
369 * // ]
370 * // }
371 * }
372 * }
373 */
374 // TODO
375 def dispatch protected VLSTerm transformSymbolicReference(Relation relation, List<Term> parameterSubstitutions,
376 Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
377// createVLSFunction => [
378// it.referredDefinition = relation.lookup(trace.relationDefinition2Predicate)
379// it.params += parameterSubstitutions.map[p|p.transformTerm(trace, variables)]
380// ]
381 return createVLSFunction => [
382 it.constant = (relation as RelationDeclaration).lookup(trace.rel2Predicate).constant
383 it.terms += parameterSubstitutions.map[p|p.transformTerm(trace, variables)]
384 ]
385 }
386
387}
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
new file mode 100644
index 00000000..22bd4ab5
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapperTrace.xtend
@@ -0,0 +1,58 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
6import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
7import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
8import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration
10import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition
11import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
12import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
13import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition
14import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
15import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
16import java.util.HashMap
17import java.util.List
18import java.util.Map
19
20interface Logic2VampireLanguageMapper_TypeMapperTrace {}
21
22class Logic2VampireLanguageMapperTrace {
23// public var ViatraQueryEngine incQueryEngine;
24
25 //list of needed VLS components
26 public var VampireModel specification
27 public var VLSFofFormula logicLanguageBody
28 public var VLSTerm formula
29
30 //Necessary containers
31 public var Logic2VampireLanguageMapper_TypeMapperTrace typeMapperTrace
32
33 public val Map<Type, VLSFunction> type2Predicate = new HashMap;
34 public val Map<DefinedElement, VLSFunction> element2Predicate = new HashMap
35 public val Map<Type, VLSTerm> type2PossibleNot = new HashMap
36 public val Map<Type, VLSTerm> type2And = new HashMap
37 //Uniqueness
38 public val List<VLSConstant> uniqueInstances = newArrayList
39
40
41 public var Map<ConstantDeclaration, ConstantDefinition> constantDefinitions
42 public var Map<RelationDeclaration, RelationDefinition> relationDefinitions
43 public var Map<RelationDeclaration, VLSFunction> rel2Predicate = new HashMap
44
45
46//NOT NEEDED //public var VLSFunction constantDec
47
48
49
50
51//NOT NEEDED //public val Map<ConstantDeclaration, VLSFunctionDeclaration> constantDeclaration2LanguageField = new HashMap
52 //public val Map<ConstantDefinition, ALSFunctionDefinition> constantDefinition2Function = new HashMap
53
54
55 public val Map<Variable, VLSVariable> relationVar2VLS = new HashMap
56 public val Map<Variable, VLSFunction> relationVar2TypeDec = new HashMap
57
58} \ No newline at end of file
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ConstantMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ConstantMapper.xtend
new file mode 100644
index 00000000..2366ea15
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ConstantMapper.xtend
@@ -0,0 +1,42 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
6
7class Logic2VampireLanguageMapper_ConstantMapper {
8 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
9 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support
10 val Logic2VampireLanguageMapper base
11
12 public new(Logic2VampireLanguageMapper base) {
13 this.base = base
14 }
15
16//NOT NEEDED
17// def protected dispatch transformConstant(ConstantDeclaration constant, Logic2VampireLanguageMapperTrace trace) {
18// val c = createVLSFunctionDeclaration=> [
19// it.name = support.toID(constant.name)
20// ]
21// trace.constantDec.constant = c
22// trace.constantDeclaration2LanguageField.put(constant, c);
23//
24// }
25
26//NOT Used In Sample
27 def protected dispatch transformConstant(ConstantDefinition constant, Logic2VampireLanguageMapperTrace trace) {
28 //error
29 //TODO
30// val c = createVLSFofFormula=> [
31// name = support.toID(constant.name)
32// fofRole = "axiom"
33// fofFormula = base.transformTypeReference()
34// ]
35 }
36
37 def protected transformConstantDefinitionSpecification(ConstantDefinition constant, Logic2VampireLanguageMapperTrace trace) {
38 //TODO
39 }
40
41
42} \ No newline at end of file
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ContainmentMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ContainmentMapper.xtend
new file mode 100644
index 00000000..0820f47d
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ContainmentMapper.xtend
@@ -0,0 +1,123 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
6import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.ContainmentHierarchy
7import java.util.List
8import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
10
11import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
12import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
13import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference
14
15class Logic2VampireLanguageMapper_ContainmentMapper {
16 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
17 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support
18 val Logic2VampireLanguageMapper base
19 private val VLSVariable variable = createVLSVariable => [it.name = "A"]
20
21 public new(Logic2VampireLanguageMapper base) {
22 this.base = base
23 }
24
25 def public void transformContainment(List<ContainmentHierarchy> hierarchies,
26 Logic2VampireLanguageMapperTrace trace) {
27
28 // TODO CONSIDER CASE WHERE MULTIPLE CONTAINMMENT HIERARCHIES EXIST
29 // TEMP
30 val hierarchy = hierarchies.get(0)
31
32 val containmentListCopy = hierarchy.typesOrderedInHierarchy
33 val relationsList = hierarchy.containmentRelations
34 // STEP 1
35 // Find root element
36 for (l : relationsList) {
37 var pointingTo = (l.parameters.get(1) as ComplexTypeReference).referred as Type
38 containmentListCopy.remove(pointingTo)
39 for (c : pointingTo.subtypes) {
40 containmentListCopy.remove(c)
41 }
42 }
43
44 // State that there must exist 1 and only 1 root element
45 val topName = containmentListCopy.get(0).lookup(trace.type2Predicate).constant.toString
46 val topTerm = support.duplicate(containmentListCopy.get(0).lookup(trace.type2Predicate))
47
48 val contTop = createVLSFofFormula => [
49 it.name = support.toIDMultiple("containment_topLevel", topName)
50 it.fofRole = "axiom"
51
52 it.fofFormula = createVLSUniversalQuantifier => [
53 it.variables += support.duplicate(variable)
54 it.operand = createVLSEquivalent => [
55 it.left = topTerm
56 it.right = createVLSEquality => [
57 it.left = support.duplicate(variable)
58 it.right = createVLSConstant => [
59 it.name = "o1"
60 ]
61 ]
62 ]
63 ]
64// it.fofFormula = support.duplicate(
65// topTerm,
66// createVLSFunctionAsTerm => [
67// it.functor = "o1"
68// ]
69// )
70 ]
71 trace.specification.formulas += contTop
72
73 // STEP 2
74 // for each edge, if the pointedTo element exists,the edge must exist also
75 val varA = createVLSVariable => [it.name = "A"]
76 val varB = createVLSVariable => [it.name = "B"]
77 val varList = newArrayList(varB, varA)
78
79 for (l : relationsList) {
80 val relName = (l as RelationDeclaration).lookup(trace.rel2Predicate).constant.toString
81 val fromType = (l.parameters.get(0) as ComplexTypeReference).referred as Type
82 val toType = (l.parameters.get(1) as ComplexTypeReference).referred as Type
83
84 val relFormula = createVLSFofFormula => [
85 it.name = support.toIDMultiple("containment", relName)
86 it.fofRole = "axiom"
87
88 it.fofFormula = createVLSUniversalQuantifier => [
89 it.variables += support.duplicate(varA)
90 it.operand = createVLSImplies => [
91 it.left = support.duplicate(toType.lookup(trace.type2Predicate), varA)
92 it.right = createVLSExistentialQuantifier => [
93 it.variables += support.duplicate(varB)
94 it.operand = createVLSAnd => [
95 it.left = support.duplicate(fromType.lookup(trace.type2Predicate), varB)
96 it.right = support.duplicate((l as RelationDeclaration).lookup(trace.rel2Predicate),
97 varList)
98 ]
99 ]
100
101 createVLSEquality => [
102 it.left = support.duplicate(variable)
103 it.right = createVLSConstant => [
104 it.name = "o1"
105 ]
106 ]
107 ]
108 ]
109 ]
110 trace.specification.formulas += relFormula
111 var pointingTo = (l.parameters.get(1) as ComplexTypeReference).referred as Type
112 containmentListCopy.remove(pointingTo)
113 for (c : pointingTo.subtypes) {
114 containmentListCopy.remove(c)
115 }
116 }
117
118 // STEP 3
119 // Ensure that an objct only has 1 parent
120 // STEP 4
121 // Ensure that there are no cycles in the hierarchy (maybe same as for step3?)
122 }
123}
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_RelationMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_RelationMapper.xtend
new file mode 100644
index 00000000..0ae06bc3
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_RelationMapper.xtend
@@ -0,0 +1,160 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
7import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
8import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
9import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
10import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula
11import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
12import java.util.ArrayList
13import java.util.HashMap
14import java.util.List
15import java.util.Map
16
17import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
18
19class Logic2VampireLanguageMapper_RelationMapper {
20 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
21 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support
22 val Logic2VampireLanguageMapper base
23
24 public new(Logic2VampireLanguageMapper base) {
25 this.base = base
26 }
27
28 def dispatch public void transformRelation(RelationDeclaration r, Logic2VampireLanguageMapperTrace trace) {
29
30 // 1. store all variables in support wrt their name
31 // 1.1 if variable has type, creating list of type declarations
32 val List<VLSVariable> relVar2VLS = new ArrayList
33 val List<VLSFunction> relVar2TypeDecComply = new ArrayList
34 for (i : 0 ..< r.parameters.length) {
35
36 val v = createVLSVariable => [
37 it.name = support.toIDMultiple("V", i.toString)
38 ]
39 relVar2VLS.add(v)
40
41 val relType = (r.parameters.get(i) as ComplexTypeReference).referred
42 val varTypeComply = support.duplicate(relType.lookup(trace.type2Predicate), v)
43 relVar2TypeDecComply.add(varTypeComply)
44
45 }
46
47 val comply = createVLSFofFormula=> [
48 val nameArray = r.name.split(" ")
49 it.name = support.toIDMultiple("compliance", nameArray.get(0), nameArray.get(2))
50 it.fofRole = "axiom"
51 it.fofFormula = createVLSUniversalQuantifier => [
52 for (v : relVar2VLS) {
53 it.variables += support.duplicate(v)
54 }
55 it.operand = createVLSImplies => [
56 val rel = createVLSFunction => [
57 it.constant = support.toIDMultiple("r", nameArray.get(0), nameArray.get(2))
58 for (v : relVar2VLS) {
59 it.terms += support.duplicate(v)
60 }
61 ]
62 trace.rel2Predicate.put(r, rel)
63 it.left = support.duplicate(rel)
64 it.right = support.unfoldAnd(relVar2TypeDecComply)
65 ]
66 ]
67 ]
68
69 trace.specification.formulas += comply
70 }
71
72 def dispatch public void transformRelation(RelationDefinition reldef, Logic2VampireLanguageMapperTrace trace) {
73
74 // 1. store all variables in support wrt their name
75 // 1.1 if variable has type, creating list of type declarations
76// val VLSVariable variable = createVLSVariable => [it.name = "A"]
77 val Map<Variable, VLSVariable> relationVar2VLS = new HashMap
78 val Map<Variable, VLSFunction> relationVar2TypeDecComply = new HashMap
79 val Map<Variable, VLSFunction> relationVar2TypeDecRes = new HashMap
80 val typedefs = new ArrayList<VLSTerm>
81
82 for (variable : reldef.variables) {
83 val v = createVLSVariable => [
84 it.name = support.toIDMultiple("V", variable.name)
85 ]
86 relationVar2VLS.put(variable, v)
87
88 val varTypeComply = createVLSFunction => [
89 it.constant = support.toIDMultiple("t", (variable.range as ComplexTypeReference).referred.name)
90 it.terms += support.duplicate(v)
91 ]
92 relationVar2TypeDecComply.put(variable, varTypeComply)
93 relationVar2TypeDecRes.put(variable, support.duplicate(varTypeComply))
94 }
95 val nameArray = reldef.name.split(" ")
96 val comply = createVLSFofFormula => [
97 it.name = support.toIDMultiple("compliance", nameArray.get(nameArray.length - 2),
98 nameArray.get(nameArray.length - 1))
99 it.fofRole = "axiom"
100 it.fofFormula = createVLSUniversalQuantifier => [
101 for (variable : reldef.variables) {
102 it.variables += support.duplicate(variable.lookup(relationVar2VLS))
103
104 }
105 it.operand = createVLSImplies => [
106 it.left = createVLSFunction => [
107 it.constant = support.toIDMultiple("rel", reldef.name)
108 for (variable : reldef.variables) {
109 val v = createVLSVariable => [
110 it.name = variable.lookup(relationVar2VLS).name
111 ]
112 it.terms += v
113 }
114 ]
115 it.right = support.unfoldAnd(new ArrayList<VLSTerm>(relationVar2TypeDecComply.values))
116 ]
117 ]
118 ]
119
120 val res = createVLSFofFormula => [
121 it.name = support.toIDMultiple("relation", nameArray.get(nameArray.length - 2),
122 nameArray.get(nameArray.length - 1))
123 it.fofRole = "axiom"
124 it.fofFormula = createVLSUniversalQuantifier => [
125 for (variable : reldef.variables) {
126 val v = createVLSVariable => [
127 it.name = variable.lookup(relationVar2VLS).name
128 ]
129 it.variables += v
130
131 }
132 it.operand = createVLSImplies => [
133 it.left = support.unfoldAnd(new ArrayList<VLSTerm>(relationVar2TypeDecRes.values))
134 it.right = createVLSEquivalent => [
135 it.left = createVLSFunction => [
136 it.constant = support.toIDMultiple("rel", reldef.name)
137 for (variable : reldef.variables) {
138 val v = createVLSVariable => [
139 it.name = variable.lookup(relationVar2VLS).name
140 ]
141 it.terms += v
142
143 }
144 ]
145 it.right = base.transformTerm(reldef.value, trace, relationVar2VLS)
146 ]
147
148 ]
149
150 ]
151
152 ]
153
154 // trace.relationDefinition2Predicate.put(r,res)
155 trace.specification.formulas += comply;
156 trace.specification.formulas += res;
157
158 }
159
160}
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
new file mode 100644
index 00000000..548deda4
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend
@@ -0,0 +1,162 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
6import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
8import java.util.ArrayList
9import java.util.Map
10
11import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
12import java.util.HashMap
13import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
14import java.util.List
15
16class Logic2VampireLanguageMapper_ScopeMapper {
17 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
18 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support
19 val Logic2VampireLanguageMapper base
20 private val VLSVariable variable = createVLSVariable => [it.name = "A"]
21
22 public new(Logic2VampireLanguageMapper base) {
23 this.base = base
24 }
25
26 def dispatch public void transformScope(LogicSolverConfiguration config, Logic2VampireLanguageMapperTrace trace) {
27
28// TODO HANDLE ERRORS RELATED TO MAX > MIN
29// TODO HANDLE ERROR RELATED TO SUM(MIN TYPES)+1(for root) > MAX OBJECTS
30// TODO HANDLE
31// TODO NOT SPECIFIED MEANS =0 ?
32 // 1. make a list of constants equaling the min number of specified objects
33 val GLOBAL_MIN = config.typeScopes.minNewElements
34 val GLOBAL_MAX = config.typeScopes.maxNewElements
35
36 val localInstances = newArrayList
37
38 // Handling Minimum_General
39 if (GLOBAL_MIN != 0) {
40 getInstanceConstants(GLOBAL_MIN, 0, localInstances, trace, true, false)
41 for(i : trace.uniqueInstances){
42 localInstances.add(support.duplicate(i))
43 }
44
45 makeFofFormula(localInstances, trace, true, null)
46 }
47
48 // Handling Maximum_General
49 if (GLOBAL_MAX != 0) {
50 getInstanceConstants(GLOBAL_MAX, 0, localInstances, trace, true, true)
51 makeFofFormula(trace.uniqueInstances as ArrayList, trace, false, null)
52 }
53
54 // Handling Minimum_Specific
55 var i = 1
56 var minNum = -1
57 var Map<Type, Integer> startPoints = new HashMap
58 for (t : config.typeScopes.minNewElementsByType.keySet) {
59 minNum = t.lookup(config.typeScopes.minNewElementsByType)
60 if (minNum != 0) {
61 getInstanceConstants(i + minNum, i, localInstances, trace, true, false)
62 startPoints.put(t, i)
63 i += minNum
64 makeFofFormula(localInstances, trace, true, t)
65 }
66 }
67
68 // TODO: calc sum of mins, compare to current value of i
69 // Handling Maximum_Specific
70 for (t : config.typeScopes.maxNewElementsByType.keySet) {
71 var maxNum = t.lookup(config.typeScopes.maxNewElementsByType)
72 minNum = t.lookup(config.typeScopes.minNewElementsByType)
73 var startpoint = t.lookup(startPoints)
74 if (minNum != 0) {
75 getInstanceConstants(startpoint + minNum, startpoint, localInstances, trace, true, false)
76 }
77 if (maxNum != minNum) {
78 var instEndInd = Math.min(GLOBAL_MAX, i + maxNum - minNum)
79 getInstanceConstants(instEndInd, i, localInstances, trace, false, false)
80 makeFofFormula(localInstances, trace, false, t)
81 }
82 }
83
84// 3. Specify uniqueness of elements
85 if (trace.uniqueInstances.length != 0) {
86 val uniqueness = createVLSFofFormula => [
87 it.name = "typeUniqueness"
88 it.fofRole = "axiom"
89 it.fofFormula = support.establishUniqueness(trace.uniqueInstances)
90 ]
91 trace.specification.formulas += uniqueness
92 }
93
94 }
95
96 def protected void getInstanceConstants(int endInd, int startInd, ArrayList list,
97 Logic2VampireLanguageMapperTrace trace, boolean clear, boolean addToTrace) {
98 if (clear) {
99 list.clear
100 }
101 for (var i = startInd; i < endInd; i++) {
102 val num = i + 1
103 val cst = createVLSConstant => [
104 it.name = "o" + num
105 ]
106 if (addToTrace) {
107 trace.uniqueInstances.add(cst)
108 }
109 list.add(cst)
110 }
111 }
112
113 def protected void makeFofFormula(ArrayList list, Logic2VampireLanguageMapperTrace trace, boolean minimum,
114 Type type) {
115 var nm = ""
116 var VLSTerm tm = null
117 if (type === null) {
118 nm = "object"
119 tm = support.topLevelTypeFunc
120 } else {
121 nm = type.lookup(trace.type2Predicate).constant.toString
122 tm = createVLSAnd => [
123 it.left = support.duplicate(type.lookup(trace.type2Predicate))
124 it.right = support.topLevelTypeFunc
125 ]
126// tm = support.duplicate(type.lookup(trace.type2Predicate))
127 }
128 val name = nm
129 val term = tm
130
131 val cstDec = createVLSFofFormula => [
132 it.name = support.toIDMultiple("typeScope", if(minimum) "min" else "max", name)
133 it.fofRole = "axiom"
134 it.fofFormula = createVLSUniversalQuantifier => [
135 it.variables += support.duplicate(variable)
136 // check below
137 it.operand = createVLSImplies => [
138 if (minimum) {
139 it.left = support.unfoldOr(list.map [ i |
140 createVLSEquality => [
141 it.left = createVLSVariable => [it.name = variable.name]
142 it.right = i
143 ]
144 ])
145 it.right = term
146 } else {
147 it.left = term
148 it.right = support.unfoldOr(list.map [ i |
149 createVLSEquality => [
150 it.left = createVLSVariable => [it.name = variable.name]
151 it.right = i
152 ]
153 ])
154
155 }
156 ]
157 ]
158 ]
159 trace.specification.formulas += cstDec
160 }
161
162}
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
new file mode 100644
index 00000000..8d00d3e7
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend
@@ -0,0 +1,242 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunctionAsTerm
6import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSInequality
7import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
8import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
9import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
10import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
11import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.QuantifiedExpression
12import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term
13import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
14import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable
15import java.util.ArrayList
16import java.util.HashMap
17import java.util.List
18import java.util.Map
19import org.eclipse.emf.common.util.EList
20
21import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
22
23class Logic2VampireLanguageMapper_Support {
24 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
25
26 // ID Handler
27 def protected String toIDMultiple(String... ids) {
28 ids.map[it.split("\\s+").join("_")].join("_")
29 }
30
31 def protected String toID(String ids) {
32 ids.split("\\s+").join("_")
33 }
34
35 // Term Handling
36 // TODO Make more general
37 def protected VLSVariable duplicate(VLSVariable term) {
38 return createVLSVariable => [it.name = term.name]
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 }
48
49 def protected VLSFunction duplicate(VLSFunction term) {
50 return createVLSFunction => [
51 it.constant = term.constant
52 for (v : term.terms) {
53 it.terms += duplicate(v as VLSVariable)
54 }
55 ]
56 }
57
58 def protected VLSFunction duplicate(VLSFunction term, VLSVariable v) {
59 return createVLSFunction => [
60 it.constant = term.constant
61 it.terms += duplicate(v)
62 ]
63 }
64
65 def protected VLSFunction duplicate(VLSFunction term, List<VLSVariable> vars) {
66 return createVLSFunction => [
67 it.constant = term.constant
68 for (v : vars) {
69 it.terms += duplicate(v)
70 }
71 ]
72 }
73
74 def protected VLSFunction duplicate(VLSFunction term, VLSFunctionAsTerm v) {
75 return createVLSFunction => [
76 it.constant = term.constant
77 it.terms += duplicate(v)
78 ]
79 }
80
81 def protected VLSConstant toConstant(VLSFunctionAsTerm term) {
82 return createVLSConstant => [
83 it.name = term.functor
84 ]
85 }
86
87 def protected VLSFunction topLevelTypeFunc() {
88 return createVLSFunction => [
89 it.constant = "object"
90 it.terms += createVLSVariable => [
91 it.name = "A"
92 ]
93 ]
94 }
95
96 def protected VLSFunction topLevelTypeFunc(VLSVariable v) {
97 return createVLSFunction => [
98 it.constant = "object"
99 it.terms += duplicate(v)
100 ]
101 }
102
103 def protected VLSFunction topLevelTypeFunc(VLSFunctionAsTerm v) {
104 return createVLSFunction => [
105 it.constant = "object"
106 it.terms += duplicate(v)
107 ]
108 }
109
110 // TODO Make more general
111 def establishUniqueness(List<VLSConstant> terms) {
112 val List<VLSInequality> eqs = newArrayList
113 for (t1 : terms.subList(1, terms.length)) {
114 for (t2 : terms.subList(0, terms.indexOf(t1))) {
115 val eq = createVLSInequality => [
116 // TEMP
117 it.left = createVLSConstant => [it.name = t2.name]
118 it.right = createVLSConstant => [it.name = t1.name]
119 // TEMP
120 ]
121 eqs.add(eq)
122 }
123 }
124 return unfoldAnd(eqs)
125 }
126
127 // Support Functions
128 // booleans
129 // AND and OR
130 def protected VLSTerm unfoldAnd(List<? extends VLSTerm> operands) {
131 if (operands.size == 1) {
132 return operands.head
133 } else if (operands.size > 1) {
134 return createVLSAnd => [
135 left = operands.head
136 right = operands.subList(1, operands.size).unfoldAnd
137 ]
138 } else
139 throw new UnsupportedOperationException('''Logic operator with 0 operands!''')
140 }
141
142 def protected VLSTerm unfoldOr(List<? extends VLSTerm> operands) {
143// if(operands.size == 0) {basically return true}
144 /*else*/ if (operands.size == 1) {
145 return operands.head
146 } else if (operands.size > 1) {
147 return createVLSOr => [
148 left = operands.head
149 right = operands.subList(1, operands.size).unfoldOr
150 ]
151 } else
152 throw new UnsupportedOperationException('''Logic operator with 0 operands!''') // TEMP
153 }
154
155 // can delete below
156 def protected VLSTerm unfoldDistinctTerms(Logic2VampireLanguageMapper m, EList<Term> operands,
157 Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables) {
158 if (operands.size == 1) {
159 return m.transformTerm(operands.head, trace, variables)
160 } else if (operands.size > 1) {
161 val notEquals = new ArrayList<VLSTerm>(operands.size * operands.size / 2)
162 for (i : 0 ..< operands.size) {
163 for (j : i + 1 ..< operands.size) {
164 notEquals += createVLSInequality => [
165 it.left = m.transformTerm(operands.get(i), trace, variables)
166 it.right = m.transformTerm(operands.get(j), trace, variables)
167 ]
168 }
169 }
170 return notEquals.unfoldAnd
171 } else
172 throw new UnsupportedOperationException('''Logic operator with 0 operands!''')
173 }
174
175 // Symbolic
176 // def postprocessResultOfSymbolicReference(TypeReference type, VLSTerm term, Logic2VampireLanguageMapperTrace trace) {
177// if(type instanceof BoolTypeReference) {
178// return booleanToLogicValue(term ,trace)
179// }
180// else return term
181// }
182// def booleanToLogicValue(VLSTerm term, Logic2VampireLanguageMapperTrace trace) {
183// throw new UnsupportedOperationException("TODO: auto-generated method stub")
184// }
185 /*
186 * def protected String toID(List<String> ids) {
187 * ids.map[it.split("\\s+").join("'")].join("'")
188 * }
189 */
190 // QUANTIFIERS + VARIABLES
191 def protected VLSTerm createQuantifiedExpression(Logic2VampireLanguageMapper mapper,
192 QuantifiedExpression expression, Logic2VampireLanguageMapperTrace trace, Map<Variable, VLSVariable> variables,
193 boolean isUniversal) {
194 val variableMap = expression.quantifiedVariables.toInvertedMap [ v |
195 createVLSVariable => [it.name = toIDMultiple("V", v.name)]
196 ]
197
198 val typedefs = new ArrayList<VLSTerm>
199 for (variable : expression.quantifiedVariables) {
200 val eq = duplicate((variable.range as ComplexTypeReference).referred.lookup(trace.type2Predicate),
201 variable.lookup(variableMap))
202 typedefs.add(eq)
203 }
204 if (isUniversal) {
205 createVLSUniversalQuantifier => [
206 it.variables += variableMap.values
207 it.operand = createVLSImplies => [
208 it.left = unfoldAnd(typedefs)
209 it.right = mapper.transformTerm(expression.expression, trace, variables.withAddition(variableMap))
210 ]
211 ]
212 } else {
213 typedefs.add(mapper.transformTerm(expression.expression, trace, variables.withAddition(variableMap)))
214 createVLSExistentialQuantifier => [
215 it.variables += variableMap.values
216 it.operand = unfoldAnd(typedefs)
217
218 ]
219 }
220
221 }
222
223 def protected boolean dfsSupertypeCheck(Type type, Type type2) {
224 // There is surely a better way to do this
225 if (type.supertypes.isEmpty)
226 return false
227 else {
228 if (type.supertypes.contains(type2))
229 return true
230 else {
231 for (supertype : type.supertypes) {
232 if(dfsSupertypeCheck(supertype, type2)) return true
233 }
234 }
235 }
236 }
237
238 def protected withAddition(Map<Variable, VLSVariable> map1, Map<Variable, VLSVariable> map2) {
239 new HashMap(map1) => [putAll(map2)]
240 }
241
242}
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
new file mode 100644
index 00000000..4c4247ce
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapper.xtend
@@ -0,0 +1,197 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSAnd
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
6import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable
7import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory
8import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
10import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
11import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
12import java.util.ArrayList
13import java.util.Collection
14import java.util.List
15
16import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
17
18class Logic2VampireLanguageMapper_TypeMapper {
19 private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE
20 private val Logic2VampireLanguageMapper_Support support = new Logic2VampireLanguageMapper_Support
21 val Logic2VampireLanguageMapper base
22
23 new(Logic2VampireLanguageMapper base) {
24 LogicproblemPackage.eINSTANCE.class
25 this.base = base
26 }
27
28 def protected transformTypes(Collection<Type> types, Collection<DefinedElement> elements,
29 Logic2VampireLanguageMapper mapper, Logic2VampireLanguageMapperTrace trace) {
30 val VLSVariable variable = createVLSVariable => [it.name = "A"]
31 var globalCounter = 0
32
33 // 1. Each type (class) is a predicate with a single variable as input
34 for (type : types) {
35 val typePred = createVLSFunction => [
36 it.constant = support.toIDMultiple("t", type.name.split(" ").get(0))
37 it.terms += support.duplicate(variable)
38 ]
39 trace.type2Predicate.put(type, typePred)
40 }
41
42 // 2. Map each ENUM type definition to fof formula
43 for (type : types.filter(TypeDefinition)) {
44
45 // Create a VLSFunction for each Enum Element
46 val List<VLSFunction> orElems = newArrayList
47 for (e : type.elements) {
48 val enumElemPred = createVLSFunction => [
49 val splitName = e.name.split(" ")
50 if (splitName.length > 2) {
51 it.constant = support.toIDMultiple("e", splitName.get(0), splitName.get(2))
52 } else {
53 it.constant = support.toIDMultiple("e", splitName.get(0))
54 }
55 it.terms += support.duplicate(variable)
56 ]
57 trace.element2Predicate.put(e, enumElemPred)
58 }
59
60 // Similar to InheritanceHierarchy for the Enum
61 val List<VLSTerm> possibleNots = newArrayList
62 val List<VLSTerm> typeDefs = newArrayList
63
64 for (t1 : type.elements) {
65 for (t2 : type.elements) {
66 if (t1 == t2) {
67 val fct = support.duplicate(t2.lookup(trace.element2Predicate), variable)
68 possibleNots.add(fct)
69 } else {
70 val op = support.duplicate(t2.lookup(trace.element2Predicate), variable)
71 val negFct = createVLSUnaryNegation => [
72 it.operand = op
73 ]
74 possibleNots.add(negFct)
75 }
76 }
77 typeDefs.add(support.unfoldAnd(possibleNots))
78 possibleNots.clear
79 }
80
81 // Implement Enum Inheritence Hierarchy
82 val res = createVLSFofFormula => [
83 it.name = support.toIDMultiple("typeDef", type.name.split(" ").get(0))
84 it.fofRole = "axiom"
85 it.fofFormula = createVLSUniversalQuantifier => [
86 it.variables += support.duplicate(variable)
87 it.operand = createVLSEquivalent => [
88 it.left = type.lookup(trace.type2Predicate)
89 it.right = createVLSAnd => [
90 it.left = support.topLevelTypeFunc(variable)
91 it.right = support.unfoldOr(typeDefs)
92 ]
93// it.right = support.unfoldOr((typeDefs))
94
95 ]
96 ]
97 ]
98 trace.specification.formulas += res
99
100 for (var i = globalCounter; i < globalCounter+type.elements.length; i++) {
101 // Create objects for the enum elements
102 val num = i + 1
103 val cstTerm = createVLSFunctionAsTerm => [
104 it.functor = "eo" + num
105 ]
106 val cst = support.toConstant(cstTerm)
107 trace.uniqueInstances.add(cst)
108
109 val index = i
110 val enumScope = createVLSFofFormula => [
111 it.name = support.toIDMultiple("enumScope", type.name.split(" ").get(0),
112 type.elements.get(index).name.split(" ").get(0))
113 it.fofRole = "axiom"
114 it.fofFormula = createVLSUniversalQuantifier => [
115 it.variables += support.duplicate(variable)
116 it.operand = createVLSEquivalent => [
117 it.left = createVLSEquality => [
118 it.left = support.duplicate(variable)
119 it.right = support.duplicate(support.toConstant(cstTerm))
120 ]
121 it.right = support.duplicate(type.elements.get(index).lookup(trace.element2Predicate),
122 variable)
123 ]
124 ]
125 ]
126
127 trace.specification.formulas += enumScope
128
129 }
130 globalCounter+=type.elements.size
131 }
132
133 // HIERARCHY HANDLER
134 // 3. For each non-abstract type, create an and sequence containing all typedeclaration predicates
135 // and store in a map
136 for (t1 : types.filter[!isIsAbstract]) {
137 for (t2 : types) {
138 // possible improvement: check all supertypes and decide if negated or not based on negations/not negations of supertypes
139 if (t1 == t2 || support.dfsSupertypeCheck(t1, t2)) {
140 trace.type2PossibleNot.put(t2, support.duplicate(t2.lookup(trace.type2Predicate)))
141 } else {
142 trace.type2PossibleNot.put(t2, createVLSUnaryNegation => [
143 it.operand = support.duplicate(t2.lookup(trace.type2Predicate))
144 ])
145 }
146 }
147// typeTrace.type2And.put(t1, support.unfoldAnd(new ArrayList<VLSTerm>(typeTrace.type2PossibleNot.values)))
148// typeTrace.type2PossibleNot.clear
149 trace.type2And.put(t1, support.unfoldAnd(new ArrayList<VLSTerm>(trace.type2PossibleNot.values)))
150 trace.type2PossibleNot.clear
151 }
152
153 // 5. create fof function that is an or with all the elements in map
154 val hierarch = createVLSFofFormula => [
155 it.name = "inheritanceHierarchyHandler"
156 it.fofRole = "axiom"
157 it.fofFormula = createVLSUniversalQuantifier => [
158 it.variables += support.duplicate(variable)
159 it.operand = createVLSEquivalent => [
160 it.left = support.topLevelTypeFunc
161// it.right = support.unfoldOr(new ArrayList<VLSTerm>(typeTrace.type2And.values))
162 val reversedList = new ArrayList<VLSTerm>(trace.type2And.values)
163// Collections.reverse(reversedList)
164 it.right = support.unfoldOr(reversedList)
165 ]
166 ]
167 ]
168
169 trace.specification.formulas += hierarch
170
171 }
172
173 // below are from previous interface
174 def protected transformTypeReference(Type referred, Logic2VampireLanguageMapper mapper,
175 Logic2VampireLanguageMapperTrace trace) {
176 throw new UnsupportedOperationException("TODO: auto-generated method stub")
177 }
178
179 def protected getUndefinedSupertype(Logic2VampireLanguageMapperTrace trace) {
180 throw new UnsupportedOperationException("TODO: auto-generated method stub")
181 }
182
183 def protected getUndefinedSupertypeScope(int undefinedScope, Logic2VampireLanguageMapperTrace trace) {
184 throw new UnsupportedOperationException("TODO: auto-generated method stub")
185 }
186
187 def protected transformReference(DefinedElement referred, Logic2VampireLanguageMapperTrace trace) {
188 createVLSDoubleQuote => [
189 it.value = "\"a" + referred.name + "\""
190 ]
191 }
192
193 def protected getTypeInterpreter() {
194 throw new UnsupportedOperationException("TODO: auto-generated method stub")
195 }
196
197}
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes.xtend
new file mode 100644
index 00000000..aba47edb
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes.xtend
@@ -0,0 +1,18 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction
4import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
7import java.util.HashMap
8import java.util.Map
9
10class Logic2VampireLanguageMapper_TypeMapperTrace_FilteredTypes implements Logic2VampireLanguageMapper_TypeMapperTrace{
11
12// public var VLSFofFormula objectSuperClass
13 public val Map<Type, VLSFunction> type2Predicate = new HashMap;
14 public val Map<DefinedElement, VLSFunction> element2Predicate = new HashMap
15 public val Map<Type, VLSTerm> type2PossibleNot = new HashMap
16 public val Map<Type, VLSTerm> type2And = new HashMap
17
18} \ No newline at end of file
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Vampire2LogicMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Vampire2LogicMapper.xtend
new file mode 100644
index 00000000..9c9e65b4
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Vampire2LogicMapper.xtend
@@ -0,0 +1,67 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
4import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicresultFactory
5
6class Vampire2LogicMapper {
7}
8// val extension LogicresultFactory resultFactory = LogicresultFactory.eINSTANCE
9//
10// public def transformOutput(LogicProblem problem, int requiredNumberOfSolution, VampireSolutionModel vampireSolution, Logic2VampireLanguageMapperTrace trace, long transformationTime) {
11// val models = vampireSolution.aswers.map[it.key].toList
12//
13// if(!monitoredAlloySolution.finishedBeforeTimeout) {
14// return createInsuficientResourcesResult => [
15// it.problem = problem
16// it.representation += models
17// it.trace = trace
18// it.statistics = transformStatistics(monitoredAlloySolution,transformationTime)
19// ]
20// } else {
21// if(models.last.satisfiable || requiredNumberOfSolution == -1) {
22// return createModelResult => [
23// it.problem = problem
24// it.representation += models
25// it.trace = trace
26// it.statistics = transformStatistics(monitoredAlloySolution,transformationTime)
27// ]
28// } else {
29// return createInconsistencyResult => [
30// it.problem = problem
31// it.representation += models
32// it.trace = trace
33// it.statistics = transformStatistics(monitoredAlloySolution,transformationTime)
34// ]
35// }
36// }
37// }
38//
39// def transformStatistics(MonitoredAlloySolution solution, long transformationTime) {
40// createStatistics => [
41// it.transformationTime = transformationTime as int
42// for(solutionIndex : 0..<solution.aswers.size) {
43// val solutionTime = solution.aswers.get(solutionIndex).value
44// it.entries+= createIntStatisticEntry => [
45// it.name = '''Answer«solutionIndex»Time'''
46// it.value = solutionTime.intValue
47// ]
48// }
49// it.entries+= createIntStatisticEntry => [
50// it.name = "Alloy2KodKodTransformationTime"
51// it.value = solution.kodkodTime as int
52// ]
53// it.entries+= createIntStatisticEntry => [
54// it.name = "Alloy2KodKodTransformationTime"
55// it.value = solution.kodkodTime as int
56// ]
57// it.entries+= createStringStatisticEntry => [
58// it.name = "warnings"
59// it.value = '''[«FOR warning : solution.warnings SEPARATOR ","»«warning»«ENDFOR»]'''
60// ]
61// ]
62// }
63//
64// def sum(Iterable<Long> ints) {
65// ints.reduce[p1, p2|p1+p2]
66// }
67//}
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireHandler.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireHandler.xtend
new file mode 100644
index 00000000..aefa1a7e
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireHandler.xtend
@@ -0,0 +1,214 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireBackendSolver
4import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration
5import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel
6import com.google.common.util.concurrent.SimpleTimeLimiter
7import com.google.common.util.concurrent.UncheckedTimeoutException
8import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
9import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace
10import java.util.ArrayList
11import java.util.HashMap
12import java.util.LinkedList
13import java.util.List
14import java.util.Map
15import java.util.concurrent.Callable
16import java.util.concurrent.TimeUnit
17import org.eclipse.emf.common.command.Command
18import org.eclipse.xtend.lib.annotations.Data
19
20class VampireSolverException extends Exception{
21 new(String s) { super(s) }
22 new(String s, Exception e) { super(s,e) }
23 new(String s, List<String> errors, Exception e) {
24 super(s + '\n' + errors.join('\n'), e)
25 }
26}
27
28@Data class VampireSolutionModel{
29// List<String> warnings
30// List<String> debugs
31// long kodkodTime
32// val List<Pair<A4Solution, Long>> aswers
33// val boolean finishedBeforeTimeout
34
35
36}
37
38class VampireHandler {
39
40 //val fileName = "problem.als"
41
42 public def callSolver(VampireModel problem, ReasonerWorkspace workspace, VampireSolverConfiguration configuration,String vampireCode) {
43 /*
44 //Prepare
45 val warnings = new LinkedList<String>
46 val debugs = new LinkedList<String>
47 val runtime = new ArrayList<Long>
48 val reporter = new A4Reporter() {
49 override debug(String message) { debugs += message }
50 override resultSAT (Object command, long solvingTime, Object solution) { runtime += solvingTime }
51 override resultUNSAT (Object command, long solvingTime, Object solution) { runtime += solvingTime }
52 override warning(ErrorWarning msg) { warnings += msg.message }
53 }
54
55 val options = new A4Options() => [
56 it.symmetry = configuration.symmetry
57 it.noOverflow = true
58 it.solver = getSolver(configuration.getSolver, configuration)
59 if(configuration.getSolver.externalSolver) {
60 it.solverDirectory = configuration.solverPath
61 }
62 //it.inferPartialInstance
63 //it.tempDirectory = CommonPlugin.resolve(workspace.workspaceURI).toFileString
64 ]
65
66 // Transform
67 var Command command = null;
68 var CompModule compModule = null
69
70 // Start: Alloy -> Kodkod
71 val kodkodTransformStart = System.currentTimeMillis();
72 try {
73 compModule = CompUtil.parseEverything_fromString(reporter,alloyCode)
74 if(compModule.allCommands.size != 1)
75 throw new UnsupportedOperationException('''Alloy files with multiple commands are not supported!''')
76 command = compModule.allCommands.head
77 } catch (Err e){
78 throw new AlloySolverException(e.message,warnings,e)
79 }
80 val kodkodTransformFinish = System.currentTimeMillis - kodkodTransformStart
81 // Finish: Alloy -> Kodkod
82
83 val limiter = new SimpleTimeLimiter
84 val callable = new AlloyCallerWithTimeout(warnings,debugs,reporter,options,command,compModule,configuration)
85 var List<Pair<A4Solution, Long>> answers
86 var boolean finished
87 if(configuration.runtimeLimit == LogicSolverConfiguration::Unlimited) {
88 answers = callable.call
89 finished = true
90 } else {
91 try{
92 answers = limiter.callWithTimeout(callable,configuration.runtimeLimit,TimeUnit.SECONDS,true)
93 finished = true
94 } catch (UncheckedTimeoutException e) {
95 answers = callable.partialAnswers
96 finished = false
97 }
98 }
99
100 new MonitoredAlloySolution(warnings,debugs,kodkodTransformFinish,answers,finished)
101 */
102 }
103 /*
104 val static Map<SolverConfiguration, SatSolver> previousSolverConfigurations = new HashMap
105 def getSolverConfiguration(AlloyBackendSolver backedSolver, String path, String[] options) {
106 val config = new SolverConfiguration(backedSolver,path,options)
107 if(previousSolverConfigurations.containsKey(config)) {
108 return previousSolverConfigurations.get(config)
109 } else {
110 val id ='''DSLReasoner_Alloy_«previousSolverConfigurations.size»_«backedSolver»'''
111 val newSolver = A4Options.SatSolver.make(id,id,path,options)
112 previousSolverConfigurations.put(config,newSolver)
113 return newSolver
114 }
115 }
116
117 def getSolver(AlloyBackendSolver backedSolver, AlloySolverConfiguration configuration) {
118 switch(backedSolver){
119 case BerkMinPIPE: return A4Options.SatSolver.BerkMinPIPE
120 case SpearPIPE: return A4Options.SatSolver.SpearPIPE
121 case MiniSatJNI: return A4Options.SatSolver.MiniSatJNI
122 case MiniSatProverJNI: return A4Options.SatSolver.MiniSatProverJNI
123 case LingelingJNI: return A4Options.SatSolver.LingelingJNI
124 case PLingelingJNI: return getSolverConfiguration(backedSolver,configuration.solverPath,null)
125 case GlucoseJNI: return A4Options.SatSolver.GlucoseJNI
126 case CryptoMiniSatJNI: return A4Options.SatSolver.CryptoMiniSatJNI
127 case SAT4J: return A4Options.SatSolver.SAT4J
128 case CNF: return A4Options.SatSolver.CNF
129 case KodKod: return A4Options.SatSolver.KK
130 }
131 }
132
133 def isExternalSolver(AlloyBackendSolver backedSolver) {
134 return !(backedSolver == AlloyBackendSolver.SAT4J)
135 }
136*/
137}
138/*
139class VampireCallerWithTimeout implements Callable<List<Pair<A4Solution,Long>>>{
140
141 val List<String> warnings
142 val List<String> debugs
143 val A4Reporter reporter
144 val A4Options options
145
146 val Command command
147 val CompModule compModule
148 val AlloySolverConfiguration configuration
149
150 val List<Pair<A4Solution,Long>> answers = new LinkedList()
151
152 new(List<String> warnings,
153 List<String> debugs,
154 A4Reporter reporter,
155 A4Options options,
156 Command command,
157 CompModule compModule,
158 AlloySolverConfiguration configuration)
159 {
160 this.warnings = warnings
161 this.debugs = debugs
162 this.reporter = reporter
163 this.options = options
164 this.command = command
165 this.compModule = compModule
166 this.configuration = configuration
167 }
168
169 override call() throws Exception {
170 val startTime = System.currentTimeMillis
171
172 // Start: Execute
173 var A4Solution lastAnswer = null
174 try {
175 if(!configuration.progressMonitor.isCancelled) {
176 do{
177 if(lastAnswer == null) {
178 lastAnswer = TranslateAlloyToKodkod.execute_command(reporter,compModule.allSigs,command,options)
179 } else {
180 lastAnswer = lastAnswer.next
181 }
182 configuration.progressMonitor.workedBackwardTransformation(configuration.solutionScope.numberOfRequiredSolution)
183
184 val runtime = System.currentTimeMillis -startTime
185 synchronized(this) {
186 answers += (lastAnswer->runtime)
187 }
188 } while(lastAnswer.satisfiable != false && !hasEnoughSolution(answers) && !configuration.progressMonitor.isCancelled)
189
190 }
191 }catch(Exception e) {
192 warnings +=e.message
193 }
194 // Finish: execute
195 return answers
196 }
197
198 def hasEnoughSolution(List<?> answers) {
199 if(configuration.solutionScope.numberOfRequiredSolution < 0) return false
200 else return answers.size() == configuration.solutionScope.numberOfRequiredSolution
201 }
202
203 public def getPartialAnswers() {
204 return answers
205 }
206
207}
208/*
209@Data class SolverConfiguration {
210 VampireBackendSolver backendSolver
211 String path
212 String[] options
213}
214*/
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation.xtend
new file mode 100644
index 00000000..66f4fb06
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation.xtend
@@ -0,0 +1,5 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3interface VampireModelInterpretation_TypeInterpretation {
4
5} \ No newline at end of file
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation_FilteredTypes.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation_FilteredTypes.xtend
new file mode 100644
index 00000000..863ec783
--- /dev/null
+++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/VampireModelInterpretation_TypeInterpretation_FilteredTypes.xtend
@@ -0,0 +1,5 @@
1package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder
2
3class VampireModelInterpretation_TypeInterpretation_FilteredTypes implements VampireModelInterpretation_TypeInterpretation {
4 //TODO
5} \ No newline at end of file