Theorem: CategoryTheory.Limits.Types.surjective_π_app_zero_of_surjective_map_aux
File: Mathlib/CategoryTheory/Limits/Types.lean

Proof steps:
state_before: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
⊢ Function.Surjective ((limitCone F).π.app (Opposite.op 0))
state_after: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
⊢ ∃ a_1, (limitCone F).π.app (Opposite.op 0) a_1 = a
tactic: intro a
state_before: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
⊢ ∃ a_1, (limitCone F).π.app (Opposite.op 0) a_1 = a
state_after: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
⊢ (fun x =>
      match x with
      | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n) ∈
    F.sections
tactic: refine ⟨⟨fun ⟨n⟩ ↦ preimage hF a n, ?_⟩, rfl⟩
state_before: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
⊢ (fun x =>
      match x with
      | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n) ∈
    F.sections
state_after: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
n m : ℕ
h : m ≤ n
⊢ F.map (Opposite.op { down := { down := h } })
      ((fun x =>
          match x with
          | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n)
        (Opposite.op n)) =
    (fun x =>
        match x with
        | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n)
      (Opposite.op m)
tactic: intro ⟨n⟩ ⟨m⟩ ⟨⟨⟨(h : m ≤ n)⟩⟩⟩
state_before: J : Type v
inst✝¹ : Category.{w, v} J
F✝ : J ⥤ Type u
inst✝ : HasColimit F✝
α β : Type u
f : α ⟶ β
F : ℕᵒᵖ ⥤ Type u
c : Cone F
hc : IsLimit c
hF : ∀ (n : ℕ), Function.Surjective (F.map (homOfLE ⋯).op)
a : F.obj (Opposite.op 0)
n m : ℕ
h : m ≤ n
⊢ F.map (Opposite.op { down := { down := h } })
      ((fun x =>
          match x with
          | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n)
        (Opposite.op n)) =
    (fun x =>
        match x with
        | Opposite.op n => CategoryTheory.Limits.Types.limitOfSurjectionsSurjective.preimage hF a n)
      (Opposite.op m)
state_after: no goals
tactic: induction h with
  | refl =>
    erw [CategoryTheory.Functor.map_id, types_id_apply]
  | @step p h ih =>
    rw [← ih]
    have h' : m ≤ p := h
    erw [CategoryTheory.Functor.map_comp (f := (homOfLE (Nat.le_succ p)).op) (g := (homOfLE h').op),
      types_comp_apply, (hF p _).choose_spec]
    rfl