Theorem: Group.mem_closure_union_iff
File: Mathlib/Deprecated/Subgroup.lean

tactic: simp only [closure_eq_mclosure, Monoid.mem_closure_union_iff, exists_prop, preimage_union]
state_before: G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ x ∈ closure (s ∪ t) ↔ ∃ y ∈ closure s, ∃ z ∈ closure t, y * z = x
state_after: G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) ↔
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x

tactic: constructor
state_before: G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) ↔
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x
state_after: case mp
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) →
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x

case mpr
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) →
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x

tactic: rintro ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, rfl⟩
state_before: case mp
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) →
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
      ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = ys * yt * (zs * zt)

tactic: refine ⟨_, ⟨_, hys, _, hzs, rfl⟩, _, ⟨_, hyt, _, hzt, rfl⟩, ?_⟩
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
      ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = ys * yt * (zs * zt)
state_after: case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * zs * (yt * zt) = ys * yt * (zs * zt)

tactic: rw [mul_assoc, mul_assoc, mul_left_comm zs]
state_before: case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * zs * (yt * zt) = ys * yt * (zs * zt)
state_after: no goals

tactic: rintro ⟨_, ⟨ys, hys, zs, hzs, rfl⟩, _, ⟨yt, hyt, zt, hzt, rfl⟩, rfl⟩
state_before: case mpr
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure (Inv.inv ⁻¹' s), y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure t, ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x) →
    ∃ y,
      (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
        ∃ z, (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧ y * z = x
state_after: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
      ∃ z,
        (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧
          y * z = ys * zs * (yt * zt)

tactic: refine ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, ?_⟩
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1 ∈ Monoid.Closure s, ∃ z ∈ Monoid.Closure t, y_1 * z = y) ∧
      ∃ z,
        (∃ y ∈ Monoid.Closure (Inv.inv ⁻¹' s), ∃ z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t), y * z_1 = z) ∧
          y * z = ys * zs * (yt * zt)
state_after: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * yt * (zs * zt) = ys * zs * (yt * zt)

tactic: rw [mul_assoc, mul_assoc, mul_left_comm yt]
state_before: case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * yt * (zs * zt) = ys * zs * (yt * zt)
state_after: no goals