[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
⊢ Groupoid.inv f ∈ arrows S d c ↔ f ∈ arrows S c d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
⊢ Groupoid.inv f ∈ arrows S d c → f ∈ arrows S c d
[PROOFSTEP]
intro h
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
h : Groupoid.inv f ∈ arrows S d c
⊢ f ∈ arrows S c d
[PROOFSTEP]
simpa only [inv_eq_inv, IsIso.inv_inv] using S.inv h
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
⊢ f ∈ arrows S c d → Groupoid.inv f ∈ arrows S d c
[PROOFSTEP]
apply S.inv
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
⊢ f ≫ g ∈ arrows S c e ↔ g ∈ arrows S d e
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
⊢ f ≫ g ∈ arrows S c e → g ∈ arrows S d e
[PROOFSTEP]
rintro h
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
h : f ≫ g ∈ arrows S c e
⊢ g ∈ arrows S d e
[PROOFSTEP]
suffices Groupoid.inv f ≫ f ≫ g ∈ S.arrows d e by simpa only [inv_eq_inv, IsIso.inv_hom_id_assoc] using this
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
h : f ≫ g ∈ arrows S c e
this : Groupoid.inv f ≫ f ≫ g ∈ arrows S d e
⊢ g ∈ arrows S d e
[PROOFSTEP]
simpa only [inv_eq_inv, IsIso.inv_hom_id_assoc] using this
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
h : f ≫ g ∈ arrows S c e
⊢ Groupoid.inv f ≫ f ≫ g ∈ arrows S d e
[PROOFSTEP]
apply S.mul (S.inv hf) h
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hf : f ∈ arrows S c d
⊢ g ∈ arrows S d e → f ≫ g ∈ arrows S c e
[PROOFSTEP]
apply S.mul hf
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
⊢ f ≫ g ∈ arrows S c e ↔ f ∈ arrows S c d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
⊢ f ≫ g ∈ arrows S c e → f ∈ arrows S c d
[PROOFSTEP]
rintro h
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
h : f ≫ g ∈ arrows S c e
⊢ f ∈ arrows S c d
[PROOFSTEP]
suffices (f ≫ g) ≫ Groupoid.inv g ∈ S.arrows c d by
  simpa only [inv_eq_inv, IsIso.hom_inv_id, Category.comp_id, Category.assoc] using this
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
h : f ≫ g ∈ arrows S c e
this : (f ≫ g) ≫ Groupoid.inv g ∈ arrows S c d
⊢ f ∈ arrows S c d
[PROOFSTEP]
simpa only [inv_eq_inv, IsIso.hom_inv_id, Category.comp_id, Category.assoc] using this
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
h : f ≫ g ∈ arrows S c e
⊢ (f ≫ g) ≫ Groupoid.inv g ∈ arrows S c d
[PROOFSTEP]
apply S.mul h (S.inv hg)
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d e : C
f : c ⟶ d
g : d ⟶ e
hg : g ∈ arrows S d e
⊢ f ∈ arrows S c d → f ≫ g ∈ arrows S c e
[PROOFSTEP]
exact fun hf => S.mul hf hg
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
⊢ c ∈ objs S → 𝟙 c ∈ arrows S c c
[PROOFSTEP]
rintro ⟨γ, hγ⟩
[GOAL]
case intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
γ : c ⟶ c
hγ : γ ∈ arrows S c c
⊢ 𝟙 c ∈ arrows S c c
[PROOFSTEP]
convert S.mul hγ (S.inv hγ)
[GOAL]
case h.e'_4
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
γ : c ⟶ c
hγ : γ ∈ arrows S c c
⊢ 𝟙 c = γ ≫ Groupoid.inv γ
[PROOFSTEP]
simp only [inv_eq_inv, IsIso.hom_inv_id]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : ↑(objs S)
p : c ⟶ d
⊢ ↑(inv p) = inv ↑p
[PROOFSTEP]
simp only [← inv_eq_inv, coe_inv_coe]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ Function.Injective (hom S).toPrefunctor.obj
[PROOFSTEP]
rintro ⟨c, hc⟩ ⟨d, hd⟩ hcd
[GOAL]
case mk.mk
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
hc : c ∈ objs S
d : C
hd : d ∈ objs S
hcd : (hom S).obj { val := c, property := hc } = (hom S).obj { val := d, property := hd }
⊢ { val := c, property := hc } = { val := d, property := hd }
[PROOFSTEP]
simp only [Subtype.mk_eq_mk]
[GOAL]
case mk.mk
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
hc : c ∈ objs S
d : C
hd : d ∈ objs S
hcd : (hom S).obj { val := c, property := hc } = (hom S).obj { val := d, property := hd }
⊢ c = d
[PROOFSTEP]
exact hcd
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ (c d : ↑(objs S)), Function.Injective fun f => (hom S).map f
[PROOFSTEP]
rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg
[GOAL]
case mk.mk.mk.mk
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
hc : c ∈ objs S
d : C
hd : d ∈ objs S
f : ↑{ val := c, property := hc } ⟶ ↑{ val := d, property := hd }
hf : f ∈ arrows S ↑{ val := c, property := hc } ↑{ val := d, property := hd }
g : ↑{ val := c, property := hc } ⟶ ↑{ val := d, property := hd }
hg : g ∈ arrows S ↑{ val := c, property := hc } ↑{ val := d, property := hd }
hfg : (fun f => (hom S).map f) { val := f, property := hf } = (fun f => (hom S).map f) { val := g, property := hg }
⊢ { val := f, property := hf } = { val := g, property := hg }
[PROOFSTEP]
exact Subtype.eq hfg
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ x✝¹ x✝ : Subgroupoid C
S : (c d : C) → Set (c ⟶ d)
inv✝¹ : ∀ {c d : C} {p : c ⟶ d}, p ∈ S c d → Groupoid.inv p ∈ S d c
mul✝¹ : ∀ {c d e : C} {p : c ⟶ d}, p ∈ S c d → ∀ {q : d ⟶ e}, q ∈ S d e → p ≫ q ∈ S c e
T : (c d : C) → Set (c ⟶ d)
inv✝ : ∀ {c d : C} {p : c ⟶ d}, p ∈ T c d → Groupoid.inv p ∈ T d c
mul✝ : ∀ {c d e : C} {p : c ⟶ d}, p ∈ T c d → ∀ {q : d ⟶ e}, q ∈ T d e → p ≫ q ∈ T c e
h : ↑{ arrows := S, inv := inv✝¹, mul := mul✝¹ } = ↑{ arrows := T, inv := inv✝, mul := mul✝ }
⊢ { arrows := S, inv := inv✝¹, mul := mul✝¹ } = { arrows := T, inv := inv✝, mul := mul✝ }
[PROOFSTEP]
ext c d f
[GOAL]
case arrows.h.h.h
C : Type u
inst✝ : Groupoid C
S✝ x✝¹ x✝ : Subgroupoid C
S : (c d : C) → Set (c ⟶ d)
inv✝¹ : ∀ {c d : C} {p : c ⟶ d}, p ∈ S c d → Groupoid.inv p ∈ S d c
mul✝¹ : ∀ {c d e : C} {p : c ⟶ d}, p ∈ S c d → ∀ {q : d ⟶ e}, q ∈ S d e → p ≫ q ∈ S c e
T : (c d : C) → Set (c ⟶ d)
inv✝ : ∀ {c d : C} {p : c ⟶ d}, p ∈ T c d → Groupoid.inv p ∈ T d c
mul✝ : ∀ {c d e : C} {p : c ⟶ d}, p ∈ T c d → ∀ {q : d ⟶ e}, q ∈ T d e → p ≫ q ∈ T c e
h : ↑{ arrows := S, inv := inv✝¹, mul := mul✝¹ } = ↑{ arrows := T, inv := inv✝, mul := mul✝ }
c d : C
f : c ⟶ d
⊢ f ∈ arrows { arrows := S, inv := inv✝¹, mul := mul✝¹ } c d ↔ f ∈ arrows { arrows := T, inv := inv✝, mul := mul✝ } c d
[PROOFSTEP]
apply Set.ext_iff.1 h ⟨c, d, f⟩
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
⊢ S ≤ T ↔ ∀ {c d : C}, arrows S c d ⊆ arrows T c d
[PROOFSTEP]
rw [SetLike.le_def, Sigma.forall]
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
⊢ (∀ (a : C) (b : (d : C) × (a ⟶ d)), { fst := a, snd := b } ∈ S → { fst := a, snd := b } ∈ T) ↔
    ∀ {c d : C}, arrows S c d ⊆ arrows T c d
[PROOFSTEP]
exact forall_congr' fun c => Sigma.forall
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d : C} {p : c ⟶ d}, p ∈ (fun x x_1 => univ) c d → Groupoid.inv p ∈ (fun x x_1 => univ) d c
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
a✝ : p✝ ∈ (fun x x_1 => univ) c✝ d✝
⊢ Groupoid.inv p✝ ∈ (fun x x_1 => univ) d✝ c✝
[PROOFSTEP]
trivial
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d e : C} {p : c ⟶ d},
    p ∈ (fun x x_1 => univ) c d → ∀ {q : d ⟶ e}, q ∈ (fun x x_1 => univ) d e → p ≫ q ∈ (fun x x_1 => univ) c e
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
a✝¹ : p✝ ∈ (fun x x_1 => univ) c✝ d✝
q✝ : d✝ ⟶ e✝
a✝ : q✝ ∈ (fun x x_1 => univ) d✝ e✝
⊢ p✝ ≫ q✝ ∈ (fun x x_1 => univ) c✝ e✝
[PROOFSTEP]
trivial
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
⊢ c ∈ objs ⊤
[PROOFSTEP]
dsimp [Top.top, objs]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
⊢ Set.Nonempty univ
[PROOFSTEP]
simp only [univ_nonempty]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
hp : p✝ ∈ (fun c d => ⋂ (S : Subgroupoid C) (_ : S ∈ s), arrows S c d) c✝ d✝
⊢ Groupoid.inv p✝ ∈ (fun c d => ⋂ (S : Subgroupoid C) (_ : S ∈ s), arrows S c d) d✝ c✝
[PROOFSTEP]
rw [mem_iInter₂] at hp ⊢
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
hp : ∀ (i : Subgroupoid C), i ∈ s → p✝ ∈ arrows i c✝ d✝
⊢ ∀ (i : Subgroupoid C), i ∈ s → Groupoid.inv p✝ ∈ arrows i d✝ c✝
[PROOFSTEP]
exact fun S hS => S.inv (hp S hS)
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
hp : p✝ ∈ (fun c d => ⋂ (S : Subgroupoid C) (_ : S ∈ s), arrows S c d) c✝ d✝
x✝ : d✝ ⟶ e✝
hq : x✝ ∈ (fun c d => ⋂ (S : Subgroupoid C) (_ : S ∈ s), arrows S c d) d✝ e✝
⊢ p✝ ≫ x✝ ∈ (fun c d => ⋂ (S : Subgroupoid C) (_ : S ∈ s), arrows S c d) c✝ e✝
[PROOFSTEP]
rw [mem_iInter₂] at hp hq ⊢
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
hp : ∀ (i : Subgroupoid C), i ∈ s → p✝ ∈ arrows i c✝ d✝
x✝ : d✝ ⟶ e✝
hq : ∀ (i : Subgroupoid C), i ∈ s → x✝ ∈ arrows i d✝ e✝
⊢ ∀ (i : Subgroupoid C), i ∈ s → p✝ ≫ x✝ ∈ arrows i c✝ e✝
[PROOFSTEP]
exact fun S hS => S.mul (hp S hS) (hq S hS)
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ (s : Set (Subgroupoid C)), IsGLB s (sInf s)
[PROOFSTEP]
refine' fun s => ⟨fun S Ss F => _, fun T Tl F fT => _⟩
[GOAL]
case refine'_1
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
s : Set (Subgroupoid C)
S : Subgroupoid C
Ss : S ∈ s
F : (c : C) × (d : C) × (c ⟶ d)
⊢ F ∈ sInf s → F ∈ S
[PROOFSTEP]
simp only [mem_sInf]
[GOAL]
case refine'_2
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
T : Subgroupoid C
Tl : T ∈ lowerBounds s
F : (c : C) × (d : C) × (c ⟶ d)
fT : F ∈ T
⊢ F ∈ sInf s
[PROOFSTEP]
simp only [mem_sInf]
[GOAL]
case refine'_1
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
s : Set (Subgroupoid C)
S : Subgroupoid C
Ss : S ∈ s
F : (c : C) × (d : C) × (c ⟶ d)
⊢ (∀ (S : Subgroupoid C), S ∈ s → F ∈ S) → F ∈ S
case refine'_2
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
T : Subgroupoid C
Tl : T ∈ lowerBounds s
F : (c : C) × (d : C) × (c ⟶ d)
fT : F ∈ T
⊢ ∀ (S : Subgroupoid C), S ∈ s → F ∈ S
[PROOFSTEP]
exacts [fun hp => hp S Ss, fun S Ss => Tl Ss fT]
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
h : S ≤ T
x✝¹ x✝ : ↑(objs S)
s : C
hs : s ∈ objs S
t : C
ht : t ∈ objs S
⊢ (inclusion h).obj { val := s, property := hs } = (inclusion h).obj { val := t, property := ht } →
    { val := s, property := hs } = { val := t, property := ht }
[PROOFSTEP]
simpa only [inclusion, Subtype.mk_eq_mk] using id
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
h : S ≤ T
s t : ↑(objs S)
x✝¹ x✝ : s ⟶ t
f : ↑s ⟶ ↑t
hf : f ∈ arrows S ↑s ↑t
g : ↑s ⟶ ↑t
hg : g ∈ arrows S ↑s ↑t
⊢ (fun f => (inclusion h).map f) { val := f, property := hf } =
      (fun f => (inclusion h).map f) { val := g, property := hg } →
    { val := f, property := hf } = { val := g, property := hg }
[PROOFSTEP]
dsimp only [inclusion]
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
h : S ≤ T
s t : ↑(objs S)
x✝¹ x✝ : s ⟶ t
f : ↑s ⟶ ↑t
hf : f ∈ arrows S ↑s ↑t
g : ↑s ⟶ ↑t
hg : g ∈ arrows S ↑s ↑t
⊢ { val := f, property := (_ : { fst := ↑s, snd := { fst := ↑t, snd := ↑{ val := f, property := hf } } } ∈ T) } =
      { val := g, property := (_ : { fst := ↑s, snd := { fst := ↑t, snd := ↑{ val := g, property := hg } } } ∈ T) } →
    { val := f, property := hf } = { val := g, property := hg }
[PROOFSTEP]
rw [Subtype.mk_eq_mk, Subtype.mk_eq_mk]
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S T : Subgroupoid C
h : S ≤ T
s t : ↑(objs S)
x✝¹ x✝ : s ⟶ t
f : ↑s ⟶ ↑t
hf : f ∈ arrows S ↑s ↑t
g : ↑s ⟶ ↑t
hg : g ∈ arrows S ↑s ↑t
⊢ f = g → f = g
[PROOFSTEP]
exact id
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d : C} {p : c ⟶ d},
    p ∈ (fun c d => {p | Discrete.Arrows c d p}) c d → Groupoid.inv p ∈ (fun c d => {p | Discrete.Arrows c d p}) d c
[PROOFSTEP]
rintro _ _ _ ⟨⟩
[GOAL]
case id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d : C
⊢ Groupoid.inv (𝟙 c✝) ∈ (fun c d => {p | Discrete.Arrows c d p}) c✝ c✝
[PROOFSTEP]
simp only [inv_eq_inv, IsIso.inv_id]
[GOAL]
case id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d : C
⊢ 𝟙 c✝ ∈ {p | Discrete.Arrows c✝ c✝ p}
[PROOFSTEP]
constructor
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d e : C} {p : c ⟶ d},
    p ∈ (fun c d => {p | Discrete.Arrows c d p}) c d →
      ∀ {q : d ⟶ e},
        q ∈ (fun c d => {p | Discrete.Arrows c d p}) d e → p ≫ q ∈ (fun c d => {p | Discrete.Arrows c d p}) c e
[PROOFSTEP]
rintro _ _ _ _ ⟨⟩ _ ⟨⟩
[GOAL]
case id.id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ d : C
⊢ 𝟙 c✝ ≫ 𝟙 c✝ ∈ (fun c d => {p | Discrete.Arrows c d p}) c✝ c✝
[PROOFSTEP]
rw [Category.comp_id]
[GOAL]
case id.id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ d : C
⊢ 𝟙 c✝ ∈ (fun c d => {p | Discrete.Arrows c d p}) c✝ c✝
[PROOFSTEP]
constructor
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
⊢ f ∈ arrows discrete c d → ∃ h, f = eqToHom h
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
⊢ ∃ h, 𝟙 c = eqToHom h
[PROOFSTEP]
exact ⟨rfl, rfl⟩
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c d : C
f : c ⟶ d
⊢ (∃ h, f = eqToHom h) → f ∈ arrows discrete c d
[PROOFSTEP]
rintro ⟨rfl, rfl⟩
[GOAL]
case intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
⊢ eqToHom (_ : c = c) ∈ arrows discrete c c
[PROOFSTEP]
constructor
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ IsWide S ↔ objs S = univ
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ IsWide S → objs S = univ
[PROOFSTEP]
rintro h
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsWide S
⊢ objs S = univ
[PROOFSTEP]
ext x
[GOAL]
case mp.h
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsWide S
x : C
⊢ x ∈ objs S ↔ x ∈ univ
[PROOFSTEP]
constructor
[GOAL]
case mp.h.mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsWide S
x : C
⊢ x ∈ objs S → x ∈ univ
[PROOFSTEP]
simp only [top_eq_univ, mem_univ, imp_true_iff, forall_true_left]
[GOAL]
case mp.h.mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsWide S
x : C
⊢ x ∈ univ → x ∈ objs S
[PROOFSTEP]
simp only [top_eq_univ, mem_univ, imp_true_iff, forall_true_left]
[GOAL]
case mp.h.mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsWide S
x : C
⊢ x ∈ objs S
[PROOFSTEP]
apply mem_objs_of_src S (h.wide x)
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ objs S = univ → IsWide S
[PROOFSTEP]
rintro h
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : objs S = univ
⊢ IsWide S
[PROOFSTEP]
refine' ⟨fun c => _⟩
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : objs S = univ
c : C
⊢ 𝟙 c ∈ arrows S c c
[PROOFSTEP]
obtain ⟨γ, γS⟩ := (le_of_eq h.symm : ⊤ ⊆ S.objs) (Set.mem_univ c)
[GOAL]
case mpr.intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : objs S = univ
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
⊢ 𝟙 c ∈ arrows S c c
[PROOFSTEP]
exact id_mem_of_src S γS
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S : Subgroupoid C
Sw : IsWide S
c d : C
h : c = d
⊢ eqToHom h ∈ arrows S c d
[PROOFSTEP]
cases h
[GOAL]
case refl
C : Type u
inst✝ : Groupoid C
S✝ S : Subgroupoid C
Sw : IsWide S
c : C
⊢ eqToHom (_ : c = c) ∈ arrows S c c
[PROOFSTEP]
simp only [eqToHom_refl]
[GOAL]
case refl
C : Type u
inst✝ : Groupoid C
S✝ S : Subgroupoid C
Sw : IsWide S
c : C
⊢ 𝟙 c ∈ arrows S c c
[PROOFSTEP]
apply Sw.id_mem c
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ S : Subgroupoid C
Sn : IsNormal S
c✝ d✝ : C
p : d✝ ⟶ c✝
γ : c✝ ⟶ c✝
hs : γ ∈ arrows S c✝ c✝
⊢ p ≫ γ ≫ Groupoid.inv p ∈ arrows S d✝ d✝
[PROOFSTEP]
convert Sn.conj (Groupoid.inv p) hs
[GOAL]
case h.e'_4.h.e'_6
C : Type u
inst✝ : Groupoid C
S✝ S : Subgroupoid C
Sn : IsNormal S
c✝ d✝ : C
p : d✝ ⟶ c✝
γ : c✝ ⟶ c✝
hs : γ ∈ arrows S c✝ c✝
⊢ p = Groupoid.inv (Groupoid.inv p)
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
Sn : IsNormal S
c d : C
p : c ⟶ d
⊢ BijOn (fun γ => Groupoid.inv p ≫ γ ≫ p) (arrows S c c) (arrows S d d)
[PROOFSTEP]
refine' ⟨fun γ γS => Sn.conj p γS, fun γ₁ _ γ₂ _ h => _, fun δ δS => ⟨p ≫ δ ≫ Groupoid.inv p, Sn.conj' p δS, _⟩⟩
[GOAL]
case refine'_1
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
Sn : IsNormal S
c d : C
p : c ⟶ d
γ₁ : c ⟶ c
x✝¹ : γ₁ ∈ arrows S c c
γ₂ : c ⟶ c
x✝ : γ₂ ∈ arrows S c c
h : (fun γ => Groupoid.inv p ≫ γ ≫ p) γ₁ = (fun γ => Groupoid.inv p ≫ γ ≫ p) γ₂
⊢ γ₁ = γ₂
[PROOFSTEP]
simpa only [inv_eq_inv, Category.assoc, IsIso.hom_inv_id, Category.comp_id, IsIso.hom_inv_id_assoc] using
  p ≫= h =≫ inv p
[GOAL]
case refine'_2
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
Sn : IsNormal S
c d : C
p : c ⟶ d
δ : d ⟶ d
δS : δ ∈ arrows S d d
⊢ (fun γ => Groupoid.inv p ≫ γ ≫ p) (p ≫ δ ≫ Groupoid.inv p) = δ
[PROOFSTEP]
simp only [inv_eq_inv, Category.assoc, IsIso.inv_hom_id, Category.comp_id, IsIso.inv_hom_id_assoc]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
sn : ∀ (S : Subgroupoid C), S ∈ s → IsNormal S
⊢ ∀ (c : C), 𝟙 c ∈ arrows (sInf s) c c
[PROOFSTEP]
simp_rw [sInf, mem_iInter₂]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
sn : ∀ (S : Subgroupoid C), S ∈ s → IsNormal S
⊢ ∀ (c : C) (i : Subgroupoid C), i ∈ s → 𝟙 c ∈ arrows i c c
[PROOFSTEP]
exact fun c S Ss => (sn S Ss).wide c
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
sn : ∀ (S : Subgroupoid C), S ∈ s → IsNormal S
⊢ ∀ {c d : C} (p : c ⟶ d) {γ : c ⟶ c}, γ ∈ arrows (sInf s) c c → Groupoid.inv p ≫ γ ≫ p ∈ arrows (sInf s) d d
[PROOFSTEP]
simp_rw [sInf, mem_iInter₂]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
s : Set (Subgroupoid C)
sn : ∀ (S : Subgroupoid C), S ∈ s → IsNormal S
⊢ ∀ {c d : C} (p : c ⟶ d) {γ : c ⟶ c},
    (∀ (i : Subgroupoid C), i ∈ s → γ ∈ arrows i c c) →
      ∀ (i : Subgroupoid C), i ∈ s → Groupoid.inv p ≫ γ ≫ p ∈ arrows i d d
[PROOFSTEP]
exact fun p γ hγ S Ss => (sn S Ss).conj p (hγ S Ss)
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c : C
⊢ 𝟙 c ∈ arrows discrete c c
[PROOFSTEP]
constructor
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ : C
f : c✝ ⟶ d✝
γ : c✝ ⟶ c✝
hγ : γ ∈ arrows discrete c✝ c✝
⊢ Groupoid.inv f ≫ γ ≫ f ∈ arrows discrete d✝ d✝
[PROOFSTEP]
cases hγ
[GOAL]
case id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ : C
f : c✝ ⟶ d✝
⊢ Groupoid.inv f ≫ 𝟙 c✝ ≫ f ∈ arrows discrete d✝ d✝
[PROOFSTEP]
simp only [inv_eq_inv, Category.id_comp, IsIso.inv_hom_id]
[GOAL]
case id
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ : C
f : c✝ ⟶ d✝
⊢ 𝟙 d✝ ∈ arrows discrete d✝ d✝
[PROOFSTEP]
constructor
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
Sn : IsNormal S
c : C
cS : c ∈ objs S
x : c ⟶ c
hx : x ∈ Subgroupoid.vertexSubgroup S cS
y : c ⟶ c
⊢ y * x * y⁻¹ ∈ Subgroupoid.vertexSubgroup S cS
[PROOFSTEP]
rw [mul_assoc]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
Sn : IsNormal S
c : C
cS : c ∈ objs S
x : c ⟶ c
hx : x ∈ Subgroupoid.vertexSubgroup S cS
y : c ⟶ c
⊢ y * (x * y⁻¹) ∈ Subgroupoid.vertexSubgroup S cS
[PROOFSTEP]
exact Sn.conj' y hx
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
c d : C
⊢ X c d ⊆ arrows (generated X) c d
[PROOFSTEP]
dsimp only [generated, sInf]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
c d : C
⊢ X c d ⊆ ⋂ (S : Subgroupoid C) (_ : S ∈ {S | ∀ (c d : C), X c d ⊆ arrows S c d}), arrows S c d
[PROOFSTEP]
simp only [subset_iInter₂_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
c d : C
⊢ ∀ (i : Subgroupoid C), i ∈ {S | ∀ (c d : C), X c d ⊆ arrows S c d} → X c d ⊆ arrows i c d
[PROOFSTEP]
exact fun S hS f fS => hS _ _ fS
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
⊢ generated X ≤ generatedNormal X
[PROOFSTEP]
apply @sInf_le_sInf (Subgroupoid C) _
[GOAL]
case h
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
⊢ {S | (∀ (c d : C), X c d ⊆ arrows S c d) ∧ IsNormal S} ⊆ {S | ∀ (c d : C), X c d ⊆ arrows S c d}
[PROOFSTEP]
exact fun S ⟨h, _⟩ => h
[GOAL]
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
⊢ generatedNormal X ≤ S ↔ ∀ (c d : C), X c d ⊆ arrows S c d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
⊢ generatedNormal X ≤ S → ∀ (c d : C), X c d ⊆ arrows S c d
[PROOFSTEP]
rintro h c d
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
h : generatedNormal X ≤ S
c d : C
⊢ X c d ⊆ arrows S c d
[PROOFSTEP]
have h' := generated_le_generatedNormal X
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
h : generatedNormal X ≤ S
c d : C
h' : generated X ≤ generatedNormal X
⊢ X c d ⊆ arrows S c d
[PROOFSTEP]
rw [le_iff] at h h' 
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
h : ∀ {c d : C}, arrows (generatedNormal X) c d ⊆ arrows S c d
c d : C
h' : ∀ {c d : C}, arrows (generated X) c d ⊆ arrows (generatedNormal X) c d
⊢ X c d ⊆ arrows S c d
[PROOFSTEP]
exact ((subset_generated X c d).trans (@h' c d)).trans (@h c d)
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
⊢ (∀ (c d : C), X c d ⊆ arrows S c d) → generatedNormal X ≤ S
[PROOFSTEP]
rintro h
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
h : ∀ (c d : C), X c d ⊆ arrows S c d
⊢ generatedNormal X ≤ S
[PROOFSTEP]
apply @sInf_le (Subgroupoid C) _
[GOAL]
case mpr.a
C : Type u
inst✝ : Groupoid C
S✝ : Subgroupoid C
X : (c d : C) → Set (c ⟶ d)
S : Subgroupoid C
Sn : IsNormal S
h : ∀ (c d : C), X c d ⊆ arrows S c d
⊢ S ∈ {S | (∀ (c d : C), X c d ⊆ arrows S c d) ∧ IsNormal S}
[PROOFSTEP]
exact ⟨h, Sn⟩
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
hp : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
⊢ Groupoid.inv p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d✝ c✝
[PROOFSTEP]
rw [mem_setOf, inv_eq_inv, φ.map_inv, ← inv_eq_inv]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
hp : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
⊢ Groupoid.inv (φ.map p✝) ∈ arrows S (φ.obj d✝) (φ.obj c✝)
[PROOFSTEP]
exact S.inv hp
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
⊢ ∀ {c d e : C} {p : c ⟶ d},
    p ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c d →
      ∀ {q : d ⟶ e},
        q ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d e →
          p ≫ q ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c e
[PROOFSTEP]
intros
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
a✝¹ : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
q✝ : d✝ ⟶ e✝
a✝ : q✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d✝ e✝
⊢ p✝ ≫ q✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ e✝
[PROOFSTEP]
simp only [mem_setOf, Functor.map_comp]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
a✝¹ : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
q✝ : d✝ ⟶ e✝
a✝ : q✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d✝ e✝
⊢ φ.map p✝ ≫ φ.map q✝ ∈ arrows S (φ.obj c✝) (φ.obj e✝)
[PROOFSTEP]
apply S.mul
[GOAL]
case a
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
a✝¹ : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
q✝ : d✝ ⟶ e✝
a✝ : q✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d✝ e✝
⊢ φ.map p✝ ∈ arrows S (φ.obj c✝) (φ.obj d✝)
[PROOFSTEP]
assumption
[GOAL]
case a
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
a✝¹ : p✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) c✝ d✝
q✝ : d✝ ⟶ e✝
a✝ : q✝ ∈ (fun c d => {f | φ.map f ∈ arrows S (φ.obj c) (φ.obj d)}) d✝ e✝
⊢ φ.map q✝ ∈ arrows S (φ.obj d✝) (φ.obj e✝)
[PROOFSTEP]
assumption
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
Sn : IsNormal S
c : C
⊢ 𝟙 c ∈ arrows (comap φ S) c c
[PROOFSTEP]
rw [comap, mem_setOf, Functor.map_id]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
Sn : IsNormal S
c : C
⊢ 𝟙 (φ.obj c) ∈ arrows S (φ.obj c) (φ.obj c)
[PROOFSTEP]
apply Sn.wide
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
Sn : IsNormal S
c✝ d✝ : C
f : c✝ ⟶ d✝
γ : c✝ ⟶ c✝
hγ : γ ∈ arrows (comap φ S) c✝ c✝
⊢ Groupoid.inv f ≫ γ ≫ f ∈ arrows (comap φ S) d✝ d✝
[PROOFSTEP]
simp_rw [inv_eq_inv f, comap, mem_setOf, Functor.map_comp, Functor.map_inv, ← inv_eq_inv]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
S : Subgroupoid D
Sn : IsNormal S
c✝ d✝ : C
f : c✝ ⟶ d✝
γ : c✝ ⟶ c✝
hγ : γ ∈ arrows (comap φ S) c✝ c✝
⊢ Groupoid.inv (φ.map f) ≫ φ.map γ ≫ φ.map f ∈ arrows S (φ.obj d✝) (φ.obj d✝)
[PROOFSTEP]
exact Sn.conj _ hγ
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
f : c ⟶ d
⊢ Arrows φ hφ S c d f ↔ ∃ a b g ha hb _hg, f = eqToHom (_ : c = φ.obj a) ≫ φ.map g ≫ eqToHom hb
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
f : c ⟶ d
⊢ Arrows φ hφ S c d f → ∃ a b g ha hb _hg, f = eqToHom (_ : c = φ.obj a) ≫ φ.map g ≫ eqToHom hb
[PROOFSTEP]
rintro ⟨g, hg⟩
[GOAL]
case mp.im
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
g : c✝ ⟶ d✝
hg : g ∈ arrows S c✝ d✝
⊢ ∃ a b g_1 ha hb _hg, φ.map g = eqToHom (_ : φ.obj c✝ = φ.obj a) ≫ φ.map g_1 ≫ eqToHom hb
[PROOFSTEP]
exact ⟨_, _, g, rfl, rfl, hg, eq_conj_eqToHom _⟩
[GOAL]
case mpr
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
f : c ⟶ d
⊢ (∃ a b g ha hb _hg, f = eqToHom (_ : c = φ.obj a) ≫ φ.map g ≫ eqToHom hb) → Arrows φ hφ S c d f
[PROOFSTEP]
rintro ⟨a, b, g, rfl, rfl, hg, rfl⟩
[GOAL]
case mpr.intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
a b : C
g : a ⟶ b
hg : g ∈ arrows S a b
⊢ Arrows φ hφ S (φ.obj a) (φ.obj b) (eqToHom (_ : φ.obj a = φ.obj a) ≫ φ.map g ≫ eqToHom (_ : φ.obj b = φ.obj b))
[PROOFSTEP]
rw [← eq_conj_eqToHom]
[GOAL]
case mpr.intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
a b : C
g : a ⟶ b
hg : g ∈ arrows S a b
⊢ Arrows φ hφ S (φ.obj a) (φ.obj b) (φ.map g)
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.intro.intro.intro.hf
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
a b : C
g : a ⟶ b
hg : g ∈ arrows S a b
⊢ g ∈ arrows S a b
[PROOFSTEP]
exact hg
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
⊢ ∀ {c d : D} {p : c ⟶ d},
    p ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) c d → Groupoid.inv p ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) d c
[PROOFSTEP]
rintro _ _ _ ⟨⟩
[GOAL]
case im
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f✝ : c✝ ⟶ d✝
hf✝ : f✝ ∈ arrows S c✝ d✝
⊢ Groupoid.inv (φ.map f✝) ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c✝)
[PROOFSTEP]
rw [inv_eq_inv, ← Functor.map_inv, ← inv_eq_inv]
[GOAL]
case im
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f✝ : c✝ ⟶ d✝
hf✝ : f✝ ∈ arrows S c✝ d✝
⊢ φ.map (Groupoid.inv f✝) ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c✝)
[PROOFSTEP]
constructor
[GOAL]
case im.hf
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f✝ : c✝ ⟶ d✝
hf✝ : f✝ ∈ arrows S c✝ d✝
⊢ Groupoid.inv f✝ ∈ arrows S d✝ c✝
[PROOFSTEP]
apply S.inv
[GOAL]
case im.hf
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f✝ : c✝ ⟶ d✝
hf✝ : f✝ ∈ arrows S c✝ d✝
⊢ f✝ ∈ arrows S c✝ d✝
[PROOFSTEP]
assumption
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
⊢ ∀ {c d e : D} {p : c ⟶ d},
    p ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) c d →
      ∀ {q : d ⟶ e},
        q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) d e → p ≫ q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) c e
[PROOFSTEP]
rintro _ _ _ _ ⟨f, hf⟩ q hq
[GOAL]
case im
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
e✝ c d : D
c✝ d✝ : C
f : c✝ ⟶ d✝
hf : f ∈ arrows S c✝ d✝
q : φ.obj d✝ ⟶ e✝
hq : q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) e✝
⊢ φ.map f ≫ q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj c✝) e✝
[PROOFSTEP]
obtain ⟨c₃, c₄, g, he, rfl, hg, gq⟩ := (Map.arrows_iff φ hφ S q).mp hq
[GOAL]
case im.intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f : c✝ ⟶ d✝
hf : f ∈ arrows S c✝ d✝
c₃ c₄ : C
g : c₃ ⟶ c₄
he : φ.obj c₃ = φ.obj d✝
q : φ.obj d✝ ⟶ φ.obj c₄
hq : q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c₄)
hg : g ∈ arrows S c₃ c₄
gq : q = eqToHom (_ : φ.obj d✝ = φ.obj c₃) ≫ φ.map g ≫ eqToHom (_ : φ.obj c₄ = φ.obj c₄)
⊢ φ.map f ≫ q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj c✝) (φ.obj c₄)
[PROOFSTEP]
cases hφ he
[GOAL]
case im.intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f : c✝ ⟶ d✝
hf : f ∈ arrows S c✝ d✝
c₄ : C
q : φ.obj d✝ ⟶ φ.obj c₄
hq : q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c₄)
g : d✝ ⟶ c₄
he : φ.obj d✝ = φ.obj d✝
hg : g ∈ arrows S d✝ c₄
gq : q = eqToHom (_ : φ.obj d✝ = φ.obj d✝) ≫ φ.map g ≫ eqToHom (_ : φ.obj c₄ = φ.obj c₄)
⊢ φ.map f ≫ q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj c✝) (φ.obj c₄)
[PROOFSTEP]
rw [gq, ← eq_conj_eqToHom, ← φ.map_comp]
[GOAL]
case im.intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f : c✝ ⟶ d✝
hf : f ∈ arrows S c✝ d✝
c₄ : C
q : φ.obj d✝ ⟶ φ.obj c₄
hq : q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c₄)
g : d✝ ⟶ c₄
he : φ.obj d✝ = φ.obj d✝
hg : g ∈ arrows S d✝ c₄
gq : q = eqToHom (_ : φ.obj d✝ = φ.obj d✝) ≫ φ.map g ≫ eqToHom (_ : φ.obj c₄ = φ.obj c₄)
⊢ φ.map (f ≫ g) ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj c✝) (φ.obj c₄)
[PROOFSTEP]
constructor
[GOAL]
case im.intro.intro.intro.intro.intro.intro.refl.hf
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
c d : D
c✝ d✝ : C
f : c✝ ⟶ d✝
hf : f ∈ arrows S c✝ d✝
c₄ : C
q : φ.obj d✝ ⟶ φ.obj c₄
hq : q ∈ (fun c d => {x | Map.Arrows φ hφ S c d x}) (φ.obj d✝) (φ.obj c₄)
g : d✝ ⟶ c₄
he : φ.obj d✝ = φ.obj d✝
hg : g ∈ arrows S d✝ c₄
gq : q = eqToHom (_ : φ.obj d✝ = φ.obj d✝) ≫ φ.map g ≫ eqToHom (_ : φ.obj c₄ = φ.obj c₄)
⊢ f ≫ g ∈ arrows S c✝ c₄
[PROOFSTEP]
exact S.mul hf hg
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
⊢ GaloisConnection (map φ hφ) (comap φ)
[PROOFSTEP]
rintro S T
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
T : Subgroupoid D
⊢ map φ hφ S ≤ T ↔ S ≤ comap φ T
[PROOFSTEP]
simp_rw [le_iff]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
T : Subgroupoid D
⊢ (∀ {c d : D}, arrows (map φ hφ S) c d ⊆ arrows T c d) ↔ ∀ {c d : C}, arrows S c d ⊆ arrows (comap φ T) c d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
T : Subgroupoid D
⊢ (∀ {c d : D}, arrows (map φ hφ S) c d ⊆ arrows T c d) → ∀ {c d : C}, arrows S c d ⊆ arrows (comap φ T) c d
[PROOFSTEP]
exact fun h c d f fS => h (Map.Arrows.im f fS)
[GOAL]
case mpr
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
T : Subgroupoid D
⊢ (∀ {c d : C}, arrows S c d ⊆ arrows (comap φ T) c d) → ∀ {c d : D}, arrows (map φ hφ S) c d ⊆ arrows T c d
[PROOFSTEP]
rintro h _ _ g ⟨a, gφS⟩
[GOAL]
case mpr.im
C : Type u
inst✝¹ : Groupoid C
S✝ : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
S : Subgroupoid C
T : Subgroupoid D
h : ∀ {c d : C}, arrows S c d ⊆ arrows (comap φ T) c d
c d : D
c✝ d✝ : C
a : c✝ ⟶ d✝
gφS : a ∈ arrows S c✝ d✝
⊢ φ.map a ∈ arrows T (φ.obj c✝) (φ.obj d✝)
[PROOFSTEP]
exact h gφS
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
⊢ d ∈ objs (map φ hφ S) ↔ ∃ c, c ∈ objs S ∧ φ.obj c = d
[PROOFSTEP]
dsimp [objs, map]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
⊢ Set.Nonempty {x | Map.Arrows φ hφ S d d x} ↔ ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
⊢ Set.Nonempty {x | Map.Arrows φ hφ S d d x} → ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d
[PROOFSTEP]
rintro ⟨f, hf⟩
[GOAL]
case mp.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
f : d ⟶ d
hf : f ∈ {x | Map.Arrows φ hφ S d d x}
⊢ ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d
[PROOFSTEP]
change Map.Arrows φ hφ S d d f at hf 
[GOAL]
case mp.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
f : d ⟶ d
hf : Map.Arrows φ hφ S d d f
⊢ ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d
[PROOFSTEP]
rw [Map.arrows_iff] at hf 
[GOAL]
case mp.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
f : d ⟶ d
hf : ∃ a b g ha hb _hg, f = eqToHom (_ : d = φ.obj a) ≫ φ.map g ≫ eqToHom hb
⊢ ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d
[PROOFSTEP]
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
[GOAL]
case mp.intro.intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d✝ : D
c d : C
g : c ⟶ d
ec : φ.obj c = d✝
ed : φ.obj d = d✝
eg : g ∈ arrows S c d
⊢ ∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d✝
[PROOFSTEP]
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
[GOAL]
case mpr
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
⊢ (∃ c, Set.Nonempty (arrows S c c) ∧ φ.obj c = d) → Set.Nonempty {x | Map.Arrows φ hφ S d d x}
[PROOFSTEP]
rintro ⟨c, ⟨γ, γS⟩, rfl⟩
[GOAL]
case mpr.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
⊢ Set.Nonempty {x | Map.Arrows φ hφ S (φ.obj c) (φ.obj c) x}
[PROOFSTEP]
exact ⟨φ.map γ, ⟨γ, γS⟩⟩
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
⊢ objs (map φ hφ S) = φ.obj '' objs S
[PROOFSTEP]
ext x
[GOAL]
case h
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
x : D
⊢ x ∈ objs (map φ hφ S) ↔ x ∈ φ.obj '' objs S
[PROOFSTEP]
convert mem_map_objs_iff S φ hφ x
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
c d : D
f : c ⟶ d
⊢ f ∈ arrows (im φ hφ) c d ↔ ∃ a b g ha hb, f = eqToHom (_ : c = φ.obj a) ≫ φ.map g ≫ eqToHom hb
[PROOFSTEP]
convert Map.arrows_iff φ hφ ⊤ f
[GOAL]
case h.e'_2.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.a
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
c d : D
f : c ⟶ d
x✝⁴ x✝³ : C
x✝² : x✝⁴ ⟶ x✝³
x✝¹ : φ.obj x✝⁴ = c
x✝ : φ.obj x✝³ = d
⊢ f = eqToHom (_ : c = φ.obj x✝⁴) ≫ φ.map x✝² ≫ eqToHom x✝ ↔
    ∃ _hg, f = eqToHom (_ : c = φ.obj x✝⁴) ≫ φ.map x✝² ≫ eqToHom x✝
[PROOFSTEP]
simp only [Top.top, mem_univ, exists_true_left]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
d : D
⊢ d ∈ objs (im φ hφ) ↔ ∃ c, φ.obj c = d
[PROOFSTEP]
simp only [im, mem_map_objs_iff, mem_top_objs, true_and]
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
⊢ Function.Surjective φ.obj
[PROOFSTEP]
rintro d
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
d : D
⊢ ∃ a, φ.obj a = d
[PROOFSTEP]
rw [← mem_im_objs_iff, hφ']
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
d : D
⊢ d ∈ objs ⊤
[PROOFSTEP]
apply mem_top_objs
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d : D
⊢ 𝟙 d ∈ arrows (map φ hφ S) d d
[PROOFSTEP]
obtain ⟨c, rfl⟩ := obj_surjective_of_im_eq_top φ hφ hφ' d
[GOAL]
case intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
⊢ 𝟙 (φ.obj c) ∈ arrows (map φ hφ S) (φ.obj c) (φ.obj c)
[PROOFSTEP]
change Map.Arrows φ hφ S _ _ (𝟙 _)
[GOAL]
case intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
⊢ Map.Arrows φ hφ S (φ.obj c) (φ.obj c) (𝟙 (φ.obj c))
[PROOFSTEP]
rw [← Functor.map_id]
[GOAL]
case intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
⊢ Map.Arrows φ hφ S (φ.obj c) (φ.obj c) (φ.map (𝟙 c))
[PROOFSTEP]
constructor
[GOAL]
case intro.hf
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
⊢ 𝟙 c ∈ arrows S c c
[PROOFSTEP]
exact Sn.wide c
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d d' : D
g : d ⟶ d'
δ : d ⟶ d
hδ : δ ∈ arrows (map φ hφ S) d d
⊢ Groupoid.inv g ≫ δ ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
rw [mem_map_iff] at hδ 
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d d' : D
g : d ⟶ d'
δ : d ⟶ d
hδ : ∃ a b g ha hb _hg, δ = eqToHom (_ : d = φ.obj a) ≫ φ.map g ≫ eqToHom hb
⊢ Groupoid.inv g ≫ δ ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ
[GOAL]
case intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d d' : D
g : d ⟶ d'
δ : d ⟶ d
c c' : C
γ : c ⟶ c'
cd : φ.obj c = d
cd' : φ.obj c' = d
γS : γ ∈ arrows S c c'
hγ : δ = eqToHom (_ : d = φ.obj c) ≫ φ.map γ ≫ eqToHom cd'
⊢ Groupoid.inv g ≫ δ ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
subst_vars
[GOAL]
case intro.intro.intro.intro.intro.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c c' : C
γ : c ⟶ c'
γS : γ ∈ arrows S c c'
g : φ.obj c ⟶ d'
cd' : φ.obj c' = φ.obj c
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
cases hφ cd'
[GOAL]
case intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c : C
g : φ.obj c ⟶ d'
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
have : d' ∈ (im φ hφ).objs := by rw [hφ']; apply mem_top_objs
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c : C
g : φ.obj c ⟶ d'
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
⊢ d' ∈ objs (im φ hφ)
[PROOFSTEP]
rw [hφ']
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c : C
g : φ.obj c ⟶ d'
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
⊢ d' ∈ objs ⊤
[PROOFSTEP]
apply mem_top_objs
[GOAL]
case intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c : C
g : φ.obj c ⟶ d'
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
this : d' ∈ objs (im φ hφ)
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
rw [mem_im_objs_iff] at this 
[GOAL]
case intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
d' : D
c : C
g : φ.obj c ⟶ d'
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
this : ∃ c, φ.obj c = d'
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈ arrows (map φ hφ S) d' d'
[PROOFSTEP]
obtain ⟨c', rfl⟩ := this
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
g : φ.obj c ⟶ φ.obj c'
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
g : φ.obj c ⟶ φ.obj c'
⊢ g ∈ arrows (im φ hφ) (φ.obj c) (φ.obj c')
[PROOFSTEP]
rw [hφ']
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
g : φ.obj c ⟶ φ.obj c'
⊢ g ∈ arrows ⊤ (φ.obj c) (φ.obj c')
[PROOFSTEP]
trivial
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
g : φ.obj c ⟶ φ.obj c'
this : g ∈ arrows (im φ hφ) (φ.obj c) (φ.obj c')
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
rw [mem_im_iff] at this 
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
g : φ.obj c ⟶ φ.obj c'
this : ∃ a b g_1 ha hb, g = eqToHom (_ : φ.obj c = φ.obj a) ≫ φ.map g_1 ≫ eqToHom hb
⊢ Groupoid.inv g ≫ (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫ g ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
obtain ⟨b, b', f, hb, hb', _, hf⟩ := this
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' b b' : C
f : b ⟶ b'
hb : φ.obj b = φ.obj c
hb' : φ.obj b' = φ.obj c'
⊢ Groupoid.inv (eqToHom (_ : φ.obj c = φ.obj b) ≫ φ.map f ≫ eqToHom hb') ≫
      (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫
        eqToHom (_ : φ.obj c = φ.obj b) ≫ φ.map f ≫ eqToHom hb' ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
subst_vars
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' b b' : C
f : b ⟶ b'
hb : φ.obj b = φ.obj c
hb' : φ.obj b' = φ.obj c'
⊢ Groupoid.inv (eqToHom (_ : φ.obj c = φ.obj b) ≫ φ.map f ≫ eqToHom hb') ≫
      (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫
        eqToHom (_ : φ.obj c = φ.obj b) ≫ φ.map f ≫ eqToHom hb' ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
cases hφ hb
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' b' : C
hb' : φ.obj b' = φ.obj c'
f : c ⟶ b'
hb : φ.obj c = φ.obj c
⊢ Groupoid.inv (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb') ≫
      (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫
        eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb' ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
cases hφ hb'
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
⊢ Groupoid.inv (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb') ≫
      (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫
        eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb' ∈
    arrows (map φ hφ S) (φ.obj c') (φ.obj c')
[PROOFSTEP]
change Map.Arrows φ hφ S (φ.obj c') (φ.obj c') _
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
⊢ Map.Arrows φ hφ S (φ.obj c') (φ.obj c')
    (Groupoid.inv (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb') ≫
      (eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map γ ≫ eqToHom cd') ≫
        eqToHom (_ : φ.obj c = φ.obj c) ≫ φ.map f ≫ eqToHom hb')
[PROOFSTEP]
simp only [eqToHom_refl, Category.comp_id, Category.id_comp, inv_eq_inv]
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
⊢ Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (inv (φ.map f) ≫ φ.map γ ≫ φ.map f)
[PROOFSTEP]
suffices Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| Groupoid.inv f ≫ γ ≫ f) by
  simp only [inv_eq_inv, Functor.map_comp, Functor.map_inv] at this ; exact this
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
this : Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map (Groupoid.inv f ≫ γ ≫ f))
⊢ Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (inv (φ.map f) ≫ φ.map γ ≫ φ.map f)
[PROOFSTEP]
simp only [inv_eq_inv, Functor.map_comp, Functor.map_inv] at this 
[GOAL]
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
this : Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (inv (φ.map f) ≫ φ.map γ ≫ φ.map f)
⊢ Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (inv (φ.map f) ≫ φ.map γ ≫ φ.map f)
[PROOFSTEP]
exact this
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl.refl
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
⊢ Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map (Groupoid.inv f ≫ γ ≫ f))
[PROOFSTEP]
constructor
[GOAL]
case intro.intro.intro.intro.intro.intro.refl.intro.intro.intro.intro.intro.intro.refl.refl.refl.hf
C : Type u
inst✝¹ : Groupoid C
S : Subgroupoid C
D : Type u_1
inst✝ : Groupoid D
φ : C ⥤ D
hφ : Function.Injective φ.obj
hφ' : im φ hφ = ⊤
Sn : IsNormal S
c : C
γ : c ⟶ c
γS : γ ∈ arrows S c c
cd' : φ.obj c = φ.obj c
c' : C
hb : φ.obj c = φ.obj c
hb' : φ.obj c' = φ.obj c'
f : c ⟶ c'
⊢ Groupoid.inv f ≫ γ ≫ f ∈ arrows S c' c'
[PROOFSTEP]
apply Sn.conj f γS
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ IsTotallyDisconnected S ↔ ∀ (c d : C), Set.Nonempty (arrows S c d) → c = d
[PROOFSTEP]
constructor
[GOAL]
case mp
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ IsTotallyDisconnected S → ∀ (c d : C), Set.Nonempty (arrows S c d) → c = d
[PROOFSTEP]
rintro h c d ⟨f, fS⟩
[GOAL]
case mp.intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsTotallyDisconnected S
c d : C
f : c ⟶ d
fS : f ∈ arrows S c d
⊢ c = d
[PROOFSTEP]
have := h ⟨c, mem_objs_of_src S fS⟩ ⟨d, mem_objs_of_tgt S fS⟩ ⟨f, fS⟩
[GOAL]
case mp.intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : IsTotallyDisconnected S
c d : C
f : c ⟶ d
fS : f ∈ arrows S c d
this : { val := c, property := (_ : c ∈ objs S) } = { val := d, property := (_ : d ∈ objs S) }
⊢ c = d
[PROOFSTEP]
exact congr_arg Subtype.val this
[GOAL]
case mpr
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ (∀ (c d : C), Set.Nonempty (arrows S c d) → c = d) → IsTotallyDisconnected S
[PROOFSTEP]
rintro h ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, fS⟩
[GOAL]
case mpr.mk.mk.mk
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : ∀ (c d : C), Set.Nonempty (arrows S c d) → c = d
c : C
hc : c ∈ objs S
d : C
hd : d ∈ objs S
f : ↑{ val := c, property := hc } ⟶ ↑{ val := d, property := hd }
fS : f ∈ arrows S ↑{ val := c, property := hc } ↑{ val := d, property := hd }
⊢ { val := c, property := hc } = { val := d, property := hd }
[PROOFSTEP]
simp only [Subtype.mk_eq_mk]
[GOAL]
case mpr.mk.mk.mk
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
h : ∀ (c d : C), Set.Nonempty (arrows S c d) → c = d
c : C
hc : c ∈ objs S
d : C
hd : d ∈ objs S
f : ↑{ val := c, property := hc } ⟶ ↑{ val := d, property := hd }
fS : f ∈ arrows S ↑{ val := c, property := hc } ↑{ val := d, property := hd }
⊢ c = d
[PROOFSTEP]
exact h c d ⟨f, fS⟩
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d : C} {p : c ⟶ d},
    p ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) c d →
      Groupoid.inv p ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) d c
[PROOFSTEP]
rintro _ _ _ ⟨rfl, h⟩
[GOAL]
case intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ : C
p✝ : c✝ ⟶ c✝
h : p✝ ∈ arrows S c✝ c✝
⊢ Groupoid.inv p✝ ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) c✝ c✝
[PROOFSTEP]
exact ⟨rfl, S.inv h⟩
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d e : C} {p : c ⟶ d},
    p ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) c d →
      ∀ {q : d ⟶ e},
        q ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) d e → p ≫ q ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) c e
[PROOFSTEP]
rintro _ _ _ _ ⟨rfl, h⟩ _ ⟨rfl, h'⟩
[GOAL]
case intro.intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ : C
p✝ : c✝ ⟶ c✝
h : p✝ ∈ arrows S c✝ c✝
q✝ : c✝ ⟶ c✝
h' : q✝ ∈ arrows S c✝ c✝
⊢ p✝ ≫ q✝ ∈ (fun c d => {f | c = d ∧ f ∈ arrows S c d}) c✝ c✝
[PROOFSTEP]
exact ⟨rfl, S.mul h h'⟩
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ disconnect S ≤ S
[PROOFSTEP]
rw [le_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ {c d : C}, arrows (disconnect S) c d ⊆ arrows S c d
[PROOFSTEP]
rintro _ _ _ ⟨⟩
[GOAL]
case intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
c✝ d✝ : C
a✝ : c✝ ⟶ d✝
left✝ : c✝ = d✝
right✝ : a✝ ∈ arrows S c✝ d✝
⊢ a✝ ∈ arrows S c✝ d✝
[PROOFSTEP]
assumption
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ IsTotallyDisconnected (disconnect S)
[PROOFSTEP]
rw [isTotallyDisconnected_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
⊢ ∀ (c d : C), Set.Nonempty (arrows (disconnect S) c d) → c = d
[PROOFSTEP]
exact fun c d ⟨_, h, _⟩ => h
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
⊢ ∀ {c d : C} {p : c ⟶ d},
    p ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) c d → Groupoid.inv p ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) d c
[PROOFSTEP]
rintro _ _ _ ⟨⟩
[GOAL]
case intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
left✝ : c✝ ∈ D
right✝ : d✝ ∈ D
⊢ Groupoid.inv p✝ ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) d✝ c✝
[PROOFSTEP]
constructor
[GOAL]
case intro.left
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
left✝ : c✝ ∈ D
right✝ : d✝ ∈ D
⊢ d✝ ∈ D
[PROOFSTEP]
assumption
[GOAL]
case intro.right
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ : C
p✝ : c✝ ⟶ d✝
left✝ : c✝ ∈ D
right✝ : d✝ ∈ D
⊢ c✝ ∈ D
[PROOFSTEP]
assumption
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
⊢ ∀ {c d e : C} {p : c ⟶ d},
    p ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) c d →
      ∀ {q : d ⟶ e}, q ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) d e → p ≫ q ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) c e
[PROOFSTEP]
rintro _ _ _ _ ⟨⟩ _ ⟨⟩
[GOAL]
case intro.intro
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
left✝¹ : c✝ ∈ D
right✝¹ : d✝ ∈ D
q✝ : d✝ ⟶ e✝
left✝ : d✝ ∈ D
right✝ : e✝ ∈ D
⊢ p✝ ≫ q✝ ∈ (fun c d => {_f | c ∈ D ∧ d ∈ D}) c✝ e✝
[PROOFSTEP]
constructor
[GOAL]
case intro.intro.left
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
left✝¹ : c✝ ∈ D
right✝¹ : d✝ ∈ D
q✝ : d✝ ⟶ e✝
left✝ : d✝ ∈ D
right✝ : e✝ ∈ D
⊢ c✝ ∈ D
[PROOFSTEP]
assumption
[GOAL]
case intro.intro.right
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c✝ d✝ e✝ : C
p✝ : c✝ ⟶ d✝
left✝¹ : c✝ ∈ D
right✝¹ : d✝ ∈ D
q✝ : d✝ ⟶ e✝
left✝ : d✝ ∈ D
right✝ : e✝ ∈ D
⊢ e✝ ∈ D
[PROOFSTEP]
assumption
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
c : C
⊢ c ∈ objs (full D) ↔ c ∈ D
[PROOFSTEP]
rw [full_objs]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
⊢ full ∅ = ⊥
[PROOFSTEP]
ext
[GOAL]
case arrows.h.h.h
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
x✝² x✝¹ : C
x✝ : x✝² ⟶ x✝¹
⊢ x✝ ∈ arrows (full ∅) x✝² x✝¹ ↔ x✝ ∈ arrows ⊥ x✝² x✝¹
[PROOFSTEP]
simp only [Bot.bot, mem_full_iff, mem_empty_iff_false, and_self_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
⊢ full univ = ⊤
[PROOFSTEP]
ext
[GOAL]
case arrows.h.h.h
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D : Set C
x✝² x✝¹ : C
x✝ : x✝² ⟶ x✝¹
⊢ x✝ ∈ arrows (full univ) x✝² x✝¹ ↔ x✝ ∈ arrows ⊤ x✝² x✝¹
[PROOFSTEP]
simp only [mem_full_iff, mem_univ, mem_top]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D✝ D E : Set C
h : D ≤ E
⊢ full D ≤ full E
[PROOFSTEP]
rw [le_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D✝ D E : Set C
h : D ≤ E
⊢ ∀ {c d : C}, arrows (full D) c d ⊆ arrows (full E) c d
[PROOFSTEP]
rintro c d f
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D✝ D E : Set C
h : D ≤ E
c d : C
f : c ⟶ d
⊢ f ∈ arrows (full D) c d → f ∈ arrows (full E) c d
[PROOFSTEP]
simp only [mem_full_iff]
[GOAL]
C : Type u
inst✝ : Groupoid C
S : Subgroupoid C
D✝ D E : Set C
h : D ≤ E
c d : C
f : c ⟶ d
⊢ c ∈ D ∧ d ∈ D → c ∈ E ∧ d ∈ E
[PROOFSTEP]
exact fun ⟨hc, hd⟩ => ⟨h hc, h hd⟩
