Theorem: MonoidHom.noncommPiCoprod_mrange
File: Mathlib/GroupTheory/NoncommPiCoprod.lean

tactic: letI := Classical.decEq ι
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
⊢ mrange (noncommPiCoprod ϕ hcomm) = ⨆ i, mrange (ϕ i)
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ mrange (noncommPiCoprod ϕ hcomm) = ⨆ i, mrange (ϕ i)

tactic: apply le_antisymm
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ mrange (noncommPiCoprod ϕ hcomm) = ⨆ i, mrange (ϕ i)
state_after: case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ mrange (noncommPiCoprod ϕ hcomm) ≤ ⨆ i, mrange (ϕ i)

case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ ⨆ i, mrange (ϕ i) ≤ mrange (noncommPiCoprod ϕ hcomm)

tactic: rintro x ⟨f, rfl⟩
state_before: case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ mrange (noncommPiCoprod ϕ hcomm) ≤ ⨆ i, mrange (ϕ i)
state_after: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
⊢ (noncommPiCoprod ϕ hcomm) f ∈ ⨆ i, mrange (ϕ i)

tactic: refine Submonoid.noncommProd_mem _ _ _ (fun _ _ _ _ h => hcomm h _ _) (fun i _ => ?_)
state_before: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
⊢ (noncommPiCoprod ϕ hcomm) f ∈ ⨆ i, mrange (ϕ i)
state_after: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ (ϕ i) (f i) ∈ ⨆ i, mrange (ϕ i)

tactic: apply Submonoid.mem_sSup_of_mem
state_before: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ (ϕ i) (f i) ∈ ⨆ i, mrange (ϕ i)
state_after: case a.intro.hs
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ ?a.intro.s✝ ∈ Set.range fun i => mrange (ϕ i)

case a.intro.a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ (ϕ i) (f i) ∈ ?a.intro.s✝

case a.intro.s
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ Submonoid M

tactic: simp
state_before: case a.intro.a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ (ϕ i) (f i) ∈ (fun i => mrange (ϕ i)) i
state_after: no goals

tactic: use i
state_before: case a.intro.hs
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f✝ g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
f : (i : ι) → N i
i : ι
x✝ : i ∈ Finset.univ
⊢ ?a.intro.s✝ ∈ Set.range fun i => mrange (ϕ i)
state_after: no goals

tactic: refine iSup_le ?_
state_before: case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ ⨆ i, mrange (ϕ i) ≤ mrange (noncommPiCoprod ϕ hcomm)
state_after: case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ ∀ (i : ι), mrange (ϕ i) ≤ mrange (noncommPiCoprod ϕ hcomm)

tactic: rintro i x ⟨y, rfl⟩
state_before: case a
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
⊢ ∀ (i : ι), mrange (ϕ i) ≤ mrange (noncommPiCoprod ϕ hcomm)
state_after: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
i : ι
y : N i
⊢ (ϕ i) y ∈ mrange (noncommPiCoprod ϕ hcomm)

tactic: exact ⟨Pi.mulSingle i y, noncommPiCoprod_mulSingle _ _ _⟩
state_before: case a.intro
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
this : DecidableEq ι := Classical.decEq ι
i : ι
y : N i
⊢ (ϕ i) y ∈ mrange (noncommPiCoprod ϕ hcomm)
state_after: no goals