Skip to content

Commit 5bf097e

Browse files
committed
Formulas for which no triggers are generated may use equations from which to derive triggers (addresses issue #3972)
1 parent 0f2801b commit 5bf097e

4 files changed

Lines changed: 74 additions & 4 deletions

File tree

key.core/src/main/java/de/uka/ilkd/key/strategy/quantifierHeuristics/ReplacerOfQuanVariablesWithMetavariables.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
* <code>allTerm</code> and create constant functions for all existential variables. The variables
2121
* with new created metavariables or constant functions are store to a map <code>mapQM</code>.
2222
*/
23-
@Deprecated
24-
class ReplacerOfQuanVariablesWithMetavariables {
23+
public class ReplacerOfQuanVariablesWithMetavariables {
2524

2625
private ReplacerOfQuanVariablesWithMetavariables() {}
2726

key.core/src/main/java/de/uka/ilkd/key/strategy/quantifierHeuristics/constraint/EqualityConstraint.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
* constraint would not be satisfiable (cycles, unification failed) the Constraint TOP of interface
3939
* Constraint is returned.
4040
*/
41-
@Deprecated
4241
public class EqualityConstraint implements Constraint {
4342

4443
/**

key.core/src/main/java/de/uka/ilkd/key/strategy/quantifierHeuristics/constraint/Metavariable.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.key_project.logic.TerminalSyntaxElement;
1414
import org.key_project.logic.sort.Sort;
1515

16-
@Deprecated
1716
public final class Metavariable extends JAbstractSortedOperator
1817
implements Comparable<Metavariable>, TerminalSyntaxElement, Named {
1918

key.core/src/main/java/de/uka/ilkd/key/strategy/quantifierHeuristics/theory/EqualityTheorySupport.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,23 @@
33
* SPDX-License-Identifier: GPL-2.0-only */
44
package de.uka.ilkd.key.strategy.quantifierHeuristics.theory;
55

6+
7+
import java.util.ArrayList;
8+
import java.util.LinkedHashMap;
69
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Set;
712

813
import de.uka.ilkd.key.java.Services;
914
import de.uka.ilkd.key.logic.JTerm;
15+
import de.uka.ilkd.key.logic.TermBuilder;
1016
import de.uka.ilkd.key.logic.op.Equality;
1117
import de.uka.ilkd.key.logic.op.Junctor;
18+
import de.uka.ilkd.key.logic.op.LogicVariable;
19+
import de.uka.ilkd.key.proof.OpReplacer;
20+
import de.uka.ilkd.key.strategy.quantifierHeuristics.constraint.Constraint;
21+
import de.uka.ilkd.key.strategy.quantifierHeuristics.constraint.EqualityConstraint;
22+
import de.uka.ilkd.key.strategy.quantifierHeuristics.constraint.Metavariable;
1223

1324
import org.key_project.logic.op.Operator;
1425
import org.key_project.logic.op.QuantifiableVariable;
@@ -103,4 +114,66 @@ public LiteralDecision decideFromAxiom(JTerm literal, JTerm axiom, Services serv
103114
}
104115
return LiteralDecision.UNKNOWN;
105116
}
117+
118+
@Override
119+
public List<JTerm> fallbackTriggers(ClauseTriggers selection, Services services,
120+
MetavariableFactory metavariableFactory) {
121+
List<JTerm> fallbackTriggers = new ArrayList<>();
122+
final ClauseAnalysis clauseInfo = selection.clause();
123+
124+
final Map<QuantifiableVariable, Metavariable> qv2mv = new LinkedHashMap<>();
125+
final Map<Metavariable, QuantifiableVariable> mv2qv = new LinkedHashMap<>();
126+
for (QuantifiableVariable var : clauseInfo.clause().freeVars()) {
127+
final Metavariable mv = metavariableFactory.fresh(var.sort());
128+
qv2mv.put(var, mv);
129+
if (clauseInfo.universalVariables().contains(var)) {
130+
mv2qv.put(mv, var);
131+
}
132+
}
133+
final OpReplacer qv2mvReplacer =
134+
new OpReplacer(qv2mv, services.getTermFactory());
135+
final OpReplacer mv2qvReplacer =
136+
new OpReplacer(mv2qv, services.getTermFactory());
137+
for (JTerm lit : clauseInfo.literals()) {
138+
if (lit.op() == Equality.EQUALS) {
139+
fallbackTriggers.addAll(
140+
solveEquation(mv2qv.keySet(), qv2mvReplacer, mv2qvReplacer, lit, services));
141+
}
142+
}
143+
return fallbackTriggers;
144+
}
145+
146+
/// solves equation f(u) = f(g(v)) to u = g(MV_V)
147+
/// @param mvs set of Metavariables used to replace **universal** bound variables
148+
/// @param qv2mv OpReplacer to replace all free variables in lit by their meta variables
149+
/// @param mv2qv OpReplacer to restore universal (not existential) bound variables
150+
/// @param lit the JTerm representing an uncovered literal
151+
/// @param services the Services class provides access to term construction and other services
152+
/// @return list of solved equations that describe triggers
153+
private List<JTerm> solveEquation(Set<Metavariable> mvs, OpReplacer qv2mv,
154+
OpReplacer mv2qv, JTerm lit,
155+
Services services) {
156+
final TermBuilder tb = services.getTermBuilder();
157+
final JTerm litWithMV = qv2mv.replace(lit);
158+
final Constraint c =
159+
EqualityConstraint.BOTTOM.unify(litWithMV.sub(0), litWithMV.sub(1), services);
160+
List<JTerm> solvedEquations = new ArrayList<>();
161+
if (c.isSatisfiable()) {
162+
for (final Metavariable mv : mvs) {
163+
final JTerm solution = c.getInstantiation(mv, services);
164+
final Operator instOp = solution.op();
165+
if (instOp instanceof LogicVariable ||
166+
instOp instanceof Metavariable) {
167+
// solutions that are a variable
168+
// and contain no function symbol do not
169+
// make useful triggers
170+
continue;
171+
}
172+
final JTerm solvedEquation = mv2qv.replace(tb.equals(tb.var(mv), solution));
173+
solvedEquations.add(solvedEquation);
174+
solvedEquations.add(tb.equals(solvedEquation.sub(1), solvedEquation.sub(0)));
175+
}
176+
}
177+
return solvedEquations;
178+
}
106179
}

0 commit comments

Comments
 (0)