Theorem: Relation.is_graph_iff
File: Mathlib/Data/Rel.lean

tactic: unfold Function.graph
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∃! f, Function.graph f = r) ↔ ∀ (x : α), ∃! y, r x y
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∃! f, (fun x y => f x = y) = r) ↔ ∀ (x : α), ∃! y, r x y

tactic: constructor
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∃! f, (fun x y => f x = y) = r) ↔ ∀ (x : α), ∃! y, r x y
state_after: case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∃! f, (fun x y => f x = y) = r) → ∀ (x : α), ∃! y, r x y

case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∀ (x : α), ∃! y, r x y) → ∃! f, (fun x y => f x = y) = r

tactic: rintro ⟨f, rfl, _⟩ x
state_before: case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∃! f, (fun x y => f x = y) = r) → ∀ (x : α), ∃! y, r x y
state_after: case mp.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
right✝ : ∀ (y : α → β), (fun f_1 => (fun x y => f_1 x = y) = fun x y => f x = y) y → y = f
x : α
⊢ ∃! y, (fun x y => f x = y) x y

tactic: use f x
state_before: case mp.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
right✝ : ∀ (y : α → β), (fun f_1 => (fun x y => f_1 x = y) = fun x y => f x = y) y → y = f
x : α
⊢ ∃! y, (fun x y => f x = y) x y
state_after: case h
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
right✝ : ∀ (y : α → β), (fun f_1 => (fun x y => f_1 x = y) = fun x y => f x = y) y → y = f
x : α
⊢ (fun y => (fun x y => f x = y) x y) (f x) ∧ ∀ (y : β), (fun y => (fun x y => f x = y) x y) y → y = f x

tactic: simp only [forall_eq', and_self]
state_before: case h
α : Type u_1
β : Type u_2
γ : Type u_3
f : α → β
right✝ : ∀ (y : α → β), (fun f_1 => (fun x y => f_1 x = y) = fun x y => f x = y) y → y = f
x : α
⊢ (fun y => (fun x y => f x = y) x y) (f x) ∧ ∀ (y : β), (fun y => (fun x y => f x = y) x y) y → y = f x
state_after: no goals

tactic: intro h
state_before: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
⊢ (∀ (x : α), ∃! y, r x y) → ∃! f, (fun x y => f x = y) = r
state_after: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
⊢ ∃! f, (fun x y => f x = y) = r

tactic: choose f hf using fun x ↦ (h x).exists
state_before: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
⊢ ∃! f, (fun x y => f x = y) = r
state_after: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ ∃! f, (fun x y => f x = y) = r

tactic: use f
state_before: case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ ∃! f, (fun x y => f x = y) = r
state_after: case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ (fun f => (fun x y => f x = y) = r) f ∧ ∀ (y : α → β), (fun f => (fun x y => f x = y) = r) y → y = f

tactic: constructor
state_before: case h
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ (fun f => (fun x y => f x = y) = r) f ∧ ∀ (y : α → β), (fun f => (fun x y => f x = y) = r) y → y = f
state_after: case h.left
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ (fun f => (fun x y => f x = y) = r) f

case h.right
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ ∀ (y : α → β), (fun f => (fun x y => f x = y) = r) y → y = f

tactic: ext x _
state_before: case h.left
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ (fun f => (fun x y => f x = y) = r) f
state_after: case h.left.a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ f x = x✝ ↔ r x x✝

tactic: constructor
state_before: case h.left.a.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ f x = x✝ ↔ r x x✝
state_after: case h.left.a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ f x = x✝ → r x x✝

case h.left.a.h.a.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ r x x✝ → f x = x✝

tactic: rintro rfl
state_before: case h.left.a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ f x = x✝ → r x x✝
state_after: case h.left.a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
⊢ r x (f x)

tactic: exact hf x
state_before: case h.left.a.h.a.mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
⊢ r x (f x)
state_after: no goals

tactic: exact (h x).unique (hf x)
state_before: case h.left.a.h.a.mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
x : α
x✝ : β
⊢ r x x✝ → f x = x✝
state_after: no goals

tactic: rintro _ rfl
state_before: case h.right
α : Type u_1
β : Type u_2
γ : Type u_3
r : Rel α β
h : ∀ (x : α), ∃! y, r x y
f : α → β
hf : ∀ (x : α), r x (f x)
⊢ ∀ (y : α → β), (fun f => (fun x y => f x = y) = r) y → y = f
state_after: case h.right
α : Type u_1
β : Type u_2
γ : Type u_3
f y✝ : α → β
h : ∀ (x : α), ∃! y, (fun x y => y✝ x = y) x y
hf : ∀ (x : α), (fun x y => y✝ x = y) x (f x)
⊢ y✝ = f

tactic: exact funext hf
state_before: case h.right
α : Type u_1
β : Type u_2
γ : Type u_3
f y✝ : α → β
h : ∀ (x : α), ∃! y, (fun x y => y✝ x = y) x y
hf : ∀ (x : α), (fun x y => y✝ x = y) x (f x)
⊢ y✝ = f
state_after: no goals