[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ inv (inv r) = r
[PROOFSTEP]
ext x y
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x : α
y : β
⊢ inv (inv r) x y ↔ r x y
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ codom (inv r) = dom r
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x : α
⊢ x ∈ codom (inv r) ↔ x ∈ dom r
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ dom (inv r) = codom r
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x : β
⊢ x ∈ dom (inv r) ↔ x ∈ codom r
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
⊢ (r • s) • t = r • s • t
[PROOFSTEP]
unfold comp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
⊢ (fun x z => ∃ y, (∃ y_1, r x y_1 ∧ s y_1 y) ∧ t y z) = fun x z => ∃ y, r x y ∧ ∃ y_1, s y y_1 ∧ t y_1 z
[PROOFSTEP]
ext (x w)
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
x : α
w : δ
⊢ (∃ y, (∃ y_1, r x y_1 ∧ s y_1 y) ∧ t y w) ↔ ∃ y, r x y ∧ ∃ y_1, s y y_1 ∧ t y_1 w
[PROOFSTEP]
constructor
[GOAL]
case a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
x : α
w : δ
⊢ (∃ y, (∃ y_1, r x y_1 ∧ s y_1 y) ∧ t y w) → ∃ y, r x y ∧ ∃ y_1, s y y_1 ∧ t y_1 w
[PROOFSTEP]
rintro ⟨z, ⟨y, rxy, syz⟩, tzw⟩
[GOAL]
case a.h.a.mp.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
x : α
w : δ
z : γ
tzw : t z w
y : β
rxy : r x y
syz : s y z
⊢ ∃ y, r x y ∧ ∃ y_1, s y y_1 ∧ t y_1 w
[PROOFSTEP]
exact ⟨y, rxy, z, syz, tzw⟩
[GOAL]
case a.h.a.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
x : α
w : δ
⊢ (∃ y, r x y ∧ ∃ y_1, s y y_1 ∧ t y_1 w) → ∃ y, (∃ y_1, r x y_1 ∧ s y_1 y) ∧ t y w
[PROOFSTEP]
rintro ⟨y, rxy, z, syz, tzw⟩
[GOAL]
case a.h.a.mpr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : Rel α β
δ : Type u_4
r : Rel α β
s : Rel β γ
t : Rel γ δ
x : α
w : δ
y : β
rxy : r x y
z : γ
syz : s y z
tzw : t z w
⊢ ∃ y, (∃ y_1, r x y_1 ∧ s y_1 y) ∧ t y w
[PROOFSTEP]
exact ⟨z, ⟨y, rxy, syz⟩, tzw⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
⊢ r • Eq = r
[PROOFSTEP]
unfold comp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
⊢ (fun x z => ∃ y, r x y ∧ y = z) = r
[PROOFSTEP]
ext y
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
y : α
x✝ : β
⊢ (∃ y_1, r y y_1 ∧ y_1 = x✝) ↔ r y x✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
⊢ Eq • r = r
[PROOFSTEP]
unfold comp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
⊢ (fun x z => ∃ y, x = y ∧ r y z) = r
[PROOFSTEP]
ext x
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
x : α
x✝ : β
⊢ (∃ y, x = y ∧ r y x✝) ↔ r x x✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ inv Eq = Eq
[PROOFSTEP]
ext x y
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x y : α
⊢ inv Eq x y ↔ x = y
[PROOFSTEP]
constructor
[GOAL]
case a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x y : α
⊢ inv Eq x y → x = y
[PROOFSTEP]
apply Eq.symm
[GOAL]
case a.h.a.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
x y : α
⊢ x = y → inv Eq x y
[PROOFSTEP]
apply Eq.symm
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
s : Rel β γ
⊢ inv (r • s) = inv s • inv r
[PROOFSTEP]
ext x z
[GOAL]
case a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ r : Rel α β
s : Rel β γ
x : γ
z : α
⊢ inv (r • s) x z ↔ (inv s • inv r) x z
[PROOFSTEP]
simp [comp, inv, flip, and_comm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Set α
⊢ image Eq s = s
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Set α
x : α
⊢ x ∈ image Eq s ↔ x ∈ s
[PROOFSTEP]
simp [mem_image]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
⊢ image (r • s) t = image s (image r t)
[PROOFSTEP]
ext z
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
⊢ z ∈ image (r • s) t ↔ z ∈ image s (image r t)
[PROOFSTEP]
simp only [mem_image]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
⊢ (∃ x, x ∈ t ∧ (r • s) x z) ↔ ∃ x, (∃ x_1, x_1 ∈ t ∧ r x_1 x) ∧ s x z
[PROOFSTEP]
constructor
[GOAL]
case h.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
⊢ (∃ x, x ∈ t ∧ (r • s) x z) → ∃ x, (∃ x_1, x_1 ∈ t ∧ r x_1 x) ∧ s x z
[PROOFSTEP]
rintro ⟨x, xt, y, rxy, syz⟩
[GOAL]
case h.mp.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
x : α
xt : x ∈ t
y : β
rxy : r x y
syz : s y z
⊢ ∃ x, (∃ x_1, x_1 ∈ t ∧ r x_1 x) ∧ s x z
[PROOFSTEP]
exact ⟨y, ⟨x, xt, rxy⟩, syz⟩
[GOAL]
case h.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
⊢ (∃ x, (∃ x_1, x_1 ∈ t ∧ r x_1 x) ∧ s x z) → ∃ x, x ∈ t ∧ (r • s) x z
[PROOFSTEP]
rintro ⟨y, ⟨x, xt, rxy⟩, syz⟩
[GOAL]
case h.mpr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set α
z : γ
y : β
syz : s y z
x : α
xt : x ∈ t
rxy : r x y
⊢ ∃ x, x ∈ t ∧ (r • s) x z
[PROOFSTEP]
exact ⟨x, xt, y, rxy, syz⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ image r Set.univ = codom r
[PROOFSTEP]
ext y
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
y : β
⊢ y ∈ image r Set.univ ↔ y ∈ codom r
[PROOFSTEP]
simp [mem_image, codom]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Set α
⊢ preimage Eq s = s
[PROOFSTEP]
simp only [preimage, inv_id, image_id]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
⊢ preimage (r • s) t = preimage r (preimage s t)
[PROOFSTEP]
simp only [preimage, inv_comp, image_comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ preimage r Set.univ = dom r
[PROOFSTEP]
rw [preimage, image_univ, codom_inv]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s t : Set β
⊢ ∀ (x : α), x ∈ core r (s ∩ t) ↔ x ∈ core r s ∩ core r t
[PROOFSTEP]
simp [mem_core, imp_and, forall_and]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ ∀ (x : α), x ∈ core r Set.univ ↔ x ∈ Set.univ
[PROOFSTEP]
simp [mem_core]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Set α
⊢ core Eq s = s
[PROOFSTEP]
simp [core]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
⊢ core (r • s) t = core r (core s t)
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
x : α
⊢ x ∈ core (r • s) t ↔ x ∈ core r (core s t)
[PROOFSTEP]
simp [core, comp]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
x : α
⊢ (∀ (y : γ) (x_1 : β), r x x_1 → s x_1 y → y ∈ t) ↔ ∀ (y : β), r x y → ∀ (y_1 : γ), s y y_1 → y_1 ∈ t
[PROOFSTEP]
constructor
[GOAL]
case h.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
x : α
⊢ (∀ (y : γ) (x_1 : β), r x x_1 → s x_1 y → y ∈ t) → ∀ (y : β), r x y → ∀ (y_1 : γ), s y y_1 → y_1 ∈ t
[PROOFSTEP]
exact fun h y rxy z => h z y rxy
[GOAL]
case h.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
s : Rel β γ
t : Set γ
x : α
⊢ (∀ (y : β), r x y → ∀ (y_1 : γ), s y y_1 → y_1 ∈ t) → ∀ (y : γ) (x_1 : β), r x x_1 → s x_1 y → y ∈ t
[PROOFSTEP]
exact fun h z y rzy => h y rzy z
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
s : Set α
⊢ f '' s = Rel.image (Function.graph f) s
[PROOFSTEP]
simp [Set.image, Function.graph, Rel.image]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
s : Set β
⊢ f ⁻¹' s = Rel.preimage (Function.graph f) s
[PROOFSTEP]
simp [Set.preimage, Function.graph, Rel.preimage, Rel.inv, flip, Rel.image]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
s : Set β
⊢ f ⁻¹' s = Rel.core (Function.graph f) s
[PROOFSTEP]
simp [Set.preimage, Function.graph, Rel.core]


[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⟩