CubicPathwidth.T4.DeletionXArith

Source file CubicPathwidth/T4/DeletionXArith.lean of the Lean project (how it is built).

import CubicPathwidth.T4.ProcessDefs

/-!
# The arithmetic of the deletion step (helper for `DeletionX`)

The inequality `J₁ + J₂ + J₃ + J₄ ≥ H_δ` of the proof of Proposition 9.10 (`prop:deletion`), in an abstract form: `C` is a connected set of vertices with
degrees `d` in `[3, Δ]`, `w ∈ C` has degree `Δ ≥ 6`, `N` is its neighbourhood, `d'` the
degrees after deleting `w`, and `J` plays the role of `J₄` (the hypothesis `hJ` is the
Claim of the manuscript).
-/

noncomputable section

namespace CubicPathwidth
namespace T4
namespace DelX

/-! ## The running minimum -/

theorem incr_nonneg {b : ℕ → ℝ} (hb : BootProps b) {d : ℕ} (hd : 3 ≤ d) :
    0 ≤ incr b d := by
  unfold incr
  have := hb.mono d hd
  linarith

theorem runMin_succ_add_three (b : ℕ → ℝ) (d : ℕ) :
    runMin b (d + 4) = min (runMin b (d + 3)) (incr b (d + 4)) := rfl

theorem runMin_nonneg {b : ℕ → ℝ} (hb : BootProps b) (j : ℕ) : 0 ≤ runMin b j := by
  have key : ∀ d : ℕ, 0 ≤ runMin b (d + 3) := by
    intro d
    induction d with
    | zero => exact incr_nonneg hb le_rfl
    | succ d ih =>
      rw [show d + 1 + 3 = d + 4 from rfl, runMin_succ_add_three]
      exact le_min ih (incr_nonneg hb (by omega))
  rcases Nat.lt_or_ge j 3 with h | h
  · interval_cases j <;> exact incr_nonneg hb le_rfl
  · obtain ⟨d, rfl⟩ : ∃ d, j = d + 3 := ⟨j - 3, by omega⟩
    exact key d

theorem runMin_succ_le {b : ℕ → ℝ} (j : ℕ) : runMin b (j + 1) ≤ runMin b j := by
  rcases Nat.lt_or_ge j 3 with h | h
  · interval_cases j <;> exact le_rfl
  · obtain ⟨d, rfl⟩ : ∃ d, j = d + 3 := ⟨j - 3, by omega⟩
    rw [show d + 3 + 1 = d + 4 from rfl, runMin_succ_add_three]
    exact min_le_left _ _

theorem runMin_anti (b : ℕ → ℝ) {i j : ℕ} (h : i ≤ j) : runMin b j ≤ runMin b i :=
  antitone_nat_of_succ_le (fun j => runMin_succ_le (b := b) j) h

theorem runMin_three (b : ℕ → ℝ) : runMin b 3 = incr b 3 := rfl

theorem runMin_le_incr (b : ℕ → ℝ) {j : ℕ} (hj : 3 ≤ j) : runMin b j ≤ incr b j := by
  rcases Nat.eq_or_lt_of_le hj with h | h
  · rw [← h]; exact le_rfl
  · obtain ⟨d, rfl⟩ : ∃ d, j = d + 4 := ⟨j - 4, by omega⟩
    rw [runMin_succ_add_three]
    exact min_le_right _ _

theorem incr_le {b : ℕ → ℝ} (hb : BootProps b) (j : ℕ) : incr b j ≤ b j := by
  unfold incr
  have := hb.nonneg (j - 1)
  linarith

theorem runMin_le_b {b : ℕ → ℝ} (hb : BootProps b) {j : ℕ} (hj : 3 ≤ j) :
    runMin b j ≤ b j := (runMin_le_incr b hj).trans (incr_le hb j)

/-! ## The core inequality -/

theorem deletion_core_ineq {α : Type*} [DecidableEq α] {b : ℕ → ℝ} (hb : BootProps b)
    (C N : Finset α) (w : α) (d d' : α → ℕ) (Δ δ : ℕ) (J : ℝ)
    (hΔ : 6 ≤ Δ)
    (hCd : ∀ v ∈ C, 3 ≤ d v ∧ d v ≤ Δ)
    (hwd : d w = Δ)
    (hNC : N ⊆ C.erase w) (hNcard : N.card = Δ)
    (hd'N : ∀ v ∈ N, d' v + 1 = d v)
    (hd'o : ∀ v ∈ C.erase w, v ∉ N → d' v = d v)
    (hδ : ∀ v ∈ C, δ ≤ d v) (hδ' : ∃ v ∈ C, d v = δ)
    (hreg : (∀ v ∈ C, d v = Δ) ∨ ∃ x ∈ N, d x < Δ)
    (hJ : ∀ u ∈ C.erase w, 3 ≤ d' u → runMin b (d' u) ≤ J)
    (hstar : ∃ u ∈ C.erase w, 3 ≤ d' u) :
    ((Δ : ℝ) - 1) * runMin b Δ + runMin b (Δ - 1) + runMin b δ ≤
      ∑ v ∈ N, incr b (d v) + J := by
  have hH0 := runMin_nonneg hb
  have hNne : N.Nonempty := by
    rw [← Finset.card_pos, hNcard]; omega
  obtain ⟨v₁, hv₁N, hv₁min⟩ := Finset.exists_min_image N d hNne
  have hv₁C : v₁ ∈ C := Finset.mem_of_mem_erase (hNC hv₁N)
  have hv₁w : v₁ ≠ w := Finset.ne_of_mem_erase (hNC hv₁N)
  have hdN : ∀ v ∈ N, 3 ≤ d v ∧ d v ≤ Δ := fun v hv =>
    hCd v (Finset.mem_of_mem_erase (hNC hv))
  have hterm : ∀ v ∈ N.erase v₁, 0 ≤ incr b (d v) - runMin b Δ := by
    intro v hv
    have h1 := hdN v (Finset.mem_of_mem_erase hv)
    have h2 := runMin_anti b h1.2
    have h3 := runMin_le_incr b h1.1
    linarith
  set R := ∑ v ∈ N.erase v₁, (incr b (d v) - runMin b Δ) with hR
  have hRnn : 0 ≤ R := Finset.sum_nonneg hterm
  have hsum : ∑ v ∈ N, incr b (d v) =
      incr b (d v₁) + R + ((Δ : ℝ) - 1) * runMin b Δ := by
    rw [← Finset.add_sum_erase N _ hv₁N]
    rw [hR, Finset.sum_sub_distrib, Finset.sum_const, Finset.card_erase_of_mem hv₁N, hNcard,
      nsmul_eq_mul]
    have : ((Δ - 1 : ℕ) : ℝ) = (Δ : ℝ) - 1 := by
      rw [Nat.cast_sub (by omega)]; simp
    rw [this]
    ring
  rw [hsum]
  suffices key : runMin b (Δ - 1) + runMin b δ ≤ incr b (d v₁) + R + J by linarith
  have hd₁ := hdN v₁ hv₁N
  have hd₁h : runMin b (d v₁) ≤ incr b (d v₁) := runMin_le_incr b hd₁.1
  rcases hreg with hall | ⟨x, hxN, hxlt⟩
  · -- Case 1: regular
    have hδΔ : δ = Δ := by
      obtain ⟨v, hv, hvd⟩ := hδ'
      rw [← hvd]; exact hall v hv
    have hd1 : d v₁ = Δ := hall v₁ hv₁C
    have hd'1 : d' v₁ = Δ - 1 := by
      have := hd'N v₁ hv₁N; omega
    have hJ1 := hJ v₁ (hNC hv₁N) (by omega)
    rw [hd'1] at hJ1
    rw [hδΔ]
    rw [hd1] at hd₁h ⊢
    linarith
  · -- Case 2: not regular
    have hxC : x ∈ C := Finset.mem_of_mem_erase (hNC hxN)
    have hd1lt : d v₁ < Δ := lt_of_le_of_lt (hv₁min x hxN) hxlt
    have hJ1 : runMin b (Δ - 1) ≤ incr b (d v₁) :=
      (runMin_anti b (by omega : d v₁ ≤ Δ - 1)).trans hd₁h
    by_cases h2a : ∃ u ∈ C.erase w, 3 ≤ d' u ∧ d' u ≤ δ
    · obtain ⟨u, hu, hu3, huδ⟩ := h2a
      have := (runMin_anti b huδ).trans (hJ u hu hu3)
      linarith
    · push Not at h2a
      obtain ⟨u₀, hu₀C, hu₀d⟩ := hδ'
      have hδlt : δ < Δ := lt_of_le_of_lt (hδ x hxC) hxlt
      have hu₀w : u₀ ≠ w := by
        intro h; rw [h, hwd] at hu₀d; omega
      have hu₀E : u₀ ∈ C.erase w := Finset.mem_erase.mpr ⟨hu₀w, hu₀C⟩
      have hδ3 : 3 ≤ δ := hu₀d ▸ (hCd u₀ hu₀C).1
      have hδeq : δ = 3 := by
        by_contra hne
        have h4 : 4 ≤ δ := by omega
        by_cases hn : u₀ ∈ N
        · have := hd'N u₀ hn
          have := h2a u₀ hu₀E (by omega)
          omega
        · have := hd'o u₀ hu₀E hn
          have := h2a u₀ hu₀E (by omega)
          omega
      have hu₀N : u₀ ∈ N := by
        by_contra hn
        have := hd'o u₀ hu₀E hn
        have := h2a u₀ hu₀E (by omega)
        omega
      have hd1eq : d v₁ = 3 := by
        have := hv₁min u₀ hu₀N
        have := hd₁.1
        omega
      have hHδ : runMin b δ = incr b (d v₁) := by
        rw [hδeq, hd1eq, runMin_three]
      suffices key2 : runMin b (Δ - 1) ≤ R + J by linarith
      by_cases hx4 : ∃ x ∈ N, 4 ≤ d x
      · obtain ⟨x, hxN, hx4⟩ := hx4
        have h1 := hd'N x hxN
        have h2 := hdN x hxN
        have := hJ x (hNC hxN) (by omega)
        have h3 := runMin_anti b (by omega : d' x ≤ Δ - 1)
        linarith
      · push Not at hx4
        have hall3 : ∀ x ∈ N, d x = 3 := fun x hx => by
          have := hx4 x hx
          have := (hdN x hx).1
          omega
        have hcard : 0 < (N.erase v₁).card := by
          rw [Finset.card_erase_of_mem hv₁N, hNcard]; omega
        obtain ⟨v₂, hv₂⟩ := Finset.card_pos.mp hcard
        have hv₂N : v₂ ∈ N := Finset.mem_of_mem_erase hv₂
        have hRge : incr b (d v₂) - runMin b Δ ≤ R :=
          Finset.single_le_sum hterm hv₂
        rw [hall3 v₂ hv₂N] at hRge
        obtain ⟨u, hu, hu3⟩ := hstar
        have hun : u ∉ N := by
          intro hn
          have := hd'N u hn
          have := hall3 u hn
          omega
        have hdu := hd'o u hu hun
        have hCu := hCd u (Finset.mem_of_mem_erase hu)
        have hJu := hJ u hu hu3
        rw [hdu] at hJu
        have h5 := runMin_anti b hCu.2
        have h6 := runMin_anti b (by omega : 3 ≤ Δ - 1)
        rw [runMin_three] at h6
        linarith

end DelX
end T4
end CubicPathwidth
Back to top