Theorem: Relation.church_rosser
File: Mathlib/Logic/Relation.lean

tactic: induction hab
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b c d : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hab : ReflTransGen r a b
hac : ReflTransGen r a c
⊢ Join (ReflTransGen r) b c

tactic: case refl => exact ⟨c, hac, refl⟩
state_before: case refl
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b c d : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
⊢ Join (ReflTransGen r) a c

case tail
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b c d : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
b✝ c✝ : α
a✝¹ : ReflTransGen r a b✝
a✝ : r b✝ c✝
a_ih✝ : Join (ReflTransGen r) b✝ c
⊢ Join (ReflTransGen r) c✝ c

tactic: exact ⟨c, hac, refl⟩
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b c d : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
⊢ Join (ReflTransGen r) a c

tactic: rcases ih with ⟨b, hdb, hcb⟩
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
ih : Join (ReflTransGen r) d c
⊢ Join (ReflTransGen r) e c

tactic: rcases this with ⟨a, hea, hba⟩
state_before: case intro.intro
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
hdb : ReflTransGen r d b
hcb : ReflTransGen r c b
this : ∃ a, ReflTransGen r e a ∧ ReflGen r b a
⊢ Join (ReflTransGen r) e c

tactic: cases' hba with _ hba
state_before: case intro.intro.intro.intro
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a✝¹ b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a✝¹ c
d e : α
a✝ : ReflTransGen r a✝¹ d
hde : r d e
b : α
hdb : ReflTransGen r d b
hcb : ReflTransGen r c b
a : α
hea : ReflTransGen r e a
hba : ReflGen r b a
⊢ Join (ReflTransGen r) e c

tactic: clear hcb
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
hdb : ReflTransGen r d b
hcb : ReflTransGen r c b
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: induction hdb
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
hdb : ReflTransGen r d b
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: case refl => exact ⟨e, refl, ReflGen.single hde⟩
state_before: case refl
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r d a

case tail
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝¹ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝² : ReflTransGen r a d
hde : r d e
b b✝ c✝ : α
a✝¹ : ReflTransGen r d b✝
a✝ : r b✝ c✝
a_ih✝ : ∃ a, ReflTransGen r e a ∧ ReflGen r b✝ a
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r c✝ a

tactic: exact ⟨e, refl, ReflGen.single hde⟩
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r d a

tactic: rcases ih with ⟨a, hea, hfa⟩
state_before: α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝¹ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝¹ : ReflTransGen r a d
hde : r d e
b✝ f b : α
a✝ : ReflTransGen r d f
hfb : r f b
ih : ∃ a, ReflTransGen r e a ∧ ReflGen r f a
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: cases' hfa with _ hfa
state_before: case intro.intro
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a✝² b✝¹ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a✝² c
d e : α
a✝¹ : ReflTransGen r a✝² d
hde : r d e
b✝ f b : α
a✝ : ReflTransGen r d f
hfb : r f b
a : α
hea : ReflTransGen r e a
hfa : ReflGen r f a
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: exact ⟨b, hea.tail hfb, ReflGen.refl⟩
state_before: case intro.intro.refl
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝¹ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝¹ : ReflTransGen r a d
hde : r d e
b✝ f b : α
a✝ : ReflTransGen r d f
hfb : r f b
hea : ReflTransGen r e f
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: rcases h _ _ _ hfb hfa with ⟨c, hbc, hac⟩
state_before: case intro.intro.single
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a✝² b✝¹ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a✝² c
d e : α
a✝¹ : ReflTransGen r a✝² d
hde : r d e
b✝ f b : α
a✝ : ReflTransGen r d f
hfb : r f b
a : α
hea : ReflTransGen r e a
hfa : r f a
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: exact ⟨c, hea.trans hac, hbc⟩
state_before: case intro.intro.single.intro.intro
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a✝² b✝¹ c✝ d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac✝ : ReflTransGen r a✝² c✝
d e : α
a✝¹ : ReflTransGen r a✝² d
hde : r d e
b✝ f b : α
a✝ : ReflTransGen r d f
hfb : r f b
a : α
hea : ReflTransGen r e a
hfa : r f a
c : α
hbc : ReflGen r b c
hac : ReflTransGen r a c
⊢ ∃ a, ReflTransGen r e a ∧ ReflGen r b a

tactic: exact ⟨b, hea, hcb⟩
state_before: case intro.intro.intro.intro.refl
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a c
d e : α
a✝ : ReflTransGen r a d
hde : r d e
b : α
hdb : ReflTransGen r d b
hcb : ReflTransGen r c b
hea : ReflTransGen r e b
⊢ Join (ReflTransGen r) e c

tactic: exact ⟨a, hea, hcb.tail hba⟩
state_before: case intro.intro.intro.intro.single
α : Type u_1
β : Type ?u.27200
γ : Type ?u.27203
δ : Type ?u.27206
r : α → α → Prop
a✝¹ b✝ c d✝ : α
h : ∀ (a b c : α), r a b → r a c → ∃ d, ReflGen r b d ∧ ReflTransGen r c d
hac : ReflTransGen r a✝¹ c
d e : α
a✝ : ReflTransGen r a✝¹ d
hde : r d e
b : α
hdb : ReflTransGen r d b
hcb : ReflTransGen r c b
a : α
hea : ReflTransGen r e a
hba : r b a
⊢ Join (ReflTransGen r) e c