int main() { SATSolver solver; vector<Lit> clause; //We need 3 variables solver.new_var(); solver.new_var(); solver.new_var(); //adds "1 0" clause.push_back(Lit(0, false)); solver.add_clause(clause); //adds "-1 2 3 0" clause.clear(); clause.push_back(Lit(0, true)); clause.push_back(Lit(1, false)); clause.push_back(Lit(2, false)); solver.add_clause(clause); lbool ret = l_True; while(ret == l_True) { ret = solver.solve(); if (ret == l_True) { std::cout << "Solution is: " << solver.get_model()[0] << ", " << solver.get_model()[1] << ", " << solver.get_model()[2] << std::endl; clause.clear(); for(size_t i = 0; i < 3; i++) { if (solver.get_model()[i] != l_Undef) { clause.push_back(Lit(i, solver.get_model()[i] == l_True)); } } solver.add_clause(clause); } else if (ret == l_False) { std::cout << "No more solutions." << std::endl; } else { std::cout << "Solver returned that it didn't finish running." "maybe you put a limit on its runtime?" << std::endl; } } return 0; }
TEST(xor_interface, xor_check_solution_values7) { SATSolver s; s.new_var(); s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, false); vector<Lit> assump = {Lit(0, false), Lit(1, false)}; lbool ret = s.solve(&assump); EXPECT_EQ( ret, l_True); EXPECT_EQ(s.get_model()[0], l_True); EXPECT_EQ(s.get_model()[1], l_True); EXPECT_EQ(s.get_model()[2], l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(xor_interface, xor_3_long2) { SATSolver s; s.new_var(); s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, false); s.add_xor_clause(vector<uint32_t>{0U}, true); s.add_xor_clause(vector<uint32_t>{1U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ(s.get_model()[0], l_True); EXPECT_EQ(s.get_model()[1], l_True); EXPECT_EQ(s.get_model()[2], l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(normal_interface, onelit) { SATSolver s; s.new_var(); s.add_clause(vector<Lit>{Lit(0, false)}); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.okay(), true); }
TEST(xor_interface, xor_check_solution_values3) { SATSolver s; s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 0U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); }
TEST(normal_interface, onelit) { SATSolver s; s.new_var(); s.add_clause(str_to_cl("1")); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.okay(), true); }
TEST(normal_interface, twolit) { SATSolver s; s.new_var(); s.add_clause(str_to_cl("1")); s.add_clause(str_to_cl("-1")); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.okay(), false); }
int main() { SATSolver solver; vector<Lit> clause; //We need 3 variables solver.new_var(); solver.new_var(); solver.new_var(); //adds "1 0" clause.push_back(Lit(0, false)); solver.add_clause(clause); //adds "-2 0" clause.clear(); clause.push_back(Lit(1, true)); solver.add_clause(clause); //adds "-1 2 3 0" clause.clear(); clause.push_back(Lit(0, true)); clause.push_back(Lit(1, false)); clause.push_back(Lit(2, false)); solver.add_clause(clause); lbool ret = solver.solve(); assert(ret == l_True); assert(solver.get_model()[0] == l_True); assert(solver.get_model()[1] == l_False); assert(solver.get_model()[2] == l_True); std::cout << "Solution is: " << solver.get_model()[0] << ", " << solver.get_model()[1] << ", " << solver.get_model()[2] << std::endl; return 0; }
TEST(xor_interface, xor_check_sat_solution) { SATSolver s; s.new_var(); s.add_xor_clause(vector<unsigned>{0U}, false); s.add_xor_clause(vector<unsigned>{0U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_False); } EXPECT_EQ( s.nVars(), 1u); }
TEST(normal_interface, multi_solve_unsat) { SATSolver s; s.new_var(); s.add_clause(vector<Lit>{Lit(0, false)}); s.add_clause(vector<Lit>{Lit(0, true)}); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.okay(), false); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.okay(), false); } }
TEST(xor_interface, xor_check_solution_values) { SATSolver s; s.new_var(); s.add_xor_clause(vector<uint32_t>{0U}, true); s.add_xor_clause(vector<uint32_t>{0U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.okay(), true); } EXPECT_EQ( s.nVars(), 1u); }
TEST(normal_interface, multi_solve_unsat) { SATSolver s; s.new_var(); s.add_clause(str_to_cl("1")); s.add_clause(str_to_cl("-1")); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.okay(), false); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.okay(), false); } }
TEST(xor_interface, xor_very_long) { SATSolver s; vector<uint32_t> vars; for(unsigned i = 0; i < 30; i++) { s.new_var(); vars.push_back(i); } s.add_xor_clause(vars, false); for(unsigned i = 0; i < 29; i++) { s.add_xor_clause(vector<uint32_t>{i}, false); } lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(unsigned i = 0; i < 30; i++) { EXPECT_EQ(s.get_model()[i], l_False); } EXPECT_EQ( s.nVars(), 30u); }
TEST(xor_interface, xor_very_long2) { for(size_t num = 3; num < 30; num++) { SATSolver s; vector<uint32_t> vars; for(unsigned i = 0; i < num; i++) { s.new_var(); vars.push_back(i); } s.add_xor_clause(vars, true); for(unsigned i = 0; i < num-1; i++) { s.add_xor_clause(vector<uint32_t>{i}, false); } lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(unsigned i = 0; i < num-1; i++) { EXPECT_EQ(s.get_model()[i], l_False); } EXPECT_EQ(s.get_model()[num-1], l_True); EXPECT_EQ( s.nVars(), num); } }