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.child,.choice,.next: the list-level step.Cslib.Logic.PL.CNF.Sparsification.isSparse: the list-level test for sparseness.Cslib.Logic.PL.CNF.Sparsification.Normalized,.normalize: 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 #
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.
Candidates #
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 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 #
Normalization. Every formula of width k has a normal form with the same solutions.