public static void Main(string[] args) { if (args.Length < 1) { Console.Error.WriteLine("usage: minisat [-s|-u] <file1.cnf> ..."); return; } bool expect = false; bool expect_res = false; int pos = 0; if (args[pos] == "-s") { expect = true; expect_res = true; pos++; } if (args[pos] == "-u") { expect = true; expect_res = false; pos++; } for (; pos < args.Length; pos++) { StreamReader sr = File.OpenText(args[pos]); vec <Solver.Lit> lits = new vec <Solver.Lit>(); Solver S = new Solver(); for (;;) { lits.clear(); string w; while ((w = ReadWord(sr)) != null) { if (w == "%") { break; } int parsed_lit = int.Parse(w); if (parsed_lit == 0) { break; } int var = Math.Abs(parsed_lit) - 1; while (var >= S.nVars()) { S.newVar(); } lits.push((parsed_lit > 0) ? new Solver.Lit(var) : ~new Solver.Lit(var)); } if (w == null) { break; } S.addClause(lits); } if (expect) { S.verbosity = 0; S.solve(); if (S.okay() == expect_res) { Solver.reportf("."); } else { Solver.reportf("\nproblem: {0}\n", args[pos]); } } else { S.verbosity = 1; S.solve(); Solver.reportf(S.okay() ? "SATISFIABLE\n" : "UNSATISFIABLE\n"); S.printStats(); } #if false if (S.okay()) { for (int i = 0; i < S.nVars(); i++) { if (S.model[i] != l_Undef) { Solver.reportf("{0}{1}\n", (S.model[i] == l_True)?" ":"-", i + 1); } } } #endif } }
public string solveIt(string AIMAproblem, out Model proposal) { string solution = ""; string DIMACSsolution = ""; translator.Clear(); proposal = new Model(); string DIMACSproblem = translator.AIMAToDIMACS(AIMAproblem); StringReader sr = new StringReader(DIMACSproblem); vec <Solver.Lit> lits = new vec <Solver.Lit>(); Solver S = new Solver(); Solver.solverReport = ""; for (; ;) { lits.clear(); string w; while ((w = ReadWordStatic(sr)) != null) { if (w == "%") { break; } int parsed_lit = int.Parse(w); if (parsed_lit == 0) { break; } int var = Math.Abs(parsed_lit) - 1; while (var >= S.nVars()) { S.newVar(); } lits.push((parsed_lit > 0) ? new Solver.Lit(var) : ~new Solver.Lit(var)); } if (w == null) { break; } S.addClause(lits); } S.verbosity = 1; S.solve(); Solver.reportf(S.okay() ? "SATISFIABLE\n" : "UNSATISFIABLE\n"); S.printStats(); /* * if (S.okay()) * { * for (int i = 0; i < S.nVars(); i++) * if ((S.model[i] != Solver.lbool.Undef0) && (S.model[i] != Solver.lbool .Undef1)) * Solver.reportf("{0}{1}\n", (S.model[i] == Solver.lbool.True) ? " " : "-", i + 1); * } */ wasSAT = S.okay(); if (S.okay()) { for (int i = 0; i < S.nVars(); i++) { if ((S.model[i] != Solver.lbool.Undef0) && (S.model[i] != Solver.lbool.Undef1)) { DIMACSsolution += String.Format("{0}{1} ", (S.model[i] == Solver.lbool.True) ? " " : "-", i + 1); } } } if (S.okay()) { for (int i = 0; i < S.nVars(); i++) { if ((S.model[i] != Solver.lbool.Undef0) && (S.model[i] != Solver.lbool.Undef1)) { //DIMACSsolution += String.Format("{0}{1} ", (S.model[i] == Solver.lbool.True) ? " " : "-", i + 1); if (S.model[i] == Solver.lbool.True) { proposal = proposal.Extend(translator.varName(i + 1), true); Console.WriteLine("+{0}", translator.varName(i + 1)); } else { proposal = proposal.Extend(translator.varName(i + 1), false); //Console.WriteLine("-{0}", translator.varName(i + 1)); } } } } solution = translator.DIMACSToAIMA(DIMACSsolution); solverReport = Solver.solverReport; return(solution); }