-- Mathlib/CategoryTheory/Galois/Decomposition.lean
/-- Up to isomorphism an element of the fiber of `X` only lies in one connected component. -/
lemma connected_component_unique {X A B : C} [IsConnected A] [IsConnected B] (a : F.obj A)
    (b : F.obj B) (i : A ⟶ X) (j : B ⟶ X) (h : F.map i a = F.map j b) [Mono i] [Mono j] :
    ∃ (f : A ≅ B), F.map f.hom a = b

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this✝ : IsIso u
this : IsIso v
hu : G.map u y = a
⊢ pullback.snd ((F ⋙ FintypeCat.incl).map i) ((F ⋙ FintypeCat.incl).map j)
      ((Types.pullbackIsoPullback (F.map i) (F.map j)).inv ⟨(a, b), h⟩) =
    b

Tactic:
erw [Types.pullbackIsoPullback_inv_snd_apply (F.map i) (F.map j)]

Result:
no goals

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this : IsIso u
⊢ ∃ f, F.map f.hom a = b

Tactic:
have : IsIso v := IsConnected.noTrivialComponent Y v hn

Result:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this✝ : IsIso u
this : IsIso v
⊢ ∃ f, F.map f.hom a = b

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
⊢ ∃ f, F.map f.hom a = b

Tactic:
let G := F ⋙ FintypeCat.incl

Result:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
⊢ ∃ f, F.map f.hom a = b

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
⊢ ∃ f, F.map f.hom a = b

Tactic:
have : IsIso u := IsConnected.noTrivialComponent Y u hn

Result:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this : IsIso u
⊢ ∃ f, F.map f.hom a = b

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this✝ : IsIso u
this : IsIso v
⊢ ∃ f, F.map f.hom a = b

Tactic:
use (asIso u).symm ≪≫ asIso v

Result:
case h
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
y : (F.obj Y).carrier := e.symm ⟨(a, b), h⟩
hn : IsInitial Y → False
this✝ : IsIso u
this : IsIso v
⊢ F.map ((asIso u).symm ≪≫ asIso v).hom a = b

Proof state:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
⊢ ∃ f, F.map f.hom a = b

Tactic:
let e : F.obj Y ≃ { p : F.obj A × F.obj B // F.map i p.1 = F.map j p.2 } :=
  fiberPullbackEquiv F i j

Result:
C : Type u₁
inst✝⁶ : Category.{u₂, u₁} C
inst✝⁵ : GaloisCategory C
F : C ⥤ FintypeCat
inst✝⁴ : FiberFunctor F
X A B : C
inst✝³ : IsConnected A
inst✝² : IsConnected B
a : (F.obj A).carrier
b : (F.obj B).carrier
i : A ⟶ X
j : B ⟶ X
h : F.map i a = F.map j b
inst✝¹ : Mono i
inst✝ : Mono j
Y : C := pullback i j
u : Y ⟶ A := pullback.fst i j
v : Y ⟶ B := pullback.snd i j
G : C ⥤ Type w := F ⋙ FintypeCat.incl
e : (F.obj Y).carrier ≃ { p // F.map i p.1 = F.map j p.2 } := fiberPullbackEquiv F i j
⊢ ∃ f, F.map f.hom a = b