package atp; /* Copyright 2010-2011 Adam Pease, apease@articulatesoftware.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program ; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ import java.io.*; import java.util.*; import java.text.*; public class TestGenerator { public static long time = 0; public static String SZSresult = ""; public static int depthLimit = 1; public static int gensymCount = 0; /** *************************************************************** */ public static Clause instantiateGensyms(Clause c) { ArrayList vars = c.collectVars(); if (vars.size() < 1) return null; Substitutions subst = new Substitutions(); for (int i = 0; i < vars.size(); i++) { String newConst = "Gensym" + Integer.toString(gensymCount++); subst.subst.put(vars.get(i),Term.string2Term(newConst)); } return c.substitute(subst); } /** *************************************************************** */ public static boolean containsBadTerms(Clause c) { System.out.println("INFO in TestGenerator.containsBadTerms(): checking: " + c); ArrayList terms = c.getConstantStrings(); System.out.println("INFO in TestGenerator.containsBadTerms(): with terms: " + terms); if (terms.contains("s__ListOrderFn") || terms.contains("s__ListLengthFn") || terms.contains("s__ListFn_2") || terms.contains("s__ListFn_3") || terms.contains("s__ListFn_4") || terms.contains("s__ListFn_5") || terms.contains("s__ListLengthFn") || terms.contains("s__initialList")) return true; return false; } /** *************************************************************** */ public static Clause seed(ClauseSet cs) { Random randomGenerator = new Random(System.currentTimeMillis()); int randomInt = 0; int safetyCounter = 0; Clause c = null; ArrayList vars = null; do { randomInt = randomGenerator.nextInt(cs.clauses.size()); c = cs.clauses.get(randomInt); //System.out.println("INFO in TestGenerator.seed(): checking potential seed: " + c); vars = c.collectVars(); } while ((c.literals.size() != 1 || vars.size() < 1 || containsBadTerms(c)) && safetyCounter++ < 10000); if (safetyCounter >= 10000) return null; System.out.println("# Chosen Seed: " + c); c.literals.get(0).negated = ! c.literals.get(0).negated; /* Substitutions subst = new Substitutions(); for (int i = 0; i < vars.size(); i++) { String newConst = "Gensym" + Integer.toString(gensymCount++); subst.subst.put(vars.get(i),Term.string2Term(newConst)); } c = c.substitute(subst); */ System.out.println("# Seed: " + c); return c; } /** *************************************************************** */ public static Clause saturateGen(ProofState state, int seconds) { System.out.println("INFO in TestGenerator.saturate()"); long t1 = System.currentTimeMillis(); int count = 0; while (state.unprocessed.length() > 0) { count++; Clause res = state.processClause(); if (res != null) { time = System.currentTimeMillis() - t1; return res; } if (count > 1000) { count = 0; Clause given_clause = state.unprocessed.selectBest(); System.out.println("# Checking: " + given_clause.toStringDiag()); if (given_clause.depth > depthLimit) { given_clause = state.unprocessed.extractBest(); System.out.println("# Checking with good depth: " + given_clause); given_clause = instantiateGensyms(given_clause); if (given_clause != null) { state.unprocessed.addClause(given_clause); System.out.println("# asserting: " + given_clause); } } } if (((System.currentTimeMillis() - t1) / 1000.0) > seconds) { SZSresult = "timeout"; time = System.currentTimeMillis() - t1; return null; } } return null; } /** *************************************************************** */ public static ProofState processTestFile(String filename, HashMap opts, ArrayList evals) { int timeout = Prover2.getTimeout(opts); ClauseSet cs = Formula.file2clauses(filename,timeout); if (opts.containsKey("verbose")) System.out.println(cs); else System.out.println("# INFO in TestGenerator.processTestFile(): completed file read"); if (cs != null) { EvalStructure eval = evals.get(0); Clause c = seed(cs); if (c == null) { System.out.println("# INFO in TestGenerator.processTestFile(): failed to generate seed."); return null; } cs.add(c); ProofState state = new ProofState(cs,evals.get(0)); Prover2.setStateOptions(state,opts); state.filename = filename; state.evalFunctionName = eval.name; System.out.println("# INFO in TestGenerator.processTestFile(): start saturation"); state.res = saturateGen(state,timeout); if (state.res != null) return state; else return null; } return null; } /** *************************************************************** * Test method for this class. */ public static void main(String[] args) { if (!Term.emptyString(args[0])) { ClauseEvaluationFunction.setupEvaluationFunctions(); ArrayList evals = null; HashMap opts = Prover2.processOptions(args); // canonicalize options if (opts == null) { System.out.println("Error in Prover2.main(): bad command line options."); return; } evals = new ArrayList(); evals.add(ClauseEvaluationFunction.PickGiven5); ProofState state = processTestFile(opts.get("filename"),opts,evals); if (state != null) Prover2.printStateResults(opts, state,null); } } }