package at.iaik.suraq.test; import java.io.File; import java.io.FileWriter; import java.util.HashSet; import java.util.Set; import at.iaik.suraq.exceptions.ParseError; import at.iaik.suraq.main.SuraqOptions; import at.iaik.suraq.parser.LogicParser; import at.iaik.suraq.parser.SExpParser; import at.iaik.suraq.sexp.SExpression; import at.iaik.suraq.sexp.SExpressionConstants; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.smtlib.SMTLibObject; import at.iaik.suraq.smtlib.Z3Proof; import at.iaik.suraq.smtlib.formula.DomainVariable; import at.iaik.suraq.smtlib.formula.Formula; import at.iaik.suraq.smtlib.formula.FunctionMacro; import at.iaik.suraq.smtlib.formula.NotFormula; import at.iaik.suraq.smtlib.formula.PropositionalVariable; import at.iaik.suraq.smtlib.formula.UninterpretedFunction; import at.iaik.suraq.smtsolver.SMTSolver; public class TestHelper { protected Formula consequent; public void setUp() { SuraqOptions.kill(); SuraqOptions.reset(); Z3Proof.setInstanceCounter(0); } private void handleParseError(ParseError exc) { System.err.println("PARSE ERROR!"); System.err.println(exc.getMessage()); System.err.println("Line: " + (exc.getLineNumber() > 0 ? exc.getLineNumber() : "unknown")); System.err.println("Column: " + (exc.getColumnNumber() > 0 ? exc.getColumnNumber() : "unknown")); System.err .println("Context: " + (exc.getContext() != "" ? exc.getContext() : "not available")); } protected String makeDeclarationsAndDefinitions(Formula formula) { Set<SExpression> outputExpressions = new HashSet<SExpression>(); Set<SMTLibObject> done = new HashSet<SMTLibObject>(); Set<PropositionalVariable> pVars = new HashSet<PropositionalVariable>(); formula.getPropositionalVariables(pVars, done); done.clear(); for (PropositionalVariable var : pVars) outputExpressions .add(SExpression.makeDeclareFun((Token) var.toSmtlibV2(), SExpressionConstants.BOOL_TYPE, 0)); Set<DomainVariable> dVars = new HashSet<DomainVariable>(); formula.getDomainVariables(dVars, done); done.clear(); for (DomainVariable var : dVars) outputExpressions.add(SExpression.makeDeclareFun( (Token) var.toSmtlibV2(), SExpressionConstants.VALUE_TYPE, 0)); Set<UninterpretedFunction> ufs = new HashSet<UninterpretedFunction>(); formula.getUninterpretedFunctions(ufs, done); done.clear(); for (UninterpretedFunction function : ufs) outputExpressions.add(SExpression.makeDeclareFun( function.getName(), function.getType(), function.getNumParams())); Set<FunctionMacro> macros = new HashSet<FunctionMacro>(); this.consequent.getFunctionMacros(macros, done); done.clear(); for (FunctionMacro macro : macros) outputExpressions.add(macro.toSmtlibV2()); String declarationsStr = ""; for (SExpression declaration : outputExpressions) declarationsStr += declaration.toString(); return declarationsStr; } protected String buildSMTDescription(String declarationStr, String formulaStr) { String smtStr = ""; smtStr += SExpressionConstants.SET_LOGIC_QF_UF.toString(); smtStr += SExpressionConstants.DECLARE_SORT_VALUE.toString(); smtStr += declarationStr; smtStr += "(assert" + formulaStr + ")"; smtStr += SExpressionConstants.CHECK_SAT.toString(); smtStr += SExpressionConstants.EXIT.toString(); return smtStr; } protected Formula getFormulaOfFile(String filename) { File input = new File(filename); // String z3InputStr = inputTransformations(sourceFile); try { SExpParser sExpParser = new SExpParser(input); try { sExpParser.parse(); assert (sExpParser.wasParsingSuccessfull()); } catch (ParseError exc) { handleParseError(exc); return null; } LogicParser logicParser = new LogicParser(sExpParser.getRootExpr()); logicParser.parse(); assert (logicParser.wasParsingSuccessfull()); Formula mainFormula = logicParser.getMainFormula(); Formula formula = mainFormula.flatten(); consequent = formula; return formula; } catch (ParseError ex) { handleParseError(ex); throw new RuntimeException("Unable to parse proof!"); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException("Other Exception"); } } protected String transformFormulaToString(Formula mainFormula) { String declarationStr = makeDeclarationsAndDefinitions(mainFormula); String formulaSmtStr = buildSMTDescription(declarationStr, mainFormula.toString()); return formulaSmtStr; } protected void writeFile(String filename, String content) { try { File outputFile = new File(filename); FileWriter fstream = new FileWriter(outputFile); fstream.write(content); fstream.close(); } catch (Exception ex) { System.err.println("Datei konnte nicht geschrieben werden: " + filename); } } protected boolean isFormulaValid(Formula formula, String description) { this.setUp(); SMTSolver z3 = SMTSolver.create(SMTSolver.z3_type, SuraqOptions.getZ3_4Path()); NotFormula valid = NotFormula.create(formula); z3.solve(transformFormulaToString(valid)); int valid2 = z3.getState(); if (valid2 == 1) // (1=UNSAT, 2=SAT) { System.out.println("Formula '" + description + "' is valid"); return true; } else { System.out.println("Formula '" + description + "' is not valid"); return false; } } protected boolean isFormulaSat(Formula formula, String description) { this.setUp(); SMTSolver z3 = SMTSolver.create(SMTSolver.z3_type, SuraqOptions.getZ3_4Path()); z3.solve(transformFormulaToString(formula)); int valid2 = z3.getState(); if (valid2 == 1) // (1=UNSAT, 2=SAT) { System.out.println("Formula '" + description + "' is UNSAT"); return false; } else { System.out.println("Formula '" + description + "' is SAT"); return true; } } }