Occurrence splitting #
Each literal occurrence receives its own copy of its variable, indexed by its clause and literal positions. Binary implication cycles force all copies of an original variable to agree. Literal occurrences include repetitions within one clause. This is the construction in Papadimitriou, Proposition 9.3. Only the bound on occurrences of each variable is formalized here; the additional bound of two occurrences per signed literal is not claimed.
Adapted from lean-trominoes at 6d5b36c15cec6cb18d30137b7f1c7fb92ea24332,
PeriodicThreeSATThree.lean,
PeriodicThreeSATThreeCorrectness.lean, and
PeriodicThreeSATThreeExactSize.lean.
This construction uses ordinary CNF formulas and Boolean assignments.
The model-count preservation proof is original here, an elementary consequence of copies_agree.
Main definitions #
Cslib.Logic.PL.CNF.occurrenceClauses: separate the literal occurrences.Cslib.Logic.PL.CNF.toThreeOccurrence: add implication cycles to the separated clauses.
Main results #
Cslib.Logic.PL.CNF.eval_toThreeOccurrence_iff: correspondence of satisfying assignments.Cslib.Logic.PL.CNF.satisfiable_toThreeOccurrence: equisatisfiability.Cslib.Logic.PL.CNF.modelCount_toThreeOccurrence: preservation of satisfying-assignment counts.Cslib.Logic.PL.CNF.width_toThreeOccurrence: preservation of width bounds of at least two.Cslib.Logic.PL.CNF.count_vars_toThreeOccurrence_le: at most three literal occurrences.Cslib.Logic.PL.CNF.length_toThreeOccurrence,Cslib.Logic.PL.CNF.length_vars_toThreeOccurrence,Cslib.Logic.PL.CNF.numVars_toThreeOccurrence: exact linear clause, literal and variable counts.
References #
Replace each literal by a copy named by its original variable and its two positions.
Cslib.Logic.PL.occurrences enumerates the same positions as a flat list of triples
(clause index, literal index, literal). This clause-preserving traversal instead names each
copy (original variable, clause index, literal index), retaining the original clause
boundaries.
Instances For
The copies belonging to one variable, in their original occurrence order.
Instances For
Split literal occurrences, then add one directed implication cycle per original variable.
Instances For
Copying literals preserves the list of clause lengths.
Forgetting copy indices recovers the original formula.
Forgetting copy indices recovers the original variable-occurrence list.
Every cycle block forces its copies to agree.
An assignment satisfies the split formula exactly when its occurring copies agree with a
satisfying assignment of the original formula. Together with copies_agree, this retains the
assignment correspondence, rather than just equisatisfiability.
Occurrence splitting preserves satisfiability, including empty clauses and formulas.
Cycles are binary, so a width bound of at least two is preserved.
Every literal occurrence gets a distinct copy, even repeated literals in one clause.
A copy occurs exactly three times in the output: once in a source clause, once as the antecedent of an implication, and once as its consequent.
Every variable has at most three literal occurrences, counting repetitions.
The number of copies belonging to an original variable is its literal-occurrence count.
Splitting adds exactly one binary clause per input literal occurrence.
Splitting triples the total number of literal occurrences.
There is exactly one distinct output variable per input literal occurrence.
Occurrence splitting preserves the number of satisfying assignments on occurring variables, including empty formulas, empty clauses, and repeated literals.