Splitting clauses into clauses of width three #
A clause l₁ ∨ l₂ ∨ ⋯ ∨ lₘ with m > 3 is equisatisfiable with the chain of width-three clauses
(l₁ ∨ l₂ ∨ y₀) ∧ (¬y₀ ∨ l₃ ∨ y₁) ∧ ⋯ ∧ (¬yₘ₋₄ ∨ lₘ₋₁ ∨ lₘ)
in fresh variables y₀, …, yₘ₋₄: in a satisfying assignment yⱼ can be taken to say that one of
the literals after lⱼ₊₂ is true Arora and Barak, Section 2.3.1. Splitting every
clause of a formula, with the fresh variables of a clause indexed by its position, gives a formula
with clauses of width at most three that is satisfiable exactly when the original one is.
Main definitions #
Cslib.Logic.PL.Clause.split3: the chain of width-three clauses for one clause.Cslib.Logic.PL.CNF.to3CNF: every clause split, over the variablesV ⊕ (ℕ × ℕ).
Main results #
Cslib.Logic.PL.CNF.length_le_three_of_mem_to3CNF: every clause has at most three literals.Cslib.Logic.PL.CNF.satisfiable_to3CNF: splitting preserves satisfiability.Cslib.Logic.PL.CNF.length_to3CNF,Cslib.Logic.PL.CNF.countUnsat_comp_inl_le_countUnsat_to3CNF: splitting replaces a clause of widthw ≥ 3byw - 2clauses and keeps every falsified clause falsified.
References #
One clause #
Formulas #
Splitting the clauses of a formula preserves satisfiability.
The number of clauses after splitting.
Splitting keeps falsified clauses falsified: an assignment of the split formula falsifies at least as many clauses as its restriction to the original variables falsifies in the original formula.