[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
obtain hα | hα :=
  le_total (card α)
    (bound ε l)
      -- If `card α ≤ bound ε l`, then the partition into singletons is acceptable.
[GOAL]
case inl
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : Fintype.card α ≤ bound ε l
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
refine' ⟨⊥, bot_isEquipartition _, _⟩
[GOAL]
case inl
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : Fintype.card α ≤ bound ε l
⊢ l ≤ Finset.card ⊥.parts ∧ Finset.card ⊥.parts ≤ bound ε l ∧ IsUniform ⊥ G ε
[PROOFSTEP]
rw [card_bot, card_univ]
[GOAL]
case inl
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : Fintype.card α ≤ bound ε l
⊢ l ≤ Fintype.card α ∧ Fintype.card α ≤ bound ε l ∧ IsUniform ⊥ G ε
[PROOFSTEP]
exact
  ⟨hl, hα, botIsUniform _ hε⟩
    -- Else, let's start from a dummy equipartition of size `initialBound ε l`.
[GOAL]
case inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
let t := initialBound ε l
[GOAL]
case inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
have htα : t ≤ (univ : Finset α).card := (initialBound_le_bound _ _).trans (by rwa [Finset.card_univ])
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
⊢ bound ε l ≤ Finset.card univ
[PROOFSTEP]
rwa [Finset.card_univ]
[GOAL]
case inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
obtain ⟨dum, hdum₁, hdum₂⟩ := exists_equipartition_card_eq (univ : Finset α) (initialBound_pos _ _).ne' htα
[GOAL]
case inr.intro.intro
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
obtain hε₁ | hε₁ := le_total 1 ε
[GOAL]
case inr.intro.intro.inl
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : 1 ≤ ε
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
exact
  ⟨dum, hdum₁, (le_initialBound ε l).trans hdum₂.ge, hdum₂.le.trans (initialBound_le_bound ε l),
    (dum.isUniformOne G).mono hε₁⟩
    -- Else, set up the induction on energy. We phrase it through the existence for each `i` of an
      -- equipartition of size bounded by `stepBound^[i] (initialBound ε l)` and which is either
      -- `ε`-uniform or has energy at least `ε ^ 5 / 4 * i`.
[GOAL]
case inr.intro.intro.inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
have : Nonempty α := by
  rw [← Fintype.card_pos_iff]
  exact (bound_pos _ _).trans_le hα
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
⊢ Nonempty α
[PROOFSTEP]
rw [← Fintype.card_pos_iff]
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
⊢ 0 < Fintype.card α
[PROOFSTEP]
exact (bound_pos _ _).trans_le hα
[GOAL]
case inr.intro.intro.inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
suffices h :
  ∀ i,
    ∃ P : Finpartition (univ : Finset α),
      P.IsEquipartition ∧
        t ≤ P.parts.card ∧
          P.parts.card ≤ stepBound^[i] t ∧
            (P.IsUniform G ε ∨ ε ^ 5 / 4 * i ≤ P.energy G)
              -- For `i > 4 / ε ^ 5` we know that the partition we get can't have energy `≥ ε ^ 5 / 4 * i > 1`,
                -- so it must instead be `ε`-uniform and we won.
[GOAL]
case inr.intro.intro.inr
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
obtain ⟨P, hP₁, hP₂, hP₃, hP₄⟩ := h (⌊4 / ε ^ 5⌋₊ + 1)
[GOAL]
case inr.intro.intro.inr.intro.intro.intro.intro
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ ∃ P, IsEquipartition P ∧ l ≤ Finset.card P.parts ∧ Finset.card P.parts ≤ bound ε l ∧ IsUniform P G ε
[PROOFSTEP]
refine' ⟨P, hP₁, (le_initialBound _ _).trans hP₂, hP₃.trans _, hP₄.resolve_right fun hPenergy => lt_irrefl (1 : ℝ) _⟩
[GOAL]
case inr.intro.intro.inr.intro.intro.intro.intro.refine'_1
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t ≤ bound ε l
[PROOFSTEP]
rw [iterate_succ_apply']
[GOAL]
case inr.intro.intro.inr.intro.intro.intro.intro.refine'_1
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ stepBound (stepBound^[⌊↑4 / ε ^ 5⌋₊] t) ≤ bound ε l
[PROOFSTEP]
exact mul_le_mul_left' (pow_le_pow_of_le_left (by norm_num) (by norm_num) _) _
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 0 ≤ 4
[PROOFSTEP]
norm_num
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 4 ≤ 16
[PROOFSTEP]
norm_num
[GOAL]
case inr.intro.intro.inr.intro.intro.intro.intro.refine'_2
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 1 < 1
[PROOFSTEP]
calc
  (1 : ℝ) = ε ^ 5 / ↑4 * (↑4 / ε ^ 5) := by rw [mul_comm, div_mul_div_cancel 4 (pow_pos hε 5).ne']; norm_num
  _ < ε ^ 5 / 4 * (⌊4 / ε ^ 5⌋₊ + 1) := ((mul_lt_mul_left <| by positivity).2 (Nat.lt_floor_add_one _))
  _ ≤ (P.energy G : ℝ) := by rwa [← Nat.cast_add_one]
  _ ≤ 1 := by exact_mod_cast P.energy_le_one G
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 1 = ε ^ 5 / 4 * (4 / ε ^ 5)
[PROOFSTEP]
rw [mul_comm, div_mul_div_cancel 4 (pow_pos hε 5).ne']
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 1 = 4 / 4
[PROOFSTEP]
norm_num
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ 0 < ε ^ 5 / 4
[PROOFSTEP]
positivity
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ ε ^ 5 / ↑4 * (↑⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
[PROOFSTEP]
rwa [← Nat.cast_add_one]
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
h :
  ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊ + 1] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
hPenergy : ε ^ 5 / 4 * ↑(⌊↑4 / ε ^ 5⌋₊ + 1) ≤ ↑(energy P G)
⊢ ↑(energy P G) ≤ 1
[PROOFSTEP]
exact_mod_cast P.energy_le_one G
[GOAL]
case h
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
⊢ ∀ (i : ℕ),
    ∃ P,
      IsEquipartition P ∧
        t ≤ Finset.card P.parts ∧
          Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
[PROOFSTEP]
intro i
[GOAL]
case h
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
[PROOFSTEP]
induction' i with i ih
[GOAL]
case h.zero
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.zero] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑Nat.zero ≤ ↑(energy P G))
[PROOFSTEP]
refine' ⟨dum, hdum₁, hdum₂.ge, hdum₂.le, Or.inr _⟩
[GOAL]
case h.zero
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
⊢ ε ^ 5 / 4 * ↑Nat.zero ≤ ↑(energy dum G)
[PROOFSTEP]
rw [Nat.cast_zero, mul_zero]
[GOAL]
case h.zero
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
⊢ 0 ≤ ↑(energy dum G)
[PROOFSTEP]
exact_mod_cast dum.energy_nonneg G
[GOAL]
case h.succ
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
ih :
  ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G))
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
obtain ⟨P, hP₁, hP₂, hP₃, hP₄⟩ := ih
[GOAL]
case h.succ.intro.intro.intro.intro
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
by_cases huniform : P.IsUniform G ε
[GOAL]
case pos
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
huniform : IsUniform P G ε
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
refine' ⟨P, hP₁, hP₂, _, Or.inl huniform⟩
[GOAL]
case pos
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
huniform : IsUniform P G ε
⊢ Finset.card P.parts ≤ stepBound^[Nat.succ i] t
[PROOFSTEP]
rw [iterate_succ_apply']
[GOAL]
case pos
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
huniform : IsUniform P G ε
⊢ Finset.card P.parts ≤ stepBound (stepBound^[i] t)
[PROOFSTEP]
exact
  hP₃.trans
    (le_stepBound _)
      -- Else, `P` must instead have energy at least `ε ^ 5 / 4 * i`.
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
hP₄ : IsUniform P G ε ∨ ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
huniform : ¬IsUniform P G ε
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
replace hP₄ := hP₄.resolve_left huniform
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
have hεl' : ↑100 < ↑4 ^ P.parts.card * ε ^ 5 :=
  (hundred_lt_pow_initialBound_mul hε l).trans_le
    (mul_le_mul_of_nonneg_right (pow_le_pow (by norm_num) hP₂) <| by positivity)
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
⊢ 1 ≤ 4
[PROOFSTEP]
norm_num
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
⊢ 0 ≤ ε ^ 5
[PROOFSTEP]
positivity
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
have hi : (i : ℝ) ≤ 4 / ε ^ 5 :=
  by
  have hi : ε ^ 5 / 4 * ↑i ≤ 1 := hP₄.trans (by exact_mod_cast P.energy_le_one G)
  rw [div_mul_eq_mul_div, div_le_iff (show (0 : ℝ) < 4 by norm_num)] at hi
  norm_num at hi
  rwa [le_div_iff' (pow_pos hε _)]
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
⊢ ↑i ≤ ↑4 / ε ^ 5
[PROOFSTEP]
have hi : ε ^ 5 / 4 * ↑i ≤ 1 := hP₄.trans (by exact_mod_cast P.energy_le_one G)
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
⊢ ↑(energy P G) ≤ 1
[PROOFSTEP]
exact_mod_cast P.energy_le_one G
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ε ^ 5 / 4 * ↑i ≤ 1
⊢ ↑i ≤ ↑4 / ε ^ 5
[PROOFSTEP]
rw [div_mul_eq_mul_div, div_le_iff (show (0 : ℝ) < 4 by norm_num)] at hi
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ε ^ 5 * ↑i / 4 ≤ 1
⊢ 0 < 4
[PROOFSTEP]
norm_num
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ε ^ 5 * ↑i ≤ 1 * 4
⊢ ↑i ≤ ↑4 / ε ^ 5
[PROOFSTEP]
norm_num at hi
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ε ^ 5 * ↑i ≤ 4
⊢ ↑i ≤ ↑4 / ε ^ 5
[PROOFSTEP]
rwa [le_div_iff' (pow_pos hε _)]
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
have hsize : P.parts.card ≤ stepBound^[⌊4 / ε ^ 5⌋₊] t :=
  hP₃.trans (monotone_iterate_of_id_le le_stepBound (Nat.le_floor hi) _)
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
have hPα : P.parts.card * 16 ^ P.parts.card ≤ card α :=
  (Nat.mul_le_mul hsize (Nat.pow_le_pow_of_le_right (by norm_num) hsize)).trans hα
[GOAL]
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
⊢ 16 > 0
[PROOFSTEP]
norm_num
[GOAL]
case neg
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ ∃ P,
    IsEquipartition P ∧
      t ≤ Finset.card P.parts ∧
        Finset.card P.parts ≤ stepBound^[Nat.succ i] t ∧ (IsUniform P G ε ∨ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G))
[PROOFSTEP]
refine'
  ⟨increment hP₁ G ε, increment_isEquipartition hP₁ G ε, _, _,
    Or.inr <| le_trans _ <| energy_increment hP₁ ((seven_le_initialBound ε l).trans hP₂) hεl' hPα huniform hε₁⟩
[GOAL]
case neg.refine'_1
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ t ≤ Finset.card (increment hP₁ G ε).parts
[PROOFSTEP]
rw [card_increment hPα huniform]
[GOAL]
case neg.refine'_1
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ t ≤ stepBound (Finset.card P.parts)
[PROOFSTEP]
exact hP₂.trans (le_stepBound _)
[GOAL]
case neg.refine'_2
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ Finset.card (increment hP₁ G ε).parts ≤ stepBound^[Nat.succ i] t
[PROOFSTEP]
rw [card_increment hPα huniform, iterate_succ_apply']
[GOAL]
case neg.refine'_2
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ stepBound (Finset.card P.parts) ≤ stepBound (stepBound^[i] t)
[PROOFSTEP]
exact stepBound_mono hP₃
[GOAL]
case neg.refine'_3
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ ε ^ 5 / 4 * ↑(Nat.succ i) ≤ ↑(energy P G) + ε ^ 5 / 4
[PROOFSTEP]
rw [Nat.cast_succ, mul_add, mul_one]
[GOAL]
case neg.refine'_3
α : Type u_1
inst✝ : Fintype α
G : SimpleGraph α
ε : ℝ
l : ℕ
hε : 0 < ε
hl : l ≤ Fintype.card α
hα : bound ε l ≤ Fintype.card α
t : ℕ := initialBound ε l
htα : t ≤ Finset.card univ
dum : Finpartition univ
hdum₁ : IsEquipartition dum
hdum₂ : Finset.card dum.parts = initialBound ε l
hε₁ : ε ≤ 1
this : Nonempty α
i : ℕ
P : Finpartition univ
hP₁ : IsEquipartition P
hP₂ : t ≤ Finset.card P.parts
hP₃ : Finset.card P.parts ≤ stepBound^[i] t
huniform : ¬IsUniform P G ε
hP₄ : ε ^ 5 / 4 * ↑i ≤ ↑(energy P G)
hεl' : 100 < 4 ^ Finset.card P.parts * ε ^ 5
hi : ↑i ≤ ↑4 / ε ^ 5
hsize : Finset.card P.parts ≤ stepBound^[⌊↑4 / ε ^ 5⌋₊] t
hPα : Finset.card P.parts * 16 ^ Finset.card P.parts ≤ Fintype.card α
⊢ ε ^ 5 / 4 * ↑i + ε ^ 5 / 4 ≤ ↑(energy P G) + ε ^ 5 / 4
[PROOFSTEP]
exact add_le_add_right hP₄ _


[GOAL]
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
f : G →* H
emb : OpenEmbedding ↑f
U : Set H
hU : U ∈ nhds 1
⊢ ↑f ⁻¹' U ∈ nhds 1
[PROOFSTEP]
apply emb.continuous.tendsto
[GOAL]
case a
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
f : G →* H
emb : OpenEmbedding ↑f
U : Set H
hU : U ∈ nhds 1
⊢ U ∈ nhds (↑f 1)
[PROOFSTEP]
rwa [f.map_one]
[GOAL]
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
hU : U ∈ nhds 1
⊢ ∃ V W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
erw [nhds_prod_eq, Filter.mem_prod_iff] at hU
[GOAL]
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
hU : ∃ t₁, t₁ ∈ nhds 1 ∧ ∃ t₂, t₂ ∈ nhds 1 ∧ t₁ ×ˢ t₂ ⊆ U
⊢ ∃ V W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
rcases hU with ⟨U₁, hU₁, U₂, hU₂, h⟩
[GOAL]
case intro.intro.intro.intro
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
⊢ ∃ V W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
cases' is_nonarchimedean _ hU₁ with V hV
[GOAL]
case intro.intro.intro.intro.intro
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
⊢ ∃ V W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
cases' is_nonarchimedean _ hU₂ with W hW
[GOAL]
case intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
W : OpenSubgroup K
hW : ↑W ⊆ U₂
⊢ ∃ V W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
use V
[GOAL]
case h
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
W : OpenSubgroup K
hW : ↑W ⊆ U₂
⊢ ∃ W, ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
use W
[GOAL]
case h
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
W : OpenSubgroup K
hW : ↑W ⊆ U₂
⊢ ↑V ×ˢ ↑W ⊆ U
[PROOFSTEP]
rw [Set.prod_subset_iff]
[GOAL]
case h
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
W : OpenSubgroup K
hW : ↑W ⊆ U₂
⊢ ∀ (x : G), x ∈ ↑V → ∀ (y : K), y ∈ ↑W → (x, y) ∈ U
[PROOFSTEP]
intro x hX y hY
[GOAL]
case h
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × K)
U₁ : Set G
hU₁ : U₁ ∈ nhds 1
U₂ : Set K
hU₂ : U₂ ∈ nhds 1
h : U₁ ×ˢ U₂ ⊆ U
V : OpenSubgroup G
hV : ↑V ⊆ U₁
W : OpenSubgroup K
hW : ↑W ⊆ U₂
x : G
hX : x ∈ ↑V
y : K
hY : y ∈ ↑W
⊢ (x, y) ∈ U
[PROOFSTEP]
exact Set.Subset.trans (Set.prod_mono hV hW) h (Set.mem_sep hX hY)
[GOAL]
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × G)
hU : U ∈ nhds 1
V W : OpenSubgroup G
h : ↑V ×ˢ ↑W ⊆ U
⊢ ↑(V ⊓ W) ×ˢ ↑(V ⊓ W) ⊆ U
[PROOFSTEP]
refine' Set.Subset.trans (Set.prod_mono _ _) ‹_›
[GOAL]
case refine'_1
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × G)
hU : U ∈ nhds 1
V W : OpenSubgroup G
h : ↑V ×ˢ ↑W ⊆ U
⊢ ↑(V ⊓ W) ⊆ ↑V
[PROOFSTEP]
simp
[GOAL]
case refine'_2
G : Type u_1
inst✝⁸ : Group G
inst✝⁷ : TopologicalSpace G
inst✝⁶ : NonarchimedeanGroup G
H : Type u_2
inst✝⁵ : Group H
inst✝⁴ : TopologicalSpace H
inst✝³ : TopologicalGroup H
K : Type u_3
inst✝² : Group K
inst✝¹ : TopologicalSpace K
inst✝ : NonarchimedeanGroup K
U : Set (G × G)
hU : U ∈ nhds 1
V W : OpenSubgroup G
h : ↑V ×ˢ ↑W ⊆ U
⊢ ↑(V ⊓ W) ⊆ ↑W
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U : OpenAddSubgroup R
⊢ ∃ V, ↑V * ↑V ⊆ ↑U
[PROOFSTEP]
let ⟨V, H⟩ :=
  prod_self_subset
    (IsOpen.mem_nhds (IsOpen.preimage continuous_mul U.isOpen)
      (by simpa only [Set.mem_preimage, SetLike.mem_coe, Prod.snd_zero, mul_zero] using U.zero_mem))
[GOAL]
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U : OpenAddSubgroup R
⊢ 0 ∈ (fun p => p.fst * p.snd) ⁻¹' ↑U
[PROOFSTEP]
simpa only [Set.mem_preimage, SetLike.mem_coe, Prod.snd_zero, mul_zero] using U.zero_mem
[GOAL]
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
⊢ ∃ V, ↑V * ↑V ⊆ ↑U
[PROOFSTEP]
use V
[GOAL]
case h
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
⊢ ↑V * ↑V ⊆ ↑U
[PROOFSTEP]
rintro v ⟨a, b, ha, hb, hv⟩
[GOAL]
case h.intro.intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
v a b : R
ha : a ∈ ↑V
hb : b ∈ ↑V
hv : (fun x x_1 => x * x_1) a b = v
⊢ v ∈ ↑U
[PROOFSTEP]
have hy := H (Set.mk_mem_prod ha hb)
[GOAL]
case h.intro.intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
v a b : R
ha : a ∈ ↑V
hb : b ∈ ↑V
hv : (fun x x_1 => x * x_1) a b = v
hy : (a, b) ∈ (fun p => p.fst * p.snd) ⁻¹' ↑U
⊢ v ∈ ↑U
[PROOFSTEP]
simp only [Set.mem_preimage, SetLike.mem_coe, hv] at hy
[GOAL]
case h.intro.intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
v a b : R
ha : a ∈ ↑V
hb : b ∈ ↑V
hv : (fun x x_1 => x * x_1) a b = v
hy : v ∈ U
⊢ v ∈ ↑U
[PROOFSTEP]
rw [SetLike.mem_coe]
[GOAL]
case h.intro.intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁵ : Ring R
inst✝⁴ : TopologicalSpace R
inst✝³ : NonarchimedeanRing R
inst✝² : Ring S
inst✝¹ : TopologicalSpace S
inst✝ : NonarchimedeanRing S
U V : OpenAddSubgroup R
H : ↑V ×ˢ ↑V ⊆ (fun p => p.fst * p.snd) ⁻¹' ↑U
v a b : R
ha : a ∈ ↑V
hb : b ∈ ↑V
hv : (fun x x_1 => x * x_1) a b = v
hy : v ∈ U
⊢ v ∈ U
[PROOFSTEP]
exact hy


[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a✝ b✝ : 𝕜
s : Set 𝕜
F : Type u_3
inst✝¹ : NormedAddCommGroup F
inst✝ : NormedSpace 𝕜 F
f : E →L[𝕜] F
g : 𝕜 → E
a b : 𝕜
H : a = b → DifferentiableAt 𝕜 g a
⊢ dslope (↑f ∘ g) a b = ↑f (dslope g a b)
[PROOFSTEP]
rcases eq_or_ne b a with (rfl | hne)
[GOAL]
case inl
𝕜 : Type u_1
E : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a b✝ : 𝕜
s : Set 𝕜
F : Type u_3
inst✝¹ : NormedAddCommGroup F
inst✝ : NormedSpace 𝕜 F
f : E →L[𝕜] F
g : 𝕜 → E
b : 𝕜
H : b = b → DifferentiableAt 𝕜 g b
⊢ dslope (↑f ∘ g) b b = ↑f (dslope g b b)
[PROOFSTEP]
simp only [dslope_same]
[GOAL]
case inl
𝕜 : Type u_1
E : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a b✝ : 𝕜
s : Set 𝕜
F : Type u_3
inst✝¹ : NormedAddCommGroup F
inst✝ : NormedSpace 𝕜 F
f : E →L[𝕜] F
g : 𝕜 → E
b : 𝕜
H : b = b → DifferentiableAt 𝕜 g b
⊢ deriv (↑f ∘ g) b = ↑f (deriv g b)
[PROOFSTEP]
exact (f.hasFDerivAt.comp_hasDerivAt b (H rfl).hasDerivAt).deriv
[GOAL]
case inr
𝕜 : Type u_1
E : Type u_2
inst✝⁴ : NontriviallyNormedField 𝕜
inst✝³ : NormedAddCommGroup E
inst✝² : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a✝ b✝ : 𝕜
s : Set 𝕜
F : Type u_3
inst✝¹ : NormedAddCommGroup F
inst✝ : NormedSpace 𝕜 F
f : E →L[𝕜] F
g : 𝕜 → E
a b : 𝕜
H : a = b → DifferentiableAt 𝕜 g a
hne : b ≠ a
⊢ dslope (↑f ∘ g) a b = ↑f (dslope g a b)
[PROOFSTEP]
simpa only [dslope_of_ne _ hne] using f.toLinearMap.slope_comp g a b
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a✝ b✝ : 𝕜
s : Set 𝕜
f : 𝕜 → E
a b : 𝕜
⊢ (b - a) • dslope f a b = f b - f a
[PROOFSTEP]
rcases eq_or_ne b a with (rfl | hne)
[GOAL]
case inl
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a b✝ : 𝕜
s : Set 𝕜
f : 𝕜 → E
b : 𝕜
⊢ (b - b) • dslope f b b = f b - f b
[PROOFSTEP]
simp [dslope_of_ne, *]
[GOAL]
case inr
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a✝ b✝ : 𝕜
s : Set 𝕜
f : 𝕜 → E
a b : 𝕜
hne : b ≠ a
⊢ (b - a) • dslope f a b = f b - f a
[PROOFSTEP]
simp [dslope_of_ne, *]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f✝ : 𝕜 → E
a b : 𝕜
s : Set 𝕜
f : 𝕜 → E
h : b ≠ a
⊢ dslope (fun x => (x - a) • f x) a b = f b
[PROOFSTEP]
rw [dslope_of_ne _ h, slope_sub_smul _ h.symm]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
⊢ ContinuousAt (dslope f a) a ↔ DifferentiableAt 𝕜 f a
[PROOFSTEP]
simp only [dslope, continuousAt_update_same, ← hasDerivAt_deriv_iff, hasDerivAt_iff_tendsto_slope]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : ContinuousWithinAt (dslope f a) s b
⊢ ContinuousWithinAt f s b
[PROOFSTEP]
have : ContinuousWithinAt (fun x => (x - a) • dslope f a x + f a) s b :=
  ((continuousWithinAt_id.sub continuousWithinAt_const).smul h).add continuousWithinAt_const
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : ContinuousWithinAt (dslope f a) s b
this : ContinuousWithinAt (fun x => (x - a) • dslope f a x + f a) s b
⊢ ContinuousWithinAt f s b
[PROOFSTEP]
simpa only [sub_smul_dslope, sub_add_cancel] using this
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
⊢ ContinuousWithinAt (dslope f a) s b ↔ ContinuousWithinAt f s b
[PROOFSTEP]
refine' ⟨ContinuousWithinAt.of_dslope, fun hc => _⟩
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
hc : ContinuousWithinAt f s b
⊢ ContinuousWithinAt (dslope f a) s b
[PROOFSTEP]
simp only [dslope, continuousWithinAt_update_of_ne h]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
hc : ContinuousWithinAt f s b
⊢ ContinuousWithinAt (slope f a) s b
[PROOFSTEP]
exact
  ((continuousWithinAt_id.sub continuousWithinAt_const).inv₀ (sub_ne_zero.2 h)).smul (hc.sub continuousWithinAt_const)
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
⊢ ContinuousAt (dslope f a) b ↔ ContinuousAt f b
[PROOFSTEP]
simp only [← continuousWithinAt_univ, continuousWithinAt_dslope_of_ne h]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : s ∈ 𝓝 a
⊢ ContinuousOn (dslope f a) s ↔ ContinuousOn f s ∧ DifferentiableAt 𝕜 f a
[PROOFSTEP]
refine' ⟨fun hc => ⟨hc.of_dslope, continuousAt_dslope_same.1 <| hc.continuousAt h⟩, _⟩
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : s ∈ 𝓝 a
⊢ ContinuousOn f s ∧ DifferentiableAt 𝕜 f a → ContinuousOn (dslope f a) s
[PROOFSTEP]
rintro ⟨hc, hd⟩ x hx
[GOAL]
case intro
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : s ∈ 𝓝 a
hc : ContinuousOn f s
hd : DifferentiableAt 𝕜 f a
x : 𝕜
hx : x ∈ s
⊢ ContinuousWithinAt (dslope f a) s x
[PROOFSTEP]
rcases eq_or_ne x a with (rfl | hne)
[GOAL]
case intro.inl
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
b : 𝕜
s : Set 𝕜
hc : ContinuousOn f s
x : 𝕜
hx : x ∈ s
h : s ∈ 𝓝 x
hd : DifferentiableAt 𝕜 f x
⊢ ContinuousWithinAt (dslope f x) s x
case intro.inr
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : s ∈ 𝓝 a
hc : ContinuousOn f s
hd : DifferentiableAt 𝕜 f a
x : 𝕜
hx : x ∈ s
hne : x ≠ a
⊢ ContinuousWithinAt (dslope f a) s x
[PROOFSTEP]
exacts [(continuousAt_dslope_same.2 hd).continuousWithinAt, (continuousWithinAt_dslope_of_ne hne).2 (hc x hx)]
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : DifferentiableWithinAt 𝕜 (dslope f a) s b
⊢ DifferentiableWithinAt 𝕜 f s b
[PROOFSTEP]
simpa only [id, sub_smul_dslope f a, sub_add_cancel] using
  ((differentiableWithinAt_id.sub_const a).smul h).add_const (f a)
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
⊢ DifferentiableWithinAt 𝕜 (dslope f a) s b ↔ DifferentiableWithinAt 𝕜 f s b
[PROOFSTEP]
refine' ⟨DifferentiableWithinAt.of_dslope, fun hd => _⟩
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
hd : DifferentiableWithinAt 𝕜 f s b
⊢ DifferentiableWithinAt 𝕜 (dslope f a) s b
[PROOFSTEP]
refine'
  (((differentiableWithinAt_id.sub_const a).inv (sub_ne_zero.2 h)).smul (hd.sub_const (f a))).congr_of_eventuallyEq _
    (dslope_of_ne _ h)
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
hd : DifferentiableWithinAt 𝕜 f s b
⊢ dslope f a =ᶠ[𝓝[s] b] fun y => (id y - a)⁻¹ • (f y - f a)
[PROOFSTEP]
refine' (eqOn_dslope_slope _ _).eventuallyEq_of_mem _
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
hd : DifferentiableWithinAt 𝕜 f s b
⊢ {a}ᶜ ∈ 𝓝[s] b
[PROOFSTEP]
exact mem_nhdsWithin_of_mem_nhds (isOpen_ne.mem_nhds h)
[GOAL]
𝕜 : Type u_1
E : Type u_2
inst✝² : NontriviallyNormedField 𝕜
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace 𝕜 E
f : 𝕜 → E
a b : 𝕜
s : Set 𝕜
h : b ≠ a
⊢ DifferentiableAt 𝕜 (dslope f a) b ↔ DifferentiableAt 𝕜 f b
[PROOFSTEP]
simp only [← differentiableWithinAt_univ, differentiableWithinAt_dslope_of_ne h]


[GOAL]
α✝ : Type u_1
β✝ : Type u_2
α : Type u
β : Type v
inst✝¹ : Fintype α
inst✝ : Fintype β
⊢ ∀ (x : α ⊕ β), x ∈ disjSum univ univ
[PROOFSTEP]
rintro (_ | _)
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
α : Type u
β : Type v
inst✝¹ : Fintype α
inst✝ : Fintype β
val✝ : α
⊢ Sum.inl val✝ ∈ disjSum univ univ
[PROOFSTEP]
simp
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
α : Type u
β : Type v
inst✝¹ : Fintype α
inst✝ : Fintype β
val✝ : β
⊢ Sum.inr val✝ ∈ disjSum univ univ
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
a : α
h : Fintype { b // b ≠ a }
⊢ Function.Bijective (Sum.elim Subtype.val Subtype.val)
[PROOFSTEP]
classical exact (Equiv.sumCompl (· = a)).bijective
[GOAL]
α : Type u_1
β : Type u_2
a : α
h : Fintype { b // b ≠ a }
⊢ Function.Bijective (Sum.elim Subtype.val Subtype.val)
[PROOFSTEP]
exact (Equiv.sumCompl (· = a)).bijective
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
⊢ image (fun i => b ↑i) univ = erase (image b univ) k
[PROOFSTEP]
apply subset_antisymm
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
⊢ image (fun i => b ↑i) univ ⊆ erase (image b univ) k
[PROOFSTEP]
rw [image_subset_iff]
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
⊢ ∀ (x : { a // b a ≠ k }), x ∈ univ → b ↑x ∈ erase (image b univ) k
[PROOFSTEP]
intro i _
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
i : { a // b a ≠ k }
a✝ : i ∈ univ
⊢ b ↑i ∈ erase (image b univ) k
[PROOFSTEP]
apply mem_erase_of_ne_of_mem i.2 (mem_image_of_mem _ (mem_univ _))
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
⊢ erase (image b univ) k ⊆ image (fun i => b ↑i) univ
[PROOFSTEP]
intro i hi
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
i : β
hi : i ∈ erase (image b univ) k
⊢ i ∈ image (fun i => b ↑i) univ
[PROOFSTEP]
rw [mem_image]
[GOAL]
case a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
i : β
hi : i ∈ erase (image b univ) k
⊢ ∃ a, a ∈ univ ∧ b ↑a = i
[PROOFSTEP]
rcases mem_image.1 (erase_subset _ _ hi) with ⟨a, _, ha⟩
[GOAL]
case a.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
i : β
hi : i ∈ erase (image b univ) k
a : α
left✝ : a ∈ univ
ha : b a = i
⊢ ∃ a, a ∈ univ ∧ b ↑a = i
[PROOFSTEP]
subst ha
[GOAL]
case a.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
k : β
b : α → β
a : α
left✝ : a ∈ univ
hi : b a ∈ erase (image b univ) k
⊢ ∃ a_1, a_1 ∈ univ ∧ b ↑a_1 = b a
[PROOFSTEP]
exact ⟨⟨a, ne_of_mem_erase hi⟩, mem_univ _, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
⊢ image (fun i => b ↑i) univ ⊂ image b univ
[PROOFSTEP]
constructor
[GOAL]
case left
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
⊢ image (fun i => b ↑i) univ ⊆ image b univ
[PROOFSTEP]
intro x hx
[GOAL]
case left
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
x : β
hx : x ∈ image (fun i => b ↑i) univ
⊢ x ∈ image b univ
[PROOFSTEP]
rcases mem_image.1 hx with ⟨y, _, hy⟩
[GOAL]
case left.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
x : β
hx : x ∈ image (fun i => b ↑i) univ
y : { a // p (b a) }
left✝ : y ∈ univ
hy : b ↑y = x
⊢ x ∈ image b univ
[PROOFSTEP]
exact hy ▸ mem_image_of_mem b (mem_univ (y : α))
[GOAL]
case right
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
⊢ ¬image b univ ⊆ image (fun i => b ↑i) univ
[PROOFSTEP]
intro h
[GOAL]
case right
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : k ∈ image b univ
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
h : image b univ ⊆ image (fun i => b ↑i) univ
⊢ False
[PROOFSTEP]
rw [mem_image] at hk
[GOAL]
case right
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
hk : ∃ a, a ∈ univ ∧ b a = k
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
h : image b univ ⊆ image (fun i => b ↑i) univ
⊢ False
[PROOFSTEP]
rcases hk with ⟨k', _, hk'⟩
[GOAL]
case right.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
k : β
b : α → β
p : β → Prop
inst✝ : DecidablePred p
hp : ¬p k
h : image b univ ⊆ image (fun i => b ↑i) univ
k' : α
left✝ : k' ∈ univ
hk' : b k' = k
⊢ False
[PROOFSTEP]
subst hk'
[GOAL]
case right.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
b : α → β
p : β → Prop
inst✝ : DecidablePred p
h : image b univ ⊆ image (fun i => b ↑i) univ
k' : α
left✝ : k' ∈ univ
hp : ¬p (b k')
⊢ False
[PROOFSTEP]
have := h (mem_image_of_mem b (mem_univ k'))
[GOAL]
case right.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
b : α → β
p : β → Prop
inst✝ : DecidablePred p
h : image b univ ⊆ image (fun i => b ↑i) univ
k' : α
left✝ : k' ∈ univ
hp : ¬p (b k')
this : b k' ∈ image (fun i => b ↑i) univ
⊢ False
[PROOFSTEP]
rw [mem_image] at this
[GOAL]
case right.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
b : α → β
p : β → Prop
inst✝ : DecidablePred p
h : image b univ ⊆ image (fun i => b ↑i) univ
k' : α
left✝ : k' ∈ univ
hp : ¬p (b k')
this : ∃ a, a ∈ univ ∧ b ↑a = b k'
⊢ False
[PROOFSTEP]
rcases this with ⟨j, _, hj'⟩
[GOAL]
case right.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝² : Fintype α
inst✝¹ : DecidableEq β
b : α → β
p : β → Prop
inst✝ : DecidablePred p
h : image b univ ⊆ image (fun i => b ↑i) univ
k' : α
left✝¹ : k' ∈ univ
hp : ¬p (b k')
j : { a // p (b a) }
left✝ : j ∈ univ
hj' : b ↑j = b k'
⊢ False
[PROOFSTEP]
exact hp (hj' ▸ j.2)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f : α → β
hfst : image f s ⊆ t
hfs : Set.InjOn f ↑s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
classical
induction' s using Finset.induction with a s has H generalizing f
· obtain ⟨e⟩ : Nonempty (α ≃ ↥t) := by rwa [← Fintype.card_eq, Fintype.card_coe]
  use e
  simp
have hfst' : Finset.image f s ⊆ t := (Finset.image_mono _ (s.subset_insert a)).trans hfst
have hfs' : Set.InjOn f s := hfs.mono (s.subset_insert a)
obtain ⟨g', hg'⟩ := H hfst' hfs'
have hfat : f a ∈ t := hfst (mem_image_of_mem _ (s.mem_insert_self a))
use g'.trans (Equiv.swap (⟨f a, hfat⟩ : t) (g' a))
simp_rw [mem_insert]
rintro i (rfl | hi)
· simp
rw [Equiv.trans_apply, Equiv.swap_apply_of_ne_of_ne, hg' _ hi]
·
  exact
    ne_of_apply_ne Subtype.val
      (ne_of_eq_of_ne (hg' _ hi) <| hfs.ne (subset_insert _ _ hi) (mem_insert_self _ _) <| ne_of_mem_of_not_mem hi has)
· exact g'.injective.ne (ne_of_mem_of_not_mem hi has)
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f : α → β
hfst : image f s ⊆ t
hfs : Set.InjOn f ↑s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
induction' s using Finset.induction with a s has H generalizing f
[GOAL]
case empty
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
⊢ ∃ g, ∀ (i : α), i ∈ ∅ → ↑(↑g i) = f i
[PROOFSTEP]
obtain ⟨e⟩ : Nonempty (α ≃ ↥t) := by rwa [← Fintype.card_eq, Fintype.card_coe]
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
⊢ Nonempty (α ≃ { x // x ∈ t })
[PROOFSTEP]
rwa [← Fintype.card_eq, Fintype.card_coe]
[GOAL]
case empty.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
e : α ≃ { x // x ∈ t }
⊢ ∃ g, ∀ (i : α), i ∈ ∅ → ↑(↑g i) = f i
[PROOFSTEP]
use e
[GOAL]
case h
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s : Finset α
f✝ : α → β
hfst✝ : image f✝ s ⊆ t
hfs✝ : Set.InjOn f✝ ↑s
f : α → β
hfst : image f ∅ ⊆ t
hfs : Set.InjOn f ↑∅
e : α ≃ { x // x ∈ t }
⊢ ∀ (i : α), i ∈ ∅ → ↑(↑e i) = f i
[PROOFSTEP]
simp
[GOAL]
case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i
[PROOFSTEP]
have hfst' : Finset.image f s ⊆ t := (Finset.image_mono _ (s.subset_insert a)).trans hfst
[GOAL]
case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i
[PROOFSTEP]
have hfs' : Set.InjOn f s := hfs.mono (s.subset_insert a)
[GOAL]
case insert
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i
[PROOFSTEP]
obtain ⟨g', hg'⟩ := H hfst' hfs'
[GOAL]
case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i
[PROOFSTEP]
have hfat : f a ∈ t := hfst (mem_image_of_mem _ (s.mem_insert_self a))
[GOAL]
case insert.intro
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∃ g, ∀ (i : α), i ∈ insert a s → ↑(↑g i) = f i
[PROOFSTEP]
use g'.trans (Equiv.swap (⟨f a, hfat⟩ : t) (g' a))
[GOAL]
case h
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∀ (i : α), i ∈ insert a s → ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i
[PROOFSTEP]
simp_rw [mem_insert]
[GOAL]
case h
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
⊢ ∀ (i : α), i = a ∨ i ∈ s → ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i
[PROOFSTEP]
rintro i (rfl | hi)
[GOAL]
case h.inl
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
s : Finset α
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
i : α
has : ¬i ∈ s
hfst : image f (insert i s) ⊆ t
hfs : Set.InjOn f ↑(insert i s)
hfat : f i ∈ t
⊢ ↑(↑(g'.trans (Equiv.swap { val := f i, property := hfat } (↑g' i))) i) = f i
[PROOFSTEP]
simp
[GOAL]
case h.inr
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑(↑(g'.trans (Equiv.swap { val := f a, property := hfat } (↑g' a))) i) = f i
[PROOFSTEP]
rw [Equiv.trans_apply, Equiv.swap_apply_of_ne_of_ne, hg' _ hi]
[GOAL]
case h.inr.a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑g' i ≠ { val := f a, property := hfat }
[PROOFSTEP]
exact
  ne_of_apply_ne Subtype.val
    (ne_of_eq_of_ne (hg' _ hi) <| hfs.ne (subset_insert _ _ hi) (mem_insert_self _ _) <| ne_of_mem_of_not_mem hi has)
[GOAL]
case h.inr.a
α : Type u_1
β : Type u_2
inst✝¹ : Fintype α
inst✝ : DecidableEq β
t : Finset β
hαt : Fintype.card α = card t
s✝ : Finset α
f✝ : α → β
hfst✝ : image f✝ s✝ ⊆ t
hfs✝ : Set.InjOn f✝ ↑s✝
a : α
s : Finset α
has : ¬a ∈ s
H : ∀ {f : α → β}, image f s ⊆ t → Set.InjOn f ↑s → ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
f : α → β
hfst : image f (insert a s) ⊆ t
hfs : Set.InjOn f ↑(insert a s)
hfst' : image f s ⊆ t
hfs' : Set.InjOn f ↑s
g' : α ≃ { x // x ∈ t }
hg' : ∀ (i : α), i ∈ s → ↑(↑g' i) = f i
hfat : f a ∈ t
i : α
hi : i ∈ s
⊢ ↑g' i ≠ ↑g' a
[PROOFSTEP]
exact g'.injective.ne (ne_of_mem_of_not_mem hi has)
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
classical
let s' : Finset α := s.toFinset
have hfst' : s'.image f ⊆ t := by simpa [← Finset.coe_subset] using hfst
have hfs' : Set.InjOn f s' := by simpa using hfs
obtain ⟨g, hg⟩ := Finset.exists_equiv_extend_of_card_eq hαt hfst' hfs'
refine' ⟨g, fun i hi => _⟩
apply hg
simpa using hi
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
let s' : Finset α := s.toFinset
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
have hfst' : s'.image f ⊆ t := by simpa [← Finset.coe_subset] using hfst
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
⊢ Finset.image f s' ⊆ t
[PROOFSTEP]
simpa [← Finset.coe_subset] using hfst
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
have hfs' : Set.InjOn f s' := by simpa using hfs
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
⊢ InjOn f ↑s'
[PROOFSTEP]
simpa using hfs
[GOAL]
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
hfs' : InjOn f ↑s'
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
obtain ⟨g, hg⟩ := Finset.exists_equiv_extend_of_card_eq hαt hfst' hfs'
[GOAL]
case intro
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
hfs' : InjOn f ↑s'
g : α ≃ { x // x ∈ t }
hg : ∀ (i : α), i ∈ s' → ↑(↑g i) = f i
⊢ ∃ g, ∀ (i : α), i ∈ s → ↑(↑g i) = f i
[PROOFSTEP]
refine' ⟨g, fun i hi => _⟩
[GOAL]
case intro
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
hfs' : InjOn f ↑s'
g : α ≃ { x // x ∈ t }
hg : ∀ (i : α), i ∈ s' → ↑(↑g i) = f i
i : α
hi : i ∈ s
⊢ ↑(↑g i) = f i
[PROOFSTEP]
apply hg
[GOAL]
case intro.a
α : Type u_1
β : Type u_2
inst✝ : Fintype α
t : Finset β
hαt : Fintype.card α = card t
s : Set α
f : α → β
hfst : MapsTo f s ↑t
hfs : InjOn f s
s' : Finset α := toFinset s
hfst' : Finset.image f s' ⊆ t
hfs' : InjOn f ↑s'
g : α ≃ { x // x ∈ t }
hg : ∀ (i : α), i ∈ s' → ↑(↑g i) = f i
i : α
hi : i ∈ s
⊢ i ∈ s'
[PROOFSTEP]
simpa using hi
[GOAL]
α : Type u_1
β : Type u_2
p q : α → Prop
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x ∨ q x } ≤ card { x // p x } + card { x // q x }
[PROOFSTEP]
classical
convert Fintype.card_le_of_embedding (subtypeOrLeftEmbedding p q)
rw [Fintype.card_sum]
[GOAL]
α : Type u_1
β : Type u_2
p q : α → Prop
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x ∨ q x } ≤ card { x // p x } + card { x // q x }
[PROOFSTEP]
convert Fintype.card_le_of_embedding (subtypeOrLeftEmbedding p q)
[GOAL]
case h.e'_4
α : Type u_1
β : Type u_2
p q : α → Prop
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x } + card { x // q x } = card ({ x // p x } ⊕ { x // q x })
[PROOFSTEP]
rw [Fintype.card_sum]
[GOAL]
α : Type u_1
β : Type u_2
p q : α → Prop
h : Disjoint p q
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x ∨ q x } = card { x // p x } + card { x // q x }
[PROOFSTEP]
classical
convert Fintype.card_congr (subtypeOrEquiv p q h)
simp
[GOAL]
α : Type u_1
β : Type u_2
p q : α → Prop
h : Disjoint p q
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x ∨ q x } = card { x // p x } + card { x // q x }
[PROOFSTEP]
convert Fintype.card_congr (subtypeOrEquiv p q h)
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
p q : α → Prop
h : Disjoint p q
inst✝² : Fintype { x // p x }
inst✝¹ : Fintype { x // q x }
inst✝ : Fintype { x // p x ∨ q x }
⊢ card { x // p x } + card { x // q x } = card ({ x // p x } ⊕ { x // q x })
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
⊢ Infinite (α ⊕ β) ↔ Infinite α ∨ Infinite β
[PROOFSTEP]
refine' ⟨fun H => _, fun H => H.elim (@Sum.infinite_of_left α β) (@Sum.infinite_of_right α β)⟩
[GOAL]
α : Type u_1
β : Type u_2
H : Infinite (α ⊕ β)
⊢ Infinite α ∨ Infinite β
[PROOFSTEP]
contrapose! H
[GOAL]
α : Type u_1
β : Type u_2
H : ¬Infinite α ∧ ¬Infinite β
⊢ ¬Infinite (α ⊕ β)
[PROOFSTEP]
haveI := fintypeOfNotInfinite H.1
[GOAL]
α : Type u_1
β : Type u_2
H : ¬Infinite α ∧ ¬Infinite β
this : Fintype α
⊢ ¬Infinite (α ⊕ β)
[PROOFSTEP]
haveI := fintypeOfNotInfinite H.2
[GOAL]
α : Type u_1
β : Type u_2
H : ¬Infinite α ∧ ¬Infinite β
this✝ : Fintype α
this : Fintype β
⊢ ¬Infinite (α ⊕ β)
[PROOFSTEP]
exact Infinite.false