/**
* Author: Christoph Hillebold <c.hillebold@student.tugraz.at>
*/
package at.iaik.suraq.main;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import at.iaik.suraq.sexp.Token;
import at.iaik.suraq.smtlib.formula.AndFormula;
import at.iaik.suraq.smtlib.formula.Formula;
import at.iaik.suraq.smtlib.formula.ImpliesFormula;
/**
* This searches for DomainEquivalences containing ITEs and transforms them.
* These Equivalences are bad for the GraphReduction. e.g. value0 ==
* ITE(constraint, value1, value2) --> newbool = ITE(constraint, value0 = value1
* , value 0 = value2) at the beginning of the formula --> newbool instead of
* equivalence in Formula
*
* @author Hillebold Christoph
*
*/
public class ITEEquationReduction {
private static boolean _isActive = true;
private List<Formula> constraints;
public static void setActive(boolean isActive) {
ITEEquationReduction._isActive = isActive;
}
public static boolean isActive() {
return ITEEquationReduction._isActive;
}
/**
* This searches for DomainEquivalences containing ITEs and transforms them.
* These Equivalences are bad for the GraphReduction.
*
* @param topLevelFormula
* @param noDependenceVars
* @return
*/
public Formula perform(Formula topLevelFormula, Set<Token> noDependenceVars) {
if (!ITEEquationReduction._isActive) {
System.err
.println("INFO: Didn't perform ITE Reduction, because it is inactive.");
return topLevelFormula;
}
constraints = new ArrayList<Formula>();
Formula main = topLevelFormula.removeDomainITE(topLevelFormula,
noDependenceVars, constraints);
if (constraints.size() == 0)
return main;
else if (constraints.size() == 1)
return ImpliesFormula.create(constraints.get(0), main);
return ImpliesFormula.create(AndFormula.generate(constraints), main);
}
public List<Formula> getConstraints() {
assert (constraints != null);
return new ArrayList<Formula>(constraints);
}
}