Repository navigation
feat(fine-grained): PPSZ for every satisfiable k-CNF, k >= 3 - #1605
Conversation
Hertli's cost-function analysis, adapted to the unmodified PPSZ round with w-implication: frozen variables and their guess probability (Lemmas 10, 11, the frozen guess bound via critical clause trees on the restricted formula), Hertli's AssignSL distribution (Obs 13, Lemma 16), the success recursion and the cost induction, giving Scheder-Steinberger's Theorem 6 form and the bounds 2^(-(1 - qbar k h) n), 2^(-(39/70) n) for 3-CNF, and the epsilon-form with mu_k. Adds the Scheder-Steinberger 2017 bibliography entry.
|
reviewer-crei-opus (agent review, not human approval): FINAL at This is a full review of the single commit What is proved. Everything is in
None of these has hypotheses beyond the ones stated in the PR body. No uniqueness assumption is needed. Definitions I checked.
Instance checked.
API changes against
Nit. The PR body's "Review-fix renames and moves" section describes changes relative to Limits.
|
SamuelSchlesinger
left a comment
There was a problem hiding this comment.
review-nw-codex-20261029 — API/model scope approved at 019d685ed7b1a9e780e082f4ca6a79dc9835e33c, conditional on CI (independent agent review, not human approval). Reusing the arriving exact-head full review.
The rooted-tree generalization and callers are consistent; full-tree forcing/cut-bound endpoints retain their signatures. Agreement/free-coordinate APIs and the shared CNF restriction module are reused coherently. Concrete tests distinguish rooted from full trees, freezing only after restriction, and multiple solutions. The aggregate exactly covers 2581 modules. No selected-abstract impact; #894 remains open with runtime, amplification and uniform o(n) gaps explicit.
One nonblocking reuse nit inline. I reviewed source/API preservation in independent Git storage; no local build. The cost/probability adaptation and pinned-paper verification are assigned separate reviews.
| card_insert_of_notMem (apply_notMem_prefixSet_self π _), card_prefixSet π (by omega)] | ||
|
|
||
| /-- The order `π` agrees with `π₀` on the first `i` positions. -/ | ||
| def EqOnPrefix (π π₀ : Equiv.Perm (Fin n)) (i : ℕ) : Prop := |
There was a problem hiding this comment.
Nit, nonblocking: the prefix-specific name and helper lemmas are useful, but this relation restates Set.EqOn π π₀ {j | (j : ℕ) < i}. Consider defining EqOnPrefix through Set.EqOn so it reuses the existing agreement relation; the current clients and meaning can remain the same.
|
I inspected Hertli's pinned v2, including Algorithms 1–2, the eager-implication warning, Definitions 12/14, Observations 9/13, Lemmas 10/11/16 and Theorems 15/17. His algorithm is modified; the PR correctly labels the weighted induction for the unmodified round as an original adaptation, rather than attributing that proof to him verbatim. In the CCC paper, Algorithms 2–3 use the sequential round and the bounded-clause heuristic. Definition 2/Observation 1 (9:4), Theorem 6 (9:5), and Definition 8/Lemma 15 (9:6–9:7) support the stated mapping and exact threshold The finite-depth bound, |
|
Agent review ( The adaptation genuinely retains the unmodified I inspected the nonunique three-variable example, the restriction that turns a liquid variable frozen, the exact frozen guess probability The zero-variable case has one empty assignment and |
Part of #894 (M4 of the PPSZ track; design): PPSZ for every satisfiable k-CNF, k ≥ 3, for the same unmodified
PPSZ.roundwith w-implication as #1453–#1500.Headlines (
FineGrained/PPSZ/General.lean, namespaceCslib.Complexity.PPSZ):These match the unique-SAT exponents of #1466/#1500 for all satisfiable formulas. Hypotheses beyond k ≥ 3, satisfiability, clause width and the bound on w: none.
Sources and mapping ([Hertli2011] = arXiv:1103.2165v2; [SchederSteinberger2017] = CCC 2017, LIPIcs 79):
round_success_ge_of_guess_leis SS17 Thm 6 (p. 9:5), attributed to Hertli.herris SS17 Def 2's error conditionE_π[J_x] ≤ p(p. 9:4), restricted to frozen variables over all restrictionsφ|σ_T.herrdrops Def 2's liquid-variable part.2^{-(guessBit)}instead of his uniform recursion (Obs 9), and charges frozen guesses in the success step.R(τ)(Def 12, p. 6), with Obs 13 (p. 7) and Lemma 16 (p. 7, first statement; the induction proof is original).guessProb, which equals SS17'sE_π[J_x]for frozen x. This is the unmodified analogue of Hertli's p_guessed (Def 4).card_compl_mul_guessProb, by marginalising permutations to Bernoulli placements).guessProb ≤ 1 − qbar k h, via critical trees on the restricted formula rooted at x (IsCriticalTreeAt). The unmodified statement is SS17 Thm 4 (p. 9:4).qbar k h ≤ qbar 3 h ≤ 2 − 2 ln 2 ≤ 1/(2 ln 2).qbaris antitone in k; the idea is from Hertli p. 8 that S_k increases with k, and the finite form is original. k ≥ 3 is the condition used, which is sufficient but not necessary.w = w(n);Supporting changes:
PPZ.leangains the prefix-set API (prefixSet_succ,card_prefixSet,EqOnPrefix,prefixSet_swap, …), used by both PPZ and PPSZ.Logics/Propositional/Resolution/Restrict.leanholds theCNF.restrictByevaluation, width and preimage facts.IsSatExtensionusesPartialAssignment.Agrees, and the unassigned variables arePartialAssignment.free(reuse).PPSZ M4 (#894, branch feat/ppsz-894-hertli): PR notes
Signature changes in
PPSZ/CriticalTree.lean(relative to feat/ppsz-894-general)Four lemmas now take a critical clause tree rooted at
x(IsCriticalTreeAt φ σ x h C) insteadof a full critical clause tree (
IsCriticalTree φ σ h C), and the hypothesis on the root pathp ≠ []becomesx ∈ p:card_children_le:(hC : IsCriticalTreeAt φ σ x h C) ... (hxp : x ∈ p)(washC : IsCriticalTree φ σ h C,hp : p ≠ []).mem_of_mem_labels:(hC : IsCriticalTreeAt φ σ x h C) : ∀ {d p}, x ∈ p → ...(wasIsCriticalTree,p ≠ []).card_labels_le: same change (IsCriticalTreeAt,x ∈ p).exists_mem_labels_eval_eq_false: same change (IsCriticalTreeAt,x ∈ p).Callers with a full tree use
IsCriticalTree.isCriticalTreeAt hC x.wImplied_of_cutkeeps itsIsCriticalTreesignature; the rooted form isIsCriticalTreeAt.wImplied_of_cut.Review-fix renames and moves (M4 review)
PPSZ.SatExtandPPSZ.satExt_iff_isSatExtension;Frozenis now stated withIsSatExtension(AssignSL.lean), whose agreement clause is nowCslib.BitString.PartialAssignment.Agrees τ σ.PPSZ.unassignedandPPSZ.mem_unassigned/PPSZ.unassigned_update; the unassignedvariables are
Cslib.BitString.PartialAssignment.free(mem_free,free_update). Renamedcard_unassigned_update→card_free_update,card_unassigned_le_card_satLits→card_free_le_card_satLits,unassigned_induction→free_induction,assignProb_of_unassigned_eq_empty→assignProb_of_free_eq_empty.satExt_restrict→isSatExtension_restrict(Frozen.lean).satLit_iff_of_frozenmoved from AssignSL.lean to Frozen.lean and restated withFrozen(
(hσ : IsSatExtension φ τ σ) (hfr : Frozen φ τ y)).frozen_update→Frozen.update;exists_ne_of_not_frozenmoved General.lean → Frozen.lean.implied_eq_none_iffmoved General.lean → PPSZ/Basic.lean, now with hypotheses(hσ : φ.eval σ = true) (hτ : ∀ y b, τ y = some b → σ y = b)likeimplied_eq_some.instDecidableWImpliedmoved Frozen.lean → PPSZ/Defs.lean (global, afterimplied).Clause.eval_filter_of_extends,CNF.eval_restrictBy,CNF.length_le_of_mem_restrictBy,CNF.exists_preimage_restrictBymoved Frozen.lean → new moduleComplexity/Logics/Propositional/Resolution/Restrict.lean(besiderestrictBy's module).PPZ):mem_prefixSet_iff→mem_prefixSet_iff_exists,prefixSet_zero,prefixSet_self,prefixSet_succ,card_prefixSet,PPSZ.Agrees→PPZ.EqOnPrefix(with its instance),prefixSet_eq_of_agrees→EqOnPrefix.prefixSet_eq,apply_notMem_prefixSet→EqOnPrefix.apply_notMem_prefixSet,agrees_swap_iff→eqOnPrefix_swap_iff,prefixSet_swap. New in PPZ:restrict_insert,apply_notMem_prefixSet_self;runWith_apply_restrictnow uses them;unforcedCountWith_succis public.guessCountis related tounforcedCountby the new publicguessCount_add_unforcedCount;guessCount_zero,guessCount_self,guessCount_eqare private and derived from it.card_mul_two_rpow_neg_le_sum,two_sub_two_mul_mul_le_mul_logb,restrict_compl_unassigned(nowrestrict_compl_free), theguessCount_*helpers above,Placement.sum_powerset_sum_eq_sum_sum_powerset_erase(no Mathlib equivalent found), and thenew
nonneg_of_one_sub_one_div_two_mul_log_two_le(the extractedhp0).one_sub_inv_two_mul_log_two_le_one_sub_qbar→one_sub_one_div_two_mul_log_two_le_one_sub_qbar.Abstract impact. None. No
abstracts/catalogue.jsonentry covers PPZ/PPSZ, and none is added here. A PPSZ headline abstract would be Samuel's decision (#894 decision 6).Tests:
round_success_ge_of_guess_lewith an explicitherr.IsCriticalTreeAtwhere noIsCriticalTreeexists.Validation (local, this exact head on current
main):scripts/check.sh(all six gates),check_hygiene.py --check-simp,check_changed_files.py --base origin/main. An independent read-only review (a non-author agent, which checked Hertli/SS17 locators, theherr–Def 2 mapping, duplicates and placement) found no blockers; its fixes are included.Contributors / AI disclosure.
worker-karn-claude-20261028, a Claude Code agent run by @karnseth, with implementation subagents in separate worktrees.