diff options
author | ArenBabikian <aren.babikian@mail.mcgill.ca> | 2019-04-05 03:32:48 -0400 |
---|---|---|
committer | ArenBabikian <aren.babikian@mail.mcgill.ca> | 2020-06-07 19:36:25 -0400 |
commit | b1bbb821c0e5a3f721de211826dab19c7d9dca4f (patch) | |
tree | ac4a87adba243916973a96141354adbed6f72979 /Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire | |
parent | test push (diff) | |
download | VIATRA-Generator-b1bbb821c0e5a3f721de211826dab19c7d9dca4f.tar.gz VIATRA-Generator-b1bbb821c0e5a3f721de211826dab19c7d9dca4f.tar.zst VIATRA-Generator-b1bbb821c0e5a3f721de211826dab19c7d9dca4f.zip |
Implement containment circularity avoidance #20
Diffstat (limited to 'Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire')
5 files changed, 54 insertions, 18 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 index 618980a3..98967181 100644 --- 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 | |||
@@ -4,7 +4,8 @@ import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | |||
4 | 4 | ||
5 | class VampireSolverConfiguration extends LogicSolverConfiguration { | 5 | class VampireSolverConfiguration extends LogicSolverConfiguration { |
6 | 6 | ||
7 | //public var int symmetry = 0 // by default | 7 | public var int contCycleLevel = 0 |
8 | public var boolean uniquenessDuplicates = false | ||
8 | //choose needed backend solver | 9 | //choose needed backend solver |
9 | // public var VampireBackendSolver solver = VampireBackendSolver.SAT4J | 10 | // public var VampireBackendSolver solver = VampireBackendSolver.SAT4J |
10 | } | 11 | } |
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 index b7ad8f3d..2be6c093 100644 --- 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 | |||
@@ -87,7 +87,7 @@ class Logic2VampireLanguageMapper { | |||
87 | problem.relations.forEach[this.relationMapper.transformRelation(it, trace)] | 87 | problem.relations.forEach[this.relationMapper.transformRelation(it, trace)] |
88 | 88 | ||
89 | // CONTAINMENT MAPPER | 89 | // CONTAINMENT MAPPER |
90 | containmentMapper.transformContainment(problem.containmentHierarchies, trace) | 90 | containmentMapper.transformContainment(config,problem.containmentHierarchies, trace) |
91 | 91 | ||
92 | // CONSTANT MAPPER | 92 | // CONSTANT MAPPER |
93 | // only transforms definitions | 93 | // only transforms definitions |
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 index 48ee8789..395b4305 100644 --- 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 | |||
@@ -1,6 +1,6 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | 1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSAnd | 3 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration |
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | 4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction |
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | 5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm |
6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | 6 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable |
@@ -25,9 +25,9 @@ class Logic2VampireLanguageMapper_ContainmentMapper { | |||
25 | this.base = base | 25 | this.base = base |
26 | } | 26 | } |
27 | 27 | ||
28 | def public void transformContainment(List<ContainmentHierarchy> hierarchies, | 28 | def public void transformContainment(VampireSolverConfiguration config, List<ContainmentHierarchy> hierarchies, |
29 | Logic2VampireLanguageMapperTrace trace) { | 29 | Logic2VampireLanguageMapperTrace trace) { |
30 | //TODO throw error is there exists a circular containment that does not involve hierarchy | 30 | // TODO throw error is there exists a circular containment that does not involve hierarchy |
31 | // TODO CONSIDER CASE WHERE MULTIPLE CONTAINMMENT HIERARCHIES EXIST | 31 | // TODO CONSIDER CASE WHERE MULTIPLE CONTAINMMENT HIERARCHIES EXIST |
32 | // TEMP | 32 | // TEMP |
33 | val hierarchy = hierarchies.get(0) | 33 | val hierarchy = hierarchies.get(0) |
@@ -94,7 +94,6 @@ class Logic2VampireLanguageMapper_ContainmentMapper { | |||
94 | // for (c : support.listSubtypes(toType)) { | 94 | // for (c : support.listSubtypes(toType)) { |
95 | // addToMap(type2cont, toFunc, rel) | 95 | // addToMap(type2cont, toFunc, rel) |
96 | // } | 96 | // } |
97 | |||
98 | // val listForAnd = newArrayList | 97 | // val listForAnd = newArrayList |
99 | //// listForAnd.add(support.duplicate(fromType.lookup(trace.type2Predicate), varB)) | 98 | //// listForAnd.add(support.duplicate(fromType.lookup(trace.type2Predicate), varB)) |
100 | // listForAnd.add(support.duplicate((l as RelationDeclaration).lookup(trace.rel2Predicate), varList)) | 99 | // listForAnd.add(support.duplicate((l as RelationDeclaration).lookup(trace.rel2Predicate), varList)) |
@@ -111,7 +110,7 @@ class Logic2VampireLanguageMapper_ContainmentMapper { | |||
111 | // STEP 3 | 110 | // STEP 3 |
112 | // Ensure that an objct only has 1 parent | 111 | // Ensure that an objct only has 1 parent |
113 | val relFormula = createVLSFofFormula => [ | 112 | val relFormula = createVLSFofFormula => [ |
114 | it.name = support.toIDMultiple("noDupCont", rel.constant.toString) | 113 | it.name = support.toIDMultiple("containment_noDup", rel.constant.toString) |
115 | it.fofRole = "axiom" | 114 | it.fofRole = "axiom" |
116 | it.fofFormula = createVLSExistentialQuantifier => [ | 115 | it.fofFormula = createVLSExistentialQuantifier => [ |
117 | it.variables += support.duplicate(varA) | 116 | it.variables += support.duplicate(varA) |
@@ -133,7 +132,7 @@ class Logic2VampireLanguageMapper_ContainmentMapper { | |||
133 | 132 | ||
134 | } | 133 | } |
135 | 134 | ||
136 | // STEP CONT'D | 135 | // STEP 2 CONT'D |
137 | for (e : type2cont.entrySet) { | 136 | for (e : type2cont.entrySet) { |
138 | val relFormula = createVLSFofFormula => [ | 137 | val relFormula = createVLSFofFormula => [ |
139 | it.name = support.toIDMultiple("containment", e.key.constant.toString) | 138 | it.name = support.toIDMultiple("containment", e.key.constant.toString) |
@@ -159,8 +158,39 @@ class Logic2VampireLanguageMapper_ContainmentMapper { | |||
159 | 158 | ||
160 | } | 159 | } |
161 | 160 | ||
162 | // STEP 4 | 161 | // STEP 4 |
163 | // Ensure that there are no cycles in the hierarchy (maybe same as for step3?) | 162 | // Ensure that there are no cycles in the hierarchy (maybe same as for step3?) |
163 | // Attempt 1: all possibilities, even the impossible one, based on MM constraints, are listed | ||
164 | |||
165 | |||
166 | val variables = newArrayList | ||
167 | val disjunctionList = newArrayList | ||
168 | val conjunctionList = newArrayList | ||
169 | for (var i = 1; i <= config.contCycleLevel; i++) { | ||
170 | val ind = i | ||
171 | variables.add(createVLSVariable => [it.name = ("V"+Integer.toString(ind))]) | ||
172 | for ( var j = 0; j < i;j++){ | ||
173 | for (l : relationsList) { | ||
174 | val rel = support.duplicate((l as RelationDeclaration).lookup(trace.rel2Predicate), newArrayList(variables.get(j), variables.get((j+1)%i))) | ||
175 | disjunctionList.add(rel) | ||
176 | } | ||
177 | conjunctionList.add(support.unfoldOr(disjunctionList)) | ||
178 | disjunctionList.clear | ||
179 | } | ||
180 | |||
181 | val contCycleForm = createVLSFofFormula => [ | ||
182 | it.name = support.toIDMultiple("containment_noCycle", Integer.toString(ind)) | ||
183 | it.fofRole = "axiom" | ||
184 | it.fofFormula = createVLSUnaryNegation => [ | ||
185 | it.operand = createVLSExistentialQuantifier => [ | ||
186 | it.variables += support.duplicate(variables) | ||
187 | it.operand = support.unfoldAnd(conjunctionList) | ||
188 | ] | ||
189 | ] | ||
190 | ] | ||
191 | trace.specification.formulas += contCycleForm | ||
192 | conjunctionList.clear | ||
193 | } | ||
164 | } | 194 | } |
165 | 195 | ||
166 | protected def VLSTerm makeUnique(List<VLSFunction> list) { | 196 | protected def VLSTerm makeUnique(List<VLSFunction> list) { |
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend index 0d0be576..0a8812e4 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_ScopeMapper.xtend | |||
@@ -1,17 +1,15 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder | 1 | package ca.mcgill.ecse.dslreasoner.vampire.reasoner.builder |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSFunction | 3 | import ca.mcgill.ecse.dslreasoner.vampire.reasoner.VampireSolverConfiguration |
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSTerm | ||
4 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable | 5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VLSVariable |
5 | import ca.mcgill.ecse.dslreasoner.vampireLanguage.VampireLanguageFactory | 6 | 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 | 7 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type |
8 | import java.util.ArrayList | 8 | import java.util.ArrayList |
9 | import java.util.HashMap | ||
9 | import java.util.Map | 10 | import java.util.Map |
10 | 11 | ||
11 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | 12 | 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 | 13 | ||
16 | class Logic2VampireLanguageMapper_ScopeMapper { | 14 | class Logic2VampireLanguageMapper_ScopeMapper { |
17 | private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE | 15 | private val extension VampireLanguageFactory factory = VampireLanguageFactory.eINSTANCE |
@@ -23,7 +21,7 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
23 | this.base = base | 21 | this.base = base |
24 | } | 22 | } |
25 | 23 | ||
26 | def dispatch public void transformScope(LogicSolverConfiguration config, Logic2VampireLanguageMapperTrace trace) { | 24 | def dispatch public void transformScope(VampireSolverConfiguration config, Logic2VampireLanguageMapperTrace trace) { |
27 | val ABSOLUTE_MIN = 0 | 25 | val ABSOLUTE_MIN = 0 |
28 | val ABSOLUTE_MAX = Integer.MAX_VALUE | 26 | val ABSOLUTE_MAX = Integer.MAX_VALUE |
29 | 27 | ||
@@ -40,7 +38,6 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
40 | 38 | ||
41 | // Handling Minimum_General | 39 | // Handling Minimum_General |
42 | if (GLOBAL_MIN != ABSOLUTE_MIN) { | 40 | if (GLOBAL_MIN != ABSOLUTE_MIN) { |
43 | // * | ||
44 | getInstanceConstants(GLOBAL_MIN, 0, localInstances, trace, true, !consistant) | 41 | getInstanceConstants(GLOBAL_MIN, 0, localInstances, trace, true, !consistant) |
45 | if (consistant) { | 42 | if (consistant) { |
46 | for (i : trace.uniqueInstances) { | 43 | for (i : trace.uniqueInstances) { |
@@ -94,7 +91,7 @@ class Logic2VampireLanguageMapper_ScopeMapper { | |||
94 | 91 | ||
95 | // 3. Specify uniqueness of elements | 92 | // 3. Specify uniqueness of elements |
96 | // TEMP | 93 | // TEMP |
97 | val DUPLICATES = false | 94 | val DUPLICATES = config.uniquenessDuplicates |
98 | 95 | ||
99 | val numInst = trace.uniqueInstances.length | 96 | val numInst = trace.uniqueInstances.length |
100 | var ind = 1 | 97 | var ind = 1 |
diff --git a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend index dd88a53a..195b89bb 100644 --- a/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend +++ b/Solvers/Vampire-Solver/ca.mcgill.ecse.dslreasoner.vampire.reasoner/src/ca/mcgill/ecse/dslreasoner/vampire/reasoner/builder/Logic2VampireLanguageMapper_Support.xtend | |||
@@ -77,6 +77,14 @@ class Logic2VampireLanguageMapper_Support { | |||
77 | it.terms += duplicate(v) | 77 | it.terms += duplicate(v) |
78 | ] | 78 | ] |
79 | } | 79 | } |
80 | |||
81 | def protected List<VLSVariable> duplicate(List<VLSVariable> vars) { | ||
82 | var newList = newArrayList | ||
83 | for (v : vars) { | ||
84 | newList.add(duplicate(v)) | ||
85 | } | ||
86 | return newList | ||
87 | } | ||
80 | 88 | ||
81 | def protected VLSConstant toConstant(VLSFunctionAsTerm term) { | 89 | def protected VLSConstant toConstant(VLSFunctionAsTerm term) { |
82 | return createVLSConstant => [ | 90 | return createVLSConstant => [ |