Theorem: Function.Injective.map_atTop_finset_prod_eq
File: Mathlib/Order/Filter/AtTopBot.lean

tactic: haveI := Classical.decEq β
state_before: ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
⊢ Filter.map (fun s => ∏ i ∈ s, f (g i)) atTop = Filter.map (fun s => ∏ i ∈ s, f i) atTop
state_after: ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
⊢ Filter.map (fun s => ∏ i ∈ s, f (g i)) atTop = Filter.map (fun s => ∏ i ∈ s, f i) atTop

tactic: apply le_antisymm <;> refine map_atTop_finset_prod_le_of_prod_eq fun s => ?_
state_before: ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
⊢ Filter.map (fun s => ∏ i ∈ s, f (g i)) atTop = Filter.map (fun s => ∏ i ∈ s, f i) atTop
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
⊢ ∃ v, ∀ (v' : Finset γ), v ⊆ v' → ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f x = ∏ b ∈ v', f (g b)

case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
⊢ ∃ v, ∀ (v' : Finset β), v ⊆ v' → ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ b ∈ v', f b

tactic: refine ⟨s.preimage g hg.injOn, fun t ht => ?_⟩
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
⊢ ∃ v, ∀ (v' : Finset γ), v ⊆ v' → ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f x = ∏ b ∈ v', f (g b)
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f x = ∏ b ∈ t, f (g b)

tactic: refine ⟨t.image g ∪ s, Finset.subset_union_right, ?_⟩
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f x = ∏ b ∈ t, f (g b)
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∏ x ∈ Finset.image g t ∪ s, f x = ∏ b ∈ t, f (g b)

tactic: rw [← Finset.prod_image hg.injOn]
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∏ x ∈ Finset.image g t ∪ s, f x = ∏ b ∈ t, f (g b)
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∏ x ∈ Finset.image g t ∪ s, f x = ∏ x ∈ Finset.image g t, f x

tactic: refine (prod_subset subset_union_left ?_).symm
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∏ x ∈ Finset.image g t ∪ s, f x = ∏ x ∈ Finset.image g t, f x
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∀ x ∈ Finset.image g t ∪ s, x ∉ Finset.image g t → f x = 1

tactic: simp only [Finset.mem_union, Finset.mem_image]
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∀ x ∈ Finset.image g t ∪ s, x ∉ Finset.image g t → f x = 1
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∀ (x : β), (∃ a ∈ t, g a = x) ∨ x ∈ s → (¬∃ a ∈ t, g a = x) → f x = 1

tactic: refine fun y hy hyt => hf y (mt ?_ hyt)
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
⊢ ∀ (x : β), (∃ a ∈ t, g a = x) ∨ x ∈ s → (¬∃ a ∈ t, g a = x) → f x = 1
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
y : β
hy : (∃ a ∈ t, g a = y) ∨ y ∈ s
hyt : ¬∃ a ∈ t, g a = y
⊢ y ∈ Set.range g → ∃ a ∈ t, g a = y

tactic: rintro ⟨x, rfl⟩
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
y : β
hy : (∃ a ∈ t, g a = y) ∨ y ∈ s
hyt : ¬∃ a ∈ t, g a = y
⊢ y ∈ Set.range g → ∃ a ∈ t, g a = y
state_after: case a.intro
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
x : γ
hy : (∃ a ∈ t, g a = g x) ∨ g x ∈ s
hyt : ¬∃ a ∈ t, g a = g x
⊢ ∃ a ∈ t, g a = g x

tactic: exact ⟨x, ht (Finset.mem_preimage.2 <| hy.resolve_left hyt), rfl⟩
state_before: case a.intro
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset β
t : Finset γ
ht : s.preimage g ⋯ ⊆ t
x : γ
hy : (∃ a ∈ t, g a = g x) ∨ g x ∈ s
hyt : ¬∃ a ∈ t, g a = g x
⊢ ∃ a ∈ t, g a = g x
state_after: no goals

tactic: refine ⟨s.image g, fun t ht => ?_⟩
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
⊢ ∃ v, ∀ (v' : Finset β), v ⊆ v' → ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ b ∈ v', f b
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
t : Finset β
ht : Finset.image g s ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ b ∈ t, f b

tactic: simp only [← prod_preimage _ _ hg.injOn _ fun x _ => hf x]
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
t : Finset β
ht : Finset.image g s ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ b ∈ t, f b
state_after: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
t : Finset β
ht : Finset.image g s ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ x ∈ t.preimage g ⋯, f (g x)

tactic: exact ⟨_, (image_subset_iff_subset_preimage _).1 ht, rfl⟩
state_before: case a
ι : Type u_1
ι' : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝ : CommMonoid α
g : γ → β
hg : Injective g
f : β → α
hf : ∀ x ∉ Set.range g, f x = 1
this : DecidableEq β
s : Finset γ
t : Finset β
ht : Finset.image g s ⊆ t
⊢ ∃ u', s ⊆ u' ∧ ∏ x ∈ u', f (g x) = ∏ x ∈ t.preimage g ⋯, f (g x)
state_after: no goals