package at.iaik.suraq.main; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import at.iaik.suraq.smtlib.formula.AndFormula; import at.iaik.suraq.smtlib.formula.Formula; import at.iaik.suraq.smtlib.formula.OrFormula; import at.iaik.suraq.smtlib.formula.PropositionalVariable; import at.iaik.suraq.util.DebugHelper; import at.iaik.suraq.util.Timer; import at.iaik.suraq.util.Util; /** * TseitinEncoding extracted to this method. It is not globally used in this * project yet. But this TseitinEncoding should also work. Used in: - QBFTest - * ONLY Before QBFEncoding in class Suraq * * @author chillebold * */ public class TseitinEncoding { protected Map<PropositionalVariable, Formula> tseitinEncoding = new HashMap<PropositionalVariable, Formula>(); public Formula performTseitinEncodingWithoutZ3(Formula formula) { Formula formula2 = formula.deepFormulaCopy(); Timer timer = new Timer(); timer.reset(); timer.start(); List<OrFormula> clauses = new ArrayList<OrFormula>(); Map<PropositionalVariable, Formula> encoding = new HashMap<PropositionalVariable, Formula>(); // the following code also changes the formula // GH 2013-05-02: Not sure where this is used, // just putting -1 for the partition parameters, // as this is probably not used anywhere anyway. // GH 2014-03-13: Not sure where this is used, // just putting null for the new "done" parameter Formula tseitinVar = formula.tseitinEncode(clauses, encoding, null, -1); assert (Util.isLiteral(tseitinVar)); tseitinEncoding.putAll(encoding); if (tseitinVar instanceof PropositionalVariable) tseitinEncoding.put((PropositionalVariable) tseitinVar, formula); List<Formula> disjuncts = new ArrayList<Formula>(); disjuncts.add(tseitinVar); clauses.add(OrFormula.generate(disjuncts)); Formula encodedFormula = AndFormula.generate(clauses); timer.end(); DebugHelper.getInstance().formulaToFile(encodedFormula, "debug-tseitin-encoding.txt"); System.out.println(" test if tseitin encoding is correct..."); assert (Util.checkFormulaImplication(encodedFormula, formula2)); System.out.println(" ...test finished"); System.out.println(" Done. (" + timer + ")"); return encodedFormula; } public Set<PropositionalVariable> getPropositionalVariables() { return tseitinEncoding.keySet(); } }