diff options
Diffstat (limited to 'Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse')
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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | ||
4 | |||
5 | class 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 | |||
13 | enum VampireBackendSolver { | ||
14 | //add needed things | ||
15 | } | ||
16 | |||
17 | |||
18 | enum 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.VampireLanguageStandaloneSetup | ||
4 | import ca.mcgill.ecse.dslreasoner.VampireLanguageStandaloneSetupGenerated | ||
5 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Logic2VampireLanguageMapper | ||
6 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Vampire2LogicMapper | ||
7 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.VampireHandler | ||
8 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguagePackage | ||
9 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel | ||
10 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasonerException | ||
12 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | ||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | ||
14 | import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult | ||
15 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace | ||
16 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder.Logic2VampireLanguageMapper_TypeMapper | ||
17 | |||
18 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.And | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Assertion | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolLiteral | ||
7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.BoolTypeReference | ||
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
9 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration | ||
10 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
12 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Distinct | ||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Equals | ||
14 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Exists | ||
15 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Forall | ||
16 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration | ||
17 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDefinition | ||
18 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Iff | ||
19 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Impl | ||
20 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.InstanceOf | ||
21 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.IntLiteral | ||
22 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Not | ||
23 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Or | ||
24 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RealLiteral | ||
25 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation | ||
26 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition | ||
27 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.SymbolicValue | ||
28 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term | ||
29 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | ||
30 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | ||
31 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration | ||
32 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
33 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
34 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
35 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel | ||
36 | import java.util.Collections | ||
37 | import java.util.HashMap | ||
38 | import java.util.List | ||
39 | import java.util.Map | ||
40 | import org.eclipse.xtend.lib.annotations.Accessors | ||
41 | |||
42 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
43 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | ||
44 | |||
45 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
8 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel | ||
9 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration | ||
10 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
12 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | ||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition | ||
14 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
15 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | ||
16 | import java.util.HashMap | ||
17 | import java.util.List | ||
18 | import java.util.Map | ||
19 | |||
20 | interface Logic2VampireLanguageMapper_TypeMapperTrace {} | ||
21 | |||
22 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDefinition | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
6 | |||
7 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.ContainmentHierarchy | ||
7 | import java.util.List | ||
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
9 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
10 | |||
11 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
12 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | ||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeReference | ||
14 | |||
15 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | ||
7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
8 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
9 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
10 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFofFormula | ||
11 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
12 | import java.util.ArrayList | ||
13 | import java.util.HashMap | ||
14 | import java.util.List | ||
15 | import java.util.Map | ||
16 | |||
17 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
18 | |||
19 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | ||
7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
8 | import java.util.ArrayList | ||
9 | import java.util.Map | ||
10 | |||
11 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
12 | import java.util.HashMap | ||
13 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
14 | import java.util.List | ||
15 | |||
16 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSConstant | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunctionAsTerm | ||
6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSInequality | ||
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 hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.QuantifiedExpression | ||
12 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Term | ||
13 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
14 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Variable | ||
15 | import java.util.ArrayList | ||
16 | import java.util.HashMap | ||
17 | import java.util.List | ||
18 | import java.util.Map | ||
19 | import org.eclipse.emf.common.util.EList | ||
20 | |||
21 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
22 | |||
23 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSAnd | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | ||
7 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | ||
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
9 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
10 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition | ||
11 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage | ||
12 | import java.util.ArrayList | ||
13 | import java.util.Collection | ||
14 | import java.util.List | ||
15 | |||
16 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
17 | |||
18 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
7 | import java.util.HashMap | ||
8 | import java.util.Map | ||
9 | |||
10 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicresultFactory | ||
5 | |||
6 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireBackendSolver | ||
4 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration | ||
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireModel | ||
6 | import com.google.common.util.concurrent.SimpleTimeLimiter | ||
7 | import com.google.common.util.concurrent.UncheckedTimeoutException | ||
8 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | ||
9 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace | ||
10 | import java.util.ArrayList | ||
11 | import java.util.HashMap | ||
12 | import java.util.LinkedList | ||
13 | import java.util.List | ||
14 | import java.util.Map | ||
15 | import java.util.concurrent.Callable | ||
16 | import java.util.concurrent.TimeUnit | ||
17 | import org.eclipse.emf.common.command.Command | ||
18 | import org.eclipse.xtend.lib.annotations.Data | ||
19 | |||
20 | class 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 | |||
38 | class 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 | /* | ||
139 | class 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | interface 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 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | ||
2 | |||
3 | class VampireModelInterpretation_TypeInterpretation_FilteredTypes implements VampireModelInterpretation_TypeInterpretation { | ||
4 | //TODO | ||
5 | } \ No newline at end of file | ||