package at.iaik.suraq.test; import java.util.ArrayList; import java.util.HashSet; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import at.iaik.suraq.main.Ackermann; import at.iaik.suraq.main.SuraqOptions; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.smtlib.Z3Proof; import at.iaik.suraq.smtlib.formula.AndFormula; import at.iaik.suraq.smtlib.formula.Formula; import at.iaik.suraq.smtlib.formula.ImpliesFormula; /** * This class tests if the Ackermann's reduction works. It is not possible to * perform all tests, only: * the given formula is unsatisfiable * the given * formula is valid * * @author chillebold * */ public class AckermannPredicatesTest { // SuraqOptions options; protected Formula consequent; protected TestHelper th = new TestHelper(); public AckermannPredicatesTest() { // options = SuraqOptions.getInstance(); } @Before public void setUp() { SuraqOptions.kill(); SuraqOptions.reset(); Z3Proof.setInstanceCounter(0); } // Live: Staendig zum Herumprobieren @Test public void liveTest() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/ack-prae1.smt2"); boolean result = testFile("./rsc/test/ack-prae1.smt2", "./rsc/test/~ack-prae1-acker.smt2", "./rsc/test/~ack-unsat.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // ///////////////////////////////////////////////////////////////////////////// protected boolean testFile(String filename, String outputFileName1, String outputFileName2) { Formula formula = th.getFormulaOfFile(filename); if (formula == null) { System.err.println("formula == null"); return false; } Formula old_formula = formula.deepFormulaCopy(); // Ackermann Ackermann ack = new Ackermann(); HashSet<Token> t = new HashSet<Token>(); formula = ack.performAckermann(formula, t); // Debug output of Ackermann's result to Filesystem String ackermannstr = th.transformFormulaToString(formula); th.writeFile(outputFileName1, ackermannstr); Formula x = formula; th.isFormulaSat(old_formula, "OLD"); th.isFormulaSat(formula, "ACKER"); th.isFormulaValid(old_formula, "OLD"); th.isFormulaValid(formula, "ACKER"); // this only works for VALID formulas ImpliesFormula f1 = ImpliesFormula.create(old_formula, x); ImpliesFormula f2 = ImpliesFormula.create(x, old_formula); ArrayList<Formula> f12 = new ArrayList<Formula>(); f12.add(f1); f12.add(f2); AndFormula equiv = AndFormula.generate(f12); // Test Output String z3InputStr = th.transformFormulaToString(equiv); th.writeFile(outputFileName2, z3InputStr); // Check if OK: boolean valid = th.isFormulaValid(equiv, "Formeln aequivalent"); if (valid) { System.out.println(" Z3 tells us UNSAT (valid). Good :-)"); return true; } else { System.err.println(" Z3 tells us SAT. Bad :-("); return false; } } }