[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G✝
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
S : Type u_5
G : Type u_6
inst✝² : InvolutiveNeg G
inst✝¹ : LinearOrder G
x✝ : SetLike S G
inst✝ : NegMemClass S G
H : S
x : G
⊢ |x| ∈ H ↔ x ∈ H
[PROOFSTEP]
cases abs_choice x
[GOAL]
case inl
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G✝
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
S : Type u_5
G : Type u_6
inst✝² : InvolutiveNeg G
inst✝¹ : LinearOrder G
x✝ : SetLike S G
inst✝ : NegMemClass S G
H : S
x : G
h✝ : |x| = x
⊢ |x| ∈ H ↔ x ∈ H
[PROOFSTEP]
simp [*]
[GOAL]
case inr
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G✝
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
S : Type u_5
G : Type u_6
inst✝² : InvolutiveNeg G
inst✝¹ : LinearOrder G
x✝ : SetLike S G
inst✝ : NegMemClass S G
H : S
x : G
h✝ : |x| = -x
⊢ |x| ∈ H ↔ x ∈ H
[PROOFSTEP]
simp [*]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x y : M
hx : x ∈ H
hy : y ∈ H
⊢ x / y ∈ H
[PROOFSTEP]
rw [div_eq_mul_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x y : M
hx : x ∈ H
hy : y ∈ H
⊢ x * y⁻¹ ∈ H
[PROOFSTEP]
exact mul_mem hx (inv_mem hy)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x : M
hx : x ∈ K
n : ℕ
⊢ x ^ ↑n ∈ K
[PROOFSTEP]
rw [zpow_ofNat]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x : M
hx : x ∈ K
n : ℕ
⊢ x ^ n ∈ K
[PROOFSTEP]
exact pow_mem hx n
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x : M
hx : x ∈ K
n : ℕ
⊢ x ^ -[n+1] ∈ K
[PROOFSTEP]
rw [zpow_negSucc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
M : Type u_5
S : Type u_6
inst✝¹ : DivInvMonoid M
inst✝ : SetLike S M
hSM : SubgroupClass S M
H K : S
x : M
hx : x ∈ K
n : ℕ
⊢ (x ^ (n + 1))⁻¹ ∈ K
[PROOFSTEP]
exact inv_mem (pow_mem hx n.succ)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
⊢ (∃ x, x ∈ H ∧ P x⁻¹) ↔ ∃ x, x ∈ H ∧ P x
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
⊢ (∃ x, x ∈ H ∧ P x⁻¹) → ∃ x, x ∈ H ∧ P x
[PROOFSTEP]
rintro ⟨x, x_in, hx⟩
[GOAL]
case mp.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
x : G
x_in : x ∈ H
hx : P x⁻¹
⊢ ∃ x, x ∈ H ∧ P x
[PROOFSTEP]
exact ⟨x⁻¹, inv_mem x_in, by simp [hx]⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
x : G
x_in : x ∈ H
hx : P x⁻¹
⊢ P x⁻¹
[PROOFSTEP]
simp [hx]
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
⊢ (∃ x, x ∈ H ∧ P x) → ∃ x, x ∈ H ∧ P x⁻¹
[PROOFSTEP]
rintro ⟨x, x_in, hx⟩
[GOAL]
case mpr.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
x : G
x_in : x ∈ H
hx : P x
⊢ ∃ x, x ∈ H ∧ P x⁻¹
[PROOFSTEP]
exact ⟨x⁻¹, inv_mem x_in, by simp [hx]⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
P : G → Prop
x : G
x_in : x ∈ H
hx : P x
⊢ P x⁻¹⁻¹
[PROOFSTEP]
simp [hx]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
x y : G
h : x ∈ H
this : SubmonoidClass S G
hba : y * x ∈ H
⊢ y ∈ H
[PROOFSTEP]
simpa using mul_mem hba (inv_mem h)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
x y : G
h : x ∈ H
this : SubmonoidClass S G
hab : x * y ∈ H
⊢ y ∈ H
[PROOFSTEP]
simpa using mul_mem (inv_mem h) hab
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
⊢ ↑↑H = Subtype.val
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
x : { x // x ∈ H }
⊢ ↑(inclusion (_ : H ≤ H)) x = x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
val✝ : G
property✝ : val✝ ∈ H
⊢ ↑(inclusion (_ : H ≤ H)) { val := val✝, property := property✝ } = { val := val✝, property := property✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
h : H ≤ K
x : { x // x ∈ K }
hx : ↑x ∈ H
⊢ ↑(inclusion h) { val := ↑x, property := hx } = x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
h : H ≤ K
val✝ : G
property✝ : val✝ ∈ K
hx : ↑{ val := val✝, property := property✝ } ∈ H
⊢ ↑(inclusion h) { val := ↑{ val := val✝, property := property✝ }, property := hx } =
    { val := val✝, property := property✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
L : S
hHK : H ≤ K
hKL : K ≤ L
x : { x // x ∈ H }
⊢ ↑(inclusion hKL) (↑(inclusion hHK) x) = ↑(inclusion (_ : H ≤ L)) x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H K : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
L : S
hHK : H ≤ K
hKL : K ≤ L
val✝ : G
property✝ : val✝ ∈ H
⊢ ↑(inclusion hKL) (↑(inclusion hHK) { val := val✝, property := property✝ }) =
    ↑(inclusion (_ : H ≤ L)) { val := val✝, property := property✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H✝ K✝ : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
H K : S
h : H ≤ K
a : { x // x ∈ H }
⊢ ↑(↑(inclusion h) a) = ↑a
[PROOFSTEP]
cases a
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H✝ K✝ : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
H K : S
h : H ≤ K
val✝ : G
property✝ : val✝ ∈ H
⊢ ↑(↑(inclusion h) { val := val✝, property := property✝ }) = ↑{ val := val✝, property := property✝ }
[PROOFSTEP]
simp only [inclusion, MonoidHom.mk'_apply]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H✝ K✝ : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
H K : S
hH : H ≤ K
⊢ MonoidHom.comp (↑K) (inclusion hH) = ↑H
[PROOFSTEP]
ext
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
M : Type u_5
S : Type u_6
inst✝³ : DivInvMonoid M
inst✝² : SetLike S M
hSM : SubgroupClass S M
H✝ K✝ : S
inst✝¹ : SetLike S G
inst✝ : SubgroupClass S G
H K : S
hH : H ≤ K
x✝ : { x // x ∈ H }
⊢ ↑(MonoidHom.comp (↑K) (inclusion hH)) x✝ = ↑↑H x✝
[PROOFSTEP]
simp only [MonoidHom.comp_apply, coeSubtype, coe_inclusion]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
p q : Subgroup G
h : (fun s => s.carrier) p = (fun s => s.carrier) q
⊢ p = q
[PROOFSTEP]
obtain ⟨⟨⟨hp, _⟩, _⟩, _⟩ := p
[GOAL]
case mk.mk.mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
q : Subgroup G
hp : Set G
mul_mem'✝ : ∀ {a b : G}, a ∈ hp → b ∈ hp → a * b ∈ hp
one_mem'✝ : 1 ∈ { carrier := hp, mul_mem' := mul_mem'✝ }.carrier
inv_mem'✝ :
  ∀ {x : G},
    x ∈ { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ }.toSubsemigroup.carrier →
      x⁻¹ ∈ { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ }.toSubsemigroup.carrier
h :
  (fun s => s.carrier)
      { toSubmonoid := { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ },
        inv_mem' := inv_mem'✝ } =
    (fun s => s.carrier) q
⊢ { toSubmonoid := { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ },
      inv_mem' := inv_mem'✝ } =
    q
[PROOFSTEP]
obtain ⟨⟨⟨hq, _⟩, _⟩, _⟩ := q
[GOAL]
case mk.mk.mk.mk.mk.mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
hp : Set G
mul_mem'✝¹ : ∀ {a b : G}, a ∈ hp → b ∈ hp → a * b ∈ hp
one_mem'✝¹ : 1 ∈ { carrier := hp, mul_mem' := mul_mem'✝¹ }.carrier
inv_mem'✝¹ :
  ∀ {x : G},
    x ∈ { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝¹ }, one_mem' := one_mem'✝¹ }.toSubsemigroup.carrier →
      x⁻¹ ∈
        { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝¹ }, one_mem' := one_mem'✝¹ }.toSubsemigroup.carrier
hq : Set G
mul_mem'✝ : ∀ {a b : G}, a ∈ hq → b ∈ hq → a * b ∈ hq
one_mem'✝ : 1 ∈ { carrier := hq, mul_mem' := mul_mem'✝ }.carrier
inv_mem'✝ :
  ∀ {x : G},
    x ∈ { toSubsemigroup := { carrier := hq, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ }.toSubsemigroup.carrier →
      x⁻¹ ∈ { toSubsemigroup := { carrier := hq, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ }.toSubsemigroup.carrier
h :
  (fun s => s.carrier)
      { toSubmonoid := { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝¹ }, one_mem' := one_mem'✝¹ },
        inv_mem' := inv_mem'✝¹ } =
    (fun s => s.carrier)
      { toSubmonoid := { toSubsemigroup := { carrier := hq, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ },
        inv_mem' := inv_mem'✝ }
⊢ { toSubmonoid := { toSubsemigroup := { carrier := hp, mul_mem' := mul_mem'✝¹ }, one_mem' := one_mem'✝¹ },
      inv_mem' := inv_mem'✝¹ } =
    { toSubmonoid := { toSubsemigroup := { carrier := hq, mul_mem' := mul_mem'✝ }, one_mem' := one_mem'✝ },
      inv_mem' := inv_mem'✝ }
[PROOFSTEP]
congr
  -- Porting note: Below can probably be written more uniformly
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
p q : Subgroup G
h : p.toSubmonoid = q.toSubmonoid
⊢ p = q
[PROOFSTEP]
have := SetLike.ext'_iff.1 h
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
p q : Subgroup G
h : p.toSubmonoid = q.toSubmonoid
this : ↑p.toSubmonoid = ↑q.toSubmonoid
⊢ p = q
[PROOFSTEP]
rw [coe_toSubmonoid, coe_toSubmonoid] at this 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
p q : Subgroup G
h : p.toSubmonoid = q.toSubmonoid
this : ↑p = ↑q
⊢ p = q
[PROOFSTEP]
exact SetLike.ext'_iff.2 this
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
x : Subgroup G
⊢ (fun S =>
        let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
        { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
          inv_mem' := (_ : ∀ {x : G}, x ∈ S.carrier → -x ∈ S.carrier) })
      ((fun S =>
          let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
          { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
            neg_mem' := (_ : ∀ {x : Additive G}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
        x) =
    x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
toSubmonoid✝ : Submonoid G
inv_mem'✝ : ∀ {x : G}, x ∈ toSubmonoid✝.carrier → x⁻¹ ∈ toSubmonoid✝.carrier
⊢ (fun S =>
        let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
        { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
          inv_mem' := (_ : ∀ {x : G}, x ∈ S.carrier → -x ∈ S.carrier) })
      ((fun S =>
          let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
          { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
            neg_mem' := (_ : ∀ {x : Additive G}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
        { toSubmonoid := toSubmonoid✝, inv_mem' := inv_mem'✝ }) =
    { toSubmonoid := toSubmonoid✝, inv_mem' := inv_mem'✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
x : AddSubgroup (Additive G)
⊢ (fun S =>
        let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
        { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
          neg_mem' := (_ : ∀ {x : Additive G}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
      ((fun S =>
          let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
          { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
            inv_mem' := (_ : ∀ {x : G}, x ∈ S.carrier → -x ∈ S.carrier) })
        x) =
    x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
toAddSubmonoid✝ : AddSubmonoid (Additive G)
neg_mem'✝ : ∀ {x : Additive G}, x ∈ toAddSubmonoid✝.carrier → -x ∈ toAddSubmonoid✝.carrier
⊢ (fun S =>
        let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
        { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
          neg_mem' := (_ : ∀ {x : Additive G}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
      ((fun S =>
          let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
          { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
            inv_mem' := (_ : ∀ {x : G}, x ∈ S.carrier → -x ∈ S.carrier) })
        { toAddSubmonoid := toAddSubmonoid✝, neg_mem' := neg_mem'✝ }) =
    { toAddSubmonoid := toAddSubmonoid✝, neg_mem' := neg_mem'✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
x : AddSubgroup A
⊢ (fun S =>
        let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
        { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
          neg_mem' := (_ : ∀ {x : A}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
      ((fun S =>
          let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
          { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
            inv_mem' := (_ : ∀ {x : Multiplicative A}, x ∈ S.carrier → -x ∈ S.carrier) })
        x) =
    x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
toAddSubmonoid✝ : AddSubmonoid A
neg_mem'✝ : ∀ {x : A}, x ∈ toAddSubmonoid✝.carrier → -x ∈ toAddSubmonoid✝.carrier
⊢ (fun S =>
        let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
        { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
          neg_mem' := (_ : ∀ {x : A}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
      ((fun S =>
          let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
          { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
            inv_mem' := (_ : ∀ {x : Multiplicative A}, x ∈ S.carrier → -x ∈ S.carrier) })
        { toAddSubmonoid := toAddSubmonoid✝, neg_mem' := neg_mem'✝ }) =
    { toAddSubmonoid := toAddSubmonoid✝, neg_mem' := neg_mem'✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
x : Subgroup (Multiplicative A)
⊢ (fun S =>
        let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
        { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
          inv_mem' := (_ : ∀ {x : Multiplicative A}, x ∈ S.carrier → -x ∈ S.carrier) })
      ((fun S =>
          let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
          { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
            neg_mem' := (_ : ∀ {x : A}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
        x) =
    x
[PROOFSTEP]
cases x
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
toSubmonoid✝ : Submonoid (Multiplicative A)
inv_mem'✝ : ∀ {x : Multiplicative A}, x ∈ toSubmonoid✝.carrier → x⁻¹ ∈ toSubmonoid✝.carrier
⊢ (fun S =>
        let src := ↑AddSubmonoid.toSubmonoid S.toAddSubmonoid;
        { toSubmonoid := { toSubsemigroup := src.toSubsemigroup, one_mem' := (_ : 1 ∈ src.carrier) },
          inv_mem' := (_ : ∀ {x : Multiplicative A}, x ∈ S.carrier → -x ∈ S.carrier) })
      ((fun S =>
          let src := ↑Submonoid.toAddSubmonoid S.toSubmonoid;
          { toAddSubmonoid := { toAddSubsemigroup := src.toAddSubsemigroup, zero_mem' := (_ : 0 ∈ src.carrier) },
            neg_mem' := (_ : ∀ {x : A}, x ∈ S.carrier → x⁻¹ ∈ S.carrier) })
        { toSubmonoid := toSubmonoid✝, inv_mem' := inv_mem'✝ }) =
    { toSubmonoid := toSubmonoid✝, inv_mem' := inv_mem'✝ }
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ K : Subgroup G
s : Set G
hs : s = ↑K
x✝ : G
hx :
  x✝ ∈
    { toSubsemigroup := { carrier := s, mul_mem' := (_ : ∀ {a b : G}, a ∈ s → b ∈ s → a * b ∈ s) },
          one_mem' :=
            (_ :
              1 ∈
                { carrier := s,
                    mul_mem' := (_ : ∀ {a b : G}, a ∈ s → b ∈ s → a * b ∈ s) }.carrier) }.toSubsemigroup.carrier
⊢ x✝⁻¹ ∈
    { toSubsemigroup := { carrier := s, mul_mem' := (_ : ∀ {a b : G}, a ∈ s → b ∈ s → a * b ∈ s) },
          one_mem' :=
            (_ :
              1 ∈
                { carrier := s,
                    mul_mem' := (_ : ∀ {a b : G}, a ∈ s → b ∈ s → a * b ∈ s) }.carrier) }.toSubsemigroup.carrier
[PROOFSTEP]
simpa [hs] using hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set G
hsn : Set.Nonempty s
hs : ∀ (x : G), x ∈ s → ∀ (y : G), y ∈ s → x * y⁻¹ ∈ s
⊢ 1 ∈ s
[PROOFSTEP]
let ⟨x, hx⟩ := hsn
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set G
hsn : Set.Nonempty s
hs : ∀ (x : G), x ∈ s → ∀ (y : G), y ∈ s → x * y⁻¹ ∈ s
x : G
hx : x ∈ s
⊢ 1 ∈ s
[PROOFSTEP]
simpa using hs x hx x hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set G
hsn : Set.Nonempty s
hs : ∀ (x : G), x ∈ s → ∀ (y : G), y ∈ s → x * y⁻¹ ∈ s
one_mem : 1 ∈ s
x : G
hx : x ∈ s
⊢ x⁻¹ ∈ s
[PROOFSTEP]
simpa using hs 1 one_mem x hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set G
hsn : Set.Nonempty s
hs : ∀ (x : G), x ∈ s → ∀ (y : G), y ∈ s → x * y⁻¹ ∈ s
one_mem : 1 ∈ s
inv_mem : ∀ (x : G), x ∈ s → x⁻¹ ∈ s
a✝ b✝ : G
hx : a✝ ∈ s
hy : b✝ ∈ s
⊢ a✝ * b✝ ∈ s
[PROOFSTEP]
simpa using hs _ hx _ (inv_mem _ hy)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
g : G
h : g ∈ H
⊢ { val := g, property := h } = { val := 1, property := (_ : 1 ∈ H) } ↔ g = 1
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K✝ H K : Subgroup G
h : H ≤ K
a : { x // x ∈ H }
⊢ ↑(↑(inclusion h) a) = ↑a
[PROOFSTEP]
cases a
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K✝ H K : Subgroup G
h : H ≤ K
val✝ : G
property✝ : val✝ ∈ H
⊢ ↑(↑(inclusion h) { val := val✝, property := property✝ }) = ↑{ val := val✝, property := property✝ }
[PROOFSTEP]
simp only [inclusion, coe_mk, MonoidHom.mk'_apply]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
src✝ : Submonoid G := ⊥
⊢ ∀ {x : G},
    x ∈ { toSubsemigroup := src✝.toSubsemigroup, one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier →
      x⁻¹ ∈ { toSubsemigroup := src✝.toSubsemigroup, one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Subsingleton { x // x ∈ H }
⊢ H = ⊥
[PROOFSTEP]
rw [Subgroup.eq_bot_iff_forall]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Subsingleton { x // x ∈ H }
⊢ ∀ (x : G), x ∈ H → x = 1
[PROOFSTEP]
intro y hy
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
inst✝ : Subsingleton { x // x ∈ H }
y : G
hy : y ∈ H
⊢ y = 1
[PROOFSTEP]
rw [← Subgroup.coe_mk H y hy, Subsingleton.elim (⟨y, hy⟩ : H) 1, Subgroup.coe_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ ↑H = ↑⊤ ↔ ↑H = Set.univ
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
x✝ : ∃ g, ↑H = {g}
g : G
hg : ↑H = {g}
⊢ Subsingleton ↑↑H
[PROOFSTEP]
rw [hg]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
x✝ : ∃ g, ↑H = {g}
g : G
hg : ↑H = {g}
⊢ Subsingleton ↑{g}
[PROOFSTEP]
infer_instance
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ Nontrivial { x // x ∈ H } ↔ ∃ x, x ∈ H ∧ x ≠ 1
[PROOFSTEP]
rw [Subtype.nontrivial_iff_exists_ne (fun x => x ∈ H) (1 : H)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ (∃ y x, y ≠ ↑1) ↔ ∃ x, x ∈ H ∧ x ≠ 1
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ H = ⊥ ∨ Nontrivial { x // x ∈ H }
[PROOFSTEP]
classical
by_cases h : ∀ x ∈ H, x = (1 : G)
· left
  exact H.eq_bot_iff_forall.mpr h
· right
  simp only [not_forall] at h 
  simpa [nontrivial_iff_exists_ne_one] using h
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ H = ⊥ ∨ Nontrivial { x // x ∈ H }
[PROOFSTEP]
by_cases h : ∀ x ∈ H, x = (1 : G)
[GOAL]
case pos
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
h : ∀ (x : G), x ∈ H → x = 1
⊢ H = ⊥ ∨ Nontrivial { x // x ∈ H }
[PROOFSTEP]
left
[GOAL]
case pos.h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
h : ∀ (x : G), x ∈ H → x = 1
⊢ H = ⊥
[PROOFSTEP]
exact H.eq_bot_iff_forall.mpr h
[GOAL]
case neg
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
h : ¬∀ (x : G), x ∈ H → x = 1
⊢ H = ⊥ ∨ Nontrivial { x // x ∈ H }
[PROOFSTEP]
right
[GOAL]
case neg.h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
h : ¬∀ (x : G), x ∈ H → x = 1
⊢ Nontrivial { x // x ∈ H }
[PROOFSTEP]
simp only [not_forall] at h 
[GOAL]
case neg.h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
h : ∃ x x_1, ¬x = 1
⊢ Nontrivial { x // x ∈ H }
[PROOFSTEP]
simpa [nontrivial_iff_exists_ne_one] using h
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ H = ⊥ ∨ ∃ x, x ∈ H ∧ x ≠ 1
[PROOFSTEP]
convert H.bot_or_nontrivial
[GOAL]
case h.e'_2.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H✝ K H : Subgroup G
⊢ (∃ x, x ∈ H ∧ x ≠ 1) ↔ Nontrivial { x // x ∈ H }
[PROOFSTEP]
rw [nontrivial_iff_exists_ne_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set (Subgroup G)
⊢ ⋂ (S : Subgroup G) (_ : S ∈ s), ↑S = ↑(⨅ (S : Subgroup G) (_ : S ∈ s), S.toSubmonoid)
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
s : Set (Subgroup G)
src✝ : Submonoid G :=
  Submonoid.copy (⨅ (S : Subgroup G) (_ : S ∈ s), S.toSubmonoid) (⋂ (S : Subgroup G) (_ : S ∈ s), ↑S)
    (_ : ⋂ (S : Subgroup G) (_ : S ∈ s), ↑S = ↑(⨅ (i : Subgroup G) (_ : i ∈ s), i.toSubmonoid))
x : G
hx : x ∈ { toSubsemigroup := src✝.toSubsemigroup, one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
i : Subgroup G
h : i ∈ s
⊢ x ∈ i
[PROOFSTEP]
apply Set.mem_iInter₂.1 hx i h
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
ι : Sort u_5
S : ι → Subgroup G
x : G
⊢ x ∈ ⨅ (i : ι), S i ↔ ∀ (i : ι), x ∈ S i
[PROOFSTEP]
simp only [iInf, mem_sInf, Set.forall_range_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
ι : Sort u_5
S : ι → Subgroup G
⊢ ↑(⨅ (i : ι), S i) = ⋂ (i : ι), ↑(S i)
[PROOFSTEP]
simp only [iInf, coe_sInf, Set.biInter_range]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
h : Subsingleton G
x y : Subgroup G
i : G
⊢ 1 ∈ x ↔ 1 ∈ y
[PROOFSTEP]
simp [Subgroup.one_mem]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
p : (x : G) → x ∈ closure k → Prop
Hs : ∀ (x : G) (h : x ∈ k), p x (_ : x ∈ ↑(closure k))
H1 : p 1 (_ : 1 ∈ closure k)
Hmul : ∀ (x : G) (hx : x ∈ closure k) (y : G) (hy : y ∈ closure k), p x hx → p y hy → p (x * y) (_ : x * y ∈ closure k)
Hinv : ∀ (x : G) (hx : x ∈ closure k), p x hx → p x⁻¹ (_ : x⁻¹ ∈ closure k)
x : G
hx : x ∈ closure k
⊢ p x hx
[PROOFSTEP]
refine' Exists.elim _ fun (hx : x ∈ closure k) (hc : p x hx) => hc
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
p : (x : G) → x ∈ closure k → Prop
Hs : ∀ (x : G) (h : x ∈ k), p x (_ : x ∈ ↑(closure k))
H1 : p 1 (_ : 1 ∈ closure k)
Hmul : ∀ (x : G) (hx : x ∈ closure k) (y : G) (hy : y ∈ closure k), p x hx → p y hy → p (x * y) (_ : x * y ∈ closure k)
Hinv : ∀ (x : G) (hx : x ∈ closure k), p x hx → p x⁻¹ (_ : x⁻¹ ∈ closure k)
x : G
hx : x ∈ closure k
⊢ ∃ x_1, p x x_1
[PROOFSTEP]
exact
  closure_induction hx (fun x hx => ⟨_, Hs x hx⟩) ⟨_, H1⟩ (fun x y ⟨hx', hx⟩ ⟨hy', hy⟩ => ⟨_, Hmul _ _ _ _ hx hy⟩)
    fun x ⟨hx', hx⟩ => ⟨_, Hinv _ _ hx⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
x✝¹ : { x // x ∈ ↑(closure k) }
x : G
hx : x ∈ ↑(closure k)
x✝ : { val := x, property := hx } ∈ ⊤
⊢ { val := x, property := hx } ∈ closure (Subtype.val ⁻¹' k)
[PROOFSTEP]
refine' closure_induction' (fun g hg => _) _ (fun g₁ g₂ hg₁ hg₂ => _) (fun g hg => _) hx
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
x✝¹ : { x // x ∈ ↑(closure k) }
x : G
hx : x ∈ ↑(closure k)
x✝ : { val := x, property := hx } ∈ ⊤
g : G
hg : g ∈ k
⊢ { val := g, property := (_ : g ∈ ↑(closure k)) } ∈ closure (Subtype.val ⁻¹' k)
[PROOFSTEP]
exact subset_closure hg
[GOAL]
case refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
x✝¹ : { x // x ∈ ↑(closure k) }
x : G
hx : x ∈ ↑(closure k)
x✝ : { val := x, property := hx } ∈ ⊤
⊢ { val := 1, property := (_ : 1 ∈ closure k) } ∈ closure (Subtype.val ⁻¹' k)
[PROOFSTEP]
exact one_mem _
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
x✝¹ : { x // x ∈ ↑(closure k) }
x : G
hx : x ∈ ↑(closure k)
x✝ : { val := x, property := hx } ∈ ⊤
g₁ : G
g₂ : g₁ ∈ closure k
hg₁ : G
hg₂ : hg₁ ∈ closure k
⊢ { val := g₁, property := g₂ } ∈ closure (Subtype.val ⁻¹' k) →
    { val := hg₁, property := hg₂ } ∈ closure (Subtype.val ⁻¹' k) →
      { val := g₁ * hg₁, property := (_ : g₁ * hg₁ ∈ closure k) } ∈ closure (Subtype.val ⁻¹' k)
[PROOFSTEP]
exact mul_mem
[GOAL]
case refine'_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
x✝¹ : { x // x ∈ ↑(closure k) }
x : G
hx : x ∈ ↑(closure k)
x✝ : { val := x, property := hx } ∈ ⊤
g : G
hg : g ∈ closure k
⊢ { val := g, property := hg } ∈ closure (Subtype.val ⁻¹' k) →
    { val := g⁻¹, property := (_ : g⁻¹ ∈ closure k) } ∈ closure (Subtype.val ⁻¹' k)
[PROOFSTEP]
exact inv_mem
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x y : { x // x ∈ closure k }
⊢ x * y = y * x
[PROOFSTEP]
ext
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x y : { x // x ∈ closure k }
⊢ ↑(x * y) = ↑(y * x)
[PROOFSTEP]
simp only [Subgroup.coe_mul]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x y : { x // x ∈ closure k }
⊢ ↑x * ↑y = ↑y * ↑x
[PROOFSTEP]
refine'
  closure_induction₂ x.prop y.prop hcomm (fun x => by simp only [mul_one, one_mul])
    (fun x => by simp only [mul_one, one_mul]) (fun x y z h₁ h₂ => by rw [mul_assoc, h₂, ← mul_assoc, h₁, mul_assoc])
    (fun x y z h₁ h₂ => by rw [← mul_assoc, h₁, mul_assoc, h₂, ← mul_assoc])
    (fun x y h => by rw [inv_mul_eq_iff_eq_mul, ← mul_assoc, h, mul_assoc, mul_inv_self, mul_one]) fun x y h => by
    rw [mul_inv_eq_iff_eq_mul, mul_assoc, h, ← mul_assoc, inv_mul_self, one_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y : { x // x ∈ closure k }
x : G
⊢ 1 * x = x * 1
[PROOFSTEP]
simp only [mul_one, one_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y : { x // x ∈ closure k }
x : G
⊢ x * 1 = 1 * x
[PROOFSTEP]
simp only [mul_one, one_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y✝ : { x // x ∈ closure k }
x y z : G
h₁ : x * z = z * x
h₂ : y * z = z * y
⊢ x * y * z = z * (x * y)
[PROOFSTEP]
rw [mul_assoc, h₂, ← mul_assoc, h₁, mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y✝ : { x // x ∈ closure k }
x y z : G
h₁ : x * y = y * x
h₂ : x * z = z * x
⊢ x * (y * z) = y * z * x
[PROOFSTEP]
rw [← mul_assoc, h₁, mul_assoc, h₂, ← mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y✝ : { x // x ∈ closure k }
x y : G
h : x * y = y * x
⊢ x⁻¹ * y = y * x⁻¹
[PROOFSTEP]
rw [inv_mul_eq_iff_eq_mul, ← mul_assoc, h, mul_assoc, mul_inv_self, mul_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k✝ k : Set G
hcomm : ∀ (x : G), x ∈ k → ∀ (y : G), y ∈ k → x * y = y * x
src✝ : Group { x // x ∈ closure k } := toGroup (closure k)
x✝ y✝ : { x // x ∈ closure k }
x y : G
h : x * y = y * x
⊢ x * y⁻¹ = y⁻¹ * x
[PROOFSTEP]
rw [mul_inv_eq_iff_eq_mul, mul_assoc, h, ← mul_assoc, inv_mul_self, one_mul]
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G✝
k : Set G✝
G : Type u_5
inst✝ : Group G
S : Set G
⊢ closure S = ⊥ ↔ S ⊆ {1}
[PROOFSTEP]
rw [← le_bot_iff]
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G✝
k : Set G✝
G : Type u_5
inst✝ : Group G
S : Set G
⊢ closure S ≤ ⊥ ↔ S ⊆ {1}
[PROOFSTEP]
exact closure_le _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
ι : Sort u_5
p : ι → Subgroup G
⊢ ⨆ (i : ι), p i = closure (⋃ (i : ι), ↑(p i))
[PROOFSTEP]
simp_rw [closure_iUnion, closure_eq]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
⊢ y ∈ closure {x} ↔ ∃ n, x ^ n = y
[PROOFSTEP]
refine' ⟨fun hy => closure_induction hy _ _ _ _, fun ⟨n, hn⟩ => hn ▸ zpow_mem (subset_closure <| mem_singleton x) n⟩
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
⊢ ∀ (x_1 : G), x_1 ∈ {x} → ∃ n, x ^ n = x_1
[PROOFSTEP]
intro y hy
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y✝ : G
hy✝ : y✝ ∈ closure {x}
y : G
hy : y ∈ {x}
⊢ ∃ n, x ^ n = y
[PROOFSTEP]
rw [eq_of_mem_singleton hy]
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y✝ : G
hy✝ : y✝ ∈ closure {x}
y : G
hy : y ∈ {x}
⊢ ∃ n, x ^ n = x
[PROOFSTEP]
exact ⟨1, zpow_one x⟩
[GOAL]
case refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
⊢ ∃ n, x ^ n = 1
[PROOFSTEP]
exact ⟨0, zpow_zero x⟩
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
⊢ ∀ (x_1 y : G), (∃ n, x ^ n = x_1) → (∃ n, x ^ n = y) → ∃ n, x ^ n = x_1 * y
[PROOFSTEP]
rintro _ _ ⟨n, rfl⟩ ⟨m, rfl⟩
[GOAL]
case refine'_3.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
n m : ℤ
⊢ ∃ n_1, x ^ n_1 = x ^ n * x ^ m
[PROOFSTEP]
exact ⟨n + m, zpow_add x n m⟩
[GOAL]
case refine'_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
⊢ ∀ (x_1 : G), (∃ n, x ^ n = x_1) → ∃ n, x ^ n = x_1⁻¹
[PROOFSTEP]
rintro _ ⟨n, rfl⟩
[GOAL]
case refine'_4.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
x y : G
hy : y ∈ closure {x}
n : ℤ
⊢ ∃ n_1, x ^ n_1 = (x ^ n)⁻¹
[PROOFSTEP]
exact ⟨-n, zpow_neg x n⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
k : Set G
⊢ closure {1} = ⊥
[PROOFSTEP]
simp [eq_bot_iff_forall, mem_closure_singleton]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
⊢ x ∈ iSup K ↔ ∃ i, x ∈ K i
[PROOFSTEP]
refine' ⟨_, fun ⟨i, hi⟩ => (SetLike.le_def.1 <| le_iSup K i) hi⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
⊢ x ∈ iSup K → ∃ i, x ∈ K i
[PROOFSTEP]
suffices x ∈ closure (⋃ i, (K i : Set G)) → ∃ i, x ∈ K i by simpa only [closure_iUnion, closure_eq (K _)] using this
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
this : x ∈ closure (⋃ (i : ι), ↑(K i)) → ∃ i, x ∈ K i
⊢ x ∈ iSup K → ∃ i, x ∈ K i
[PROOFSTEP]
simpa only [closure_iUnion, closure_eq (K _)] using this
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
⊢ x ∈ closure (⋃ (i : ι), ↑(K i)) → ∃ i, x ∈ K i
[PROOFSTEP]
refine' fun hx => closure_induction hx (fun _ => mem_iUnion.1) _ _ _
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
hx : x ∈ closure (⋃ (i : ι), ↑(K i))
⊢ ∃ i, 1 ∈ K i
[PROOFSTEP]
exact hι.elim fun i => ⟨i, (K i).one_mem⟩
[GOAL]
case refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
hx : x ∈ closure (⋃ (i : ι), ↑(K i))
⊢ ∀ (x y : G), (∃ i, x ∈ K i) → (∃ i, y ∈ K i) → ∃ i, x * y ∈ K i
[PROOFSTEP]
rintro x y ⟨i, hi⟩ ⟨j, hj⟩
[GOAL]
case refine'_2.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x✝ : G
hx : x✝ ∈ closure (⋃ (i : ι), ↑(K i))
x y : G
i : ι
hi : x ∈ K i
j : ι
hj : y ∈ K j
⊢ ∃ i, x * y ∈ K i
[PROOFSTEP]
rcases hK i j with ⟨k, hki, hkj⟩
[GOAL]
case refine'_2.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k✝ : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x✝ : G
hx : x✝ ∈ closure (⋃ (i : ι), ↑(K i))
x y : G
i : ι
hi : x ∈ K i
j : ι
hj : y ∈ K j
k : ι
hki : K i ≤ K k
hkj : K j ≤ K k
⊢ ∃ i, x * y ∈ K i
[PROOFSTEP]
exact ⟨k, mul_mem (hki hi) (hkj hj)⟩
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
hx : x ∈ closure (⋃ (i : ι), ↑(K i))
⊢ ∀ (x : G), (∃ i, x ∈ K i) → ∃ i, x⁻¹ ∈ K i
[PROOFSTEP]
rintro _ ⟨i, hi⟩
[GOAL]
case refine'_3.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
ι : Sort u_5
hι : Nonempty ι
K : ι → Subgroup G
hK : Directed (fun x x_1 => x ≤ x_1) K
x : G
hx : x ∈ closure (⋃ (i : ι), ↑(K i))
x✝ : G
i : ι
hi : x✝ ∈ K i
⊢ ∃ i, x✝⁻¹ ∈ K i
[PROOFSTEP]
exact ⟨i, inv_mem hi⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
k : Set G
ι : Sort u_5
inst✝ : Nonempty ι
S : ι → Subgroup G
hS : Directed (fun x x_1 => x ≤ x_1) S
x : G
⊢ x ∈ ↑(⨆ (i : ι), S i) ↔ x ∈ ⋃ (i : ι), ↑(S i)
[PROOFSTEP]
simp [mem_iSup_of_directed hS]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
K : Set (Subgroup G)
Kne : Set.Nonempty K
hK : DirectedOn (fun x x_1 => x ≤ x_1) K
x : G
⊢ x ∈ sSup K ↔ ∃ s, s ∈ K ∧ x ∈ s
[PROOFSTEP]
haveI : Nonempty K := Kne.to_subtype
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K✝ : Subgroup G
k : Set G
K : Set (Subgroup G)
Kne : Set.Nonempty K
hK : DirectedOn (fun x x_1 => x ≤ x_1) K
x : G
this : Nonempty ↑K
⊢ x ∈ sSup K ↔ ∃ s, s ∈ K ∧ x ∈ s
[PROOFSTEP]
simp only [sSup_eq_iSup', mem_iSup_of_directed hK.directed_val, SetCoe.exists, Subtype.coe_mk, exists_prop]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N✝ : Type u_5
inst✝² : Group N✝
P : Type u_6
inst✝¹ : Group P
N : Type u_7
inst✝ : Group N
f : G →* N
H : Subgroup N
src✝ : Submonoid G := Submonoid.comap f H.toSubmonoid
a : G
ha :
  a ∈
    {
          toSubsemigroup :=
            { carrier := ↑f ⁻¹' ↑H,
              mul_mem' := (_ : ∀ {a b : G}, a ∈ src✝.carrier → b ∈ src✝.carrier → a * b ∈ src✝.carrier) },
          one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
⊢ ↑f a⁻¹ ∈ H
[PROOFSTEP]
rw [f.map_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N✝ : Type u_5
inst✝² : Group N✝
P : Type u_6
inst✝¹ : Group P
N : Type u_7
inst✝ : Group N
f : G →* N
H : Subgroup N
src✝ : Submonoid G := Submonoid.comap f H.toSubmonoid
a : G
ha :
  a ∈
    {
          toSubsemigroup :=
            { carrier := ↑f ⁻¹' ↑H,
              mul_mem' := (_ : ∀ {a b : G}, a ∈ src✝.carrier → b ∈ src✝.carrier → a * b ∈ src✝.carrier) },
          one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
⊢ (↑f a)⁻¹ ∈ H
[PROOFSTEP]
exact H.inv_mem ha
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
K : Subgroup N
⊢ comap (MonoidHom.id N) K = K
[PROOFSTEP]
ext
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
K : Subgroup N
x✝ : N
⊢ x✝ ∈ comap (MonoidHom.id N) K ↔ x✝ ∈ K
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
H : Subgroup G
src✝ : Submonoid N := Submonoid.map f H.toSubmonoid
⊢ ∀ {x : N},
    x ∈
        {
              toSubsemigroup :=
                { carrier := ↑f '' ↑H,
                  mul_mem' := (_ : ∀ {a b : N}, a ∈ src✝.carrier → b ∈ src✝.carrier → a * b ∈ src✝.carrier) },
              one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier →
      x⁻¹ ∈
        {
              toSubsemigroup :=
                { carrier := ↑f '' ↑H,
                  mul_mem' := (_ : ∀ {a b : N}, a ∈ src✝.carrier → b ∈ src✝.carrier → a * b ∈ src✝.carrier) },
              one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
[PROOFSTEP]
rintro _ ⟨x, hx, rfl⟩
[GOAL]
case intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
H : Subgroup G
src✝ : Submonoid N := Submonoid.map f H.toSubmonoid
x : G
hx : x ∈ ↑H
⊢ (↑f x)⁻¹ ∈
    {
          toSubsemigroup :=
            { carrier := ↑f '' ↑H,
              mul_mem' := (_ : ∀ {a b : N}, a ∈ src✝.carrier → b ∈ src✝.carrier → a * b ∈ src✝.carrier) },
          one_mem' := (_ : 1 ∈ src✝.carrier) }.toSubsemigroup.carrier
[PROOFSTEP]
exact ⟨x⁻¹, H.inv_mem hx, f.map_inv x⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
K : Subgroup G
y : N
⊢ y ∈ map f K ↔ ∃ x, x ∈ K ∧ ↑f x = y
[PROOFSTEP]
erw [mem_image_iff_bex]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
K : Subgroup G
y : N
⊢ (∃ x x_1, ↑f x = y) ↔ ∃ x, x ∈ K ∧ ↑f x = y
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
⊢ map 1 K ≤ ⊥
[PROOFSTEP]
rintro x ⟨y, _, rfl⟩
[GOAL]
case intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
y : G
left✝ : y ∈ ↑K
⊢ ↑1 y ∈ ⊥
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G ≃* N
K : Subgroup G
x : N
⊢ x ∈ map (MulEquiv.toMonoidHom f) K ↔ ↑(MulEquiv.symm f) x ∈ K
[PROOFSTEP]
erw [@Set.mem_image_equiv _ _ (↑K) f.toEquiv x]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G ≃* N
K : Subgroup G
x : N
⊢ ↑f.symm x ∈ ↑K ↔ ↑(MulEquiv.symm f) x ∈ K
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup N
e : G ≃* N
⊢ map (↑(MulEquiv.symm e)) H = K ↔ map (↑e) K = H
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup N
e : G ≃* N
⊢ map (↑(MulEquiv.symm e)) H = K → map (↑e) K = H
[PROOFSTEP]
rintro rfl
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup N
e : G ≃* N
⊢ map (↑e) K = H → map (↑(MulEquiv.symm e)) H = K
[PROOFSTEP]
rintro rfl
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup N
e : G ≃* N
⊢ map (↑e) (map (↑(MulEquiv.symm e)) H) = H
[PROOFSTEP]
rw [map_map, ← MulEquiv.coe_monoidHom_trans, MulEquiv.symm_trans_self, MulEquiv.coe_monoidHom_refl, map_id]
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
e : G ≃* N
⊢ map (↑(MulEquiv.symm e)) (map (↑e) K) = K
[PROOFSTEP]
rw [map_map, ← MulEquiv.coe_monoidHom_trans, MulEquiv.self_trans_symm, MulEquiv.coe_monoidHom_refl, map_id]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H K : Subgroup G
f : G →* N
hf : Injective ↑f
⊢ map f (H ⊓ K) = map f H ⊓ map f K
[PROOFSTEP]
rw [← SetLike.coe_set_eq]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H K : Subgroup G
f : G →* N
hf : Injective ↑f
⊢ ↑(map f (H ⊓ K)) = ↑(map f H ⊓ map f K)
[PROOFSTEP]
simp [Set.image_inter hf]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
h : Surjective ↑f
⊢ map f ⊤ = ⊤
[PROOFSTEP]
rw [eq_top_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
h : Surjective ↑f
⊢ ⊤ ≤ map f ⊤
[PROOFSTEP]
intro x _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
h : Surjective ↑f
x : N
a✝ : x ∈ ⊤
⊢ x ∈ map f ⊤
[PROOFSTEP]
obtain ⟨y, hy⟩ := h x
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
f : G →* N
h : Surjective ↑f
x : N
a✝ : x ∈ ⊤
y : G
hy : ↑f y = x
⊢ x ∈ map f ⊤
[PROOFSTEP]
exact ⟨y, trivial, hy⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H₁ H₂ K : Subgroup G
⊢ subgroupOf H₁ K = subgroupOf H₂ K ↔ H₁ ⊓ K = H₂ ⊓ K
[PROOFSTEP]
simpa only [SetLike.ext_iff, mem_inf, mem_subgroupOf, and_congr_left_iff] using Subtype.forall
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H K : Subgroup G
⊢ subgroupOf (K ⊓ H) K = subgroupOf H K
[PROOFSTEP]
rw [inf_comm, inf_subgroupOf_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H K : Subgroup G
⊢ subgroupOf H K = ⊥ ↔ Disjoint H K
[PROOFSTEP]
rw [disjoint_iff, ← bot_subgroupOf, subgroupOf_inj, bot_inf_eq]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H K : Subgroup G
⊢ subgroupOf H K = ⊤ ↔ K ≤ H
[PROOFSTEP]
rw [← top_subgroupOf, subgroupOf_inj, top_inf_eq, inf_eq_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
K : Subgroup G
x : G × N
⊢ x ∈ prod K ⊤ ↔ x ∈ comap (MonoidHom.fst G N) K
[PROOFSTEP]
simp [mem_prod, MonoidHom.coe_fst]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup N
x : G × N
⊢ x ∈ prod ⊤ H ↔ x ∈ comap (MonoidHom.snd G N) H
[PROOFSTEP]
simp [mem_prod, MonoidHom.coe_snd]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
⊢ ↑(prod ⊥ ⊥) = ↑⊥
[PROOFSTEP]
simp [coe_prod, Prod.one_eq_mk]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup G
K : Subgroup N
J : Subgroup (G × N)
⊢ J ≤ prod H K ↔ map (MonoidHom.fst G N) J ≤ H ∧ map (MonoidHom.snd G N) J ≤ K
[PROOFSTEP]
simpa only [← Subgroup.toSubmonoid_le] using Submonoid.le_prod_iff
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup G
K : Subgroup N
J : Subgroup (G × N)
⊢ prod H K ≤ J ↔ map (MonoidHom.inl G N) H ≤ J ∧ map (MonoidHom.inr G N) K ≤ J
[PROOFSTEP]
simpa only [← Subgroup.toSubmonoid_le] using Submonoid.prod_le_iff
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
H✝ K✝ : Subgroup G
k : Set G
N : Type u_5
inst✝¹ : Group N
P : Type u_6
inst✝ : Group P
H : Subgroup G
K : Subgroup N
⊢ prod H K = ⊥ ↔ H = ⊥ ∧ K = ⊥
[PROOFSTEP]
simpa only [← Subgroup.toSubmonoid_eq] using Submonoid.prod_eq_bot_iff
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
x : (i : η) → f i
⊢ (x ∈ pi I fun i => ⊤) ↔ x ∈ ⊤
[PROOFSTEP]
simp [mem_pi]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
x : (i : η) → f i
⊢ x ∈ pi ∅ H ↔ x ∈ ⊤
[PROOFSTEP]
simp [mem_pi]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
p : (i : η) → f i
hp : p ∈ pi univ fun i => ⊥
⊢ p = 1
[PROOFSTEP]
simp only [mem_pi, mem_bot] at *
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
p : (i : η) → f i
hp : ∀ (i : η), i ∈ univ → p i = 1
⊢ p = 1
[PROOFSTEP]
ext j
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
p : (i : η) → f i
hp : ∀ (i : η), i ∈ univ → p i = 1
j : η
⊢ p j = OfNat.ofNat 1 j
[PROOFSTEP]
exact hp j trivial
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ J ≤ pi I H ↔ ∀ (i : η), i ∈ I → map (Pi.evalMonoidHom f i) J ≤ H i
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ J ≤ pi I H → ∀ (i : η), i ∈ I → map (Pi.evalMonoidHom f i) J ≤ H i
[PROOFSTEP]
intro h i hi
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
h : J ≤ pi I H
i : η
hi : i ∈ I
⊢ map (Pi.evalMonoidHom f i) J ≤ H i
[PROOFSTEP]
rintro _ ⟨x, hx, rfl⟩
[GOAL]
case mp.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
h : J ≤ pi I H
i : η
hi : i ∈ I
x : (i : η) → f i
hx : x ∈ ↑J
⊢ ↑(Pi.evalMonoidHom f i) x ∈ H i
[PROOFSTEP]
exact (h hx) _ hi
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
⊢ (∀ (i : η), i ∈ I → map (Pi.evalMonoidHom f i) J ≤ H i) → J ≤ pi I H
[PROOFSTEP]
intro h x hx i hi
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
I : Set η
H : (i : η) → Subgroup (f i)
J : Subgroup ((i : η) → f i)
h : ∀ (i : η), i ∈ I → map (Pi.evalMonoidHom f i) J ≤ H i
x : (i : η) → f i
hx : x ∈ J
i : η
hi : i ∈ I
⊢ x i ∈ (fun i => ((fun i => (H i).toSubmonoid) i).carrier) i
[PROOFSTEP]
refine' h i hi ⟨_, hx, rfl⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
⊢ Pi.mulSingle i x ∈ pi I H ↔ i ∈ I → x ∈ H i
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
⊢ Pi.mulSingle i x ∈ pi I H → i ∈ I → x ∈ H i
[PROOFSTEP]
intro h hi
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
h : Pi.mulSingle i x ∈ pi I H
hi : i ∈ I
⊢ x ∈ H i
[PROOFSTEP]
simpa using h i hi
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
⊢ (i ∈ I → x ∈ H i) → Pi.mulSingle i x ∈ pi I H
[PROOFSTEP]
intro h j hj
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
h : i ∈ I → x ∈ H i
j : η
hj : j ∈ I
⊢ Pi.mulSingle i x j ∈ (fun i => ((fun i => (H i).toSubmonoid) i).carrier) j
[PROOFSTEP]
by_cases heq : j = i
[GOAL]
case pos
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
h : i ∈ I → x ∈ H i
j : η
hj : j ∈ I
heq : j = i
⊢ Pi.mulSingle i x j ∈ (fun i => ((fun i => (H i).toSubmonoid) i).carrier) j
[PROOFSTEP]
subst heq
[GOAL]
case pos
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
j : η
hj : j ∈ I
x : f j
h : j ∈ I → x ∈ H j
⊢ Pi.mulSingle j x j ∈ (fun i => ((fun i => (H i).toSubmonoid) i).carrier) j
[PROOFSTEP]
simpa using h hj
[GOAL]
case neg
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝³ : Group N
P : Type u_6
inst✝² : Group P
η : Type u_7
f : η → Type u_8
inst✝¹ : (i : η) → Group (f i)
inst✝ : DecidableEq η
I : Set η
H : (i : η) → Subgroup (f i)
i : η
x : f i
h : i ∈ I → x ∈ H i
j : η
hj : j ∈ I
heq : ¬j = i
⊢ Pi.mulSingle i x j ∈ (fun i => ((fun i => (H i).toSubmonoid) i).carrier) j
[PROOFSTEP]
simp [heq, one_mem]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
⊢ pi univ H = ⊥ ↔ ∀ (i : η), H i = ⊥
[PROOFSTEP]
classical
simp only [eq_bot_iff_forall]
constructor
· intro h i x hx
  have : MonoidHom.single f i x = 1 := h (MonoidHom.single f i x) ((mulSingle_mem_pi i x).mpr fun _ => hx)
  simpa using congr_fun this i
· exact fun h x hx => funext fun i => h _ _ (hx i trivial)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
⊢ pi univ H = ⊥ ↔ ∀ (i : η), H i = ⊥
[PROOFSTEP]
simp only [eq_bot_iff_forall]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
⊢ (∀ (x : (i : η) → f i), x ∈ pi univ H → x = 1) ↔ ∀ (i : η) (x : f i), x ∈ H i → x = 1
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
⊢ (∀ (x : (i : η) → f i), x ∈ pi univ H → x = 1) → ∀ (i : η) (x : f i), x ∈ H i → x = 1
[PROOFSTEP]
intro h i x hx
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
h : ∀ (x : (i : η) → f i), x ∈ pi univ H → x = 1
i : η
x : f i
hx : x ∈ H i
⊢ x = 1
[PROOFSTEP]
have : MonoidHom.single f i x = 1 := h (MonoidHom.single f i x) ((mulSingle_mem_pi i x).mpr fun _ => hx)
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
h : ∀ (x : (i : η) → f i), x ∈ pi univ H → x = 1
i : η
x : f i
hx : x ∈ H i
this : ↑(MonoidHom.single f i) x = 1
⊢ x = 1
[PROOFSTEP]
simpa using congr_fun this i
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
H✝ K : Subgroup G
k : Set G
N : Type u_5
inst✝² : Group N
P : Type u_6
inst✝¹ : Group P
η : Type u_7
f : η → Type u_8
inst✝ : (i : η) → Group (f i)
H : (i : η) → Subgroup (f i)
⊢ (∀ (i : η) (x : f i), x ∈ H i → x = 1) → ∀ (x : (i : η) → f i), x ∈ pi univ H → x = 1
[PROOFSTEP]
exact fun h x hx => funext fun i => h _ _ (hx i trivial)
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H✝ K : Subgroup G✝
G : Type u_5
inst✝ : CommGroup G
H : Subgroup G
⊢ ∀ (n : G), n ∈ H → ∀ (g : G), g * n * g⁻¹ ∈ H
[PROOFSTEP]
simp [mul_comm, mul_left_comm]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
nH : Normal H
a b : G
h : a * b ∈ H
⊢ b * a ∈ H
[PROOFSTEP]
have : a⁻¹ * (a * b) * a⁻¹⁻¹ ∈ H :=
  nH.conj_mem (a * b) h
    a⁻¹
      -- Porting note: Previous code was:
        -- simpa
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
nH : Normal H
a b : G
h : a * b ∈ H
this : a⁻¹ * (a * b) * a⁻¹⁻¹ ∈ H
⊢ b * a ∈ H
[PROOFSTEP]
simp_all only [inv_mul_cancel_left, inv_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), map (MulEquiv.toMonoidHom ϕ) H = H
[PROOFSTEP]
simp_rw [map_equiv_eq_comap_symm]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), comap (MulEquiv.toMonoidHom (MulEquiv.symm ϕ)) H = H
[PROOFSTEP]
exact characteristic_iff_comap_eq.trans ⟨fun h ϕ => h ϕ.symm, fun h ϕ => h ϕ.symm⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), map (MulEquiv.toMonoidHom ϕ) H ≤ H
[PROOFSTEP]
simp_rw [map_equiv_eq_comap_symm]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), comap (MulEquiv.toMonoidHom (MulEquiv.symm ϕ)) H ≤ H
[PROOFSTEP]
exact characteristic_iff_comap_le.trans ⟨fun h ϕ => h ϕ.symm, fun h ϕ => h ϕ.symm⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), H ≤ map (MulEquiv.toMonoidHom ϕ) H
[PROOFSTEP]
simp_rw [map_equiv_eq_comap_symm]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic H ↔ ∀ (ϕ : G ≃* G), H ≤ comap (MulEquiv.toMonoidHom (MulEquiv.symm ϕ)) H
[PROOFSTEP]
exact characteristic_iff_le_comap.trans ⟨fun h ϕ => h ϕ.symm, fun h ϕ => h ϕ.symm⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ Characteristic (center G)
[PROOFSTEP]
refine' characteristic_iff_comap_le.mpr fun ϕ g hg h => _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
ϕ : G ≃* G
g : G
hg : g ∈ comap (MulEquiv.toMonoidHom ϕ) (center G)
h : G
⊢ h * g = g * h
[PROOFSTEP]
rw [← ϕ.injective.eq_iff, ϕ.map_mul, ϕ.map_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
ϕ : G ≃* G
g : G
hg : g ∈ comap (MulEquiv.toMonoidHom ϕ) (center G)
h : G
⊢ ↑ϕ h * ↑ϕ g = ↑ϕ g * ↑ϕ h
[PROOFSTEP]
exact hg (ϕ h)
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G✝
G : Type u_5
inst✝ : CommGroup G
⊢ center G = ⊤
[PROOFSTEP]
rw [eq_top_iff']
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G✝
G : Type u_5
inst✝ : CommGroup G
⊢ ∀ (x : G), x ∈ center G
[PROOFSTEP]
intro x y
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G✝
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G✝
G : Type u_5
inst✝ : CommGroup G
x y : G
⊢ y * x = x * y
[PROOFSTEP]
exact mul_comm y x
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
h : center G = ⊤
src✝ : Group G := ?m.358703 h
⊢ ∀ (a b : G), a * b = b * a
[PROOFSTEP]
rw [eq_top_iff'] at h 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
h✝ : center G = ⊤
h : ∀ (x : G), x ∈ center G
src✝ : Group G := inst✝³
⊢ ∀ (a b : G), a * b = b * a
[PROOFSTEP]
intro x y
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
h✝ : center G = ⊤
h : ∀ (x : G), x ∈ center G
src✝ : Group G := inst✝³
x y : G
⊢ x * y = y * x
[PROOFSTEP]
exact h y x
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
a b : G
ha : ∀ (n : G), n ∈ H ↔ a * n * a⁻¹ ∈ H
hb : ∀ (n : G), n ∈ H ↔ b * n * b⁻¹ ∈ H
n : G
⊢ n ∈ H ↔ a * b * n * (a * b)⁻¹ ∈ H
[PROOFSTEP]
rw [hb, ha]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
a b : G
ha : ∀ (n : G), n ∈ H ↔ a * n * a⁻¹ ∈ H
hb : ∀ (n : G), n ∈ H ↔ b * n * b⁻¹ ∈ H
n : G
⊢ a * (b * n * b⁻¹) * a⁻¹ ∈ H ↔ a * b * n * (a * b)⁻¹ ∈ H
[PROOFSTEP]
simp only [mul_assoc, mul_inv_rev]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
⊢ 1 ∈
    { carrier := {g | ∀ (n : G), n ∈ H ↔ g * n * g⁻¹ ∈ H},
        mul_mem' :=
          (_ :
            ∀ {a b : G},
              (∀ (n : G), n ∈ H ↔ a * n * a⁻¹ ∈ H) →
                (∀ (n : G), n ∈ H ↔ b * n * b⁻¹ ∈ H) → ∀ (n : G), n ∈ H ↔ a * b * n * (a * b)⁻¹ ∈ H) }.carrier
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
a : G
ha : ∀ (n : G), n ∈ H ↔ a * n * a⁻¹ ∈ H
n : G
⊢ n ∈ H ↔ a⁻¹ * n * a⁻¹⁻¹ ∈ H
[PROOFSTEP]
rw [ha (a⁻¹ * n * a⁻¹⁻¹)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
a : G
ha : ∀ (n : G), n ∈ H ↔ a * n * a⁻¹ ∈ H
n : G
⊢ n ∈ H ↔ a * (a⁻¹ * n * a⁻¹⁻¹) * a⁻¹ ∈ H
[PROOFSTEP]
simp only [inv_inv, mul_assoc, mul_inv_cancel_left, mul_right_inv, mul_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
S : Set G
a b : G
ha : ∀ (n : G), n ∈ S ↔ a * n * a⁻¹ ∈ S
hb : ∀ (n : G), n ∈ S ↔ b * n * b⁻¹ ∈ S
n : G
⊢ n ∈ S ↔ a * b * n * (a * b)⁻¹ ∈ S
[PROOFSTEP]
rw [hb, ha]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
S : Set G
a b : G
ha : ∀ (n : G), n ∈ S ↔ a * n * a⁻¹ ∈ S
hb : ∀ (n : G), n ∈ S ↔ b * n * b⁻¹ ∈ S
n : G
⊢ a * (b * n * b⁻¹) * a⁻¹ ∈ S ↔ a * b * n * (a * b)⁻¹ ∈ S
[PROOFSTEP]
simp only [mul_assoc, mul_inv_rev]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
S : Set G
⊢ 1 ∈
    { carrier := {g | ∀ (n : G), n ∈ S ↔ g * n * g⁻¹ ∈ S},
        mul_mem' :=
          (_ :
            ∀ {a b : G},
              (∀ (n : G), n ∈ S ↔ a * n * a⁻¹ ∈ S) →
                (∀ (n : G), n ∈ S ↔ b * n * b⁻¹ ∈ S) → ∀ (n : G), n ∈ S ↔ a * b * n * (a * b)⁻¹ ∈ S) }.carrier
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
S : Set G
a : G
ha : ∀ (n : G), n ∈ S ↔ a * n * a⁻¹ ∈ S
n : G
⊢ n ∈ S ↔ a⁻¹ * n * a⁻¹⁻¹ ∈ S
[PROOFSTEP]
rw [ha (a⁻¹ * n * a⁻¹⁻¹)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
S : Set G
a : G
ha : ∀ (n : G), n ∈ S ↔ a * n * a⁻¹ ∈ S
n : G
⊢ n ∈ S ↔ a * (a⁻¹ * n * a⁻¹⁻¹) * a⁻¹ ∈ S
[PROOFSTEP]
simp only [inv_inv, mul_assoc, mul_inv_cancel_left, mul_right_inv, mul_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
g : G
⊢ g ∈ normalizer H ↔ ∀ (h : G), h ∈ H ↔ g⁻¹ * h * g ∈ H
[PROOFSTEP]
rw [← inv_mem_iff (x := g), mem_normalizer_iff, inv_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
g : G
h : g ∈ normalizer H
n : G
⊢ n * g ∈ H ↔ g * n ∈ H
[PROOFSTEP]
rw [h, mul_assoc, mul_inv_cancel_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
g : G
h : ∀ (n : G), n * g ∈ H ↔ g * n ∈ H
n : G
⊢ n ∈ H ↔ g * n * g⁻¹ ∈ H
[PROOFSTEP]
rw [mul_assoc, ← h, inv_mul_cancel_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
x : G
xH : x ∈ H
n : G
⊢ n ∈ H ↔ x * n * x⁻¹ ∈ H
[PROOFSTEP]
rw [H.mul_mem_cancel_right (H.inv_mem xH), H.mul_mem_cancel_left xH]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
x : { x // x ∈ normalizer H }
xH : x ∈ subgroupOf H (normalizer H)
g : { x // x ∈ normalizer H }
⊢ g * x * g⁻¹ ∈ subgroupOf H (normalizer H)
[PROOFSTEP]
simpa only [mem_subgroupOf] using (g.2 x.1).1 xH
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
h : Normal H
a : G
_ha : a ∈ ⊤
b : G
hb : a * b * a⁻¹ ∈ H
⊢ b ∈ H
[PROOFSTEP]
rwa [h.mem_comm_iff, inv_mul_cancel_left] at hb 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
x : G
hx : x ∈ center G
y : G
⊢ y ∈ H ↔ x * y * x⁻¹ ∈ H
[PROOFSTEP]
simp [← mem_center_iff.mp hx y, mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
hK : Normal (subgroupOf H K)
HK : H ≤ K
x : G
hx : x ∈ K
y : G
yH : x * y * x⁻¹ ∈ H
⊢ y ∈ H
[PROOFSTEP]
simpa [mem_subgroupOf, mul_assoc] using hK.conj_mem ⟨x * y * x⁻¹, HK yH⟩ yH ⟨x⁻¹, K.inv_mem hx⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : N →* G
x : N
⊢ x ∈ comap f (normalizer H) → x ∈ normalizer (comap f H)
[PROOFSTEP]
simp only [mem_normalizer_iff, mem_comap]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : N →* G
x : N
⊢ (∀ (h : G), h ∈ H ↔ ↑f x * h * (↑f x)⁻¹ ∈ H) → ∀ (h : N), ↑f h ∈ H ↔ ↑f (x * h * x⁻¹) ∈ H
[PROOFSTEP]
intro h n
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : N →* G
x : N
h : ∀ (h : G), h ∈ H ↔ ↑f x * h * (↑f x)⁻¹ ∈ H
n : N
⊢ ↑f n ∈ H ↔ ↑f (x * n * x⁻¹) ∈ H
[PROOFSTEP]
simp [h (f n)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x✝ : N
⊢ x✝ ∈ map f (normalizer H) → x✝ ∈ normalizer (map f H)
[PROOFSTEP]
simp only [and_imp, exists_prop, mem_map, exists_imp, mem_normalizer_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x✝ : N
⊢ ∀ (x : G),
    (∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H) →
      ↑f x = x✝ → ∀ (h : N), (∃ x, x ∈ H ∧ ↑f x = h) ↔ ∃ x, x ∈ H ∧ ↑f x = x✝ * h * x✝⁻¹
[PROOFSTEP]
rintro x hx rfl n
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
⊢ (∃ x, x ∈ H ∧ ↑f x = n) ↔ ∃ x_1, x_1 ∈ H ∧ ↑f x_1 = ↑f x * n * (↑f x)⁻¹
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
⊢ (∃ x, x ∈ H ∧ ↑f x = n) → ∃ x_1, x_1 ∈ H ∧ ↑f x_1 = ↑f x * n * (↑f x)⁻¹
[PROOFSTEP]
rintro ⟨y, hy, rfl⟩
[GOAL]
case mp.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
y : G
hy : y ∈ H
⊢ ∃ x_1, x_1 ∈ H ∧ ↑f x_1 = ↑f x * ↑f y * (↑f x)⁻¹
[PROOFSTEP]
use x * y * x⁻¹, (hx y).1 hy
[GOAL]
case right
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
y : G
hy : y ∈ H
⊢ ↑f (x * y * x⁻¹) = ↑f x * ↑f y * (↑f x)⁻¹
[PROOFSTEP]
simp
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
⊢ (∃ x_1, x_1 ∈ H ∧ ↑f x_1 = ↑f x * n * (↑f x)⁻¹) → ∃ x, x ∈ H ∧ ↑f x = n
[PROOFSTEP]
rintro ⟨y, hyH, hy⟩
[GOAL]
case mpr.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
y : G
hyH : y ∈ H
hy : ↑f y = ↑f x * n * (↑f x)⁻¹
⊢ ∃ x, x ∈ H ∧ ↑f x = n
[PROOFSTEP]
use x⁻¹ * y * x
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
y : G
hyH : y ∈ H
hy : ↑f y = ↑f x * n * (↑f x)⁻¹
⊢ x⁻¹ * y * x ∈ H ∧ ↑f (x⁻¹ * y * x) = n
[PROOFSTEP]
rw [hx]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
f : G →* N
x : G
hx : ∀ (h : G), h ∈ H ↔ x * h * x⁻¹ ∈ H
n : N
y : G
hyH : y ∈ H
hy : ↑f y = ↑f x * n * (↑f x)⁻¹
⊢ x * (x⁻¹ * y * x) * x⁻¹ ∈ H ∧ ↑f (x⁻¹ * y * x) = n
[PROOFSTEP]
simp [hy, hyH, mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
⊢ NormalizerCondition G ↔ ∀ (H : Subgroup G), normalizer H = H → H = ⊤
[PROOFSTEP]
apply forall_congr'
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
N : Type u_5
inst✝ : Group N
⊢ ∀ (a : Subgroup G), a < ⊤ → a < normalizer a ↔ normalizer a = a → a = ⊤
[PROOFSTEP]
intro H
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H✝ K : Subgroup G
N : Type u_5
inst✝ : Group N
H : Subgroup G
⊢ H < ⊤ → H < normalizer H ↔ normalizer H = H → H = ⊤
[PROOFSTEP]
simp only [lt_iff_le_and_ne, le_normalizer, true_and_iff, le_top, Ne.def]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H✝ K : Subgroup G
N : Type u_5
inst✝ : Group N
H : Subgroup G
⊢ ¬H = ⊤ → ¬H = normalizer H ↔ normalizer H = H → H = ⊤
[PROOFSTEP]
tauto
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
g : G
s : Set G
⊢ g ∈ centralizer s ↔ ∀ (h : G), h ∈ s → h * g * h⁻¹ * g⁻¹ = 1
[PROOFSTEP]
simp only [mem_centralizer_iff, mul_inv_eq_iff_eq_mul, one_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
hH : Characteristic H
⊢ Characteristic (centralizer ↑H)
[PROOFSTEP]
refine' Subgroup.characteristic_iff_comap_le.mpr fun ϕ g hg h hh => ϕ.injective _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
hH : Characteristic H
ϕ : G ≃* G
g : G
hg : g ∈ comap (MulEquiv.toMonoidHom ϕ) (centralizer ↑H)
h : G
hh : h ∈ ↑H
⊢ ↑ϕ (h * g) = ↑ϕ (g * h)
[PROOFSTEP]
rw [map_mul, map_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
H K : Subgroup G
hH : Characteristic H
ϕ : G ≃* G
g : G
hg : g ∈ comap (MulEquiv.toMonoidHom ϕ) (centralizer ↑H)
h : G
hh : h ∈ ↑H
⊢ ↑ϕ h * ↑ϕ g = ↑ϕ g * ↑ϕ h
[PROOFSTEP]
exact hg (ϕ h) (Subgroup.characteristic_iff_le_comap.mp hH ϕ hh)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
f : G →* G'
inst✝ : IsCommutative H
⊢ ∀ (a b : { x // x ∈ map f H }), a * b = b * a
[PROOFSTEP]
rintro ⟨-, a, ha, rfl⟩ ⟨-, b, hb, rfl⟩
[GOAL]
case mk.intro.intro.mk.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
f : G →* G'
inst✝ : IsCommutative H
a : G
ha : a ∈ ↑H
b : G
hb : b ∈ ↑H
⊢ { val := ↑f a, property := (_ : ∃ a_1, a_1 ∈ ↑H ∧ ↑f a_1 = ↑f a) } *
      { val := ↑f b, property := (_ : ∃ a, a ∈ ↑H ∧ ↑f a = ↑f b) } =
    { val := ↑f b, property := (_ : ∃ a, a ∈ ↑H ∧ ↑f a = ↑f b) } *
      { val := ↑f a, property := (_ : ∃ a_1, a_1 ∈ ↑H ∧ ↑f a_1 = ↑f a) }
[PROOFSTEP]
rw [Subtype.ext_iff, coe_mul, coe_mul, Subtype.coe_mk, Subtype.coe_mk, ← map_mul, ← map_mul]
[GOAL]
case mk.intro.intro.mk.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
f : G →* G'
inst✝ : IsCommutative H
a : G
ha : a ∈ ↑H
b : G
hb : b ∈ ↑H
⊢ ↑f (a * b) = ↑f (b * a)
[PROOFSTEP]
exact congr_arg f (Subtype.ext_iff.mp (mul_comm (⟨a, ha⟩ : H) ⟨b, hb⟩))
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
f : G' →* G
hf : Injective ↑f
inst✝ : IsCommutative H
a b : { x // x ∈ comap f H }
⊢ ↑(a * b) = ↑(b * a)
[PROOFSTEP]
have := mul_comm (⟨f a, a.2⟩ : H) (⟨f b, b.2⟩ : H)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
H K : Subgroup G
f : G' →* G
hf : Injective ↑f
inst✝ : IsCommutative H
a b : { x // x ∈ comap f H }
this :
  { val := ↑f ↑a, property := (_ : ↑a ∈ comap f H) } * { val := ↑f ↑b, property := (_ : ↑b ∈ comap f H) } =
    { val := ↑f ↑b, property := (_ : ↑b ∈ comap f H) } * { val := ↑f ↑a, property := (_ : ↑a ∈ comap f H) }
⊢ ↑(a * b) = ↑(b * a)
[PROOFSTEP]
rwa [Subtype.ext_iff, coe_mul, coe_mul, coe_mk, coe_mk, ← map_mul, ← map_mul, hf.eq_iff] at this 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
x : G
⊢ x ∈ conjugatesOfSet s ↔ ∃ a, a ∈ s ∧ IsConj a x
[PROOFSTEP]
erw [Set.mem_iUnion₂]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
x : G
⊢ (∃ i j, x ∈ conjugatesOf i) ↔ ∃ a, a ∈ s ∧ IsConj a x
[PROOFSTEP]
simp only [conjugatesOf, isConj_iff, Set.mem_setOf_eq, exists_prop]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
N : Subgroup G
tn : Subgroup.Normal N
a : G
h : a ∈ N
⊢ conjugatesOf a ⊆ ↑N
[PROOFSTEP]
rintro a hc
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
N : Subgroup G
tn : Subgroup.Normal N
a✝ : G
h : a✝ ∈ N
a : G
hc : a ∈ conjugatesOf a✝
⊢ a ∈ ↑N
[PROOFSTEP]
obtain ⟨c, rfl⟩ := isConj_iff.1 hc
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
N : Subgroup G
tn : Subgroup.Normal N
a : G
h : a ∈ N
c : G
hc : c * a * c⁻¹ ∈ conjugatesOf a
⊢ c * a * c⁻¹ ∈ ↑N
[PROOFSTEP]
exact tn.conj_mem a h c
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
x c : G
H : x ∈ conjugatesOfSet s
⊢ c * x * c⁻¹ ∈ conjugatesOfSet s
[PROOFSTEP]
rcases mem_conjugatesOfSet_iff.1 H with ⟨a, h₁, h₂⟩
[GOAL]
case intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
x c : G
H : x ∈ conjugatesOfSet s
a : G
h₁ : a ∈ s
h₂ : IsConj a x
⊢ c * x * c⁻¹ ∈ conjugatesOfSet s
[PROOFSTEP]
exact mem_conjugatesOfSet_iff.2 ⟨a, h₁, h₂.trans (isConj_iff.2 ⟨c, rfl⟩)⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g : G
⊢ g * n * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
refine' Subgroup.closure_induction h (fun x hx => _) _ (fun x y ihx ihy => _) fun x ihx => _
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g x : G
hx : x ∈ conjugatesOfSet s
⊢ g * x * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
exact conjugatesOfSet_subset_normalClosure (conj_mem_conjugatesOfSet hx)
[GOAL]
case refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g : G
⊢ g * 1 * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
simpa using (normalClosure s).one_mem
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g x y : G
ihx : g * x * g⁻¹ ∈ normalClosure s
ihy : g * y * g⁻¹ ∈ normalClosure s
⊢ g * (x * y) * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
rw [← conj_mul]
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g x y : G
ihx : g * x * g⁻¹ ∈ normalClosure s
ihy : g * y * g⁻¹ ∈ normalClosure s
⊢ g * x * g⁻¹ * (g * y * g⁻¹) ∈ normalClosure s
[PROOFSTEP]
exact mul_mem ihx ihy
[GOAL]
case refine'_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g x : G
ihx : g * x * g⁻¹ ∈ normalClosure s
⊢ g * x⁻¹ * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
rw [← conj_inv]
[GOAL]
case refine'_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
n : G
h : n ∈ normalClosure s
g x : G
ihx : g * x * g⁻¹ ∈ normalClosure s
⊢ (g * x * g⁻¹)⁻¹ ∈ normalClosure s
[PROOFSTEP]
exact inv_mem ihx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
⊢ normalClosure s ≤ N
[PROOFSTEP]
intro a w
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
a : G
w : a ∈ normalClosure s
⊢ a ∈ N
[PROOFSTEP]
refine' closure_induction w (fun x hx => _) _ (fun x y ihx ihy => _) fun x ihx => _
[GOAL]
case refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
a : G
w : a ∈ normalClosure s
x : G
hx : x ∈ conjugatesOfSet s
⊢ x ∈ N
[PROOFSTEP]
exact conjugatesOfSet_subset h hx
[GOAL]
case refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
a : G
w : a ∈ normalClosure s
⊢ 1 ∈ N
[PROOFSTEP]
exact one_mem _
[GOAL]
case refine'_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
a : G
w : a ∈ normalClosure s
x y : G
ihx : x ∈ N
ihy : y ∈ N
⊢ x * y ∈ N
[PROOFSTEP]
exact mul_mem ihx ihy
[GOAL]
case refine'_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
s : Set G
N : Subgroup G
inst✝ : Normal N
h : s ⊆ ↑N
a : G
w : a ∈ normalClosure s
x : G
ihx : x ∈ N
⊢ x⁻¹ ∈ N
[PROOFSTEP]
exact inv_mem ihx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
⊢ Normal (normalClosure s)
[PROOFSTEP]
infer_instance
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s✝ s : Set G
⊢ closure s ≤ normalClosure s
[PROOFSTEP]
simp only [subset_normalClosure, closure_le]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
⊢ a * 1 * a⁻¹ ∈ H
[PROOFSTEP]
rw [mul_one, mul_inv_self]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
⊢ 1 ∈ H
[PROOFSTEP]
exact H.one_mem
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
h : a ∈ normalCore H
⊢ a ∈ H
[PROOFSTEP]
rw [← mul_one a, ← inv_one, ← one_mul a]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
h : a ∈ normalCore H
⊢ 1 * a * 1⁻¹ ∈ H
[PROOFSTEP]
exact h 1
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
h : a ∈ normalCore H
b c : G
⊢ c * (b * a * b⁻¹) * c⁻¹ ∈ H
[PROOFSTEP]
rw [mul_assoc, mul_assoc, ← mul_inv_rev, ← mul_assoc, ← mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝³ : Group G
inst✝² : Group G'
inst✝¹ : Group G''
A : Type u_4
inst✝ : AddGroup A
s : Set G
H : Subgroup G
a : G
h : a ∈ normalCore H
b c : G
⊢ c * b * a * (c * b)⁻¹ ∈ H
[PROOFSTEP]
exact h (c * b)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
⊢ Set.range ↑f = ↑(map f ⊤)
[PROOFSTEP]
simp [Set.ext_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
⊢ range f = map f ⊤
[PROOFSTEP]
ext
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
x✝ : N
⊢ x✝ ∈ range f ↔ x✝ ∈ map f ⊤
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
⊢ range (restrict f K) = map f K
[PROOFSTEP]
simp_rw [SetLike.ext_iff, mem_range, mem_map, restrict_apply, SetLike.exists, exists_prop, forall_const]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
⊢ Injective ↑(rangeRestrict f) ↔ Injective ↑f
[PROOFSTEP]
convert Set.injective_codRestrict _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
g : N →* P
f : G →* N
⊢ map g (range f) = range (comp g f)
[PROOFSTEP]
rw [range_eq_map, range_eq_map]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
g : N →* P
f : G →* N
⊢ map g (map f ⊤) = map (comp g f) ⊤
[PROOFSTEP]
exact (⊤ : Subgroup G).map_map g f
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N✝ : Type u_5
P : Type u_6
inst✝² : Group N✝
inst✝¹ : Group P
K : Subgroup G
N : Type u_7
inst✝ : Group N
f : G →* N
⊢ ↑(range f) = ↑⊤ ↔ Set.range ↑f = Set.univ
[PROOFSTEP]
rw [coe_range, coe_top]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
x : N
⊢ x ∈ range 1 ↔ x ∈ ⊥
[PROOFSTEP]
simpa using @comm _ (· = ·) _ 1 x
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K H : Subgroup G
⊢ range (Subgroup.subtype H) = H
[PROOFSTEP]
rw [range_eq_map, ← SetLike.coe_set_eq, coe_map, Subgroup.coeSubtype]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K H : Subgroup G
⊢ Subtype.val '' ↑⊤ = ↑H
[PROOFSTEP]
ext
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K H : Subgroup G
x✝ : G
⊢ x✝ ∈ Subtype.val '' ↑⊤ ↔ x✝ ∈ ↑H
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
N : Type u_5
P : Type u_6
inst✝³ : Group N
inst✝² : Group P
K✝ : Subgroup G
G₁ : Type u_7
G₂ : Type u_8
inst✝¹ : Group G₁
inst✝ : Group G₂
K : Subgroup G₂
f : G₁ →* G₂
h : range f ≤ K
⊢ subgroupOf (range f) K = range (codRestrict f K (_ : ∀ (x : G₁), ↑f x ∈ K))
[PROOFSTEP]
ext k
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
N : Type u_5
P : Type u_6
inst✝³ : Group N
inst✝² : Group P
K✝ : Subgroup G
G₁ : Type u_7
G₂ : Type u_8
inst✝¹ : Group G₁
inst✝ : Group G₂
K : Subgroup G₂
f : G₁ →* G₂
h : range f ≤ K
k : { x // x ∈ K }
⊢ k ∈ subgroupOf (range f) K ↔ k ∈ range (codRestrict f K (_ : ∀ (x : G₁), ↑f x ∈ K))
[PROOFSTEP]
refine' exists_congr _
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
N : Type u_5
P : Type u_6
inst✝³ : Group N
inst✝² : Group P
K✝ : Subgroup G
G₁ : Type u_7
G₂ : Type u_8
inst✝¹ : Group G₁
inst✝ : Group G₂
K : Subgroup G₂
f : G₁ →* G₂
h : range f ≤ K
k : { x // x ∈ K }
⊢ ∀ (a : G₁), ↑f a = ↑(Subgroup.subtype K) k ↔ ↑(codRestrict f K (_ : ∀ (x : G₁), ↑f x ∈ K)) a = k
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
g : N →* G
h : LeftInverse ↑g ↑f
src✝ : G →* { x // x ∈ range f } := rangeRestrict f
⊢ Function.RightInverse (↑g ∘ ↑(Subgroup.subtype (range f))) ↑(rangeRestrict f)
[PROOFSTEP]
rintro ⟨x, y, rfl⟩
[GOAL]
case mk.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
g : N →* G
h : LeftInverse ↑g ↑f
src✝ : G →* { x // x ∈ range f } := rangeRestrict f
y : G
⊢ ↑(rangeRestrict f) ((↑g ∘ ↑(Subgroup.subtype (range f))) { val := ↑f y, property := (_ : ∃ y_1, ↑f y_1 = ↑f y) }) =
    { val := ↑f y, property := (_ : ∃ y_1, ↑f y_1 = ↑f y) }
[PROOFSTEP]
apply Subtype.ext
[GOAL]
case mk.intro.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
g : N →* G
h : LeftInverse ↑g ↑f
src✝ : G →* { x // x ∈ range f } := rangeRestrict f
y : G
⊢ ↑(↑(rangeRestrict f) ((↑g ∘ ↑(Subgroup.subtype (range f))) { val := ↑f y, property := (_ : ∃ y_1, ↑f y_1 = ↑f y) })) =
    ↑{ val := ↑f y, property := (_ : ∃ y_1, ↑f y_1 = ↑f y) }
[PROOFSTEP]
rw [coe_rangeRestrict, Function.comp_apply, Subgroup.coeSubtype, Subtype.coe_mk, h]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
hf : Injective ↑f
⊢ Surjective ↑(codRestrict f (range f) (_ : ∀ (x : G), ∃ y, ↑f y = ↑f x))
[PROOFSTEP]
rintro ⟨x, y, rfl⟩
[GOAL]
case mk.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
hf : Injective ↑f
y : G
⊢ ∃ a,
    ↑(codRestrict f (range f) (_ : ∀ (x : G), ∃ y, ↑f y = ↑f x)) a =
      { val := ↑f y, property := (_ : ∃ y_1, ↑f y_1 = ↑f y) }
[PROOFSTEP]
exact ⟨y, rfl⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
src✝ : Submonoid G := mker f
x : G
hx : ↑f x = 1
⊢ ↑f x⁻¹ = ↑f x * ↑f x⁻¹
[PROOFSTEP]
rw [hx, one_mul]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
src✝ : Submonoid G := mker f
x : G
hx : ↑f x = 1
⊢ ↑f x * ↑f x⁻¹ = 1
[PROOFSTEP]
rw [← map_mul, mul_inv_self, map_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
N : Type u_5
P : Type u_6
inst✝³ : Group N
inst✝² : Group P
K : Subgroup G
M✝ : Type u_7
inst✝¹ : MulOneClass M✝
M : Type u_8
inst✝ : Monoid M
f : G →* M
⊢ ker (toHomUnits f) = ker f
[PROOFSTEP]
ext x
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁷ : Group G
inst✝⁶ : Group G'
inst✝⁵ : Group G''
A : Type u_4
inst✝⁴ : AddGroup A
N : Type u_5
P : Type u_6
inst✝³ : Group N
inst✝² : Group P
K : Subgroup G
M✝ : Type u_7
inst✝¹ : MulOneClass M✝
M : Type u_8
inst✝ : Monoid M
f : G →* M
x : G
⊢ x ∈ ker (toHomUnits f) ↔ x ∈ ker f
[PROOFSTEP]
simp [mem_ker, Units.ext_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x y : G
⊢ ↑f x = ↑f y ↔ y⁻¹ * x ∈ ker f
[PROOFSTEP]
constructor
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x y : G
⊢ ↑f x = ↑f y → y⁻¹ * x ∈ ker f
[PROOFSTEP]
intro h
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x y : G
⊢ y⁻¹ * x ∈ ker f → ↑f x = ↑f y
[PROOFSTEP]
intro h
[GOAL]
case mp
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x y : G
h : ↑f x = ↑f y
⊢ y⁻¹ * x ∈ ker f
[PROOFSTEP]
rw [mem_ker, map_mul, h, ← map_mul, inv_mul_self, map_one]
[GOAL]
case mpr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x y : G
h : y⁻¹ * x ∈ ker f
⊢ ↑f x = ↑f y
[PROOFSTEP]
rw [← one_mul x, ← mul_inv_self y, mul_assoc, map_mul, f.mem_ker.1 h, mul_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
h : ker f = ⊥
x y : G
hxy : ↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
rwa [eq_iff, h, mem_bot, inv_mul_eq_one, eq_comm] at hxy 
[GOAL]
G : Type u_1
G'✝ : Type u_2
G'' : Type u_3
inst✝⁸ : Group G
inst✝⁷ : Group G'✝
inst✝⁶ : Group G''
A : Type u_4
inst✝⁵ : AddGroup A
N : Type u_5
P : Type u_6
inst✝⁴ : Group N
inst✝³ : Group P
K : Subgroup G
M : Type u_7
inst✝² : MulOneClass M
G' : Type u_8
N' : Type u_9
inst✝¹ : Group G'
inst✝ : Group N'
f : G →* N
g : G' →* N'
⊢ ker (prodMap f g) = prod (ker f) (ker g)
[PROOFSTEP]
rw [← comap_bot, ← comap_bot, ← comap_bot, ← prodMap_comap_prod, bot_prod_bot]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* G'
g : G' →* G''
⊢ comp g f = 1 → range f ≤ ker g
[PROOFSTEP]
rintro h _ ⟨y, rfl⟩
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* G'
g : G' →* G''
h : comp g f = 1
y : G
⊢ ↑f y ∈ ker g
[PROOFSTEP]
exact FunLike.congr_fun h y
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
N : Type u_5
P : Type u_6
inst✝² : Group N
inst✝¹ : Group P
K : Subgroup G
M : Type u_7
inst✝ : MulOneClass M
f : G →* M
x : G
hx : x ∈ ker f
y : G
⊢ y * x * y⁻¹ ∈ ker f
[PROOFSTEP]
rw [mem_ker, map_mul, map_mul, f.mem_ker.1 hx, mul_one, map_mul_eq_one f (mul_inv_self y)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
s : Set N
x : G
hx : x ∈ ↑f ⁻¹' s
⊢ x ∈ ↑(comap f (closure s))
[PROOFSTEP]
rw [SetLike.mem_coe, mem_comap]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
P : Type u_6
inst✝¹ : Group N
inst✝ : Group P
K : Subgroup G
f : G →* N
s : Set N
x : G
hx : x ∈ ↑f ⁻¹' s
⊢ ↑f x ∈ closure s
[PROOFSTEP]
exact subset_closure hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H✝ H : Subgroup G
h : Normal H
f : G →* N
hf : Surjective ↑f
⊢ Normal (Subgroup.map f H)
[PROOFSTEP]
rw [← normalizer_eq_top, ← top_le_iff, ← f.range_top_of_surjective hf, f.range_eq_map, ← normalizer_eq_top.2 h]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H✝ H : Subgroup G
h : Normal H
f : G →* N
hf : Surjective ↑f
⊢ Subgroup.map f (normalizer H) ≤ normalizer (Subgroup.map f H)
[PROOFSTEP]
exact le_normalizer_map _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H : Subgroup G
f : G →* N
hf : Injective ↑f
⊢ map f H = ⊥ ↔ H = ⊥
[PROOFSTEP]
rw [map_eq_bot_iff, f.ker_eq_bot_iff.mpr hf, le_bot_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup N
⊢ ↑(map f (comap f H)) = ↑(range f ⊓ H)
[PROOFSTEP]
rw [coe_map, coe_comap, Set.image_preimage_eq_inter_range, coe_inf, coe_range, Set.inter_comm]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
⊢ comap f (map f H) = H ⊔ ker f
[PROOFSTEP]
refine' le_antisymm _ (sup_le (le_comap_map _ _) (ker_le_comap _ _))
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
⊢ comap f (map f H) ≤ H ⊔ ker f
[PROOFSTEP]
intro x hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
x : G
hx : x ∈ comap f (map f H)
⊢ x ∈ H ⊔ ker f
[PROOFSTEP]
simp only [exists_prop, mem_map, mem_comap] at hx 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
x : G
hx : ∃ x_1, x_1 ∈ H ∧ ↑f x_1 = ↑f x
⊢ x ∈ H ⊔ ker f
[PROOFSTEP]
rcases hx with ⟨y, hy, hy'⟩
[GOAL]
case intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
x y : G
hy : y ∈ H
hy' : ↑f y = ↑f x
⊢ x ∈ H ⊔ ker f
[PROOFSTEP]
rw [← mul_inv_cancel_left y x]
[GOAL]
case intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
x y : G
hy : y ∈ H
hy' : ↑f y = ↑f x
⊢ y * (y⁻¹ * x) ∈ H ⊔ ker f
[PROOFSTEP]
exact mul_mem_sup hy (by simp [mem_ker, hy'])
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H : Subgroup G
x y : G
hy : y ∈ H
hy' : ↑f y = ↑f x
⊢ y⁻¹ * x ∈ ker f
[PROOFSTEP]
simp [mem_ker, hy']
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H : Subgroup N
h : H ≤ range f
⊢ map f (comap f H) = H
[PROOFSTEP]
rwa [map_comap_eq, inf_eq_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
K L : Subgroup N
hf : Surjective ↑f
⊢ comap f K < comap f L ↔ K < L
[PROOFSTEP]
simp_rw [lt_iff_le_not_le, comap_le_comap_of_surjective hf]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
h : Surjective ↑f
K L : Subgroup N
⊢ comap f K = comap f L → K = L
[PROOFSTEP]
simp only [le_antisymm_iff, comap_le_comap_of_surjective h, imp_self]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H : Subgroup G
h : ker f ≤ H
⊢ comap f (map f H) = H
[PROOFSTEP]
rwa [comap_map_eq, sup_eq_left]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H K : Subgroup G
⊢ map f H ≤ map f K ↔ H ≤ K ⊔ ker f
[PROOFSTEP]
rw [map_le_iff_le_comap, comap_map_eq]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H K : Subgroup G
⊢ map f H ≤ map f K ↔ H ⊔ ker f ≤ K ⊔ ker f
[PROOFSTEP]
simp only [map_le_map_iff, sup_le_iff, le_sup_right, and_true_iff]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H K : Subgroup G
⊢ map f H = map f K ↔ H ⊔ ker f = K ⊔ ker f
[PROOFSTEP]
simp only [le_antisymm_iff, map_le_map_iff']
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
H : Subgroup G
⊢ map f H = range f ↔ Codisjoint H (ker f)
[PROOFSTEP]
rw [f.range_eq_map, map_eq_map_iff, codisjoint_iff, top_sup_eq]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
hf : Injective ↑f
H K : Subgroup G
⊢ map f H ≤ map f K ↔ H ≤ K
[PROOFSTEP]
rw [map_le_iff_le_comap, comap_map_eq_self_of_injective hf]
[GOAL]
G : Type u_1
G'✝ : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'✝
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
G' : Subgroup G
H K : Subgroup { x // x ∈ G' }
⊢ Injective ↑(Subgroup.subtype G')
[PROOFSTEP]
apply Subtype.coe_injective
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ f : G →* N
g : N →* G
hl : LeftInverse ↑g ↑f
hr : Function.RightInverse ↑g ↑f
H : Subgroup G
⊢ ↑(map f H) = ↑(comap g H)
[PROOFSTEP]
rw [coe_map, coe_comap, Set.image_eq_preimage_of_inverse hl hr]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup G
hH : ker f ≤ H
hK : ker f ≤ K
hf : map f H = map f K
⊢ H = K
[PROOFSTEP]
apply_fun comap f at hf 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup G
hH : ker f ≤ H
hK : ker f ≤ K
hf : comap f (map f H) = comap f (map f K)
⊢ H = K
[PROOFSTEP]
rwa [comap_map_eq, comap_map_eq, sup_of_le_left hH, sup_of_le_left hK] at hf 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
s : Set G
⊢ closure (↑(Subgroup.subtype (closure s)) ⁻¹' s) = ⊤
[PROOFSTEP]
apply map_injective (closure s).subtype_injective
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
s : Set G
⊢ map (Subgroup.subtype (closure s)) (closure (↑(Subgroup.subtype (closure s)) ⁻¹' s)) =
    map (Subgroup.subtype (closure s)) ⊤
[PROOFSTEP]
rw [MonoidHom.map_closure, ← MonoidHom.range_eq_map, subtype_range, Set.image_preimage_eq_of_subset]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
s : Set G
⊢ s ⊆ Set.range ↑(Subgroup.subtype (closure s))
[PROOFSTEP]
rw [coeSubtype, Subtype.range_coe_subtype]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
s : Set G
⊢ s ⊆ {x | x ∈ ↑(closure s)}
[PROOFSTEP]
exact subset_closure
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup N
hH : H ≤ range f
hK : K ≤ range f
⊢ map f (comap f H ⊔ comap f K) = map f (comap f (H ⊔ K))
[PROOFSTEP]
rw [map_comap_eq, map_sup, map_comap_eq, map_comap_eq, inf_eq_right.mpr hH, inf_eq_right.mpr hK,
  inf_eq_right.mpr (sup_le hH hK)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup G
⊢ Codisjoint (subgroupOf H (H ⊔ K)) (subgroupOf K (H ⊔ K))
[PROOFSTEP]
rw [codisjoint_iff, sup_subgroupOf_eq, subgroupOf_self]
[GOAL]
case hH
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup G
⊢ H ≤ H ⊔ K
case hK
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f : G →* N
H K : Subgroup G
⊢ K ≤ H ⊔ K
[PROOFSTEP]
exacts [le_sup_left, le_sup_right]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : N →* G
hf : Surjective ↑f
⊢ normalizer (comap f H) ≤ comap f (normalizer H)
[PROOFSTEP]
intro x hx
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : N →* G
hf : Surjective ↑f
x : N
hx : x ∈ normalizer (comap f H)
⊢ x ∈ comap f (normalizer H)
[PROOFSTEP]
simp only [mem_comap, mem_normalizer_iff] at *
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : N →* G
hf : Surjective ↑f
x : N
hx : ∀ (h : N), ↑f h ∈ H ↔ ↑f (x * h * x⁻¹) ∈ H
⊢ ∀ (h : G), h ∈ H ↔ ↑f x * h * (↑f x)⁻¹ ∈ H
[PROOFSTEP]
intro n
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : N →* G
hf : Surjective ↑f
x : N
hx : ∀ (h : N), ↑f h ∈ H ↔ ↑f (x * h * x⁻¹) ∈ H
n : G
⊢ n ∈ H ↔ ↑f x * n * (↑f x)⁻¹ ∈ H
[PROOFSTEP]
rcases hf n with ⟨y, rfl⟩
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : N →* G
hf : Surjective ↑f
x : N
hx : ∀ (h : N), ↑f h ∈ H ↔ ↑f (x * h * x⁻¹) ∈ H
y : N
⊢ ↑f y ∈ H ↔ ↑f x * ↑f y * (↑f x)⁻¹ ∈ H
[PROOFSTEP]
simp [hx y]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ comap f (normalizer H) = normalizer (comap f H)
[PROOFSTEP]
apply Subgroup.map_injective hf
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ map f (comap f (normalizer H)) = map f (normalizer (comap f H))
[PROOFSTEP]
rw [map_comap_eq_self h]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ normalizer H = map f (normalizer (comap f H))
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ normalizer H ≤ map f (normalizer (comap f H))
[PROOFSTEP]
refine' le_trans (le_of_eq _) (map_mono (le_normalizer_comap _))
[GOAL]
case a.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ normalizer H = map f (comap f (normalizer H))
[PROOFSTEP]
rw [map_comap_eq_self h]
[GOAL]
case a.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ map f (normalizer (comap f H)) ≤ normalizer H
[PROOFSTEP]
refine' le_trans (le_normalizer_map f) (le_of_eq _)
[GOAL]
case a.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N✝ : Type u_5
inst✝¹ : Group N✝
f✝ : G →* N✝
N : Type u_6
inst✝ : Group N
H : Subgroup G
f : N →* G
hf : Injective ↑f
h : normalizer H ≤ range f
⊢ normalizer (map f (comap f H)) = normalizer H
[PROOFSTEP]
rw [map_comap_eq_self (le_trans le_normalizer h)]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
f : G →* N✝
H N : Subgroup G
h : normalizer H ≤ N
⊢ subgroupOf (normalizer H) N = normalizer (subgroupOf H N)
[PROOFSTEP]
apply comap_normalizer_eq_of_injective_of_le_range
[GOAL]
case hf
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
f : G →* N✝
H N : Subgroup G
h : normalizer H ≤ N
⊢ Injective ↑(Subgroup.subtype N)
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
f : G →* N✝
H N : Subgroup G
h : normalizer H ≤ N
⊢ normalizer H ≤ range (Subgroup.subtype N)
[PROOFSTEP]
exact Subtype.coe_injective
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
f : G →* N✝
H N : Subgroup G
h : normalizer H ≤ N
⊢ normalizer H ≤ range (Subgroup.subtype N)
[PROOFSTEP]
simpa
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
⊢ map (MulEquiv.toMonoidHom f) (normalizer H) = normalizer (map (MulEquiv.toMonoidHom f) H)
[PROOFSTEP]
ext x
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
⊢ x ∈ map (MulEquiv.toMonoidHom f) (normalizer H) ↔ x ∈ normalizer (map (MulEquiv.toMonoidHom f) H)
[PROOFSTEP]
simp only [mem_normalizer_iff, mem_map_equiv]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
⊢ (∀ (h : G), h ∈ H ↔ ↑(MulEquiv.symm f) x * h * (↑(MulEquiv.symm f) x)⁻¹ ∈ H) ↔
    ∀ (h : N), ↑(MulEquiv.symm f) h ∈ H ↔ ↑(MulEquiv.symm f) (x * h * x⁻¹) ∈ H
[PROOFSTEP]
rw [f.toEquiv.forall_congr]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
⊢ ∀ {x_1 : G},
    (x_1 ∈ H ↔ ↑(MulEquiv.symm f) x * x_1 * (↑(MulEquiv.symm f) x)⁻¹ ∈ H) ↔
      (↑(MulEquiv.symm f) (↑f.toEquiv x_1) ∈ H ↔ ↑(MulEquiv.symm f) (x * ↑f.toEquiv x_1 * x⁻¹) ∈ H)
[PROOFSTEP]
intro
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
x✝ : G
⊢ (x✝ ∈ H ↔ ↑(MulEquiv.symm f) x * x✝ * (↑(MulEquiv.symm f) x)⁻¹ ∈ H) ↔
    (↑(MulEquiv.symm f) (↑f.toEquiv x✝) ∈ H ↔ ↑(MulEquiv.symm f) (x * ↑f.toEquiv x✝ * x⁻¹) ∈ H)
[PROOFSTEP]
erw [f.toEquiv.symm_apply_apply]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
x✝ : G
⊢ (x✝ ∈ H ↔ ↑(MulEquiv.symm f) x * x✝ * (↑(MulEquiv.symm f) x)⁻¹ ∈ H) ↔
    (x✝ ∈ H ↔ ↑(MulEquiv.symm f) (x * ↑f.toEquiv x✝ * x⁻¹) ∈ H)
[PROOFSTEP]
simp only [map_mul, map_inv]
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
f✝ : G →* N
H : Subgroup G
f : G ≃* N
x : N
x✝ : G
⊢ (x✝ ∈ H ↔ ↑(MulEquiv.symm f) x * x✝ * (↑(MulEquiv.symm f) x)⁻¹ ∈ H) ↔
    (x✝ ∈ H ↔ ↑(MulEquiv.symm f) x * ↑(MulEquiv.symm f) (↑f.toEquiv x✝) * (↑(MulEquiv.symm f) x)⁻¹ ∈ H)
[PROOFSTEP]
erw [f.toEquiv.symm_apply_apply]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
⊢ ∀ (x y : G₂),
    OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } (x * y) =
      OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } x *
        OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } y
[PROOFSTEP]
intro x y
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x y : G₂
⊢ OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } (x * y) =
    OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } x *
      OneHom.toFun { toFun := fun b => ↑g (f_inv b), map_one' := (_ : f_inv 1 ∈ ker g) } y
[PROOFSTEP]
rw [← g.map_mul, ← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x y : G₂
⊢ f_inv (x * y) * (f_inv x * f_inv y)⁻¹ ∈ ker g
[PROOFSTEP]
apply hg
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x y : G₂
⊢ f_inv (x * y) * (f_inv x * f_inv y)⁻¹ ∈ ker f
[PROOFSTEP]
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one, f.map_mul]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x y : G₂
⊢ ↑f (f_inv (x * y)) = ↑f (f_inv x) * ↑f (f_inv y)
[PROOFSTEP]
simp only [hf _]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x : G₁
⊢ ↑(liftOfRightInverseAux f f_inv hf g hg) (↑f x) = ↑g x
[PROOFSTEP]
dsimp [liftOfRightInverseAux]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x : G₁
⊢ ↑g (f_inv (↑f x)) = ↑g x
[PROOFSTEP]
rw [← mul_inv_eq_one, ← g.map_inv, ← g.map_mul, ← g.mem_ker]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x : G₁
⊢ f_inv (↑f x) * x⁻¹ ∈ ker g
[PROOFSTEP]
apply hg
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x : G₁
⊢ f_inv (↑f x) * x⁻¹ ∈ ker f
[PROOFSTEP]
rw [f.mem_ker, f.map_mul, f.map_inv, mul_inv_eq_one]
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
x : G₁
⊢ ↑f (f_inv (↑f x)) = ↑f x
[PROOFSTEP]
simp only [hf _]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
φ : G₂ →* G₃
x : G₁
hx : x ∈ ker f
⊢ ↑(comp φ f) x = 1
[PROOFSTEP]
simp [(mem_ker _).mp hx]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : { g // ker f ≤ ker g }
⊢ (fun φ => { val := comp φ f, property := (_ : ∀ (x : G₁), x ∈ ker f → x ∈ ker (comp φ f)) })
      ((fun g => liftOfRightInverseAux f f_inv hf ↑g (_ : ker f ≤ ker ↑g)) g) =
    g
[PROOFSTEP]
ext
[GOAL]
case a.h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : { g // ker f ≤ ker g }
x✝ : G₁
⊢ ↑↑((fun φ => { val := comp φ f, property := (_ : ∀ (x : G₁), x ∈ ker f → x ∈ ker (comp φ f)) })
            ((fun g => liftOfRightInverseAux f f_inv hf ↑g (_ : ker f ≤ ker ↑g)) g))
      x✝ =
    ↑↑g x✝
[PROOFSTEP]
simp only [comp_apply, liftOfRightInverseAux_comp_apply, Subtype.coe_mk]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
φ : G₂ →* G₃
⊢ (fun g => liftOfRightInverseAux f f_inv hf ↑g (_ : ker f ≤ ker ↑g))
      ((fun φ => { val := comp φ f, property := (_ : ∀ (x : G₁), x ∈ ker f → x ∈ ker (comp φ f)) }) φ) =
    φ
[PROOFSTEP]
ext b
[GOAL]
case h
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
φ : G₂ →* G₃
b : G₂
⊢ ↑((fun g => liftOfRightInverseAux f f_inv hf ↑g (_ : ker f ≤ ker ↑g))
          ((fun φ => { val := comp φ f, property := (_ : ∀ (x : G₁), x ∈ ker f → x ∈ ker (comp φ f)) }) φ))
      b =
    ↑φ b
[PROOFSTEP]
simp [liftOfRightInverseAux, hf b]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
h : G₂ →* G₃
hh : comp h f = g
⊢ h = ↑(liftOfRightInverse f f_inv hf) { val := g, property := hg }
[PROOFSTEP]
simp_rw [← hh]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁶ : Group G
inst✝⁵ : Group G'
inst✝⁴ : Group G''
A : Type u_4
inst✝³ : AddGroup A
G₁ : Type u_5
G₂ : Type u_6
G₃ : Type u_7
inst✝² : Group G₁
inst✝¹ : Group G₂
inst✝ : Group G₃
f : G₁ →* G₂
f_inv : G₂ → G₁
hf : Function.RightInverse f_inv ↑f
g : G₁ →* G₃
hg : ker f ≤ ker g
h : G₂ →* G₃
hh : comp h f = g
⊢ h = ↑(liftOfRightInverse f f_inv hf) { val := comp h f, property := (_ : (fun g => ker f ≤ ker g) (comp h f)) }
[PROOFSTEP]
exact ((f.liftOfRightInverse f_inv hf).apply_symm_apply _).symm
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H : Subgroup N
hH : Normal H
f : G →* N
x✝ : G
⊢ x✝ ∈ Subgroup.comap f H → ∀ (g : G), g * x✝ * g⁻¹ ∈ Subgroup.comap f H
[PROOFSTEP]
simp (config := { contextual := true }) [Subgroup.mem_comap, hH.conj_mem]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H : Subgroup G
e : G ≃* G'
⊢ equivMapOfInjective H ↑e (_ : Injective ↑e) = MulEquiv.subgroupMap e H
[PROOFSTEP]
ext
[GOAL]
case h.a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H : Subgroup G
e : G ≃* G'
x✝ : { x // x ∈ H }
⊢ ↑(↑(equivMapOfInjective H ↑e (_ : Injective ↑e)) x✝) = ↑(↑(MulEquiv.subgroupMap e H) x✝)
[PROOFSTEP]
rfl
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ s ⊔ t
⊢ ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x
[PROOFSTEP]
rw [← closure_eq s, ← closure_eq t, ← closure_union] at h 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
⊢ ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x
[PROOFSTEP]
refine Subgroup.closure_induction h ?_ ?_ ?_ ?_
[GOAL]
case refine_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
⊢ ∀ (x : C), x ∈ ↑s ∪ ↑t → ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x
[PROOFSTEP]
rintro y (h | h)
[GOAL]
case refine_1.inl
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h✝ : x ∈ closure (↑s ∪ ↑t)
y : C
h : y ∈ ↑s
⊢ ∃ y_1, y_1 ∈ s ∧ ∃ z, z ∈ t ∧ y_1 * z = y
[PROOFSTEP]
exact ⟨y, h, 1, t.one_mem, by simp⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h✝ : x ∈ closure (↑s ∪ ↑t)
y : C
h : y ∈ ↑s
⊢ y * 1 = y
[PROOFSTEP]
simp
[GOAL]
case refine_1.inr
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h✝ : x ∈ closure (↑s ∪ ↑t)
y : C
h : y ∈ ↑t
⊢ ∃ y_1, y_1 ∈ s ∧ ∃ z, z ∈ t ∧ y_1 * z = y
[PROOFSTEP]
exact ⟨1, s.one_mem, y, h, by simp⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h✝ : x ∈ closure (↑s ∪ ↑t)
y : C
h : y ∈ ↑t
⊢ 1 * y = y
[PROOFSTEP]
simp
[GOAL]
case refine_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
⊢ ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = 1
[PROOFSTEP]
exact ⟨1, s.one_mem, 1, ⟨t.one_mem, mul_one 1⟩⟩
[GOAL]
case refine_3
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
⊢ ∀ (x y : C),
    (∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x) →
      (∃ y_1, y_1 ∈ s ∧ ∃ z, z ∈ t ∧ y_1 * z = y) → ∃ y_1, y_1 ∈ s ∧ ∃ z, z ∈ t ∧ y_1 * z = x * y
[PROOFSTEP]
rintro _ _ ⟨y₁, hy₁, z₁, hz₁, rfl⟩ ⟨y₂, hy₂, z₂, hz₂, rfl⟩
[GOAL]
case refine_3.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
y₁ : C
hy₁ : y₁ ∈ s
z₁ : C
hz₁ : z₁ ∈ t
y₂ : C
hy₂ : y₂ ∈ s
z₂ : C
hz₂ : z₂ ∈ t
⊢ ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = y₁ * z₁ * (y₂ * z₂)
[PROOFSTEP]
exact ⟨_, mul_mem hy₁ hy₂, _, mul_mem hz₁ hz₂, by simp [mul_assoc, mul_left_comm]⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
y₁ : C
hy₁ : y₁ ∈ s
z₁ : C
hz₁ : z₁ ∈ t
y₂ : C
hy₂ : y₂ ∈ s
z₂ : C
hz₂ : z₂ ∈ t
⊢ y₁ * y₂ * (z₁ * z₂) = y₁ * z₁ * (y₂ * z₂)
[PROOFSTEP]
simp [mul_assoc, mul_left_comm]
[GOAL]
case refine_4
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
⊢ ∀ (x : C), (∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x) → ∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x⁻¹
[PROOFSTEP]
rintro _ ⟨y, hy, z, hz, rfl⟩
[GOAL]
case refine_4.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
h : x ∈ closure (↑s ∪ ↑t)
y : C
hy : y ∈ s
z : C
hz : z ∈ t
⊢ ∃ y_1, y_1 ∈ s ∧ ∃ z_1, z_1 ∈ t ∧ y_1 * z_1 = (y * z)⁻¹
[PROOFSTEP]
exact ⟨_, inv_mem hy, _, inv_mem hz, mul_comm z y ▸ (mul_inv_rev z y).symm⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
⊢ (∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x) → x ∈ s ⊔ t
[PROOFSTEP]
rintro ⟨y, hy, z, hz, rfl⟩
[GOAL]
case intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
y : C
hy : y ∈ s
z : C
hz : z ∈ t
⊢ y * z ∈ s ⊔ t
[PROOFSTEP]
exact mul_mem_sup hy hz
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x : C
⊢ (∃ y, y ∈ s ∧ ∃ z, z ∈ t ∧ y * z = x) ↔ ∃ y z, ↑y * ↑z = x
[PROOFSTEP]
simp only [SetLike.exists, coe_mk, exists_prop]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ x y z : C
⊢ z ∈ closure {x, y} ↔ ∃ m n, x ^ m * y ^ n = z
[PROOFSTEP]
rw [← Set.singleton_union, Subgroup.closure_union, mem_sup]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ x y z : C
⊢ (∃ y_1, y_1 ∈ closure {x} ∧ ∃ z_1, z_1 ∈ closure {y} ∧ y_1 * z_1 = z) ↔ ∃ m n, x ^ m * y ^ n = z
[PROOFSTEP]
simp_rw [mem_closure_singleton, exists_exists_eq_and]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ : C
x y z : Subgroup C
xz : x ≤ z
a : C
ha : a ∈ (x ⊔ y) ⊓ z
⊢ a ∈ x ⊔ y ⊓ z
[PROOFSTEP]
rw [mem_inf, mem_sup] at ha 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ : C
x y z : Subgroup C
xz : x ≤ z
a : C
ha : (∃ y_1, y_1 ∈ x ∧ ∃ z, z ∈ y ∧ y_1 * z = a) ∧ a ∈ z
⊢ a ∈ x ⊔ y ⊓ z
[PROOFSTEP]
rcases ha with ⟨⟨b, hb, c, hc, rfl⟩, haz⟩
[GOAL]
case intro.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ : C
x y z : Subgroup C
xz : x ≤ z
b : C
hb : b ∈ x
c : C
hc : c ∈ y
haz : b * c ∈ z
⊢ b * c ∈ x ⊔ y ⊓ z
[PROOFSTEP]
rw [mem_sup]
[GOAL]
case intro.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
C : Type u_6
inst✝ : CommGroup C
s t : Subgroup C
x✝ : C
x y z : Subgroup C
xz : x ≤ z
b : C
hb : b ∈ x
c : C
hc : c ∈ y
haz : b * c ∈ z
⊢ ∃ y_1, y_1 ∈ x ∧ ∃ z_1, z_1 ∈ y ⊓ z ∧ y_1 * z_1 = b * c
[PROOFSTEP]
exact ⟨b, hb, c, mem_inf.2 ⟨hc, (mul_mem_cancel_left (xz hb)).1 haz⟩, rfl⟩
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A✝ : Type u_4
inst✝¹ : AddGroup A✝
N : Type u_5
inst✝ : Group N
A A' B : Subgroup G
hA : A ≤ B
hA' : A' ≤ B
⊢ subgroupOf (A ⊔ A') B = subgroupOf A B ⊔ subgroupOf A' B
[PROOFSTEP]
refine' map_injective_of_ker_le B.subtype (ker_le_comap _ _) (le_trans (ker_le_comap B.subtype _) le_sup_left) _
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A✝ : Type u_4
inst✝¹ : AddGroup A✝
N : Type u_5
inst✝ : Group N
A A' B : Subgroup G
hA : A ≤ B
hA' : A' ≤ B
⊢ map (Subgroup.subtype B) (subgroupOf (A ⊔ A') B) = map (Subgroup.subtype B) (subgroupOf A B ⊔ subgroupOf A' B)
[PROOFSTEP]
simp only [subgroupOf, map_comap_eq, map_sup, subtype_range]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A✝ : Type u_4
inst✝¹ : AddGroup A✝
N : Type u_5
inst✝ : Group N
A A' B : Subgroup G
hA : A ≤ B
hA' : A' ≤ B
⊢ B ⊓ (A ⊔ A') = B ⊓ A ⊔ B ⊓ A'
[PROOFSTEP]
rw [inf_of_le_right (sup_le hA hA'), inf_of_le_right hA', inf_of_le_right hA]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H K : Subgroup G
hK : H ≤ K
hN : Normal (subgroupOf H K)
a b : G
hb : b ∈ K
h : a * b ∈ H
⊢ b * a ∈ H
[PROOFSTEP]
have := (normal_subgroupOf_iff hK).mp hN (a * b) b h hb
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H K : Subgroup G
hK : H ≤ K
hN : Normal (subgroupOf H K)
a b : G
hb : b ∈ K
h : a * b ∈ H
this : b * (a * b) * b⁻¹ ∈ H
⊢ b * a ∈ H
[PROOFSTEP]
rwa [mul_assoc, mul_assoc, mul_right_inv, mul_one] at this 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ Commute x y
[PROOFSTEP]
suffices x * y * x⁻¹ * y⁻¹ = 1 by
  show x * y = y * x
  · rw [mul_assoc, mul_eq_one_iff_eq_inv] at this 
    simp only [this, mul_inv_rev, inv_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
this : x * y * x⁻¹ * y⁻¹ = 1
⊢ Commute x y
[PROOFSTEP]
show x * y = y * x
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
this : x * y * x⁻¹ * y⁻¹ = 1
⊢ x * y = y * x
[PROOFSTEP]
rw [mul_assoc, mul_eq_one_iff_eq_inv] at this 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
this : x * y = (x⁻¹ * y⁻¹)⁻¹
⊢ x * y = y * x
[PROOFSTEP]
simp only [this, mul_inv_rev, inv_inv]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ * y⁻¹ = 1
[PROOFSTEP]
apply hdis.le_bot
[GOAL]
case a
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ * y⁻¹ ∈ H₁ ⊓ H₂
[PROOFSTEP]
constructor
[GOAL]
case a.left
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ * y⁻¹ ∈ ↑H₁.toSubmonoid
[PROOFSTEP]
suffices x * (y * x⁻¹ * y⁻¹) ∈ H₁ by simpa [mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
this : x * (y * x⁻¹ * y⁻¹) ∈ H₁
⊢ x * y * x⁻¹ * y⁻¹ ∈ ↑H₁.toSubmonoid
[PROOFSTEP]
simpa [mul_assoc]
[GOAL]
case a.left
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * (y * x⁻¹ * y⁻¹) ∈ H₁
[PROOFSTEP]
exact H₁.mul_mem hx (hH₁.conj_mem _ (H₁.inv_mem hx) _)
[GOAL]
case a.right
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ * y⁻¹ ∈ ↑H₂.toSubmonoid
[PROOFSTEP]
show x * y * x⁻¹ * y⁻¹ ∈ H₂
[GOAL]
case a.right
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ * y⁻¹ ∈ H₂
[PROOFSTEP]
apply H₂.mul_mem _ (H₂.inv_mem hy)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
hH₁ : Normal H₁
hH₂ : Normal H₂
hdis : Disjoint H₁ H₂
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
⊢ x * y * x⁻¹ ∈ H₂
[PROOFSTEP]
apply hH₂.conj_mem _ hy
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
⊢ H₁ ⊓ H₂ ≤ ⊥ ↔ ∀ {x : G}, x ∈ H₁ → x ∈ H₂ → x = 1
[PROOFSTEP]
simp only [Disjoint, SetLike.le_def, mem_inf, mem_bot, and_imp]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
h : ∀ {x y : G}, x ∈ H₁ → y ∈ H₂ → x = y → x = 1
x y : G
hx : x ∈ H₁
hy : y ∈ H₂
hxy : x * y = 1
hx1 : x = 1 := h hx (Subgroup.inv_mem H₂ hy) (Iff.mpr eq_inv_iff_mul_eq_one hxy)
⊢ y = 1
[PROOFSTEP]
simpa [hx1] using hxy
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
h : Disjoint H₁ H₂
⊢ Injective fun g => ↑g.fst * ↑g.snd
[PROOFSTEP]
intro x y hxy
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
h : Disjoint H₁ H₂
x y : { x // x ∈ H₁ } × { x // x ∈ H₂ }
hxy : (fun g => ↑g.fst * ↑g.snd) x = (fun g => ↑g.fst * ↑g.snd) y
⊢ x = y
[PROOFSTEP]
rw [← inv_mul_eq_iff_eq_mul, ← mul_assoc, ← mul_inv_eq_one, mul_assoc] at hxy 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
h : Disjoint H₁ H₂
x y : { x // x ∈ H₁ } × { x // x ∈ H₂ }
hxy✝ : (↑y.fst)⁻¹ * ↑x.fst * ↑x.snd = ↑y.snd
hxy : (↑y.fst)⁻¹ * ↑x.fst * (↑x.snd * (↑y.snd)⁻¹) = 1
⊢ x = y
[PROOFSTEP]
replace hxy := disjoint_iff_mul_eq_one.mp h (y.1⁻¹ * x.1).prop (x.2 * y.2⁻¹).prop hxy
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N : Type u_5
inst✝ : Group N
H₁ H₂ : Subgroup G
h : Disjoint H₁ H₂
x y : { x // x ∈ H₁ } × { x // x ∈ H₂ }
hxy✝ : (↑y.fst)⁻¹ * ↑x.fst * ↑x.snd = ↑y.snd
hxy : ↑(y.fst⁻¹ * x.fst) = 1 ∧ ↑(x.snd * y.snd⁻¹) = 1
⊢ x = y
[PROOFSTEP]
rwa [coe_mul, coe_mul, coe_inv, coe_inv, inv_mul_eq_one, mul_inv_eq_one, ← Subtype.ext_iff, ← Subtype.ext_iff, eq_comm,
  ← Prod.ext_iff] at hxy 
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g g' : G
hg : g ∈ N
hg' : g' ∈ N
hc : IsConj g g'
ht : normalClosure {{ val := g, property := hg }} = ⊤
⊢ normalClosure {{ val := g', property := hg' }} = ⊤
[PROOFSTEP]
obtain ⟨c, rfl⟩ := isConj_iff.1 hc
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
⊢ normalClosure {{ val := c * g * c⁻¹, property := hg' }} = ⊤
[PROOFSTEP]
have h : ∀ x : N, (MulAut.conj c) x ∈ N := by
  rintro ⟨x, hx⟩
  exact hn.conj_mem _ hx c
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
⊢ ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
[PROOFSTEP]
rintro ⟨x, hx⟩
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
x : G
hx : x ∈ N
⊢ ↑(↑MulAut.conj c) ↑{ val := x, property := hx } ∈ N
[PROOFSTEP]
exact hn.conj_mem _ hx c
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
⊢ normalClosure {{ val := c * g * c⁻¹, property := hg' }} = ⊤
[PROOFSTEP]
have hs : Function.Surjective (((MulAut.conj c).toMonoidHom.restrict N).codRestrict _ h) :=
  by
  rintro ⟨x, hx⟩
  refine' ⟨⟨c⁻¹ * x * c, _⟩, _⟩
  · have h := hn.conj_mem _ hx c⁻¹
    rwa [inv_inv] at h 
  simp only [MonoidHom.codRestrict_apply, MulEquiv.coe_toMonoidHom, MulAut.conj_apply, coe_mk, MonoidHom.restrict_apply,
    Subtype.mk_eq_mk, ← mul_assoc, mul_inv_self, one_mul]
  rw [mul_assoc, mul_inv_self, mul_one]
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
⊢ Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
[PROOFSTEP]
rintro ⟨x, hx⟩
[GOAL]
case mk
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
x : G
hx : x ∈ N
⊢ ∃ a,
    ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h) a =
      { val := x, property := hx }
[PROOFSTEP]
refine' ⟨⟨c⁻¹ * x * c, _⟩, _⟩
[GOAL]
case mk.refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
x : G
hx : x ∈ N
⊢ c⁻¹ * x * c ∈ N
[PROOFSTEP]
have h := hn.conj_mem _ hx c⁻¹
[GOAL]
case mk.refine'_1
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h✝ : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
x : G
hx : x ∈ N
h : c⁻¹ * x * c⁻¹⁻¹ ∈ N
⊢ c⁻¹ * x * c ∈ N
[PROOFSTEP]
rwa [inv_inv] at h 
[GOAL]
case mk.refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
x : G
hx : x ∈ N
⊢ ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
      { val := c⁻¹ * x * c, property := (_ : c⁻¹ * x * c ∈ N) } =
    { val := x, property := hx }
[PROOFSTEP]
simp only [MonoidHom.codRestrict_apply, MulEquiv.coe_toMonoidHom, MulAut.conj_apply, coe_mk, MonoidHom.restrict_apply,
  Subtype.mk_eq_mk, ← mul_assoc, mul_inv_self, one_mul]
[GOAL]
case mk.refine'_2
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
x : G
hx : x ∈ N
⊢ x * c * c⁻¹ = x
[PROOFSTEP]
rw [mul_assoc, mul_inv_self, mul_one]
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
hs : Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
⊢ normalClosure {{ val := c * g * c⁻¹, property := hg' }} = ⊤
[PROOFSTEP]
rw [eq_top_iff, ← MonoidHom.range_top_of_surjective _ hs, MonoidHom.range_eq_map]
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
hs : Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
⊢ map (MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h) ⊤ ≤
    normalClosure {{ val := c * g * c⁻¹, property := hg' }}
[PROOFSTEP]
refine' le_trans (map_mono (eq_top_iff.1 ht)) (map_le_iff_le_comap.2 (normalClosure_le_normal _))
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
hs : Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
⊢ {{ val := g, property := hg }} ⊆
    ↑(comap (MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
        (normalClosure {{ val := c * g * c⁻¹, property := hg' }}))
[PROOFSTEP]
rw [Set.singleton_subset_iff, SetLike.mem_coe]
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
hs : Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
⊢ { val := g, property := hg } ∈
    comap (MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
      (normalClosure {{ val := c * g * c⁻¹, property := hg' }})
[PROOFSTEP]
simp only [MonoidHom.codRestrict_apply, MulEquiv.coe_toMonoidHom, MulAut.conj_apply, coe_mk, MonoidHom.restrict_apply,
  mem_comap]
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : Group G''
A : Type u_4
inst✝¹ : AddGroup A
N✝ : Type u_5
inst✝ : Group N✝
N : Subgroup G
hn : Normal N
g : G
hg : g ∈ N
ht : normalClosure {{ val := g, property := hg }} = ⊤
c : G
hg' : c * g * c⁻¹ ∈ N
hc : IsConj g (c * g * c⁻¹)
h : ∀ (x : { x // x ∈ N }), ↑(↑MulAut.conj c) ↑x ∈ N
hs : Surjective ↑(MonoidHom.codRestrict (MonoidHom.restrict (MulEquiv.toMonoidHom (↑MulAut.conj c)) N) N h)
⊢ { val := c * g * c⁻¹, property := (_ : (fun x => x ∈ N) (c * g * c⁻¹)) } ∈
    normalClosure {{ val := c * g * c⁻¹, property := hg' }}
[PROOFSTEP]
exact subset_normalClosure (Set.mem_singleton _)
[GOAL]
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
M : Type u_6
inst✝ : Monoid M
g h : M
H : IsConj g h
Hg : g ∈ Set.center M
⊢ g = h
[PROOFSTEP]
rcases H with ⟨u, hu⟩
[GOAL]
case intro
G : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
M : Type u_6
inst✝ : Monoid M
g h : M
Hg : g ∈ Set.center M
u : Mˣ
hu : SemiconjBy (↑u) g h
⊢ g = h
[PROOFSTEP]
rwa [← u.mul_left_inj, ← Hg u]
[GOAL]
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
⊢ Set.BijOn ConjClasses.mk (↑(Subgroup.center G)) (noncenter G)ᶜ
[PROOFSTEP]
refine ⟨fun g hg ↦ ?_, fun x hx y _ H ↦ ?_, ?_⟩
[GOAL]
case refine_1
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
g : G
hg : g ∈ ↑(Subgroup.center G)
⊢ ConjClasses.mk g ∈ (noncenter G)ᶜ
[PROOFSTEP]
simp only [mem_noncenter, Set.compl_def, Set.mem_setOf, Set.not_nontrivial_iff]
[GOAL]
case refine_1
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
g : G
hg : g ∈ ↑(Subgroup.center G)
⊢ Set.Subsingleton (carrier (ConjClasses.mk g))
[PROOFSTEP]
intro x hx y hy
[GOAL]
case refine_1
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
g : G
hg : g ∈ ↑(Subgroup.center G)
x : G
hx : x ∈ carrier (ConjClasses.mk g)
y : G
hy : y ∈ carrier (ConjClasses.mk g)
⊢ x = y
[PROOFSTEP]
simp only [mem_carrier_iff_mk_eq, mk_eq_mk_iff_isConj] at hx hy 
[GOAL]
case refine_1
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
g : G
hg : g ∈ ↑(Subgroup.center G)
x y : G
hx : IsConj x g
hy : IsConj y g
⊢ x = y
[PROOFSTEP]
rw [hx.eq_of_right_mem_center hg, hy.eq_of_right_mem_center hg]
[GOAL]
case refine_2
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
x : G
hx : x ∈ ↑(Subgroup.center G)
y : G
x✝ : y ∈ ↑(Subgroup.center G)
H : ConjClasses.mk x = ConjClasses.mk y
⊢ x = y
[PROOFSTEP]
rw [mk_eq_mk_iff_isConj] at H 
[GOAL]
case refine_2
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
x : G
hx : x ∈ ↑(Subgroup.center G)
y : G
x✝ : y ∈ ↑(Subgroup.center G)
H : IsConj x y
⊢ x = y
[PROOFSTEP]
exact H.eq_of_left_mem_center hx
[GOAL]
case refine_3
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
⊢ Set.SurjOn ConjClasses.mk (↑(Subgroup.center G)) (noncenter G)ᶜ
[PROOFSTEP]
rintro ⟨g⟩ hg
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Quot.mk Setoid.r g ∈ (noncenter G)ᶜ
⊢ Quot.mk Setoid.r g ∈ ConjClasses.mk '' ↑(Subgroup.center G)
[PROOFSTEP]
refine ⟨g, ?_, rfl⟩
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Quot.mk Setoid.r g ∈ (noncenter G)ᶜ
⊢ g ∈ ↑(Subgroup.center G)
[PROOFSTEP]
simp only [mem_noncenter, Set.compl_def, Set.mem_setOf, Set.not_nontrivial_iff] at hg 
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
⊢ g ∈ ↑(Subgroup.center G)
[PROOFSTEP]
intro h
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ h * g = g * h
[PROOFSTEP]
rw [← mul_inv_eq_iff_eq_mul]
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ h * g * h⁻¹ = g
[PROOFSTEP]
refine hg ?_ mem_carrier_mk
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ h * g * h⁻¹ ∈ carrier (Quot.mk Setoid.r g)
[PROOFSTEP]
rw [mem_carrier_iff_mk_eq]
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ ConjClasses.mk (h * g * h⁻¹) = Quot.mk Setoid.r g
[PROOFSTEP]
apply mk_eq_mk_iff_isConj.mpr
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ IsConj (h * g * h⁻¹) g
[PROOFSTEP]
rw [isConj_comm, isConj_iff]
[GOAL]
case refine_3.mk
G✝ : Type u_1
G' : Type u_2
G'' : Type u_3
inst✝⁵ : Group G✝
inst✝⁴ : Group G'
inst✝³ : Group G''
A : Type u_4
inst✝² : AddGroup A
N : Type u_5
inst✝¹ : Group N
G : Type u_6
inst✝ : Group G
a✝ : ConjClasses G
g : G
hg : Set.Subsingleton (carrier (Quot.mk Setoid.r g))
h : G
⊢ ∃ c, c * g * c⁻¹ = h * g * h⁻¹
[PROOFSTEP]
exact ⟨h, rfl⟩
