Theorem: Subgroup.quotientEquivProdOfLE'_symm_apply
File: Mathlib/GroupTheory/Coset.lean

Proof steps:
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
⊢ Setoid.r ((fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) b) ((fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) c)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
⊢ ((fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) b)⁻¹ * (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) c ∈ s.subgroupOf t
tactic: rw [leftRel_apply]
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
⊢ ((fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) b)⁻¹ * (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) c ∈ s.subgroupOf t
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
⊢ ((f ↑b)⁻¹ * b)⁻¹ * ((f ↑c)⁻¹ * c) ∈ s
tactic: change ((f b)⁻¹ * b)⁻¹ * ((f c)⁻¹ * c) ∈ s
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
⊢ ((f ↑b)⁻¹ * b)⁻¹ * ((f ↑c)⁻¹ * c) ∈ s
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
key : f ↑b = f ↑c
⊢ ((f ↑b)⁻¹ * b)⁻¹ * ((f ↑c)⁻¹ * c) ∈ s
tactic: have key : f b = f c :=
          congr_arg f (Quotient.sound' (leftRel_apply.mpr (h_le (leftRel_apply.mp h))))
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α ⧸ s
b c : α
h : Setoid.r b c
key : f ↑b = f ↑c
⊢ ((f ↑b)⁻¹ * b)⁻¹ * ((f ↑c)⁻¹ * c) ∈ s
state_after: no goals
tactic: rwa [key, mul_inv_rev, inv_inv, mul_assoc, mul_inv_cancel_left, ← leftRel_apply]
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : (α ⧸ t) × ↥t ⧸ s.subgroupOf t
⊢ α ⧸ s
state_after: no goals
tactic: refine a.2.map' (fun (b : { x // x ∈ t}) => f a.1 * b) fun b c h => by
      rw [leftRel_apply] at h ⊢
      change (f a.1 * b)⁻¹ * (f a.1 * c) ∈ s
      rwa [mul_inv_rev, mul_assoc, inv_mul_cancel_left]
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
⊢ LeftInverse (fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) fun a =>
    (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
⊢ (fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2)
      ((fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        (Quotient.mk'' a)) =
    Quotient.mk'' a
tactic: refine Quotient.ind' fun a => ?_
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
⊢ (fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2)
      ((fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        (Quotient.mk'' a)) =
    Quotient.mk'' a
state_after: no goals
tactic: simp_rw [Quotient.map'_mk'', id, mul_inv_cancel_left]
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
⊢ Function.RightInverse (fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) fun a =>
    (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
⊢ ∀ (fst : α ⧸ t) (snd : ↥t ⧸ s.subgroupOf t),
    (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (fst, snd)) =
      (fst, snd)
tactic: refine Prod.rec ?_
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
⊢ ∀ (fst : α ⧸ t) (snd : ↥t ⧸ s.subgroupOf t),
    (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (fst, snd)) =
      (fst, snd)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
⊢ ∀ (snd : ↥t ⧸ s.subgroupOf t),
    (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, snd)) =
      (Quotient.mk'' a, snd)
tactic: refine Quotient.ind' fun a => ?_
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
⊢ ∀ (snd : ↥t ⧸ s.subgroupOf t),
    (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
        ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, snd)) =
      (Quotient.mk'' a, snd)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
b : ↥t
⊢ (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
      ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, Quotient.mk'' b)) =
    (Quotient.mk'' a, Quotient.mk'' b)
tactic: refine Quotient.ind' fun b => ?_
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
b : ↥t
⊢ (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
      ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, Quotient.mk'' b)) =
    (Quotient.mk'' a, Quotient.mk'' b)
state_after: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
b : ↥t
key : Quotient.mk'' (f (Quotient.mk'' a) * ↑b) = Quotient.mk'' a
⊢ (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
      ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, Quotient.mk'' b)) =
    (Quotient.mk'' a, Quotient.mk'' b)
tactic: have key : Quotient.mk'' (f (Quotient.mk'' a) * b) = Quotient.mk'' a :=
      (QuotientGroup.mk_mul_of_mem (f a) b.2).trans (hf a)
state_before: α : Type u_1
inst✝ : Group α
s t : Subgroup α
h_le : s ≤ t
f : α ⧸ t → α
hf : Function.RightInverse f QuotientGroup.mk
a : α
b : ↥t
key : Quotient.mk'' (f (Quotient.mk'' a) * ↑b) = Quotient.mk'' a
⊢ (fun a => (Quotient.map' id ⋯ a, Quotient.map' (fun g => ⟨(f (Quotient.mk'' g))⁻¹ * g, ⋯⟩) ⋯ a))
      ((fun a => Quotient.map' (fun b => f a.1 * ↑b) ⋯ a.2) (Quotient.mk'' a, Quotient.mk'' b)) =
    (Quotient.mk'' a, Quotient.mk'' b)
state_after: no goals
tactic: simp_rw [Quotient.map'_mk'', id, key, inv_mul_cancel_left]