by Yu Feng

Only handle formula in CNF:
F1 ∧ F2 ∧ … ∧ Fn
Is B(F) satisfiable?
Is F satisfiable?
Offline-DPLL(T-formula φ)
φᵖ ← B(φ)
while (TRUE) do
μᵖ, res ← CDCL(φᵖ)
if res = UNSAT then return UNSAT
else
T-res ← T-solve(B⁻¹(μᵖ))
if T-res = SAT then return SAT
else φᵖ ← φᵖ ⋀¬μᵖB⁻¹(F) = x = y ∧ x < y ∧ a1 ∧ a2 ∧ . . . ∧ a2019{2^{2019}} UNSAT assignments containing
x = y ∧ x < y but ¬A prevents only one of them
Offline-DPLL(T-formula φ)
φᵖ ← B(φ)
while (TRUE) do
μᵖ, res ← CDCL(φᵖ)
if res = UNSAT then return UNSAT
else
T-res ← T-solve(B⁻¹(μᵖ))
if T-res = SAT then return SAT
else
t ← B(UNSATCORE(B⁻¹(μᵖ)))
φᵖ ← φᵖ ⋀ ¬tBetter but still need a full assignment to the boolean abstraction in order to generate a conflict clause.



The lemmas prevents bad assignments to boolean abstraction

DPLL(T)(Formula φ, Assignment μ)
if all variables assigned in μ then
if T-Consistent(μ) then return SAT
else learn conflict clause and backtrack
else if φ contains empty clause then
learn conflict clause and backtrack
else
var ← PickBranchLiteral()
result ← DPLL(T)(φ, μ ∪ {var})
if result = UNSAT then
return DPLL(T)(φ, μ ∪ {¬var})
else
return result
// Theory checks happen during propagation