l3lab/ntp-mathlib huggingface dataset:
/--
A sieve belongs to the coherent topology if and only if it contains a finite
`EffectiveEpiFamily`.
-/
theorem coherentTopology.mem_sieves_iff_hasEffectiveEpiFamily (S : Sieve X) :
    (S ∈ GrothendieckTopology.sieves (coherentTopology C) X) ↔
    (∃ (α : Type) (_ : Fintype α) (Y : α → C) (π : (a : α) → (Y a ⟶ X)),
        EffectiveEpiFamily Y π ∧ (∀ a : α, (S.arrows) (π a)) )  := by
  constructor
  · intro h
    induction' h with Y T hS Y Y R S _ _ a b
    · rcases hS with ⟨a, h, Y', π, h'⟩
      use a, h, Y', π, by tauto
      intro a'
      rcases h' with ⟨rfl, _⟩
      simp only [Sieve.generate_apply]
      use Y' a', 𝟙 Y' a', π a', Presieve.ofArrows.mk a'
      apply Category.id_comp
    · use Unit, Unit.fintype, fun _ => Y, fun _ => (𝟙 Y)
      cases' S with arrows downward_closed
      exact ⟨inferInstance, by simp only [Sieve.top_apply, forall_const]⟩
    · rcases a with ⟨α, w, Y₁, π, ⟨h₁,h₂⟩⟩
      choose β _ Y_n π_n H using fun a => b (h₂ a)
      use (Σ a, β a), inferInstance, fun ⟨a,b⟩ => Y_n a b, fun ⟨a, b⟩ => (π_n a b) ≫ (π a)
      constructor
      · 

Proof state:
case h.left
C✝ : Type u_1
inst✝² : Category.{?u.18231, u_1} C✝
C : Type u_2
inst✝¹ : Category.{u_3, u_2} C
inst✝ : Precoherent C
X : C
S✝ : Sieve X
Y : C
R S : Sieve Y
a✝¹ : Coverage.saturate (coherentCoverage C) Y R
a✝ : ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄, R.arrows f → Coverage.saturate (coherentCoverage C) Y_1 (Sieve.pullback f S)
b :
  ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄,
    R.arrows f → ∃ α x Y_2 π, EffectiveEpiFamily Y_2 π ∧ ∀ (a : α), (Sieve.pullback f S).arrows (π a)
α : Type
w : Fintype α
Y₁ : α → C
π : (a : α) → Y₁ a ⟶ Y
h₁ : EffectiveEpiFamily Y₁ π
h₂ : ∀ (a : α), R.arrows (π a)
β : α → Type
x✝ : (a : α) → Fintype (β a)
Y_n : (a : α) → β a → C
π_n : (a : α) → (a_1 : β a) → Y_n a a_1 ⟶ Y₁ a
H : ∀ (a : α), EffectiveEpiFamily (Y_n a) (π_n a) ∧ ∀ (a_1 : β a), (Sieve.pullback (π a) S).arrows (π_n a a_1)
⊢ EffectiveEpiFamily
    (fun x =>
      match x with
      | { fst := a, snd := b } => Y_n a b)
    fun x =>
    match x with
    | { fst := a, snd := b } => π_n a b ≫ π a

Next tactic:
exact EffectiveEpiFamily.transitive_of_finite _ h₁ _ (fun a => (H a).1)
/--
A sieve belongs to the coherent topology if and only if it contains a finite
`EffectiveEpiFamily`.
-/
theorem coherentTopology.mem_sieves_iff_hasEffectiveEpiFamily (S : Sieve X) :
    (S ∈ GrothendieckTopology.sieves (coherentTopology C) X) ↔
    (∃ (α : Type) (_ : Fintype α) (Y : α → C) (π : (a : α) → (Y a ⟶ X)),
        EffectiveEpiFamily Y π ∧ (∀ a : α, (S.arrows) (π a)) )  := by
  constructor
  · intro h
    induction' h with Y T hS Y Y R S _ _ a b
    · rcases hS with ⟨a, h, Y', π, h'⟩
      use a, h, Y', π, by tauto
      intro a'
      rcases h' with ⟨rfl, _⟩
      simp only [Sieve.generate_apply]
      use Y' a', 𝟙 Y' a', π a', Presieve.ofArrows.mk a'
      apply Category.id_comp
    · use Unit, Unit.fintype, fun _ => Y, fun _ => (𝟙 Y)
      cases' S with arrows downward_closed
      exact ⟨inferInstance, by simp only [Sieve.top_apply, forall_const]⟩
    · rcases a with ⟨α, w, Y₁, π, ⟨h₁,h₂⟩⟩
      choose β _ Y_n π_n H using fun a => b (h₂ a)
      use (Σ a, β a), inferInstance, fun ⟨a,b⟩ => Y_n a b, fun ⟨a, b⟩ => (π_n a b) ≫ (π a)
      constructor
      · exact EffectiveEpiFamily.transitive_of_finite _ h₁ _ (fun a => (H a).1)
      · 

Proof state:
case h.right
C✝ : Type u_1
inst✝² : Category.{?u.18231, u_1} C✝
C : Type u_2
inst✝¹ : Category.{u_3, u_2} C
inst✝ : Precoherent C
X : C
S✝ : Sieve X
Y : C
R S : Sieve Y
a✝¹ : Coverage.saturate (coherentCoverage C) Y R
a✝ : ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄, R.arrows f → Coverage.saturate (coherentCoverage C) Y_1 (Sieve.pullback f S)
b :
  ∀ ⦃Y_1 : C⦄ ⦃f : Y_1 ⟶ Y⦄,
    R.arrows f → ∃ α x Y_2 π, EffectiveEpiFamily Y_2 π ∧ ∀ (a : α), (Sieve.pullback f S).arrows (π a)
α : Type
w : Fintype α
Y₁ : α → C
π : (a : α) → Y₁ a ⟶ Y
h₁ : EffectiveEpiFamily Y₁ π
h₂ : ∀ (a : α), R.arrows (π a)
β : α → Type
x✝ : (a : α) → Fintype (β a)
Y_n : (a : α) → β a → C
π_n : (a : α) → (a_1 : β a) → Y_n a a_1 ⟶ Y₁ a
H : ∀ (a : α), EffectiveEpiFamily (Y_n a) (π_n a) ∧ ∀ (a_1 : β a), (Sieve.pullback (π a) S).arrows (π_n a a_1)
⊢ ∀ (a : (a : α) × β a),
    S.arrows
      (match a with
      | { fst := a, snd := b } => π_n a b ≫ π a)

Next tactic:
exact fun c => (H c.fst).2 c.snd
/--
A sieve belongs to the coherent topology if and only if it contains a finite
`EffectiveEpiFamily`.
-/
theorem coherentTopology.mem_sieves_iff_hasEffectiveEpiFamily (S : Sieve X) :
    (S ∈ GrothendieckTopology.sieves (coherentTopology C) X) ↔
    (∃ (α : Type) (_ : Fintype α) (Y : α → C) (π : (a : α) → (Y a ⟶ X)),
        EffectiveEpiFamily Y π ∧ (∀ a : α, (S.arrows) (π a)) )  := by
  constructor
  · intro h
    induction' h with Y T hS Y Y R S _ _ a b
    · rcases hS with ⟨a, h, Y', π, h'⟩
      use a, h, Y', π, by tauto
      intro a'
      rcases h' with ⟨rfl, _⟩
      simp only [Sieve.generate_apply]
      use Y' a', 𝟙 Y' a', π a', Presieve.ofArrows.mk a'
      apply Category.id_comp
    · use Unit, Unit.fintype, fun _ => Y, fun _ => (𝟙 Y)
      cases' S with arrows downward_closed
      exact ⟨inferInstance, by simp only [Sieve.top_apply, forall_const]⟩
    · rcases a with ⟨α, w, Y₁, π, ⟨h₁,h₂⟩⟩
      choose β _ Y_n π_n H using fun a => b (h₂ a)
      use (Σ a, β a), inferInstance, fun ⟨a,b⟩ => Y_n a b, fun ⟨a, b⟩ => (π_n a b) ≫ (π a)
      constructor
      · exact EffectiveEpiFamily.transitive_of_finite _ h₁ _ (fun a => (H a).1)
      · exact fun c => (H c.fst).2 c.snd
  · 

Proof state:
case mpr
C✝ : Type u_1
inst✝² : Category.{?u.18231, u_1} C✝
C : Type u_2
inst✝¹ : Category.{u_3, u_2} C
inst✝ : Precoherent C
X : C
S : Sieve X
⊢ (∃ α x Y π, EffectiveEpiFamily Y π ∧ ∀ (a : α), S.arrows (π a)) →
    S ∈ GrothendieckTopology.sieves (coherentTopology C) X

Next tactic:
exact coherentTopology.mem_sieves_of_hasEffectiveEpiFamily S
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    

Proof state:
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
⊢ ∀ (e e' : Trivialization F TotalSpace.proj) [inst : MemTrivializationAtlas e] [inst_1 : MemTrivializationAtlas e'],
    SmoothOn IB' 𝓘(𝕜, F →L[𝕜] F) (fun b => ↑(Trivialization.coordChangeL 𝕜 e e' b)) (e.baseSet ∩ e'.baseSet)

Next tactic:
rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; 

Proof state:
case mk.intro.intro.mk.intro.intro
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
⊢ SmoothOn IB' 𝓘(𝕜, F →L[𝕜] F)
    (fun b => ↑(Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) b))
    ((Trivialization.pullback e f).baseSet ∩ (Trivialization.pullback e' f).baseSet)

Next tactic:
skip
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; skip
    

Proof state:
case mk.intro.intro.mk.intro.intro
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
⊢ SmoothOn IB' 𝓘(𝕜, F →L[𝕜] F)
    (fun b => ↑(Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) b))
    ((Trivialization.pullback e f).baseSet ∩ (Trivialization.pullback e' f).baseSet)

Next tactic:
refine' ((smoothOn_coordChangeL _ e e').comp f.smooth.smoothOn fun b hb => hb).congr _
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; skip
    refine' ((smoothOn_coordChangeL _ e e').comp f.smooth.smoothOn fun b hb => hb).congr _
    

Proof state:
case mk.intro.intro.mk.intro.intro
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
⊢ ∀ y ∈ ⇑f ⁻¹' (e.baseSet ∩ e'.baseSet),
    ↑(Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) y) =
      ((fun b => ↑(Trivialization.coordChangeL 𝕜 e e' b)) ∘ ⇑f) y

Next tactic:
rintro b (hb : f b ∈ e.baseSet ∩ e'.baseSet)
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; skip
    refine' ((smoothOn_coordChangeL _ e e').comp f.smooth.smoothOn fun b hb => hb).congr _
    rintro b (hb : f b ∈ e.baseSet ∩ e'.baseSet); 

Proof state:
case mk.intro.intro.mk.intro.intro
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
b : B'
hb : f b ∈ e.baseSet ∩ e'.baseSet
⊢ ↑(Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) b) =
    ((fun b => ↑(Trivialization.coordChangeL 𝕜 e e' b)) ∘ ⇑f) b

Next tactic:
ext v
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; skip
    refine' ((smoothOn_coordChangeL _ e e').comp f.smooth.smoothOn fun b hb => hb).congr _
    rintro b (hb : f b ∈ e.baseSet ∩ e'.baseSet); ext v
    

Proof state:
case mk.intro.intro.mk.intro.intro.h
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
b : B'
hb : f b ∈ e.baseSet ∩ e'.baseSet
v : F
⊢ ↑(Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) b) v =
    (((fun b => ↑(Trivialization.coordChangeL 𝕜 e e' b)) ∘ ⇑f) b) v

Next tactic:
show ((e.pullback f).coordChangeL 𝕜 (e'.pullback f) b) v = (e.coordChangeL 𝕜 e' (f b)) v
/-- For a smooth vector bundle `E` over a manifold `B` and a smooth map `f : B' → B`, the pullback
vector bundle `f *ᵖ E` is a smooth vector bundle. -/
instance SmoothVectorBundle.pullback : SmoothVectorBundle F (f *ᵖ E) IB' where
  smoothOn_coordChangeL := by
    rintro _ _ ⟨e, he, rfl⟩ ⟨e', he', rfl⟩; skip
    refine' ((smoothOn_coordChangeL _ e e').comp f.smooth.smoothOn fun b hb => hb).congr _
    rintro b (hb : f b ∈ e.baseSet ∩ e'.baseSet); ext v
    show ((e.pullback f).coordChangeL 𝕜 (e'.pullback f) b) v = (e.coordChangeL 𝕜 e' (f b)) v
    

Proof state:
case mk.intro.intro.mk.intro.intro.h
𝕜 : Type u_1
B : Type u_2
B' : Type u_3
M : Type u_4
F : Type u_5
E : B → Type u_6
inst✝²¹ : NontriviallyNormedField 𝕜
inst✝²⁰ : (x : B) → AddCommMonoid (E x)
inst✝¹⁹ : (x : B) → Module 𝕜 (E x)
inst✝¹⁸ : NormedAddCommGroup F
inst✝¹⁷ : NormedSpace 𝕜 F
inst✝¹⁶ : TopologicalSpace (TotalSpace F E)
inst✝¹⁵ : (x : B) → TopologicalSpace (E x)
EB : Type u_7
inst✝¹⁴ : NormedAddCommGroup EB
inst✝¹³ : NormedSpace 𝕜 EB
HB : Type u_8
inst✝¹² : TopologicalSpace HB
IB : ModelWithCorners 𝕜 EB HB
inst✝¹¹ : TopologicalSpace B
inst✝¹⁰ : ChartedSpace HB B
inst✝⁹ : SmoothManifoldWithCorners IB B
EB' : Type u_9
inst✝⁸ : NormedAddCommGroup EB'
inst✝⁷ : NormedSpace 𝕜 EB'
HB' : Type u_10
inst✝⁶ : TopologicalSpace HB'
IB' : ModelWithCorners 𝕜 EB' HB'
inst✝⁵ : TopologicalSpace B'
inst✝⁴ : ChartedSpace HB' B'
inst✝³ : SmoothManifoldWithCorners IB' B'
inst✝² : FiberBundle F E
inst✝¹ : VectorBundle 𝕜 F E
inst✝ : SmoothVectorBundle F E IB
f : SmoothMap IB' IB B' B
e : Trivialization F TotalSpace.proj
he : MemTrivializationAtlas e
e' : Trivialization F TotalSpace.proj
he' : MemTrivializationAtlas e'
b : B'
hb : f b ∈ e.baseSet ∩ e'.baseSet
v : F
⊢ (Trivialization.coordChangeL 𝕜 (Trivialization.pullback e f) (Trivialization.pullback e' f) b) v =
    (Trivialization.coordChangeL 𝕜 e e' (f b)) v

Next tactic:
rw [e.coordChangeL_apply e' hb, (e.pullback f).coordChangeL_apply' _]
/-- **Blichfeldt's Theorem**. If the volume of the set `s` is larger than the covolume of the
countable subgroup `L` of `E`, then there exist two distinct points `x, y ∈ L` such that `(x + s)`
and `(y + s)` are not disjoint. -/
theorem exists_pair_mem_lattice_not_disjoint_vadd [AddCommGroup L] [Countable L] [AddAction L E]
    [MeasurableSpace L] [MeasurableVAdd L E] [VAddInvariantMeasure L E μ]
    (fund : IsAddFundamentalDomain L F μ) (hS : NullMeasurableSet s μ) (h : μ F < μ s) :
    ∃ x y : L, x ≠ y ∧ ¬Disjoint (x +ᵥ s) (y +ᵥ s) := by
  

Proof state:
E : Type u_1
L : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : AddCommGroup L
inst✝⁴ : Countable L
inst✝³ : AddAction L E
inst✝² : MeasurableSpace L
inst✝¹ : MeasurableVAdd L E
inst✝ : VAddInvariantMeasure L E μ
fund : IsAddFundamentalDomain L F
hS : NullMeasurableSet s
h : ↑↑μ F < ↑↑μ s
⊢ ∃ x y, x ≠ y ∧ ¬Disjoint (x +ᵥ s) (y +ᵥ s)

Next tactic:
contrapose! h
/-- **Blichfeldt's Theorem**. If the volume of the set `s` is larger than the covolume of the
countable subgroup `L` of `E`, then there exist two distinct points `x, y ∈ L` such that `(x + s)`
and `(y + s)` are not disjoint. -/
theorem exists_pair_mem_lattice_not_disjoint_vadd [AddCommGroup L] [Countable L] [AddAction L E]
    [MeasurableSpace L] [MeasurableVAdd L E] [VAddInvariantMeasure L E μ]
    (fund : IsAddFundamentalDomain L F μ) (hS : NullMeasurableSet s μ) (h : μ F < μ s) :
    ∃ x y : L, x ≠ y ∧ ¬Disjoint (x +ᵥ s) (y +ᵥ s) := by
  contrapose! h
  

Proof state:
E : Type u_1
L : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : AddCommGroup L
inst✝⁴ : Countable L
inst✝³ : AddAction L E
inst✝² : MeasurableSpace L
inst✝¹ : MeasurableVAdd L E
inst✝ : VAddInvariantMeasure L E μ
fund : IsAddFundamentalDomain L F
hS : NullMeasurableSet s
h : ∀ (x y : L), x ≠ y → Disjoint (x +ᵥ s) (y +ᵥ s)
⊢ ↑↑μ s ≤ ↑↑μ F

Next tactic:
exact ((fund.measure_eq_tsum _).trans (measure_iUnion₀
    (Pairwise.mono h fun i j hij => (hij.mono inf_le_left inf_le_left).aedisjoint)
      fun _ => (hS.vadd _).inter fund.nullMeasurableSet).symm).trans_le
      (measure_mono <| Set.iUnion_subset fun _ => Set.inter_subset_right _ _)
/-- The **Minkowski Convex Body Theorem**. If `s` is a convex symmetric domain of `E` whose volume
is large enough compared to the covolume of a lattice `L` of `E`, then it contains a non-zero
lattice point of `L`.  -/
theorem exists_ne_zero_mem_lattice_of_measure_mul_two_pow_lt_measure [NormedAddCommGroup E]
    [NormedSpace ℝ E] [BorelSpace E] [FiniteDimensional ℝ E] [IsAddHaarMeasure μ]
    {L : AddSubgroup E} [Countable L] (fund : IsAddFundamentalDomain L F μ)
    (h_symm : ∀ x ∈ s, -x ∈ s) (h_conv : Convex ℝ s) (h : μ F * 2 ^ finrank ℝ E < μ s) :
    ∃ x ≠ 0, ((x : L) : E) ∈ s := by
  

Proof state:
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable ↥L
fund : IsAddFundamentalDomain (↥L) F
h_symm : ∀ x ∈ s, -x ∈ s
h_conv : Convex ℝ s
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
⊢ ∃ x, x ≠ 0 ∧ ↑x ∈ s

Next tactic:
have h_vol : μ F < μ ((2⁻¹ : ℝ) • s) := by
    rw [addHaar_smul_of_nonneg μ (by norm_num : 0 ≤ (2 : ℝ)⁻¹) s, ←
      mul_lt_mul_right (pow_ne_zero (finrank ℝ E) (two_ne_zero' _)) (pow_ne_top two_ne_top),
      mul_right_comm, ofReal_pow (by norm_num : 0 ≤ (2 : ℝ)⁻¹), ← ofReal_inv_of_pos zero_lt_two]
    norm_num
    rwa [← mul_pow, ENNReal.inv_mul_cancel two_ne_zero two_ne_top, one_pow, one_mul]
/-- The **Minkowski Convex Body Theorem**. If `s` is a convex symmetric domain of `E` whose volume
is large enough compared to the covolume of a lattice `L` of `E`, then it contains a non-zero
lattice point of `L`.  -/
theorem exists_ne_zero_mem_lattice_of_measure_mul_two_pow_lt_measure [NormedAddCommGroup E]
    [NormedSpace ℝ E] [BorelSpace E] [FiniteDimensional ℝ E] [IsAddHaarMeasure μ]
    {L : AddSubgroup E} [Countable L] (fund : IsAddFundamentalDomain L F μ)
    (h_symm : ∀ x ∈ s, -x ∈ s) (h_conv : Convex ℝ s) (h : μ F * 2 ^ finrank ℝ E < μ s) :
    ∃ x ≠ 0, ((x : L) : E) ∈ s := by
  have h_vol : μ F < μ ((2⁻¹ : ℝ) • s) := by
    

Proof state:
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable ↥L
fund : IsAddFundamentalDomain (↥L) F
h_symm : ∀ x ∈ s, -x ∈ s
h_conv : Convex ℝ s
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
⊢ ↑↑μ F < ↑↑μ (2⁻¹ • s)

Next tactic:
rw [addHaar_smul_of_nonneg μ (by norm_num : 0 ≤ (2 : ℝ)⁻¹) s, ←
      mul_lt_mul_right (pow_ne_zero (finrank ℝ E) (two_ne_zero' _)) (pow_ne_top two_ne_top),
      mul_right_comm, ofReal_pow (by norm_num : 0 ≤ (2 : ℝ)⁻¹), ← ofReal_inv_of_pos zero_lt_two]
/-- The **Minkowski Convex Body Theorem**. If `s` is a convex symmetric domain of `E` whose volume
is large enough compared to the covolume of a lattice `L` of `E`, then it contains a non-zero
lattice point of `L`.  -/
theorem exists_ne_zero_mem_lattice_of_measure_mul_two_pow_lt_measure [NormedAddCommGroup E]
    [NormedSpace ℝ E] [BorelSpace E] [FiniteDimensional ℝ E] [IsAddHaarMeasure μ]
    {L : AddSubgroup E} [Countable L] (fund : IsAddFundamentalDomain L F μ)
    (h_symm : ∀ x ∈ s, -x ∈ s) (h_conv : Convex ℝ s) (h : μ F * 2 ^ finrank ℝ E < μ s) :
    ∃ x ≠ 0, ((x : L) : E) ∈ s := by
  have h_vol : μ F < μ ((2⁻¹ : ℝ) • s) := by
    rw [addHaar_smul_of_nonneg μ (by 

Proof state:
E : Type u_1
L✝ : Type u_2
inst✝⁶ : MeasurableSpace E
μ : Measure E
F s : Set E
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : BorelSpace E
inst✝² : FiniteDimensional ℝ E
inst✝¹ : IsAddHaarMeasure μ
L : AddSubgroup E
inst✝ : Countable ↥L
fund : IsAddFundamentalDomain (↥L) F
h_symm : ∀ x ∈ s, -x ∈ s
h_conv : Convex ℝ s
h : ↑↑μ F * 2 ^ finrank ℝ E < ↑↑μ s
⊢ 0 ≤ 2⁻¹

Next tactic:
norm_num