l3lab/ntp-mathlib huggingface dataset:
/-- The derivative of the zero section of the tangent bundle maps `⟨x, v⟩` to `⟨⟨x, 0⟩, ⟨v, 0⟩⟩`.

Note that, as currently framed, this is a statement in coordinates, thus reliant on the choice
of the coordinate system we use on the tangent bundle.

However, the result itself is coordinate-dependent only to the extent that the coordinates
determine a splitting of the tangent bundle.  Moreover, there is a canonical splitting at each
point of the zero section (since there is a canonical horizontal space there, the tangent space
to the zero section, in addition to the canonical vertical space which is the kernel of the
derivative of the projection), and this canonical splitting is also the one that comes from the
coordinates on the tangent bundle in our definitions. So this statement is not as crazy as it
may seem.

TODO define splittings of vector bundles; state this result invariantly. -/
theorem tangentMap_tangentBundle_pure (p : TangentBundle I M) :
    tangentMap I I.tangent (zeroSection E (TangentSpace I)) p = ⟨⟨p.proj, 0⟩, ⟨p.2, 0⟩⟩ := by
  rcases p with ⟨x, v⟩
  have N : I.symm ⁻¹' (chartAt H x).target ∈ 𝓝 (I ((chartAt H x) x)) := by
    

Proof state:
𝕜 : Type u_1
inst✝²⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝²³ : NormedAddCommGroup E
inst✝²² : NormedSpace 𝕜 E
H : Type u_3
inst✝²¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝²⁰ : TopologicalSpace M
inst✝¹⁹ : ChartedSpace H M
Is : SmoothManifoldWithCorners I M
E' : Type u_5
inst✝¹⁸ : NormedAddCommGroup E'
inst✝¹⁷ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝¹⁶ : TopologicalSpace H'
I' : ModelWithCorners 𝕜 E' H'
M' : Type u_7
inst✝¹⁵ : TopologicalSpace M'
inst✝¹⁴ : ChartedSpace H' M'
I's : SmoothManifoldWithCorners I' M'
F : Type u_8
inst✝¹³ : NormedAddCommGroup F
inst✝¹² : NormedSpace 𝕜 F
G : Type u_9
inst✝¹¹ : TopologicalSpace G
J : ModelWithCorners 𝕜 F G
N : Type u_10
inst✝¹⁰ : TopologicalSpace N
inst✝⁹ : ChartedSpace G N
Js : SmoothManifoldWithCorners J N
F' : Type u_11
inst✝⁸ : NormedAddCommGroup F'
inst✝⁷ : NormedSpace 𝕜 F'
G' : Type u_12
inst✝⁶ : TopologicalSpace G'
J' : ModelWithCorners 𝕜 F' G'
N' : Type u_13
inst✝⁵ : TopologicalSpace N'
inst✝⁴ : ChartedSpace G' N'
J's : SmoothManifoldWithCorners J' N'
F₁ : Type u_14
inst✝³ : NormedAddCommGroup F₁
inst✝² : NormedSpace 𝕜 F₁
F₂ : Type u_15
inst✝¹ : NormedAddCommGroup F₂
inst✝ : NormedSpace 𝕜 F₂
f f₁ : M → M'
s s₁ t : Set M
x✝ : M
m n : ℕ∞
x : M
v : TangentSpace I x
⊢ ↑(ModelWithCorners.symm I) ⁻¹' (chartAt H x).toPartialEquiv.target ∈ 𝓝 (↑I (↑(chartAt H x) x))

Next tactic:
apply IsOpen.mem_nhds
/-- The derivative of the zero section of the tangent bundle maps `⟨x, v⟩` to `⟨⟨x, 0⟩, ⟨v, 0⟩⟩`.

Note that, as currently framed, this is a statement in coordinates, thus reliant on the choice
of the coordinate system we use on the tangent bundle.

However, the result itself is coordinate-dependent only to the extent that the coordinates
determine a splitting of the tangent bundle.  Moreover, there is a canonical splitting at each
point of the zero section (since there is a canonical horizontal space there, the tangent space
to the zero section, in addition to the canonical vertical space which is the kernel of the
derivative of the projection), and this canonical splitting is also the one that comes from the
coordinates on the tangent bundle in our definitions. So this statement is not as crazy as it
may seem.

TODO define splittings of vector bundles; state this result invariantly. -/
theorem tangentMap_tangentBundle_pure (p : TangentBundle I M) :
    tangentMap I I.tangent (zeroSection E (TangentSpace I)) p = ⟨⟨p.proj, 0⟩, ⟨p.2, 0⟩⟩ := by
  rcases p with ⟨x, v⟩
  have N : I.symm ⁻¹' (chartAt H x).target ∈ 𝓝 (I ((chartAt H x) x)) := by
    apply IsOpen.mem_nhds
    apply (PartialHomeomorph.open_target _).preimage I.continuous_invFun
    

Proof state:
case ha
𝕜 : Type u_1
inst✝²⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝²³ : NormedAddCommGroup E
inst✝²² : NormedSpace 𝕜 E
H : Type u_3
inst✝²¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝²⁰ : TopologicalSpace M
inst✝¹⁹ : ChartedSpace H M
Is : SmoothManifoldWithCorners I M
E' : Type u_5
inst✝¹⁸ : NormedAddCommGroup E'
inst✝¹⁷ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝¹⁶ : TopologicalSpace H'
I' : ModelWithCorners 𝕜 E' H'
M' : Type u_7
inst✝¹⁵ : TopologicalSpace M'
inst✝¹⁴ : ChartedSpace H' M'
I's : SmoothManifoldWithCorners I' M'
F : Type u_8
inst✝¹³ : NormedAddCommGroup F
inst✝¹² : NormedSpace 𝕜 F
G : Type u_9
inst✝¹¹ : TopologicalSpace G
J : ModelWithCorners 𝕜 F G
N : Type u_10
inst✝¹⁰ : TopologicalSpace N
inst✝⁹ : ChartedSpace G N
Js : SmoothManifoldWithCorners J N
F' : Type u_11
inst✝⁸ : NormedAddCommGroup F'
inst✝⁷ : NormedSpace 𝕜 F'
G' : Type u_12
inst✝⁶ : TopologicalSpace G'
J' : ModelWithCorners 𝕜 F' G'
N' : Type u_13
inst✝⁵ : TopologicalSpace N'
inst✝⁴ : ChartedSpace G' N'
J's : SmoothManifoldWithCorners J' N'
F₁ : Type u_14
inst✝³ : NormedAddCommGroup F₁
inst✝² : NormedSpace 𝕜 F₁
F₂ : Type u_15
inst✝¹ : NormedAddCommGroup F₂
inst✝ : NormedSpace 𝕜 F₂
f f₁ : M → M'
s s₁ t : Set M
x✝ : M
m n : ℕ∞
x : M
v : TangentSpace I x
⊢ ↑I (↑(chartAt H x) x) ∈ ↑(ModelWithCorners.symm I) ⁻¹' (chartAt H x).toPartialEquiv.target

Next tactic:
simp only [mfld_simps]
/-- The derivative of the zero section of the tangent bundle maps `⟨x, v⟩` to `⟨⟨x, 0⟩, ⟨v, 0⟩⟩`.

Note that, as currently framed, this is a statement in coordinates, thus reliant on the choice
of the coordinate system we use on the tangent bundle.

However, the result itself is coordinate-dependent only to the extent that the coordinates
determine a splitting of the tangent bundle.  Moreover, there is a canonical splitting at each
point of the zero section (since there is a canonical horizontal space there, the tangent space
to the zero section, in addition to the canonical vertical space which is the kernel of the
derivative of the projection), and this canonical splitting is also the one that comes from the
coordinates on the tangent bundle in our definitions. So this statement is not as crazy as it
may seem.

TODO define splittings of vector bundles; state this result invariantly. -/
theorem tangentMap_tangentBundle_pure (p : TangentBundle I M) :
    tangentMap I I.tangent (zeroSection E (TangentSpace I)) p = ⟨⟨p.proj, 0⟩, ⟨p.2, 0⟩⟩ := by
  rcases p with ⟨x, v⟩
  have N : I.symm ⁻¹' (chartAt H x).target ∈ 𝓝 (I ((chartAt H x) x)) := by
    apply IsOpen.mem_nhds
    apply (PartialHomeomorph.open_target _).preimage I.continuous_invFun
    simp only [mfld_simps]
  

Proof state:
case mk
𝕜 : Type u_1
inst✝²⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝²³ : NormedAddCommGroup E
inst✝²² : NormedSpace 𝕜 E
H : Type u_3
inst✝²¹ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝²⁰ : TopologicalSpace M
inst✝¹⁹ : ChartedSpace H M
Is : SmoothManifoldWithCorners I M
E' : Type u_5
inst✝¹⁸ : NormedAddCommGroup E'
inst✝¹⁷ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝¹⁶ : TopologicalSpace H'
I' : ModelWithCorners 𝕜 E' H'
M' : Type u_7
inst✝¹⁵ : TopologicalSpace M'
inst✝¹⁴ : ChartedSpace H' M'
I's : SmoothManifoldWithCorners I' M'
F : Type u_8
inst✝¹³ : NormedAddCommGroup F
inst✝¹² : NormedSpace 𝕜 F
G : Type u_9
inst✝¹¹ : TopologicalSpace G
J : ModelWithCorners 𝕜 F G
N✝ : Type u_10
inst✝¹⁰ : TopologicalSpace N✝
inst✝⁹ : ChartedSpace G N✝
Js : SmoothManifoldWithCorners J N✝
F' : Type u_11
inst✝⁸ : NormedAddCommGroup F'
inst✝⁷ : NormedSpace 𝕜 F'
G' : Type u_12
inst✝⁶ : TopologicalSpace G'
J' : ModelWithCorners 𝕜 F' G'
N' : Type u_13
inst✝⁵ : TopologicalSpace N'
inst✝⁴ : ChartedSpace G' N'
J's : SmoothManifoldWithCorners J' N'
F₁ : Type u_14
inst✝³ : NormedAddCommGroup F₁
inst✝² : NormedSpace 𝕜 F₁
F₂ : Type u_15
inst✝¹ : NormedAddCommGroup F₂
inst✝ : NormedSpace 𝕜 F₂
f f₁ : M → M'
s s₁ t : Set M
x✝ : M
m n : ℕ∞
x : M
v : TangentSpace I x
N : ↑(ModelWithCorners.symm I) ⁻¹' (chartAt H x).toPartialEquiv.target ∈ 𝓝 (↑I (↑(chartAt H x) x))
⊢ tangentMap I (ModelWithCorners.tangent I) (zeroSection E (TangentSpace I)) { proj := x, snd := v } =
    { proj := { proj := { proj := x, snd := v }.proj, snd := 0 }, snd := ({ proj := x, snd := v }.snd, 0) }

Next tactic:
have A : MDifferentiableAt I I.tangent (fun x => @TotalSpace.mk M E (TangentSpace I) x 0) x :=
    haveI : Smooth I (I.prod 𝓘(𝕜, E)) (zeroSection E (TangentSpace I : M → Type _)) :=
      Bundle.smooth_zeroSection 𝕜 (TangentSpace I : M → Type _)
    this.mdifferentiableAt
theorem Absorbs.union (hu : Absorbs 𝕜 s u) (hv : Absorbs 𝕜 s v) : Absorbs 𝕜 s (u ∪ v) := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
hu : Absorbs 𝕜 s u
hv : Absorbs 𝕜 s v
⊢ Absorbs 𝕜 s (u ∪ v)

Next tactic:
obtain ⟨a, ha, hu⟩ := hu
theorem Absorbs.union (hu : Absorbs 𝕜 s u) (hv : Absorbs 𝕜 s v) : Absorbs 𝕜 s (u ∪ v) := by
  obtain ⟨a, ha, hu⟩ := hu
  

Proof state:
case intro.intro
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
hv : Absorbs 𝕜 s v
a : ℝ
ha : 0 < a
hu : ∀ (a_1 : 𝕜), a ≤ ‖a_1‖ → u ⊆ a_1 • s
⊢ Absorbs 𝕜 s (u ∪ v)

Next tactic:
obtain ⟨b, _hb, hv⟩ := hv
theorem Absorbs.union (hu : Absorbs 𝕜 s u) (hv : Absorbs 𝕜 s v) : Absorbs 𝕜 s (u ∪ v) := by
  obtain ⟨a, ha, hu⟩ := hu
  obtain ⟨b, _hb, hv⟩ := hv
  

Proof state:
case intro.intro.intro.intro
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
a : ℝ
ha : 0 < a
hu : ∀ (a_1 : 𝕜), a ≤ ‖a_1‖ → u ⊆ a_1 • s
b : ℝ
_hb : 0 < b
hv : ∀ (a : 𝕜), b ≤ ‖a‖ → v ⊆ a • s
⊢ Absorbs 𝕜 s (u ∪ v)

Next tactic:
exact
    ⟨max a b, lt_max_of_lt_left ha, fun c hc =>
      union_subset (hu _ <| le_of_max_le_left hc) (hv _ <| le_of_max_le_right hc)⟩
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
t : Finset ι
f : ι → Set E
⊢ Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
      exact fun hi'' => by
        rw [hi'']
        exact h.1
    exact ⟨h i (Finset.mem_insert_self i t), fun i' hi' => h i' (Finset.mem_insert_of_mem hi')⟩
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
t : Finset ι
f : ι → Set E
⊢ Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
induction' t using Finset.induction_on with i t _ht hi
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · 

Proof state:
case empty
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
ι : Type u_6
f : ι → Set E
⊢ Absorbs 𝕜 s (⋃ i ∈ ∅, f i) ↔ ∀ i ∈ ∅, Absorbs 𝕜 s (f i)

Next tactic:
simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    

Proof state:
case insert
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
⊢ Absorbs 𝕜 s (⋃ i_1 ∈ insert i t, f i_1) ↔ ∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)

Next tactic:
rw [Finset.set_biUnion_insert, absorbs_union, hi]
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    

Proof state:
case insert
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
⊢ (Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)) ↔ ∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)

Next tactic:
constructor
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> 

Proof state:
case insert.mp
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
⊢ (Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)) → ∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)

Next tactic:
intro h
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> 

Proof state:
case insert.mpr
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
⊢ (∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)) → Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
intro h
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · 

Proof state:
case insert.mp
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
h : Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)
⊢ ∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)

Next tactic:
refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
      

Proof state:
case insert.mp
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
h : Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)
x✝ : ι
hi' : x✝ ∈ insert i t
⊢ x✝ = i → Absorbs 𝕜 s (f x✝)

Next tactic:
exact fun hi'' => by
        rw [hi'']
        exact h.1
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
      exact fun hi'' => by
        

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
h : Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)
x✝ : ι
hi' : x✝ ∈ insert i t
hi'' : x✝ = i
⊢ Absorbs 𝕜 s (f x✝)

Next tactic:
rw [hi'']
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
      exact fun hi'' => by
        rw [hi'']
        

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
h : Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)
x✝ : ι
hi' : x✝ ∈ insert i t
hi'' : x✝ = i
⊢ Absorbs 𝕜 s (f i)

Next tactic:
exact h.1
theorem absorbs_iUnion_finset {ι : Type*} {t : Finset ι} {f : ι → Set E} :
    Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  classical
    induction' t using Finset.induction_on with i t _ht hi
    · simp only [Finset.not_mem_empty, Set.iUnion_false, Set.iUnion_empty, absorbs_empty,
        IsEmpty.forall_iff, imp_true_iff]
    rw [Finset.set_biUnion_insert, absorbs_union, hi]
    constructor <;> intro h
    · refine' fun _ hi' => (Finset.mem_insert.mp hi').elim _ (h.2 _)
      exact fun hi'' => by
        rw [hi'']
        exact h.1
    

Proof state:
case insert.mpr
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t✝ u v A B : Set E
ι : Type u_6
f : ι → Set E
i : ι
t : Finset ι
_ht : i ∉ t
hi : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)
h : ∀ i_1 ∈ insert i t, Absorbs 𝕜 s (f i_1)
⊢ Absorbs 𝕜 s (f i) ∧ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
exact ⟨h i (Finset.mem_insert_self i t), fun i' hi' => h i' (Finset.mem_insert_of_mem hi')⟩
theorem Set.Finite.absorbs_iUnion {ι : Type*} {s : Set E} {t : Set ι} {f : ι → Set E}
    (hi : t.Finite) : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s✝ t✝ u v A B : Set E
ι : Type u_6
s : Set E
t : Set ι
f : ι → Set E
hi : Set.Finite t
⊢ Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
lift t to Finset ι using hi
theorem Set.Finite.absorbs_iUnion {ι : Type*} {s : Set E} {t : Set ι} {f : ι → Set E}
    (hi : t.Finite) : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  lift t to Finset ι using hi
  

Proof state:
case intro
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s✝ t✝ u v A B : Set E
ι : Type u_6
s : Set E
f : ι → Set E
t : Finset ι
⊢ Absorbs 𝕜 s (⋃ i ∈ ↑t, f i) ↔ ∀ i ∈ ↑t, Absorbs 𝕜 s (f i)

Next tactic:
simp only [Finset.mem_coe]
theorem Set.Finite.absorbs_iUnion {ι : Type*} {s : Set E} {t : Set ι} {f : ι → Set E}
    (hi : t.Finite) : Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i) := by
  lift t to Finset ι using hi
  simp only [Finset.mem_coe]
  

Proof state:
case intro
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι✝ : Sort u_4
κ : ι✝ → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s✝ t✝ u v A B : Set E
ι : Type u_6
s : Set E
f : ι → Set E
t : Finset ι
⊢ Absorbs 𝕜 s (⋃ i ∈ t, f i) ↔ ∀ i ∈ t, Absorbs 𝕜 s (f i)

Next tactic:
exact absorbs_iUnion_finset
theorem Absorbent.subset (hA : Absorbent 𝕜 A) (hAB : A ⊆ B) : Absorbent 𝕜 B := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
hA : Absorbent 𝕜 A
hAB : A ⊆ B
⊢ Absorbent 𝕜 B

Next tactic:
refine' forall_imp (fun x => _) hA
theorem Absorbent.subset (hA : Absorbent 𝕜 A) (hAB : A ⊆ B) : Absorbent 𝕜 B := by
  refine' forall_imp (fun x => _) hA
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
hA : Absorbent 𝕜 A
hAB : A ⊆ B
x : E
⊢ (∃ r, 0 < r ∧ ∀ (a : 𝕜), r ≤ ‖a‖ → x ∈ a • A) → ∃ r, 0 < r ∧ ∀ (a : 𝕜), r ≤ ‖a‖ → x ∈ a • B

Next tactic:
exact Exists.imp fun r => And.imp_right <| forall₂_imp fun a _ha hx => Set.smul_set_mono hAB hx
theorem absorbent_iff_forall_absorbs_singleton : Absorbent 𝕜 A ↔ ∀ x, Absorbs 𝕜 A {x} := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
⊢ Absorbent 𝕜 A ↔ ∀ (x : E), Absorbs 𝕜 A {x}

Next tactic:
simp_rw [Absorbs, Absorbent, singleton_subset_iff]
theorem Absorbent.absorbs_finite {s : Set E} (hs : Absorbent 𝕜 s) {v : Set E} (hv : v.Finite) :
    Absorbs 𝕜 s v := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s✝ t u v✝ A B s : Set E
hs : Absorbent 𝕜 s
v : Set E
hv : Set.Finite v
⊢ Absorbs 𝕜 s v

Next tactic:
rw [← Set.biUnion_of_singleton v]
theorem Absorbent.absorbs_finite {s : Set E} (hs : Absorbent 𝕜 s) {v : Set E} (hv : v.Finite) :
    Absorbs 𝕜 s v := by
  rw [← Set.biUnion_of_singleton v]
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s✝ t u v✝ A B s : Set E
hs : Absorbent 𝕜 s
v : Set E
hv : Set.Finite v
⊢ Absorbs 𝕜 s (⋃ x ∈ v, {x})

Next tactic:
exact hv.absorbs_iUnion.mpr fun _ _ => hs.absorbs
@[simp]
theorem balanced_empty : Balanced 𝕜 (∅ : Set E) := fun _ _ => by 

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝¹ : SeminormedRing 𝕜
inst✝ : SMul 𝕜 E
s t u v A B : Set E
x✝¹ : 𝕜
x✝ : ‖x✝¹‖ ≤ 1
⊢ x✝¹ • ∅ ⊆ ∅

Next tactic:
rw [smul_set_empty]
theorem Absorbs.sub (h₁ : Absorbs 𝕜 s₁ t₁) (h₂ : Absorbs 𝕜 s₂ t₂) :
    Absorbs 𝕜 (s₁ - s₂) (t₁ - t₂) := by
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝² : SeminormedRing 𝕜
inst✝¹ : AddCommGroup E
inst✝ : Module 𝕜 E
s s₁ s₂ t t₁ t₂ : Set E
h₁ : Absorbs 𝕜 s₁ t₁
h₂ : Absorbs 𝕜 s₂ t₂
⊢ Absorbs 𝕜 (s₁ - s₂) (t₁ - t₂)

Next tactic:
simp_rw [sub_eq_add_neg]
theorem Absorbs.sub (h₁ : Absorbs 𝕜 s₁ t₁) (h₂ : Absorbs 𝕜 s₂ t₂) :
    Absorbs 𝕜 (s₁ - s₂) (t₁ - t₂) := by
  simp_rw [sub_eq_add_neg]
  

Proof state:
𝕜 : Type u_1
𝕝 : Type u_2
E : Type u_3
ι : Sort u_4
κ : ι → Sort u_5
inst✝² : SeminormedRing 𝕜
inst✝¹ : AddCommGroup E
inst✝ : Module 𝕜 E
s s₁ s₂ t t₁ t₂ : Set E
h₁ : Absorbs 𝕜 s₁ t₁
h₂ : Absorbs 𝕜 s₂ t₂
⊢ Absorbs 𝕜 (s₁ + -s₂) (t₁ + -t₂)

Next tactic:
exact h₁.add h₂.neg