Expand description
The PR (propagation-redundancy) checker — the trust tier for model-removing clause additions, and the keystone that makes certified symmetry breaking possible.
RUP (crate::rup) certifies only clauses implied by the formula. A symmetry-breaking
predicate is different in kind: it deletes satisfying assignments (keeping at least one per
symmetry orbit), so it is satisfiability-preserving but not implied — RUP must and does
reject it. Propagation redundancy (Heule, Kiesl & Biere, CADE 2017) closes exactly this
gap: a clause C is redundant w.r.t. F with witness ω iff ω satisfies C and
F|α ⊢₁ F|ω, where α = ¬C is the assignment falsifying C and ⊢₁ is implication by
unit propagation. Adding such a C preserves satisfiability, with an independently
checkable certificate.
Two witness forms are checked, each with its own well-specified criterion:
Witness::Assignmentω— the classic PR criterionω ⊨ CandF|α ⊢₁ F|ω. This is the general redundancy tier (vivification, BVE, …).Witness::Substitutionσ— the substitution-redundancy criterion for a symmetry. Repair a modelτofF ∧ ¬Cby composing withσ: the resultτ∘σsatisfiesFautomatically whenσ(F) = F, and satisfiesCexactly whenτ ⊨ σ(C). SoCis redundant iffσis an automorphism of the database ANDF ∧ ¬C ⊢₁ σ(C)(Heule & Biere, substitution redundancy). The automorphism is checked against the current database, so an earlier predicate that breaks a later generator’s symmetry simply makes that check fail — fail-closed, no generator-ordering hazard.
The checker reuses the very same tiny unit-propagation core as crate::rup: its
simplicity IS the trust, and it is wrapped by a brute-force equisatisfiability oracle over
BOTH witness forms in the tests so it can never bless a clause that turns a satisfiable
formula unsatisfiable.
Functions§
- check_
pr_ refutation - Verify a refutation made of
ProofSteps overoriginal. Each step’s added clause must check (RUP or PR) against the database built so far; then the empty clause must be RUP. Returnsfalseif any step fails to check — a bogus or unsound proof is rejected. - check_
pr_ refutation_ fast check_pr_refutationaccelerated by an incrementally-maintainedAutomorphismIndex— the same verdict, but each substitution step’s automorphism re-check costsO(support)rather thanO(|db|). Falls back to the stateless checker if the proof deletes clauses (the index is append-only, and certified symmetry refutations do not delete).- is_pr
- Is
clausepropagation-redundant w.r.t.dbunderwitness? - is_
pr_ indexed is_prwith the automorphism re-check served by a pre-built incrementalAutomorphismIndex(which must hold exactly the clauses ofdb). Identical verdict tois_pr— the index is an acceleration structure — but the substitution path no longer rebuilds the membership set per call, the difference between anO(n⁴)and anO(n³)certified refutation.