Theorem: MulAction.quotient_preimage_image_eq_union_mul
File: Mathlib/GroupTheory/GroupAction/Basic.lean

tactic: letI := orbitRel α β
state_before: α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
⊢ Quotient.mk' ⁻¹' (Quotient.mk' '' U) = ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: set f : β → Quotient (MulAction.orbitRel α β) := Quotient.mk'
state_before: α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
⊢ Quotient.mk' ⁻¹' (Quotient.mk' '' U) = ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: ext x
state_before: α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
⊢ f ⁻¹' (f '' U) = ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: constructor
state_before: case h
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
⊢ x ∈ f ⁻¹' (f '' U) ↔ x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: rintro ⟨y, hy, hxy⟩
state_before: case h.mp
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
⊢ x ∈ f ⁻¹' (f '' U) → x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: obtain ⟨a, rfl⟩ := Quotient.exact hxy
state_before: case h.mp.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x y : β
hy : y ∈ U
hxy : f y = f x
⊢ x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: rw [Set.mem_iUnion]
state_before: case h.mp.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
hy : (fun x_1 => x_1 • x) a ∈ U
hxy : f ((fun x_1 => x_1 • x) a) = f x
⊢ x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U

tactic: exact ⟨a⁻¹, a • x, hy, inv_smul_smul a x⟩
state_before: case h.mp.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
hy : (fun x_1 => x_1 • x) a ∈ U
hxy : f ((fun x_1 => x_1 • x) a) = f x
⊢ ∃ i, x ∈ (fun x x_1 => x • x_1) i '' U

tactic: intro hx
state_before: case h.mpr
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
⊢ (x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U) → x ∈ f ⁻¹' (f '' U)

tactic: rw [Set.mem_iUnion] at hx
state_before: case h.mpr
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
hx : x ∈ ⋃ (a : α), (fun x x_1 => x • x_1) a '' U
⊢ x ∈ f ⁻¹' (f '' U)

tactic: obtain ⟨a, u, hu₁, hu₂⟩ := hx
state_before: case h.mpr
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
hx : ∃ i, x ∈ (fun x x_1 => x • x_1) i '' U
⊢ x ∈ f ⁻¹' (f '' U)

tactic: rw [Set.mem_preimage, Set.mem_image_iff_bex]
state_before: case h.mpr.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ x ∈ f ⁻¹' (f '' U)

tactic: refine' ⟨a⁻¹ • x, _, by simp only [Quotient.eq']; use a⁻¹⟩
state_before: case h.mpr.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ ∃ x_1 x_2, f x_1 = f x

tactic: rw [← hu₂]
state_before: case h.mpr.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ a⁻¹ • x ∈ U

tactic: convert hu₁
state_before: case h.mpr.intro.intro.intro
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ a⁻¹ • (fun x x_1 => x • x_1) a u ∈ U

tactic: simp only [inv_smul_smul]
state_before: case h.e'_4
α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ a⁻¹ • (fun x x_1 => x • x_1) a u = u

tactic: simp only [Quotient.eq']
state_before: α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ f (a⁻¹ • x) = f x

tactic: use a⁻¹
state_before: α : Type u
β : Type v
γ : Type w
inst✝¹ : Group α
inst✝ : MulAction α β
U : Set β
this : Setoid β := orbitRel α β
f : β → Quotient (orbitRel α β) := Quotient.mk'
x : β
a : α
u : β
hu₁ : u ∈ U
hu₂ : (fun x x_1 => x • x_1) a u = x
⊢ Setoid.r (a⁻¹ • x) x