MiniSat provides overloaded solve() methods for common cases:
// Single assumptionbool sat = solver.solve(mkLit(x));// Two assumptionsbool sat = solver.solve(mkLit(x), ~mkLit(y));// Three assumptionsbool sat = solver.solve(mkLit(x), mkLit(y), mkLit(z));// Many assumptionsvec<Lit> assumptions;assumptions.push(mkLit(x));assumptions.push(mkLit(y));bool sat = solver.solve(assumptions);
When solving with assumptions returns UNSAT, you can extract the conflict:
#include "minisat/core/Solver.h"#include <iostream>using namespace Minisat;int main() { Solver solver; Var a = solver.newVar(); Var b = solver.newVar(); Var c = solver.newVar(); // Add clauses that create a conflict under certain assumptions solver.addClause(mkLit(a), mkLit(b)); solver.addClause(~mkLit(a)); solver.addClause(~mkLit(b)); // Try to solve with assumptions vec<Lit> assumptions; assumptions.push(mkLit(c)); bool sat = solver.solve(assumptions); if (!sat) { std::cout << "UNSAT. Conflict literals:" << std::endl; // The conflict field contains literals involved in the conflict for (int i = 0; i < solver.conflict.size(); i++) { Lit lit = solver.conflict[i]; std::cout << " " << (sign(lit) ? "-" : "") << var(lit) << std::endl; } } return 0;}
The conflict field is a LSet (set of literals) representing the conflict clause derived from the assumptions.
// Permanently adds to formulasolver.addClause(mkLit(x));solver.addClause(mkLit(y));bool sat1 = solver.solve();bool sat2 = solver.solve(); // x and y still forced true
vec<Lit> assumptions;// Solve multiple times with different assumptionsfor (int i = 0; i < 100; i++) { assumptions.clear(); assumptions.push(mkLit(vars[i])); bool sat = solver.solve(assumptions); // ...}
3
Use assumptions for temporary constraints
4
Prefer assumptions over adding and removing clauses:
5
// Good: use assumptionsvec<Lit> assumptions;assumptions.push(mkLit(x));bool sat = solver.solve(assumptions);// Bad: MiniSat doesn't support clause removal// (would need to create a new solver)
6
Minimize assumption sets
7
Smaller assumption sets lead to faster solving:
8
// Only include essential assumptionsvec<Lit> assumptions;assumptions.push(mkLit(critical_var));// Don't add redundant assumptions