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

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
⊢ Relation.Map (Relation.Map r f₁ g₁) f₂ g₂ = Relation.Map r (f₂ ∘ f₁) (g₂ ∘ g₁)
state_after: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a : ε
b : ζ
⊢ Relation.Map (Relation.Map r f₁ g₁) f₂ g₂ a b ↔ Relation.Map r (f₂ ∘ f₁) (g₂ ∘ g₁) a b
tactic: ext a b
state_before: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a : ε
b : ζ
⊢ Relation.Map (Relation.Map r f₁ g₁) f₂ g₂ a b ↔ Relation.Map r (f₂ ∘ f₁) (g₂ ∘ g₁) a b
state_after: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a : ε
b : ζ
⊢ (∃ b_1 b_2 b_3 a_1, (r b_1 b_2 ∧ f₁ b_1 = b_3 ∧ g₁ b_2 = a_1) ∧ f₂ b_3 = a ∧ g₂ a_1 = b) ↔
    ∃ a_1 b_1, r a_1 b_1 ∧ f₂ (f₁ a_1) = a ∧ g₂ (g₁ b_1) = b
tactic: simp_rw [Relation.Map, Function.comp_apply, ← exists_and_right, @exists_comm γ, @exists_comm δ]
state_before: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a : ε
b : ζ
⊢ (∃ b_1 b_2 b_3 a_1, (r b_1 b_2 ∧ f₁ b_1 = b_3 ∧ g₁ b_2 = a_1) ∧ f₂ b_3 = a ∧ g₂ a_1 = b) ↔
    ∃ a_1 b_1, r a_1 b_1 ∧ f₂ (f₁ a_1) = a ∧ g₂ (g₁ b_1) = b
state_after: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a✝ : ε
b✝ : ζ
a : α
b : β
⊢ (∃ b_1 a_1, (r a b ∧ f₁ a = b_1 ∧ g₁ b = a_1) ∧ f₂ b_1 = a✝ ∧ g₂ a_1 = b✝) → r a b ∧ f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
tactic: refine exists₂_congr fun a b ↦ ⟨?_, fun h ↦ ⟨_, _, ⟨⟨h.1, rfl, rfl⟩, h.2⟩⟩⟩
state_before: case h.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a✝ : ε
b✝ : ζ
a : α
b : β
⊢ (∃ b_1 a_1, (r a b ∧ f₁ a = b_1 ∧ g₁ b = a_1) ∧ f₂ b_1 = a✝ ∧ g₂ a_1 = b✝) → r a b ∧ f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
state_after: case h.h.a.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a✝ : ε
b✝ : ζ
a : α
b : β
hab : r a b
h : f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
⊢ r a b ∧ f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
tactic: rintro ⟨_, _, ⟨hab, rfl, rfl⟩, h⟩
state_before: case h.h.a.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ε : Type u_5
ζ : Type u_6
r✝ : α → β → Prop
f : α → γ
g : β → δ
c : γ
d : δ
r : α → β → Prop
f₁ : α → γ
g₁ : β → δ
f₂ : γ → ε
g₂ : δ → ζ
a✝ : ε
b✝ : ζ
a : α
b : β
hab : r a b
h : f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
⊢ r a b ∧ f₂ (f₁ a) = a✝ ∧ g₂ (g₁ b) = b✝
state_after: no goals
tactic: exact ⟨hab, h⟩