Skip to content
Browse chapters
Imports

Column totals of the assignment certificate

The selected variable item contributes one to its own variable column and the number of true literal occurrences to each clause column. The selected unit slack copies fill every satisfied clause column to four.

namespace CLRS.Chapter34.SubsetSumReductiontheorem assignmentChoiceItems_variable_column (formula : CNF) (assignment : Nat → Bool) {column : Nat} (hcolumn : column < reductionVariableCount formula) : columnSum formula (assignmentChoiceItems formula assignment) column = 1 := by simp [columnSum, assignmentChoiceItems, Finset.sum_image, hcolumn]theorem assignmentChoiceItems_clause_column (formula : CNF) (assignment : Nat → Bool) (clause : Nat) : columnSum formula (assignmentChoiceItems formula assignment) (reductionVariableCount formula + clause) = assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) := by simp [columnSum, assignmentChoiceItems, Finset.sum_image, assignmentClauseCount]theorem assignmentSlackItems_variable_column (formula : CNF) (assignment : Nat → Bool) {column : Nat} (hcolumn : column < reductionVariableCount formula) : columnSum formula (assignmentSlackItems formula assignment) column = 0 := by simp [columnSum, assignmentSlackItems, Finset.sum_image, hcolumn] theorem assignmentSlackItems_clause_column (formula : CNF) (assignment : Nat → Bool) {clause : Nat} (hclause : clause < formula.length) (hpos : 0 < assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause [])) (hle : assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) ≤ 3) : columnSum formula (assignmentSlackItems formula assignment) (reductionVariableCount formula + clause) = 4 - assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) := by unfold columnSum assignmentSlackItems rw [Finset.sum_image] · rw [Finset.sum_filter] calc _ = ∑ source ∈ Finset.range formula.length, ∑ slot ∈ Finset.range 3, if slot < 4 - assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD source []) then itemDigit formula (.slack source slot) (reductionVariableCount formula + clause) else 0 := Finset.sum_product _ _ _ _ = _ := by rw [Finset.sum_eq_single clause] · simp only [itemDigit_slack_clause_column, ↓reduceIte] change (∑ slot ∈ Finset.range 3, if slot < 4 - assignmentClauseCount (reductionVariableCount formula) assignment (List.getD formula clause []) then 1 else 0) = 4 - assignmentClauseCount (reductionVariableCount formula) assignment (List.getD formula clause []) have hcountCases : assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) = 1 ∨ assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) = 2 ∨ assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) = 3 := by omega rcases hcountCases with hcount | hcount | hcount · rw [hcount] decide · rw [hcount] decide · rw [hcount] decide · intro source hsource hne simp [Ne.symm hne] · simp [hclause] · intro a ha b hb hab injection hab with hfirst hsecond exact Prod.ext hfirst hsecond theorem assignmentClauseCount_bounds_of_eval {formula : CNF} {assignment : Nat → Bool} (hthree : IsThreeCNF formula) (heval : evalCNF assignment formula) {clause : Nat} (hclause : clause < formula.length) : 0 < assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) ∧ assignmentClauseCount (reductionVariableCount formula) assignment (formula.getD clause []) ≤ 3 := by have hmem : formula[clause] ∈ formula := List.getElem_mem hclause have hbound : ∀ literal ∈ formula.getD clause [], literalIndex literal < reductionVariableCount formula := by rw [List.getD_eq_getElem formula [] hclause] intro literal hliteral exact literalIndex_lt_reductionVariableCount hmem hliteral constructor · apply assignmentClauseCount_pos assignment hbound rw [List.getD_eq_getElem formula [] hclause] exact heval _ hmem · exact le_trans (assignmentClauseCount_le_length assignment hbound) (clauseAt_length_le_three hthree clause) theorem columnSum_assignmentItems_variable (formula : CNF) (assignment : Nat → Bool) {column : Nat} (hcolumn : column < reductionVariableCount formula) : columnSum formula (assignmentItems formula assignment) column = targetDigit formula column := by rw [assignmentItems, columnSum, Finset.sum_union (assignmentChoiceItems_disjoint_assignmentSlackItems formula assignment)] rw [← columnSum, ← columnSum, assignmentChoiceItems_variable_column formula assignment hcolumn, assignmentSlackItems_variable_column formula assignment hcolumn] simp [targetDigit, hcolumn] theorem columnSum_assignmentItems_clause {formula : CNF} {assignment : Nat → Bool} (hthree : IsThreeCNF formula) (heval : evalCNF assignment formula) {clause : Nat} (hclause : clause < formula.length) : columnSum formula (assignmentItems formula assignment) (reductionVariableCount formula + clause) = targetDigit formula (reductionVariableCount formula + clause) := by obtain ⟨hpos, hle⟩ := assignmentClauseCount_bounds_of_eval hthree heval hclause rw [assignmentItems, columnSum, Finset.sum_union (assignmentChoiceItems_disjoint_assignmentSlackItems formula assignment)] rw [← columnSum, ← columnSum, assignmentChoiceItems_clause_column formula assignment clause, assignmentSlackItems_clause_column formula assignment hclause hpos hle] rw [targetDigit_clause_column] omega theorem columnSum_assignmentItems_eq_target {formula : CNF} {assignment : Nat → Bool} (hthree : IsThreeCNF formula) (heval : evalCNF assignment formula) : ∀ column < reductionWidth formula, columnSum formula (assignmentItems formula assignment) column = targetDigit formula column := by intro column hcolumn by_cases hvariable : column < reductionVariableCount formula · exact columnSum_assignmentItems_variable formula assignment hvariable · have hclause : column - reductionVariableCount formula < formula.length := by simp only [reductionWidth] at hcolumn omega have hcolumnEq : column = reductionVariableCount formula + (column - reductionVariableCount formula) := by omega rw [hcolumnEq] exact columnSum_assignmentItems_clause hthree heval hclause theorem sum_assignmentItems_eq_target {formula : CNF} {assignment : Nat → Bool} (hthree : IsThreeCNF formula) (heval : evalCNF assignment formula) : (∑ item ∈ assignmentItems formula assignment, itemValue formula item) = reductionTarget formula := by rw [sum_itemValue_eq_pack_columnSum] exact packColumns_congr (columnSum_assignmentItems_eq_target hthree heval)end CLRS.Chapter34.SubsetSumReduction