Theorem: AddSubgroup.exists_leftTransversal_of_FiniteIndex
File: Mathlib/GroupTheory/CosetCover.lean

Proof steps:
state_before: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
⊢ ∃ t, ↑t ∈ leftTransversals ↑(D.subgroupOf H) ∧ ⋃ g ∈ t, ↑g • ↑D = ↑H
state_after: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
⊢ ∃ t, ↑t ∈ leftTransversals ↑(D.subgroupOf H) ∧ ⋃ g ∈ t, ↑g • ↑D = ↑H
tactic: have ⟨t, ht⟩ := exists_left_transversal (D.subgroupOf H) 1
state_before: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
⊢ ∃ t, ↑t ∈ leftTransversals ↑(D.subgroupOf H) ∧ ⋃ g ∈ t, ↑g • ↑D = ↑H
state_after: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
⊢ ∃ t, ↑t ∈ leftTransversals ↑(D.subgroupOf H) ∧ ⋃ g ∈ t, ↑g • ↑D = ↑H
tactic: have hf : t.Finite := (MemLeftTransversals.finite_iff ht.1).mpr inferInstance
state_before: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
⊢ ∃ t, ↑t ∈ leftTransversals ↑(D.subgroupOf H) ∧ ⋃ g ∈ t, ↑g • ↑D = ↑H
state_after: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
⊢ ⋃ g ∈ hf.toFinset, ↑g • ↑D = ↑H
tactic: refine ⟨hf.toFinset, hf.coe_toFinset.symm ▸ ht.1, ?_⟩
state_before: G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
⊢ ⋃ g ∈ hf.toFinset, ↑g • ↑D = ↑H
state_after: case h
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ x ∈ ⋃ g ∈ hf.toFinset, ↑g • ↑D ↔ x ∈ ↑H
tactic: ext x
state_before: case h
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ x ∈ ⋃ g ∈ hf.toFinset, ↑g • ↑D ↔ x ∈ ↑H
state_after: case h
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ (∃ y ∈ t, ∃ d ∈ D, ↑y * d = x) ↔ x ∈ H
tactic: suffices (∃ y ∈ t, ∃ d ∈ D, y * d = x) ↔ x ∈ H by simpa using this
state_before: case h
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ (∃ y ∈ t, ∃ d ∈ D, ↑y * d = x) ↔ x ∈ H
state_after: case h.mp
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ (∃ y ∈ t, ∃ d ∈ D, ↑y * d = x) → x ∈ H

case h.mpr
G : Type u_1
inst✝¹ : Group G
D H : Subgroup G
inst✝ : D.FiniteIndex
hD_le_H : D ≤ H
t : Set ↥H
ht : t ∈ leftTransversals ↑(D.subgroupOf H) ∧ 1 ∈ t
hf : t.Finite
x : G
⊢ x ∈ H → ∃ y ∈ t, ∃ d ∈ D, ↑y * d = x
tactic: constructor