Counting sparsification on CNF formulas #
List-level operations for the counting sparsification refinement of Appendix A.1 [OAI26c]:
tautology removal (removeTautologies), nontautological normalization (countingNormalize),
singleton negated-heart unit clauses (negatedHeartUnits), the disjoint counting children
(countingChild), and one deterministic counting-sparsification step (countingNext).
Initial preprocessing (countingNormalize φ = normalize (removeTautologies φ)) removes tautologies,
deduplicates literals and clauses, and reduces to a subset-minimal antichain. At each branching step
on a heavy heart H satisfying deg_c(H) ≥ θ_{c - |H|} (equation (A.1), p. 44, with the
unnumbered threshold schedule θ j = M ^ j), the false (A) branch adds H while the true (B)
branch adds both the petals petals ψ c H and the singleton negated-heart units
negatedHeartUnits H [OpenAI2026ETH, Appendix A.1, equation (A.2), pp. 44–45]. Applying
dedupClauses before reduce restores the duplicate-free antichain (CountingNormalized) across
steps without re-running tautology removal, while computing the exact clause-set operation
ClauseSet.Sparsification.countingChild (toClauseSet_countingChild) and conserving the
declared-variable model count (modelCountOn_countingChild).
Main definitions #
Cslib.Logic.PL.CNF.Sparsification.Clause.isTautology,Cslib.Logic.PL.CNF.Sparsification.removeTautologies,Cslib.Logic.PL.CNF.Sparsification.countingNormalize: tautology removal and normalization.Cslib.Logic.PL.CNF.Sparsification.negatedHeartUnits,Cslib.Logic.PL.CNF.Sparsification.countingIntro,Cslib.Logic.PL.CNF.Sparsification.countingChild,Cslib.Logic.PL.CNF.Sparsification.countingNext: the list-level counting step.Cslib.Logic.PL.CNF.Sparsification.countingThreshold: the counting thresholdsθ j = M ^ j.Cslib.Logic.PL.CNF.Sparsification.Nontautological,Cslib.Logic.PL.CNF.Sparsification.CountingNormalized: the nontautological normal form.
Main results #
Cslib.Logic.PL.CNF.Sparsification.eval_countingNormalize,Cslib.Logic.PL.CNF.Sparsification.modelCountOn_countingNormalize,Cslib.Logic.PL.CNF.Sparsification.countingNormalized_countingNormalize: nontautological normalization preserves evaluation and declared-variable model counts.Cslib.Logic.PL.CNF.Sparsification.toClauseSet_countingChild,Cslib.Logic.PL.CNF.Sparsification.toClauseSet_countingNext: the list-level counting children compute the clause-set counting children.Cslib.Logic.PL.CNF.Sparsification.modelCountOn_countingChild,Cslib.Logic.PL.CNF.Sparsification.modelCountOn_countingNext: additive conservation ofCNF.modelCountOnacross both branches.Cslib.Logic.PL.CNF.Sparsification.countingNormalized_countingChild,Cslib.Logic.PL.CNF.Sparsification.countingNormalized_countingNext: the counting step preserves the nontautological normal form.
References #
Tautology removal and counting normalization #
Whether a clause contains both a literal and its negation.
Instances For
Remove tautological clauses from a CNF formula.
Instances For
Bring a formula into nontautological normal form: remove tautological clauses, deduplicate literals and clauses, and reduce by strict subset containment.
Instances For
Singleton clauses [-l] for each literal l of a heart H.
Instances For
The clauses introduced by a counting-sparsification branch: the heart (false) or the petals
together with the singleton negated-heart units (true).
Instances For
A counting child of a branching node: append the introduced clauses, deduplicate clauses with identical literal sets, and reduce by strict subset containment.
Instances For
One deterministic counting-sparsification step using the computed choice choice θ k ψ.
Instances For
The counting-sparsification threshold schedule θ j = M ^ j (defined on p. 44 of
[OpenAI2026ETH, Appendix A.1] for 0 ≤ j < k, extended here to a total function on ℕ, and used
in the heavy-heart branching inequality deg_c(H) ≥ θ_{c - |H|} of equation (A.1)).
Instances For
For 1 ≤ M, every counting threshold is positive.
Nontautological normal form #
A CNF formula is nontautological if no clause contains both a literal and its negation.
Instances For
The normal form for list-level counting sparsification at width k: Normalized k ψ together
with Nontautological ψ.
- nontautological : Nontautological ψ
Instances For
Any tautological clause evaluates to true under every assignment.
removeTautologies φ is a sublist of φ.
Removing tautological clauses preserves evaluation under every assignment.
Removing tautological clauses preserves the declared-variable model count.
removeTautologies φ is nontautological.
The clause set of countingNormalize φ has the same satisfying assignments as φ.
countingNormalize φ evaluates identically to φ under every assignment.
countingNormalize φ preserves the declared-variable model count.
Every clause of countingNormalize φ has the literals of a nontautological clause of φ.
The number of clauses of countingNormalize φ is at most that of φ.
Every variable occurring in countingNormalize φ occurs in φ.
Every formula of width k is brought into nontautological normal form by
countingNormalize.
Agreement with clause-set counting operations #
The clause set of negatedHeartUnits H is ClauseSet.Sparsification.negatedHeartUnits.
The list-level counting children compute the clause-set counting children.
The clause set of countingNext θ k ψ b equals the clause-set counting child for the computed
choice.
Additive model-count conservation for countingChild. On any formula ψ without repeated
literals in its clauses, the declared-variable model count equals the sum of the counts of its two
counting children.
Additive model-count conservation for countingNext. On any k-normalized formula ψ,
one deterministic counting-sparsification step splits the declared-variable model count additively
across its false and true branches.
Preservation of normal form under the counting step #
The counting children preserve CountingNormalized k whenever 1 ≤ k and the heart H is a
duplicate-free nontautological clause of width at most k.
One counting-sparsification step preserves CountingNormalized k.
Every literal occurring in countingChild ψ c H b occurs in ψ or has its variable in H.
Every literal occurring in countingNext θ k ψ b has its variable in declared whenever ψ
does.