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

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

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

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

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

tactic: exact (h hy1).1
state_before: case mp.left.intro.mk.intro
M : Type u_1
N : Type u_2
P : Type ?u.110903
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.110924
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : u ≤ prod s t
y1 : M
y2 : N
hy1 : (y1, y2) ∈ ↑u
⊢ ↑(fst M N) (y1, y2) ∈ s

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

tactic: exact (h hy1).2
state_before: case mp.right.intro.mk.intro
M : Type u_1
N : Type u_2
P : Type ?u.110903
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.110924
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
h : u ≤ prod s t
y1 : M
y2 : N
hy1 : (y1, y2) ∈ ↑u
⊢ ↑(snd M N) (y1, y2) ∈ t

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

tactic: exact ⟨hH ⟨_, h, rfl⟩, hK ⟨_, h, rfl⟩⟩
state_before: case mpr.intro.mk
M : Type u_1
N : Type u_2
P : Type ?u.110903
inst✝³ : MulOneClass M
inst✝² : MulOneClass N
inst✝¹ : MulOneClass P
S : Submonoid M
A : Type ?u.110924
inst✝ : SetLike A M
hA : SubmonoidClass A M
S' : A
s : Submonoid M
t : Submonoid N
u : Submonoid (M × N)
hH : map (fst M N) u ≤ s
hK : map (snd M N) u ≤ t
x1 : M
x2 : N
h : (x1, x2) ∈ u
⊢ (x1, x2) ∈ prod s t