Theorem: CategoryTheory.RelCat.rel_iso_iff
File: Mathlib/CategoryTheory/Category/RelCat.lean

tactic: constructor
state_before: X Y : RelCat
r : X ⟶ Y
⊢ IsIso r ↔ ∃ f, graphFunctor.map f.hom = r
state_after: case mp
X Y : RelCat
r : X ⟶ Y
⊢ IsIso r → ∃ f, graphFunctor.map f.hom = r

case mpr
X Y : RelCat
r : X ⟶ Y
⊢ (∃ f, graphFunctor.map f.hom = r) → IsIso r

tactic: intro h
state_before: case mp
X Y : RelCat
r : X ⟶ Y
⊢ IsIso r → ∃ f, graphFunctor.map f.hom = r
state_after: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: have h1 := congr_fun₂ h.hom_inv_id
state_before: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (r ≫ inv r) a b = 𝟙 X a b
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: have h2 := congr_fun₂ h.inv_hom_id
state_before: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (r ≫ inv r) a b = 𝟙 X a b
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (r ≫ inv r) a b = 𝟙 X a b
h2 : ∀ (a b : Y), (inv r ≫ r) a b = 𝟙 Y a b
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: simp only [RelCat.Hom.rel_comp_apply₂, RelCat.Hom.rel_id_apply₂, eq_iff_iff] at h1 h2
state_before: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (r ≫ inv r) a b = 𝟙 X a b
h2 : ∀ (a b : Y), (inv r ≫ r) a b = 𝟙 Y a b
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: obtain ⟨f, hf⟩ := Classical.axiomOfChoice (fun a => (h1 a a).mpr rfl)
state_before: case mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case mp.intro
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: obtain ⟨g, hg⟩ := Classical.axiomOfChoice (fun a => (h2 a a).mpr rfl)
state_before: case mp.intro
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case mp.intro.intro
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ ∃ f, graphFunctor.map f.hom = r

tactic: use g
state_before: case mp.intro.intro
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ IsIso f
state_after: case h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ f ≫ g = 𝟙 X ∧ g ≫ f = 𝟙 Y

tactic: constructor
state_before: case h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ f ≫ g = 𝟙 X ∧ g ≫ f = 𝟙 Y
state_after: case h.left
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ f ≫ g = 𝟙 X

case h.right
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ g ≫ f = 𝟙 Y

tactic: use asIso f
state_before: X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
⊢ ∃ f, graphFunctor.map f.hom = r
state_after: case h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
⊢ graphFunctor.map (asIso f).hom = r

tactic: ext x y
state_before: case h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
⊢ graphFunctor.map (asIso f).hom = r
state_after: case h.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ graphFunctor.map (asIso f).hom x y ↔ r x y

tactic: simp only [asIso_hom, graphFunctor_map]
state_before: case h.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ graphFunctor.map (asIso f).hom x y ↔ r x y
state_after: case h.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ f x = y ↔ r x y

tactic: constructor
state_before: case h.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ f x = y ↔ r x y
state_after: case h.h.mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ f x = y → r x y

case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ r x y → f x = y

tactic: rintro rfl
state_before: case h.h.mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ f x = y → r x y
state_after: case h.h.mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
⊢ r x (f x)

tactic: exact (hf x).1
state_before: case h.h.mp
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
⊢ r x (f x)
state_after: no goals

tactic: intro hr
state_before: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
⊢ r x y → f x = y
state_after: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
⊢ f x = y

tactic: specialize h2 (f x) y
state_before: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
⊢ f x = y
state_after: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
h2 : (∃ y_1, inv r (f x) y_1 ∧ r y_1 y) ↔ f x = y
⊢ f x = y

tactic: rw [← h2]
state_before: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
h2 : (∃ y_1, inv r (f x) y_1 ∧ r y_1 y) ↔ f x = y
⊢ f x = y
state_after: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
h2 : (∃ y_1, inv r (f x) y_1 ∧ r y_1 y) ↔ f x = y
⊢ ∃ y_1, inv r (f x) y_1 ∧ r y_1 y

tactic: use x, (hf x).2, hr
state_before: case h.h.mpr
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
hif : IsIso f
x : graphFunctor.obj X
y : graphFunctor.obj Y
hr : r x y
h2 : (∃ y_1, inv r (f x) y_1 ∧ r y_1 y) ↔ f x = y
⊢ ∃ y_1, inv r (f x) y_1 ∧ r y_1 y
state_after: no goals

tactic: ext x
state_before: case h.left
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ f ≫ g = 𝟙 X
state_after: case h.left.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
x : X
⊢ (f ≫ g) x = 𝟙 X x

tactic: apply (h1 _ _).mp
state_before: case h.left.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
x : X
⊢ (f ≫ g) x = 𝟙 X x
state_after: case h.left.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
x : X
⊢ ∃ y, r ((f ≫ g) x) y ∧ inv r y (𝟙 X x)

tactic: use f x, (hg _).2, (hf _).2
state_before: case h.left.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
x : X
⊢ ∃ y, r ((f ≫ g) x) y ∧ inv r y (𝟙 X x)
state_after: no goals

tactic: ext y
state_before: case h.right
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
⊢ g ≫ f = 𝟙 Y
state_after: case h.right.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
y : Y
⊢ (g ≫ f) y = 𝟙 Y y

tactic: apply (h2 _ _).mp
state_before: case h.right.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
y : Y
⊢ (g ≫ f) y = 𝟙 Y y
state_after: case h.right.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
y : Y
⊢ ∃ y_1, inv r ((g ≫ f) y) y_1 ∧ r y_1 (𝟙 Y y)

tactic: use g y, (hf (g y)).2, (hg y).2
state_before: case h.right.h
X Y : RelCat
r : X ⟶ Y
h : IsIso r
h1 : ∀ (a b : X), (∃ y, r a y ∧ inv r y b) ↔ a = b
h2 : ∀ (a b : Y), (∃ y, inv r a y ∧ r y b) ↔ a = b
f : X → Y
hf : ∀ (x : X), r x (f x) ∧ inv r (f x) x
g : Y → X
hg : ∀ (x : Y), inv r x (g x) ∧ r (g x) x
y : Y
⊢ ∃ y_1, inv r ((g ≫ f) y) y_1 ∧ r y_1 (𝟙 Y y)
state_after: no goals

tactic: rintro ⟨f, rfl⟩
state_before: case mpr
X Y : RelCat
r : X ⟶ Y
⊢ (∃ f, graphFunctor.map f.hom = r) → IsIso r
state_after: case mpr.intro
X Y : RelCat
f : X ≅ Y
⊢ IsIso (graphFunctor.map f.hom)

tactic: apply graphFunctor.map_isIso
state_before: case mpr.intro
X Y : RelCat
f : X ≅ Y
⊢ IsIso (graphFunctor.map f.hom)
state_after: no goals