return compress(formula, new Changed());
}
private static Formula compress(Formula formula, Changed changed) throws DliException{
Changed changed1 = new Changed();
Formula formula1 = formula;
formula1 = insertEx(formula1, changed1);
formula1 = insertOr(formula1, changed1);
formula1 = insertImplies(formula1, changed1);
formula1 = insertIff(formula1, changed1);
formula1 = deleteNotNot(formula1, changed1);
if (formula instanceof And) {
And and = (And)formula;
Changed changed2 = new Changed();
boolean compress = false;
LinkedList<Formula> formulaList = new LinkedList<Formula>();
for (Formula formula2 : and.getFormulaList()){
formulaList.add(compress(formula2, changed2));
if (changed2.isChanged) compress = true;
}
if (compress) {
formula1 = new And(formulaList);
changed1.isChanged = true;
}
} else if (formula instanceof Or) {
Or or = (Or)formula;
Changed changed2 = new Changed();
boolean compress = false;
LinkedList<Formula> formulaList = new LinkedList<Formula>();
for (Formula formula2 : or.getFormulaList()){
formulaList.add(compress(formula2, changed2));
if (changed2.isChanged) compress = true;
}
if (compress) {
formula1 = new Or(formulaList);
changed1.isChanged = true;
}
} else if (formula instanceof For){
For for1 = (For)formula;
Changed changed2 = new Changed();
Formula formula2 = compress(for1.getFormula(), changed2);
if (changed2.isChanged) {
formula1 = new For(for1.getVariable(), for1.getType(), formula2);
changed1.isChanged = true;
}
} else if (formula instanceof Ex){
Ex ex = (Ex)formula;
Changed changed2 = new Changed();
Formula formula2 = compress(ex.getFormula(), changed2);
if (changed2.isChanged){
formula1 = new Ex(ex.getVariable(), ex.getType(), formula2);
changed1.isChanged = true;
}
}