Theorem: Submonoid.prod_le_iff
File: Mathlib/GroupTheory/Submonoid/Operations.lean

tactic: constructor
state_before: M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
⊢ prod s t ≤ u ↔ map (inl M N) s ≤ u ∧ map (inr M N) t ≤ u

tactic: intro h
state_before: case mp
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
⊢ prod s t ≤ u → map (inl M N) s ≤ u ∧ map (inr M N) t ≤ u

tactic: constructor
state_before: case mp
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
⊢ map (inl M N) s ≤ u ∧ map (inr M N) t ≤ u

tactic: rintro _ ⟨x, hx, rfl⟩
state_before: case mp.left
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
⊢ map (inl M N) s ≤ u

tactic: apply h
state_before: case mp.left.intro.intro
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
x : M
hx : x ∈ ↑s
⊢ ↑(inl M N) x ∈ u

tactic: exact ⟨hx, Submonoid.one_mem _⟩
state_before: case mp.left.intro.intro.a
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
x : M
hx : x ∈ ↑s
⊢ ↑(inl M N) x ∈ prod s t

tactic: rintro _ ⟨x, hx, rfl⟩
state_before: case mp.right
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
⊢ map (inr M N) t ≤ u

tactic: apply h
state_before: case mp.right.intro.intro
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
x : N
hx : x ∈ ↑t
⊢ ↑(inr M N) x ∈ u

tactic: exact ⟨Submonoid.one_mem _, hx⟩
state_before: case mp.right.intro.intro.a
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : prod s t ≤ u
x : N
hx : x ∈ ↑t
⊢ ↑(inr M N) x ∈ prod s t

tactic: rintro ⟨hH, hK⟩ ⟨x1, x2⟩ ⟨h1, h2⟩
state_before: case mpr
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
⊢ map (inl M N) s ≤ u ∧ map (inr M N) t ≤ u → prod s t ≤ u

tactic: have h1' : inl M N x1 ∈ u := by
  apply hH
  simpa using h1
state_before: case mpr.intro.mk.intro
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
⊢ (x1, x2) ∈ u

tactic: have h2' : inr M N x2 ∈ u := by
  apply hK
  simpa using h2
state_before: case mpr.intro.mk.intro
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
h1' : ↑(inl M N) x1 ∈ u
⊢ (x1, x2) ∈ u

tactic: simpa using Submonoid.mul_mem _ h1' h2'
state_before: case mpr.intro.mk.intro
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
h1' : ↑(inl M N) x1 ∈ u
h2' : ↑(inr M N) x2 ∈ u
⊢ (x1, x2) ∈ u

tactic: apply hH
state_before: M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
⊢ ↑(inl M N) x1 ∈ u

tactic: simpa using h1
state_before: case a
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
⊢ ↑(inl M N) x1 ∈ map (inl M N) s

tactic: apply hK
state_before: M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
h1' : ↑(inl M N) x1 ∈ u
⊢ ↑(inr M N) x2 ∈ u

tactic: simpa using h2
state_before: case a
M : Type u_1
N : Type u_2
P : Type ?u.111775
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.111796
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (inl M N) s ≤ u
hK : map (inr M N) t ≤ u
x1 : M
x2 : N
h1 : (x1, x2).fst ∈ ↑s
h2 : (x1, x2).snd ∈ ↑t
h1' : ↑(inl M N) x1 ∈ u
⊢ ↑(inr M N) x2 ∈ map (inr M N) t