CNFgen - background
CNFgen
Combinatorial benchmarks for SAT solvers
What is a CNF?
A propositional formula is a representation of a function over \(\{\mathrm{True},\mathrm{False}\}\) variables. Consider such a variable \(x\), the formula \(\overline{x}\) is called the negation of \(x\), and has the opposite value of \(x\). Expressions of the form \(x\) and \(\overline{x}\) are called literals, and a clause is a disjunction
\[ \ell_1 \lor \ell_2 \ldots \]
where each \(\ell_i\) is a literal. A clause evaluates to \(\mathrm{True}\) when at least one of the literals evaluates to \(\mathrm{True}\), and evaluates to \(\mathrm{False}\) otherwise. A CNF is a conjunction of clauses \[ C_1 \land C_2 \ldots \]
and the CNF evaluates to \(\mathrm{True}\) if all clauses evaluates to \(\mathrm{True}\).
To falsify a formula we need an input for which the formula evaluates to \(\mathrm{False}\); to satisfy a formula we need an input for which it evaluates to \(\mathrm{True}\). Observe that to falsify a CNF it is sufficient to pick a clause and set the variables in such a way that all literals in the clause evaluate to \(\mathrm{False}\). There is no efficient algorithm that decides whether a CNF is satisfiable or not.
DIMACS encoding of CNFs
The program outputs CNF formulas encoded in dimacs format, which has the following structure:
at the beginning of the file there may be an arbitrary number of
comment lines, which must start with character c. The first non
comment line specifies how many variables and how many clauses are
in the CNF formulas. The next lines are sequence of non zero
integers followed by zero.
p cnf <N> <M> <i> <i> <i> <i> 0 <i> <i> <i> 0 ...
Each line after the specification represents a clause in the
following way: a positive number t is the positive literal on the
variable indexed by t. A negative number t is the negated literal on
the variable indexed by -t.
For example if the formula is defined on \(n\) variables \(x_1, x_2,
x_3, \ldots\), then the line 3 -1 5 6 -4 0 encodes the clause \(x_3
\lor \overline{x_1} \lor x_5 \lor x_6 \lor \overline{x_4}\).