initial commit
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
# Davis Putnam Procedure (DP)
|
||||
```
|
||||
while True:
|
||||
if [] in formula:
|
||||
return UNSAT
|
||||
//remove all variables that occur only in one phase
|
||||
vars = one_phased(formula)
|
||||
for var in vars:
|
||||
for clause in formula:
|
||||
if var in formula:
|
||||
remove(clause)
|
||||
|
||||
var = decide(formula)
|
||||
|
||||
// Add non trivial resolvants
|
||||
formula += resolution(var, formula)
|
||||
|
||||
for clause in formula:
|
||||
if var in formula:
|
||||
remove(clause)
|
||||
|
||||
if formula is []:
|
||||
return SAT
|
||||
```
|
||||
- Notice that
|
||||
- Adding a resolvant always preservers SAT (resolution rule)
|
||||
- Adding any clause always preserves UNSAT
|
||||
|
||||
- Removing any clause always preserves SAT
|
||||
- Removing a clause containing a 'one phase variable' preserves UNSAT (reverse of resolution rule)
|
||||
# Davis Putnam Logemann Loveland DPLL
|
||||
## Boolean Constraint Propagation (BCP)
|
||||
- Given a unit clause $l$
|
||||
1. Remove all subsumed clauses, i.e. $C$ where $l \in C$
|
||||
2. Remove $\lnot l$ from all $C$ (which contain it) [Unit Prop](SAT_in_general#Special Case Unit Resolution)
|
||||
```
|
||||
def dpll(formula):
|
||||
if [] in formula:
|
||||
return UNSAT
|
||||
vars = one_phased(formula)
|
||||
for var in vars:
|
||||
for clause in formula:
|
||||
if var in formula:
|
||||
remove(clause)
|
||||
if formula is []:
|
||||
return SAT
|
||||
|
||||
var = decide()
|
||||
if dpll(formula + [var]) == SAT:
|
||||
return SAT
|
||||
return dpll(formula + [-var])
|
||||
```
|
||||
- Correct because of theorem of Shanon
|
||||
- $f(x) = (x \land f(1)) \lor (\overline x \land f(0))$
|
||||
-
|
||||
# Backjumping
|
||||
- If some conflict has been derived without using specific assignments/ decision
|
||||
- We can skip over that decision when flipping: ![[backjump.png]]
|
||||
- If conflict stems from for example from (1 2) (1 -2)
|
||||
- Removes 'bad decisions'/ 'useless' from the trail
|
||||
- Can reduce search space from exponential to quadratic in number of bad decisions
|
||||
- Whatever that means
|
||||
|
||||
# CDCL
|
||||
- DPLL with learning
|
||||
- On conflict, learn a conflict clause which will help in further exploration
|
||||
- Usually the first UIP of the [implication graph](SAT_in_general#Implication Graph) is used as conflict clause
|
||||
- After learning a conflict:
|
||||
- Back-jump to the lowest level in the implication graph supporting the UIP
|
||||
- Assign negated UIP literal
|
||||
- this is why first UIP is good (“pulls in” as few decision levels as possible)
|
||||
## Reduction
|
||||
- Not all clauses are useful forever
|
||||
- Useless via Subsumption, or trivially satisfied by units
|
||||
- Try to reduce the amount of clauses you need to consider in BCP
|
||||
- Schedule throwing away clauses
|
||||
- geometric, Luby, arithmetic scheme
|
||||
- Consider various heuristics
|
||||
- Size
|
||||
- Last Recently Used (LRU),
|
||||
- Clause Move To Front (CMTF)
|
||||
- Clause Scores similar to VSIDS
|
||||
- Glucose/ Literal Block Distance (LBD)
|
||||
- LBD = number of distinct decision levels among a (learned) clause's literals
|
||||
- Low LBD ("glue clause"): literals tightly related across few levels -> likely useful, keep
|
||||
- High LBD: literals span many levels, weakly related -> good deletion candidate
|
||||
- Used flag
|
||||
## Restarts
|
||||
- Schedule restarts every so often can improve performance
|
||||
- Throw away the trail
|
||||
- Keep (most) learned clauses, phase saving, other state
|
||||
- Idea:
|
||||
- The solver might have zoomed in on an efficient part of the search space
|
||||
- For SAT instances might stuck in a UNSAT part
|
||||
- For UNSAT instances might miss a shorter proof
|
||||
- Avoid going down the same path by keeping what was learned
|
||||
- Clauses, phase saving, variable scoring
|
||||
|
||||
## Phase saving
|
||||
- Whenever assigning a variable, save the phase it is assigned
|
||||
- When deciding on a variable assign the saved phase
|
||||
- Idea: Go down the right branch of the search tree
|
||||
|
||||
Reference in New Issue
Block a user