Theorem: TopCat.GlueData.rel_equiv
File: Mathlib/Topology/Gluing.lean

tactic: rintro a b (⟨⟨⟩⟩ | ⟨x, e₁, e₂⟩)
state_before: D : GlueData
⊢ ∀ {x y : (i : D.J) × ↑(D.U i)}, D.Rel x y → D.Rel y x
state_after: case inl.refl
D : GlueData
a : (i : D.J) × ↑(D.U i)
⊢ D.Rel a a

case inr.intro.intro
D : GlueData
a b : (i : D.J) × ↑(D.U i)
x : ↑(D.V (a.fst, b.fst))
e₁ : (D.f a.fst b.fst) x = a.snd
e₂ : (D.f b.fst a.fst) ((D.t a.fst b.fst) x) = b.snd
⊢ D.Rel b a

tactic: exacts [Or.inl rfl, Or.inr ⟨D.t _ _ x, e₂, by erw [← e₁, D.t_inv_apply]⟩]
state_before: case inl.refl
D : GlueData
a : (i : D.J) × ↑(D.U i)
⊢ D.Rel a a

case inr.intro.intro
D : GlueData
a b : (i : D.J) × ↑(D.U i)
x : ↑(D.V (a.fst, b.fst))
e₁ : (D.f a.fst b.fst) x = a.snd
e₂ : (D.f b.fst a.fst) ((D.t a.fst b.fst) x) = b.snd
⊢ D.Rel b a
state_after: no goals

tactic: erw [← e₁, D.t_inv_apply]
state_before: D : GlueData
a b : (i : D.J) × ↑(D.U i)
x : ↑(D.V (a.fst, b.fst))
e₁ : (D.f a.fst b.fst) x = a.snd
e₂ : (D.f b.fst a.fst) ((D.t a.fst b.fst) x) = b.snd
⊢ (D.f a.fst b.fst) ((D.t b.fst a.fst) ((D.t a.fst b.fst) x)) = a.snd
state_after: no goals

tactic: rintro ⟨i, a⟩ ⟨j, b⟩ ⟨k, c⟩ (⟨⟨⟩⟩ | ⟨x, e₁, e₂⟩)
state_before: D : GlueData
⊢ ∀ {x y z : (i : D.J) × ↑(D.U i)}, D.Rel x y → D.Rel y z → D.Rel x z
state_after: case mk.mk.mk.inl.refl
D : GlueData
i : D.J
a : ↑(D.U i)
k : D.J
c : ↑(D.U k)
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩ → D.Rel ⟨i, a⟩ ⟨k, c⟩

case mk.mk.mk.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
⊢ D.Rel ⟨j, b⟩ ⟨k, c⟩ → D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: rintro (⟨⟨⟩⟩ | ⟨y, e₃, e₄⟩)
state_before: case mk.mk.mk.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
⊢ D.Rel ⟨j, b⟩ ⟨k, c⟩ → D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inl.refl
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
⊢ D.Rel ⟨i, a⟩ ⟨j, b⟩

case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: let z := (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨⟨_, _⟩, e₂.trans e₃.symm⟩
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: have eq₁ : (D.t j i) ((pullback.fst : _  ⟶ D.V (j, i)) z) = x := by
  dsimp only [coe_of, z]
  erw [pullbackIsoProdSubtype_inv_fst_apply, D.t_inv_apply]
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
eq₁ : (D.t j i) (pullback.fst z) = x
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: have eq₂ : (pullback.snd : _ ⟶ D.V _) z = y := pullbackIsoProdSubtype_inv_snd_apply _ _ _
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
eq₁ : (D.t j i) (pullback.fst z) = x
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: clear_value z
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩

tactic: right
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: case mk.mk.mk.inr.intro.intro.inr.intro.intro.h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ ∃ x,
    (D.f ⟨i, a⟩.fst ⟨k, c⟩.fst) x = ⟨i, a⟩.snd ∧
      (D.f ⟨k, c⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨k, c⟩.fst) x) = ⟨k, c⟩.snd

tactic: use (pullback.fst : _ ⟶ D.V (i, k)) (D.t' _ _ _ z)
state_before: case mk.mk.mk.inr.intro.intro.inr.intro.intro.h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ ∃ x,
    (D.f ⟨i, a⟩.fst ⟨k, c⟩.fst) x = ⟨i, a⟩.snd ∧
      (D.f ⟨k, c⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨k, c⟩.fst) x) = ⟨k, c⟩.snd
state_after: case h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ (D.f ⟨i, a⟩.fst ⟨k, c⟩.fst) (pullback.fst ((D.t' j i k) z)) = ⟨i, a⟩.snd ∧
    (D.f ⟨k, c⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨k, c⟩.fst) (pullback.fst ((D.t' j i k) z))) = ⟨k, c⟩.snd

tactic: dsimp only at *
state_before: case h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ (D.f ⟨i, a⟩.fst ⟨k, c⟩.fst) (pullback.fst ((D.t' j i k) z)) = ⟨i, a⟩.snd ∧
    (D.f ⟨k, c⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨k, c⟩.fst) (pullback.fst ((D.t' j i k) z))) = ⟨k, c⟩.snd
state_after: case h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f i j) x = a
e₂ : (D.f j i) ((D.t i j) x) = b
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f j k) y = b
e₄ : (D.f k j) ((D.t j k) y) = c
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = a ∧ (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = c

tactic: substs eq₁ eq₂ e₁ e₃ e₄
state_before: case h
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f i j) x = a
e₂ : (D.f j i) ((D.t i j) x) = b
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f j k) y = b
e₄ : (D.f k j) ((D.t j k) y) = c
z : ↑(pullback (D.f j i) (D.f j k))
eq₁ : (D.t j i) (pullback.fst z) = x
eq₂ : pullback.snd z = y
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = a ∧ (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = c
state_after: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))

tactic: have h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j := by
  rw [← 𝖣.t_fac_assoc]; congr 1; exact pullback.condition
state_before: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))
state_after: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))

tactic: have h₂ : D.t' j i k ≫ pullback.fst ≫ D.t i k ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j := by
  rw [← 𝖣.t_fac_assoc]
  apply @Epi.left_cancellation _ _ _ _ (D.t' k j i)
  rw [𝖣.cocycle_assoc, 𝖣.t_fac_assoc, 𝖣.t_inv_assoc]
  exact pullback.condition.symm
state_before: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))
state_after: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
h₂ : D.t' j i k ≫ pullback.fst ≫ D.t i k ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))

tactic: exact ⟨ContinuousMap.congr_fun h₁ z, ContinuousMap.congr_fun h₂ z⟩
state_before: case h
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
h₂ : D.t' j i k ≫ pullback.fst ≫ D.t i k ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j
⊢ (D.f i k) (pullback.fst ((D.t' j i k) z)) = (D.f i j) ((D.t j i) (pullback.fst z)) ∧
    (D.f k i) ((D.t i k) (pullback.fst ((D.t' j i k) z))) = (D.f k j) ((D.t j k) (pullback.snd z))
state_after: no goals

tactic: exact id
state_before: case mk.mk.mk.inl.refl
D : GlueData
i : D.J
a : ↑(D.U i)
k : D.J
c : ↑(D.U k)
⊢ D.Rel ⟨i, a⟩ ⟨k, c⟩ → D.Rel ⟨i, a⟩ ⟨k, c⟩
state_after: no goals

tactic: exact Or.inr ⟨x, e₁, e₂⟩
state_before: case mk.mk.mk.inr.intro.intro.inl.refl
D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
⊢ D.Rel ⟨i, a⟩ ⟨j, b⟩
state_after: no goals

tactic: dsimp only [coe_of, z]
state_before: D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
⊢ (D.t j i) (pullback.fst z) = x
state_after: D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
⊢ (D.t j i) (pullback.fst ((pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t i j) x, y), ⋯⟩)) = x

tactic: erw [pullbackIsoProdSubtype_inv_fst_apply, D.t_inv_apply]
state_before: D : GlueData
i : D.J
a : ↑(D.U i)
j : D.J
b : ↑(D.U j)
k : D.J
c : ↑(D.U k)
x : ↑(D.V (⟨i, a⟩.fst, ⟨j, b⟩.fst))
e₁ : (D.f ⟨i, a⟩.fst ⟨j, b⟩.fst) x = ⟨i, a⟩.snd
e₂ : (D.f ⟨j, b⟩.fst ⟨i, a⟩.fst) ((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x) = ⟨j, b⟩.snd
y : ↑(D.V (⟨j, b⟩.fst, ⟨k, c⟩.fst))
e₃ : (D.f ⟨j, b⟩.fst ⟨k, c⟩.fst) y = ⟨j, b⟩.snd
e₄ : (D.f ⟨k, c⟩.fst ⟨j, b⟩.fst) ((D.t ⟨j, b⟩.fst ⟨k, c⟩.fst) y) = ⟨k, c⟩.snd
z : ↑(pullback (D.f j i) (D.f j k)) :=
  (pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t ⟨i, a⟩.fst ⟨j, b⟩.fst) x, y), ⋯⟩
⊢ (D.t j i) (pullback.fst ((pullbackIsoProdSubtype (D.f j i) (D.f j k)).inv ⟨((D.t i j) x, y), ⋯⟩)) = x
state_after: no goals

tactic: rw [← 𝖣.t_fac_assoc]
state_before: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
state_after: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ D.t' j i k ≫ pullback.fst ≫ D.f i k = D.t' j i k ≫ pullback.snd ≫ D.f i j

tactic: congr 1
state_before: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ D.t' j i k ≫ pullback.fst ≫ D.f i k = D.t' j i k ≫ pullback.snd ≫ D.f i j
state_after: case e_a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ pullback.fst ≫ D.f i k = pullback.snd ≫ D.f i j

tactic: exact pullback.condition
state_before: case e_a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
⊢ pullback.fst ≫ D.f i k = pullback.snd ≫ D.f i j
state_after: no goals

tactic: rw [← 𝖣.t_fac_assoc]
state_before: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ D.t' j i k ≫ pullback.fst ≫ D.t i k ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j
state_after: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ D.t' j i k ≫ D.t' i k j ≫ pullback.snd ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j

tactic: apply @Epi.left_cancellation _ _ _ _ (D.t' k j i)
state_before: D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ D.t' j i k ≫ D.t' i k j ≫ pullback.snd ≫ D.f k i = pullback.snd ≫ D.t j k ≫ D.f k j
state_after: case a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ D.t' k j i ≫ D.t' j i k ≫ D.t' i k j ≫ pullback.snd ≫ D.f k i = D.t' k j i ≫ pullback.snd ≫ D.t j k ≫ D.f k j

tactic: rw [𝖣.cocycle_assoc, 𝖣.t_fac_assoc, 𝖣.t_inv_assoc]
state_before: case a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ D.t' k j i ≫ D.t' j i k ≫ D.t' i k j ≫ pullback.snd ≫ D.f k i = D.t' k j i ≫ pullback.snd ≫ D.t j k ≫ D.f k j
state_after: case a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ pullback.snd ≫ D.f k i = pullback.fst ≫ D.f k j

tactic: exact pullback.condition.symm
state_before: case a
D : GlueData
i j k : D.J
z : ↑(pullback (D.f j i) (D.f j k))
e₂ : (D.f j i) ((D.t i j) ((D.t j i) (pullback.fst z))) = (D.f j k) (pullback.snd z)
h₁ : D.t' j i k ≫ pullback.fst ≫ D.f i k = pullback.fst ≫ D.t j i ≫ D.f i j
⊢ pullback.snd ≫ D.f k i = pullback.fst ≫ D.f k j
state_after: no goals