Sparsification on formulas #
The branching step of the sparsification procedure on formulas in conjunctive normal form, as
list operations: reduction (CNF.Sparsification.reduce), flowers and petals, the children
(CNF.Sparsification.child) and a computed heavy-heart choice (CNF.Sparsification.choice).
Formulas are kept in a normal form (CNF.Sparsification.Normalized): no clause repeats a literal or
has more than k literals, no two clauses have the same literals, and no clause strictly contains
another. Then a formula and its clause set have the same number of clauses, and the list operations
compute the clause-set operations of Cslib.Logic.PL.ClauseSet.Sparsification
(CNF.Sparsification.toClauseSet_child). Any formula of width k is brought into normal form by
CNF.Sparsification.normalize.
The candidate hearts of a clause C are its sublists selected by the subsets of the first k
positions (CNF.Sparsification.hearts); for clauses of width k these are all of its subclauses,
so every heavy heart is a candidate. The choice takes a heavy candidate of least rank
c (k + 1) + (k - |H|), which has the smallest clause size c and then the largest heart: a
valid choice (CNF.Sparsification.choice_spec). So the list-level step is a branching rule
(CNF.Sparsification.rule) on the formulas in normal form, to which the analysis of the branching
tree applies.
Main definitions #
Cslib.Logic.PL.CNF.Sparsification.subclause,Cslib.Logic.PL.CNF.Sparsification.reduce,Cslib.Logic.PL.CNF.Sparsification.flower,Cslib.Logic.PL.CNF.Sparsification.petals,Cslib.Logic.PL.CNF.Sparsification.intro,Cslib.Logic.PL.CNF.Sparsification.child,Cslib.Logic.PL.CNF.Sparsification.heavy,Cslib.Logic.PL.CNF.Sparsification.hearts,Cslib.Logic.PL.CNF.Sparsification.candidates,Cslib.Logic.PL.CNF.Sparsification.rank,Cslib.Logic.PL.CNF.Sparsification.choice,Cslib.Logic.PL.CNF.Sparsification.next: the list-level step.Cslib.Logic.PL.CNF.Sparsification.isSparse: the list-level test for sparseness.Cslib.Logic.PL.CNF.Sparsification.dedup,Cslib.Logic.PL.CNF.Sparsification.dedupClauses,Cslib.Logic.PL.CNF.Sparsification.normalize,Cslib.Logic.PL.CNF.Sparsification.Normalized: the normal form.Cslib.Logic.PL.CNF.Sparsification.rule: the list-level branching rule.
Main results #
Cslib.Logic.PL.CNF.Sparsification.toClauseSet_child: the list-level children compute the clause-set children.Cslib.Logic.PL.CNF.Sparsification.choice_spec: the computed choice is valid.Cslib.Logic.PL.CNF.Sparsification.isSparse_eq_true_iff: the list-level test decides sparseness.
References #
The list operations #
Whether every literal of D is a literal of C.
Instances For
Remove every clause whose literals strictly contain those of another clause.
Instances For
The flower of H at clause size c: the clauses of length c containing the literals of
H.
Instances For
The petals C \ H of the flower of H.
Instances For
The clauses a branch introduces: the heart (false) or the petals (true).
Instances For
A child of a branching node: add the introduced clauses and reduce.
Instances For
Whether no candidate is a heavy heart.
Instances For
One branching step: the heart (false) or petal (true) child for the computed choice.
Instances For
Remove repeated literals of a clause, keeping first occurrences.
Instances For
Remove every clause with the same literals as an earlier clause.
Instances For
The normal form of a formula: repeated literals and clauses removed, and reduced.
Instances For
Clause sets of formulas #
A clause set C belongs to ψ.toClauseSet if and only if D.toFinset = C for some clause
D ∈ ψ.
reduce ψ is a sublist of ψ.
The list-level reduction computes the reduction of clause sets.
The list-level flower computes the clause-set flower when clauses have no repeated literals.
The list-level petals compute the clause-set petals when clauses have no repeated literals.
The list-level children compute the clause-set children.
The normal form #
The normal form of the list-level procedure, for width k: no clause repeats a literal or
has more than k literals, no two clauses have the same literals, and no clause strictly contains
another.
- nodup (C : Clause V) : C ∈ ψ → List.Nodup C
- length_le (C : Clause V) : C ∈ ψ → List.length C ≤ k
- nodup_toFinset : (List.map List.toFinset ψ).Nodup
- reduced : ClauseSet.Sparsification.Reduced ψ.toClauseSet
Instances For
A formula in normal form has as many clauses as its clause set.
Every clause in the clause set of a k-normalized formula has at most k literals.
Candidates #
Every candidate heart of C is a sublist of C.
The computed choice is valid. At a formula in normal form that is not sparse, the computed choice is a heavy heart with the smallest clause size, and among those the largest heart.
The list-level test decides sparseness of formulas in normal form.
The step preserves the normal form #
The clause set of next θ k ψ b equals the clause-set child for the computed choice.
At a non-sparse k-normalized formula, one branching step preserves normal form.
The branching rule #
The list-level branching rule, on formulas in normal form: the computed choice, and at a sparse formula no step.
Instances For
Normalization #
Deduplicating a clause preserves its set of literals.
dedupClauses ψ is a sublist of ψ.
Deduplicating clauses produces clauses with pairwise distinct literal sets.
Deduplicating clauses preserves the clause set.
Normalization. Every formula of width k has a normal form with the same solutions.
The clause set of normalize φ has the same solutions as φ.