4.7 KiB
4.7 KiB
- Preprocessing is very good at optimizing the CNF
- Its mostly polynomial (not too costly)
- But running it until completion can be too much
- Inprocessing runs preprocesors after each restart
- benefits of preprocessing, less overhead timewise
Bounded Variable Elimination (BVE)
- Use resolution to remove a variable
- Works only if number of clauses is not increasing (bounded)
- Best and most important preprocessing
Bounded Variable Addition (BVA)
- Conversely reverse the resolution rule to add a variable
- Only if you can decrease the number of variables
(a\lor d), (b\lor d), (c\lor d)and(a\lor e), (b\lor e), (c\lor e)-
(a\lor x), (b\lor x), (c\lor x)and(\overline x \lor d), (\overline x \lor e)
Subsumption
- Smaller clause subsumes longer clause (backward subsumption)
- Longer clause is subsumed by smaller clause (forwards subsumption)
Sweeping
- Find literals/nodes that are functionally equivalent (e.g. candidates via random simulation, confirmed with a SAT call)
- Merge equivalent literals: substitute one for the other everywhere, removing the redundant variable
- Preserves the exact model set (true logical equivalence), unlike Subsumption/BVE which only preserve (un)satisfiability
- Example:
(\overline x \lor y) \land (\overline y \lor x) \land (x \lor a) \land (\overline y \lor b)- Simulation shows
x,yalways agree; SAT call confirms\overline{x \leftrightarrow y}is UNSAT\Rightarrow x \leftrightarrow y - Substitute
y := xeverywhere:(x \lor a) \land (\overline x \lor b)(the defining clauses forydrop out)
- Simulation shows
Variable instantiation
for l in lits:
for c in clauses:
assume l and -l' for all other l' in c
if all c lead to conflict assign -l
Pure Literal
- Find variables which only occur in one phase.
- Assign variable to that phase & remove all subsumed clauses
Symmetry Breaking
- Find symmetries: permutations of variables/literals that leave the CNF invariant (e.g. via automorphisms of the clause-variable incidence graph)
- Add symmetry-breaking predicates (SBPs) that pick one canonical representative per symmetric orbit (e.g. lexicographic-leader constraints)
- Cuts away redundant, symmetric parts of the search space without losing satisfiability
- "Every model after works": a model of the constrained (canonical) formula is still a model of the original
- Example:
(x_1 \lor x_2) \land (\overline{x_1} \lor \overline{x_2})("exactly one of $x_1,x_2$") is symmetric under swappingx_1 \leftrightarrow x_2- Two models exist:
x_1{=}1,x_2{=}0andx_1{=}0,x_2{=}1(mirror images) - Add SBP
(\overline{x_1} \lor x_2)(forcesx_1 \le x_2) to keep only the canonicalx_1{=}0,x_2{=}1, cutting the mirrored branch from the search
- Two models exist:
Stalmarks Method
- Method on triplets (such as results from the Tseitin transformation)
- Can transform (in)equalities
- BCP over (in)equalities, Structural Rules, Test Rule
Autarky
- Partial assignments
\sigmamaybe satisfes subset of a CNF - If all clauses touched by
\sigmaare satisfied\sigmais an an autarky- These clauses may be removed
Conditional autarky
- an coditinal autarky is an assignment
\alpha = \gamma \cup \beta - First F is simplified
F|_\gammaand then\betais an autarky ofF|_\gamma - Relation to (globally) blocked clauses
- Let
\gamma = \overline{C \setminus L}, \beta = L - We have
\gamma \cup \beta \text{ is autarky} \iff L \text{ globally blocked } C
- Let
Computing (conditional) autarkies
- Trivial base case: pure literals are already autarkies (touched clauses are all satisfied)
- Fixpoint search: tentatively assign a literal, satisfy the clauses it touches, then keep adding literals whose touched clauses are already satisfied, until no touched clause is falsified (else backtrack the guess)
- For conditional autarkies: fix
\gammafirst (simplifyF|_\gamma), then run the same fixpoint search for\betaonF|_\gamma
Blocked Clauses
- If we have a blocked clause
Ccontaining a literall - and all resolvents of
Care tautological (trivially true) we can remove C - (Trivial proof by contradiction)
Set Blocked Clauses
- Extension to generalize the blocked literal to a Set
L- Similar idea Set blocked Clause
C, and all ClausesDwhich contain al \in \overline L
- Similar idea Set blocked Clause
(C \setminus L) \cup \overline L \cup D\; \text{tautological}
Vivification / Distillation
- Try to set literals in clauses to false and find out which other literals are implied
- Maybe even the clause is implied
for c in clauses:
for i in len (c):
lit = c[i]
assign (-lit)
propagate ()
if eval(c) == True:
// Implies itself somehow
mark_clause_for_removal (c)
for other in c[i+1..]:
if is_assigned (other):
mark_lit_for_removal (other)