Theorem: Besicovitch.le_multiplicity_of_δ_of_fin
File: Mathlib/MeasureTheory/Covering/BesicovitchVectorSpace.lean

tactic: classical
have finj : Function.Injective f := by
  intro i j hij
  by_contra h
  have : 1 - goodδ E ≤ ‖f i - f j‖ := h' i j h
  simp only [hij, norm_zero, sub_self] at this
  linarith [goodδ_lt_one E]
let s := Finset.image f Finset.univ
have s_card : s.card = n := by rw [Finset.card_image_of_injective _ finj]; exact Finset.card_fin n
have hs : ∀ c ∈ s, ‖c‖ ≤ 2 := by
  simp only [h, forall_apply_eq_imp_iff', forall_const, forall_exists_index, Finset.mem_univ,
    Finset.mem_image, imp_true_iff, true_and]
have h's : ∀ c ∈ s, ∀ d ∈ s, c ≠ d → 1 - goodδ E ≤ ‖c - d‖ := by
  simp only [forall_apply_eq_imp_iff', forall_exists_index, Finset.mem_univ, Finset.mem_image,
    Ne.def, exists_true_left, forall_apply_eq_imp_iff', forall_true_left, true_and]
  intro i j hij
  have : i ≠ j := fun h => by rw [h] at hij ; exact hij rfl
  exact h' i j this
have : s.card ≤ multiplicity E := card_le_multiplicity_of_δ hs h's
rwa [s_card] at this
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
⊢ n ≤ multiplicity E

tactic: have finj : Function.Injective f := by
  intro i j hij
  by_contra h
  have : 1 - goodδ E ≤ ‖f i - f j‖ := h' i j h
  simp only [hij, norm_zero, sub_self] at this
  linarith [goodδ_lt_one E]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
⊢ n ≤ multiplicity E

tactic: let s := Finset.image f Finset.univ
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
⊢ n ≤ multiplicity E

tactic: have s_card : s.card = n := by rw [Finset.card_image_of_injective _ finj]; exact Finset.card_fin n
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
⊢ n ≤ multiplicity E

tactic: have hs : ∀ c ∈ s, ‖c‖ ≤ 2 := by
  simp only [h, forall_apply_eq_imp_iff', forall_const, forall_exists_index, Finset.mem_univ,
    Finset.mem_image, imp_true_iff, true_and]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
⊢ n ≤ multiplicity E

tactic: have h's : ∀ c ∈ s, ∀ d ∈ s, c ≠ d → 1 - goodδ E ≤ ‖c - d‖ := by
  simp only [forall_apply_eq_imp_iff', forall_exists_index, Finset.mem_univ, Finset.mem_image,
    Ne.def, exists_true_left, forall_apply_eq_imp_iff', forall_true_left, true_and]
  intro i j hij
  have : i ≠ j := fun h => by rw [h] at hij ; exact hij rfl
  exact h' i j this
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
⊢ n ≤ multiplicity E

tactic: have : s.card ≤ multiplicity E := card_le_multiplicity_of_δ hs h's
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
h's : ∀ (c : E), c ∈ s → ∀ (d : E), d ∈ s → c ≠ d → 1 - goodδ E ≤ ‖c - d‖
⊢ n ≤ multiplicity E

tactic: rwa [s_card] at this
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
h's : ∀ (c : E), c ∈ s → ∀ (d : E), d ∈ s → c ≠ d → 1 - goodδ E ≤ ‖c - d‖
this : Finset.card s ≤ multiplicity E
⊢ n ≤ multiplicity E

tactic: intro i j hij
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
⊢ Function.Injective f

tactic: by_contra h
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
i j : Fin n
hij : f i = f j
⊢ i = j

tactic: have : 1 - goodδ E ≤ ‖f i - f j‖ := h' i j h
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h✝ : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
i j : Fin n
hij : f i = f j
h : ¬i = j
⊢ False

tactic: simp only [hij, norm_zero, sub_self] at this
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h✝ : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
i j : Fin n
hij : f i = f j
h : ¬i = j
this : 1 - goodδ E ≤ ‖f i - f j‖
⊢ False

tactic: linarith [goodδ_lt_one E]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h✝ : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
i j : Fin n
hij : f i = f j
h : ¬i = j
this : 1 - goodδ E ≤ 0
⊢ False

tactic: rw [Finset.card_image_of_injective _ finj]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
⊢ Finset.card s = n

tactic: exact Finset.card_fin n
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
⊢ Finset.card Finset.univ = n

tactic: simp only [h, forall_apply_eq_imp_iff', forall_const, forall_exists_index, Finset.mem_univ,
  Finset.mem_image, imp_true_iff, true_and]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
⊢ ∀ (c : E), c ∈ s → ‖c‖ ≤ 2

tactic: simp only [forall_apply_eq_imp_iff', forall_exists_index, Finset.mem_univ, Finset.mem_image,
  Ne.def, exists_true_left, forall_apply_eq_imp_iff', forall_true_left, true_and]
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
⊢ ∀ (c : E), c ∈ s → ∀ (d : E), d ∈ s → c ≠ d → 1 - goodδ E ≤ ‖c - d‖

tactic: intro i j hij
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
⊢ ∀ (a a_1 : Fin n), ¬f a = f a_1 → 1 - goodδ E ≤ ‖f a - f a_1‖

tactic: have : i ≠ j := fun h => by rw [h] at hij ; exact hij rfl
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
i j : Fin n
hij : ¬f i = f j
⊢ 1 - goodδ E ≤ ‖f i - f j‖

tactic: exact h' i j this
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
i j : Fin n
hij : ¬f i = f j
this : i ≠ j
⊢ 1 - goodδ E ≤ ‖f i - f j‖

tactic: rw [h] at hij
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h✝ : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
i j : Fin n
hij : ¬f i = f j
h : i = j
⊢ False

tactic: exact hij rfl
state_before: E : Type u_1
inst✝² : NormedAddCommGroup E
inst✝¹ : NormedSpace ℝ E
inst✝ : FiniteDimensional ℝ E
n : ℕ
f : Fin n → E
h✝ : ∀ (i : Fin n), ‖f i‖ ≤ 2
h' : ∀ (i j : Fin n), i ≠ j → 1 - goodδ E ≤ ‖f i - f j‖
finj : Function.Injective f
s : Finset E := Finset.image f Finset.univ
s_card : Finset.card s = n
hs : ∀ (c : E), c ∈ s → ‖c‖ ≤ 2
i j : Fin n
hij : ¬f j = f j
h : i = j
⊢ False