[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
f : α →₀ M
⊢ (a, m) ∈ graph f ↔ ↑f a = m ∧ m ≠ 0
[PROOFSTEP]
simp_rw [graph, mem_map, mem_support_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
f : α →₀ M
⊢ (∃ a_1,
      ↑f a_1 ≠ 0 ∧
        ↑{ toFun := fun a => (a, ↑f a),
                inj' := (_ : ∀ (x x_1 : α), (fun a => (a, ↑f a)) x = (fun a => (a, ↑f a)) x_1 → x = x_1) }
            a_1 =
          (a, m)) ↔
    ↑f a = m ∧ m ≠ 0
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
f : α →₀ M
⊢ (∃ a_1,
      ↑f a_1 ≠ 0 ∧
        ↑{ toFun := fun a => (a, ↑f a),
                inj' := (_ : ∀ (x x_1 : α), (fun a => (a, ↑f a)) x = (fun a => (a, ↑f a)) x_1 → x = x_1) }
            a_1 =
          (a, m)) →
    ↑f a = m ∧ m ≠ 0
[PROOFSTEP]
rintro ⟨b, ha, rfl, -⟩
[GOAL]
case mp.intro.intro.refl
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
f : α →₀ M
ha : ↑f a ≠ 0
⊢ ↑f a = ↑f a ∧ ↑f a ≠ 0
[PROOFSTEP]
exact ⟨rfl, ha⟩
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
f : α →₀ M
⊢ ↑f a = m ∧ m ≠ 0 →
    ∃ a_2,
      ↑f a_2 ≠ 0 ∧
        ↑{ toFun := fun a => (a, ↑f a),
                inj' := (_ : ∀ (x x_1 : α), (fun a => (a, ↑f a)) x = (fun a => (a, ↑f a)) x_1 → x = x_1) }
            a_2 =
          (a, m)
[PROOFSTEP]
rintro ⟨rfl, ha⟩
[GOAL]
case mpr.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
f : α →₀ M
ha : ↑f a ≠ 0
⊢ ∃ a_1,
    ↑f a_1 ≠ 0 ∧
      ↑{ toFun := fun a => (a, ↑f a),
              inj' := (_ : ∀ (x x_1 : α), (fun a => (a, ↑f a)) x = (fun a => (a, ↑f a)) x_1 → x = x_1) }
          a_1 =
        (a, ↑f a)
[PROOFSTEP]
exact ⟨a, ha, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
c : α × M
f : α →₀ M
⊢ c ∈ graph f ↔ ↑f c.fst = c.snd ∧ c.snd ≠ 0
[PROOFSTEP]
cases c
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α →₀ M
fst✝ : α
snd✝ : M
⊢ (fst✝, snd✝) ∈ graph f ↔ ↑f (fst✝, snd✝).fst = (fst✝, snd✝).snd ∧ (fst✝, snd✝).snd ≠ 0
[PROOFSTEP]
exact mk_mem_graph_iff
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
f : α →₀ M
⊢ image Prod.fst (graph f) = f.support
[PROOFSTEP]
classical simp only [graph, map_eq_image, image_image, Embedding.coeFn_mk, (· ∘ ·), image_id']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
f : α →₀ M
⊢ image Prod.fst (graph f) = f.support
[PROOFSTEP]
simp only [graph, map_eq_image, image_image, Embedding.coeFn_mk, (· ∘ ·), image_id']
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
⊢ Injective graph
[PROOFSTEP]
intro f g h
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
f g : α →₀ M
h : graph f = graph g
⊢ f = g
[PROOFSTEP]
classical
have hsup : f.support = g.support := by rw [← image_fst_graph, h, image_fst_graph]
refine' ext_iff'.2 ⟨hsup, fun x hx => apply_eq_of_mem_graph <| h.symm ▸ _⟩
exact mk_mem_graph _ (hsup ▸ hx)
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
f g : α →₀ M
h : graph f = graph g
⊢ f = g
[PROOFSTEP]
have hsup : f.support = g.support := by rw [← image_fst_graph, h, image_fst_graph]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
f g : α →₀ M
h : graph f = graph g
⊢ f.support = g.support
[PROOFSTEP]
rw [← image_fst_graph, h, image_fst_graph]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
f g : α →₀ M
h : graph f = graph g
hsup : f.support = g.support
⊢ f = g
[PROOFSTEP]
refine' ext_iff'.2 ⟨hsup, fun x hx => apply_eq_of_mem_graph <| h.symm ▸ _⟩
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M✝
α : Type u_13
M : Type u_14
inst✝ : Zero M
f g : α →₀ M
h : graph f = graph g
hsup : f.support = g.support
x : α
hx : x ∈ f.support
⊢ (x, ↑g x) ∈ graph g
[PROOFSTEP]
exact mk_mem_graph _ (hsup ▸ hx)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
⊢ graph 0 = ∅
[PROOFSTEP]
simp [graph]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ M
⊢ mapRange (↑f.symm) hf' (mapRange (↑f) hf x) = x
[PROOFSTEP]
rw [← mapRange_comp _ _ _ _]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ M
⊢ mapRange (↑f.symm ∘ ↑f) ?h x = x
[PROOFSTEP]
simp_rw [Equiv.symm_comp_self]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ M
⊢ (↑f.symm ∘ ↑f) 0 = 0
[PROOFSTEP]
simp_rw [Equiv.symm_comp_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ M
⊢ mapRange id (_ : id 0 = 0) x = x
[PROOFSTEP]
exact mapRange_id _
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ M
⊢ id 0 = 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ N
⊢ mapRange (↑f) hf (mapRange (↑f.symm) hf' x) = x
[PROOFSTEP]
rw [← mapRange_comp _ _ _ _]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ N
⊢ mapRange (↑f ∘ ↑f.symm) ?h x = x
[PROOFSTEP]
simp_rw [Equiv.self_comp_symm]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ N
⊢ (↑f ∘ ↑f.symm) 0 = 0
[PROOFSTEP]
simp_rw [Equiv.self_comp_symm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ N
⊢ mapRange id (_ : id 0 = 0) x = x
[PROOFSTEP]
exact mapRange_id _
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
x : α →₀ N
⊢ id 0 = 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
f₂ : N ≃ P
hf₂ : ↑f₂ 0 = 0
hf₂' : ↑f₂.symm 0 = 0
⊢ ↑(f.trans f₂) 0 = 0
[PROOFSTEP]
rw [Equiv.trans_apply, hf, hf₂]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : M ≃ N
hf : ↑f 0 = 0
hf' : ↑f.symm 0 = 0
f₂ : N ≃ P
hf₂ : ↑f₂ 0 = 0
hf₂' : ↑f₂.symm 0 = 0
⊢ ↑(f.trans f₂).symm 0 = 0
[PROOFSTEP]
rw [Equiv.symm_trans_apply, hf₂', hf']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : Zero N
inst✝ : Zero P
f : ZeroHom N P
f₂ : ZeroHom M N
⊢ (↑f ∘ ↑f₂) 0 = 0
[PROOFSTEP]
simp only [comp_apply, map_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M →+ N
a b : α →₀ M
⊢ ZeroHom.toFun { toFun := mapRange ↑f (_ : ↑f 0 = 0), map_zero' := (_ : mapRange ↑f (_ : ↑f 0 = 0) 0 = 0) } (a + b) =
    ZeroHom.toFun { toFun := mapRange ↑f (_ : ↑f 0 = 0), map_zero' := (_ : mapRange ↑f (_ : ↑f 0 = 0) 0 = 0) } a +
      ZeroHom.toFun { toFun := mapRange ↑f (_ : ↑f 0 = 0), map_zero' := (_ : mapRange ↑f (_ : ↑f 0 = 0) 0 = 0) } b
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M →+ N
a b : α →₀ M
⊢ mapRange ↑f (_ : ↑f 0 = 0) (a + b) = mapRange ↑f (_ : ↑f 0 = 0) a + mapRange ↑f (_ : ↑f 0 = 0) b
[PROOFSTEP]
exact mapRange_add f.map_add _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : N →+ P
f₂ : M →+ N
⊢ (↑f ∘ ↑f₂) 0 = 0
[PROOFSTEP]
simp only [comp_apply, map_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ M
⊢ mapRange ↑(AddEquiv.symm f) (_ : ↑(AddEquiv.symm f) 0 = 0) (mapRange ↑f (_ : ↑f 0 = 0) x) = x
[PROOFSTEP]
rw [← mapRange_comp _ _ _ _]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ M
⊢ mapRange (↑(AddEquiv.symm f) ∘ ↑f) ?h x = x
[PROOFSTEP]
simp_rw [AddEquiv.symm_comp_self]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ M
⊢ (↑(AddEquiv.symm f) ∘ ↑f) 0 = 0
[PROOFSTEP]
simp_rw [AddEquiv.symm_comp_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ M
⊢ mapRange id (_ : id 0 = 0) x = x
[PROOFSTEP]
exact mapRange_id _
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ M
⊢ id 0 = 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ N
⊢ mapRange ↑f (_ : ↑f 0 = 0) (mapRange ↑(AddEquiv.symm f) (_ : ↑(AddEquiv.symm f) 0 = 0) x) = x
[PROOFSTEP]
rw [← mapRange_comp _ _ _ _]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ N
⊢ mapRange (↑f ∘ ↑(AddEquiv.symm f)) ?h x = x
[PROOFSTEP]
simp_rw [AddEquiv.self_comp_symm]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ N
⊢ (↑f ∘ ↑(AddEquiv.symm f)) 0 = 0
[PROOFSTEP]
simp_rw [AddEquiv.self_comp_symm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ N
⊢ mapRange id (_ : id 0 = 0) x = x
[PROOFSTEP]
exact mapRange_id _
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
src✝ : (α →₀ M) →+ α →₀ N := addMonoidHom (AddEquiv.toAddMonoidHom f)
x : α →₀ N
⊢ id 0 = 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : AddCommMonoid P
f : M ≃+ N
f₂ : N ≃+ P
⊢ (↑f₂ ∘ ↑f) 0 = 0
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
l : α →₀ M
a : β
⊢ a ∈ map (Equiv.toEmbedding f) l.support ↔ (fun a => ↑l (↑f.symm a)) a ≠ 0
[PROOFSTEP]
simp only [Finset.mem_map_equiv, mem_support_toFun]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
l : α →₀ M
a : β
⊢ toFun l (↑f.symm a) ≠ 0 ↔ ↑l (↑f.symm a) ≠ 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
l : α →₀ M
⊢ equivMapDomain (Equiv.refl α) l = l
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
l : α →₀ M
x : α
⊢ ↑(equivMapDomain (Equiv.refl α) l) x = ↑l x
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
⊢ equivMapDomain (Equiv.refl α) = id
[PROOFSTEP]
ext x
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α →₀ M
a✝ : α
⊢ ↑(equivMapDomain (Equiv.refl α) x) a✝ = ↑(id x) a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
g : β ≃ γ
l : α →₀ M
⊢ equivMapDomain (f.trans g) l = equivMapDomain g (equivMapDomain f l)
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
g : β ≃ γ
l : α →₀ M
x : γ
⊢ ↑(equivMapDomain (f.trans g) l) x = ↑(equivMapDomain g (equivMapDomain f l)) x
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
g : β ≃ γ
⊢ equivMapDomain (f.trans g) = equivMapDomain g ∘ equivMapDomain f
[PROOFSTEP]
ext x
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
g : β ≃ γ
x : α →₀ M
a✝ : γ
⊢ ↑(equivMapDomain (f.trans g) x) a✝ = ↑((equivMapDomain g ∘ equivMapDomain f) x) a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
a : α
b : M
⊢ equivMapDomain f (single a b) = single (↑f a) b
[PROOFSTEP]
classical
ext x
simp only [single_apply, Equiv.apply_eq_iff_eq_symm_apply, equivMapDomain_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
a : α
b : M
⊢ equivMapDomain f (single a b) = single (↑f a) b
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
a : α
b : M
x : β
⊢ ↑(equivMapDomain f (single a b)) x = ↑(single (↑f a) b) x
[PROOFSTEP]
simp only [single_apply, Equiv.apply_eq_iff_eq_symm_apply, equivMapDomain_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
⊢ equivMapDomain f 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
a✝ : β
⊢ ↑(equivMapDomain f 0) a✝ = ↑0 a✝
[PROOFSTEP]
simp only [equivMapDomain_apply, coe_zero, Pi.zero_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α ≃ β
⊢ (α →₀ M) ≃ (β →₀ M)
[PROOFSTEP]
refine' ⟨equivMapDomain f, equivMapDomain f.symm, fun f => _, fun f => _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f✝ : α ≃ β
f : α →₀ M
⊢ equivMapDomain f✝.symm (equivMapDomain f✝ f) = f
[PROOFSTEP]
ext x
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f✝ : α ≃ β
f : β →₀ M
⊢ equivMapDomain f✝ (equivMapDomain f✝.symm f) = f
[PROOFSTEP]
ext x
[GOAL]
case refine'_1.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f✝ : α ≃ β
f : α →₀ M
x : α
⊢ ↑(equivMapDomain f✝.symm (equivMapDomain f✝ f)) x = ↑f x
[PROOFSTEP]
simp only [equivMapDomain_apply, Equiv.symm_symm, Equiv.symm_apply_apply, Equiv.apply_symm_apply]
[GOAL]
case refine'_2.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f✝ : α ≃ β
f : β →₀ M
x : β
⊢ ↑(equivMapDomain f✝ (equivMapDomain f✝.symm f)) x = ↑f x
[PROOFSTEP]
simp only [equivMapDomain_apply, Equiv.symm_symm, Equiv.symm_apply_apply, Equiv.apply_symm_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
x : α →₀ M
a : α
⊢ ↑(mapDomain f x) (f a) = ↑x a
[PROOFSTEP]
rw [mapDomain, sum_apply, sum, Finset.sum_eq_single a, single_eq_same]
[GOAL]
case h₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
x : α →₀ M
a : α
⊢ ∀ (b : α), b ∈ x.support → b ≠ a → ↑(single (f b) (↑x b)) (f a) = 0
[PROOFSTEP]
intro b _ hba
[GOAL]
case h₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
x : α →₀ M
a b : α
a✝ : b ∈ x.support
hba : b ≠ a
⊢ ↑(single (f b) (↑x b)) (f a) = 0
[PROOFSTEP]
exact single_eq_of_ne (hf.ne hba)
[GOAL]
case h₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
x : α →₀ M
a : α
⊢ ¬a ∈ x.support → ↑(single (f a) (↑x a)) (f a) = 0
[PROOFSTEP]
intro h
[GOAL]
case h₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
x : α →₀ M
a : α
h : ¬a ∈ x.support
⊢ ↑(single (f a) (↑x a)) (f a) = 0
[PROOFSTEP]
rw [not_mem_support_iff.1 h, single_zero, zero_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
x : α →₀ M
a : β
h : ¬a ∈ Set.range f
⊢ ↑(mapDomain f x) a = 0
[PROOFSTEP]
rw [mapDomain, sum_apply, sum]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
x : α →₀ M
a : β
h : ¬a ∈ Set.range f
⊢ ∑ a_1 in x.support, ↑(single (f a_1) (↑x a_1)) a = 0
[PROOFSTEP]
exact Finset.sum_eq_zero fun a' _ => single_eq_of_ne fun eq => h <| eq ▸ Set.mem_range_self _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
⊢ mapDomain (g ∘ f) v = mapDomain g (mapDomain f v)
[PROOFSTEP]
refine' ((sum_sum_index _ _).trans _).symm
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
⊢ ∀ (a : β), single (g a) 0 = 0
[PROOFSTEP]
intro
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
a✝ : β
⊢ single (g a✝) 0 = 0
[PROOFSTEP]
exact single_zero _
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
⊢ ∀ (a : β) (b₁ b₂ : M), single (g a) (b₁ + b₂) = single (g a) b₁ + single (g a) b₂
[PROOFSTEP]
intro
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
a✝ : β
⊢ ∀ (b₁ b₂ : M), single (g a✝) (b₁ + b₂) = single (g a✝) b₁ + single (g a✝) b₂
[PROOFSTEP]
exact single_add _
[GOAL]
case refine'_3
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
⊢ (sum v fun a b => sum (single (f a) b) fun a => single (g a)) = mapDomain (g ∘ f) v
[PROOFSTEP]
refine' sum_congr fun _ _ => sum_single_index _
[GOAL]
case refine'_3
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
g : β → γ
x✝¹ : α
x✝ : x✝¹ ∈ v.support
⊢ single (g (f x✝¹)) 0 = 0
[PROOFSTEP]
exact single_zero _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H✝ : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f g : α → β
h : ∀ (x : α), x ∈ v.support → f x = g x
x✝ : α
H : x✝ ∈ v.support
⊢ (fun a => single (f a)) x✝ (↑v x✝) = (fun a => single (g a)) x✝ (↑v x✝)
[PROOFSTEP]
simp only [h _ H]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α ≃ β
x : α →₀ M
a : β
⊢ ↑(mapDomain (↑f) x) a = ↑x (↑f.symm a)
[PROOFSTEP]
conv_lhs => rw [← f.apply_symm_apply a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α ≃ β
x : α →₀ M
a : β
| ↑(mapDomain (↑f) x) a
[PROOFSTEP]
rw [← f.apply_symm_apply a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α ≃ β
x : α →₀ M
a : β
| ↑(mapDomain (↑f) x) a
[PROOFSTEP]
rw [← f.apply_symm_apply a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α ≃ β
x : α →₀ M
a : β
| ↑(mapDomain (↑f) x) a
[PROOFSTEP]
rw [← f.apply_symm_apply a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α ≃ β
x : α →₀ M
a : β
⊢ ↑(mapDomain (↑f) x) (↑f (↑f.symm a)) = ↑x (↑f.symm a)
[PROOFSTEP]
exact mapDomain_apply f.injective _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
⊢ (Finset.biUnion s.support fun a => {f a}) ⊆ image f s.support
[PROOFSTEP]
rw [Finset.biUnion_singleton]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
⊢ ↑(mapDomain f x) (f a) = ↑x a
[PROOFSTEP]
classical
rw [mapDomain, sum_apply, sum]
simp_rw [single_apply]
by_cases hax : a ∈ x.support
· rw [← Finset.add_sum_erase _ _ hax, if_pos rfl]
  convert add_zero (x a)
  refine' Finset.sum_eq_zero fun i hi => if_neg _
  exact (hf.mono hS).ne (Finset.mem_of_mem_erase hi) hax (Finset.ne_of_mem_erase hi)
· rw [not_mem_support_iff.1 hax]
  refine' Finset.sum_eq_zero fun i hi => if_neg _
  exact hf.ne (hS hi) ha (ne_of_mem_of_not_mem hi hax)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
⊢ ↑(mapDomain f x) (f a) = ↑x a
[PROOFSTEP]
rw [mapDomain, sum_apply, sum]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
⊢ ∑ a_1 in x.support, ↑(single (f a_1) (↑x a_1)) (f a) = ↑x a
[PROOFSTEP]
simp_rw [single_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
⊢ (∑ x_1 in x.support, if f x_1 = f a then ↑x x_1 else 0) = ↑x a
[PROOFSTEP]
by_cases hax : a ∈ x.support
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : a ∈ x.support
⊢ (∑ x_1 in x.support, if f x_1 = f a then ↑x x_1 else 0) = ↑x a
[PROOFSTEP]
rw [← Finset.add_sum_erase _ _ hax, if_pos rfl]
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : a ∈ x.support
⊢ (↑x a + ∑ x_1 in Finset.erase x.support a, if f x_1 = f a then ↑x x_1 else 0) = ↑x a
[PROOFSTEP]
convert add_zero (x a)
[GOAL]
case h.e'_2.h.e'_6
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : a ∈ x.support
⊢ (∑ x_1 in Finset.erase x.support a, if f x_1 = f a then ↑x x_1 else 0) = 0
[PROOFSTEP]
refine' Finset.sum_eq_zero fun i hi => if_neg _
[GOAL]
case h.e'_2.h.e'_6
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : a ∈ x.support
i : α
hi : i ∈ Finset.erase x.support a
⊢ ¬f i = f a
[PROOFSTEP]
exact (hf.mono hS).ne (Finset.mem_of_mem_erase hi) hax (Finset.ne_of_mem_erase hi)
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : ¬a ∈ x.support
⊢ (∑ x_1 in x.support, if f x_1 = f a then ↑x x_1 else 0) = ↑x a
[PROOFSTEP]
rw [not_mem_support_iff.1 hax]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : ¬a ∈ x.support
⊢ (∑ x_1 in x.support, if f x_1 = f a then ↑x x_1 else 0) = 0
[PROOFSTEP]
refine' Finset.sum_eq_zero fun i hi => if_neg _
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
x : α →₀ M
hS : ↑x.support ⊆ S
hf : Set.InjOn f S
a : α
ha : a ∈ S
hax : ¬a ∈ x.support
i : α
hi : i ∈ x.support
⊢ ¬f i = f a
[PROOFSTEP]
exact hf.ne (hS hi) ha (ne_of_mem_of_not_mem hi hax)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
⊢ image f s.support ⊆ (mapDomain f s).support
[PROOFSTEP]
intro x hx
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
x : β
hx : x ∈ image f s.support
⊢ x ∈ (mapDomain f s).support
[PROOFSTEP]
simp only [mem_image, exists_prop, mem_support_iff, Ne.def] at hx 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
x : β
hx : ∃ a, ¬↑s a = 0 ∧ f a = x
⊢ x ∈ (mapDomain f s).support
[PROOFSTEP]
rcases hx with ⟨hx_w, hx_h_left, rfl⟩
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ f hx_w ∈ (mapDomain f s).support
[PROOFSTEP]
simp only [mem_support_iff, Ne.def]
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ ¬↑(mapDomain f s) (f hx_w) = 0
[PROOFSTEP]
rw [mapDomain_apply' (↑s.support : Set _) _ _ hf]
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ ¬↑s hx_w = 0
[PROOFSTEP]
exact hx_h_left
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ hx_w ∈ ↑s.support
[PROOFSTEP]
simp only [mem_coe, mem_support_iff, Ne.def]
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ ¬↑s hx_w = 0
[PROOFSTEP]
exact hx_h_left
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : DecidableEq β
f : α → β
s : α →₀ M
hf : Set.InjOn f ↑s.support
hx_w : α
hx_h_left : ¬↑s hx_w = 0
⊢ ↑s.support ⊆ ↑s.support
[PROOFSTEP]
exact Subset.refl _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
⊢ embDomain f v = mapDomain (↑f) v
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : β
⊢ ↑(embDomain f v) a = ↑(mapDomain (↑f) v) a
[PROOFSTEP]
by_cases h : a ∈ Set.range f
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : β
h : a ∈ Set.range ↑f
⊢ ↑(embDomain f v) a = ↑(mapDomain (↑f) v) a
[PROOFSTEP]
rcases h with ⟨a, rfl⟩
[GOAL]
case pos.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : α
⊢ ↑(embDomain f v) (↑f a) = ↑(mapDomain (↑f) v) (↑f a)
[PROOFSTEP]
rw [mapDomain_apply f.injective, embDomain_apply]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : β
h : ¬a ∈ Set.range ↑f
⊢ ↑(embDomain f v) a = ↑(mapDomain (↑f) v) a
[PROOFSTEP]
rw [mapDomain_notin_range, embDomain_notin_range]
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : β
h : ¬a ∈ Set.range ↑f
⊢ ¬a ∈ Set.range ↑f
[PROOFSTEP]
assumption
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v✝ v₁ v₂ : α →₀ M
f : α ↪ β
v : α →₀ M
a : β
h : ¬a ∈ Set.range ↑f
⊢ ¬a ∈ Set.range ↑f
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : CommMonoid N
f : α → β
s : α →₀ M
h : β → M → N
hf : Injective f
⊢ prod (mapDomain f s) h = prod s fun a b => h (f a) b
[PROOFSTEP]
rw [← Function.Embedding.coeFn_mk f hf, ← embDomain_eq_mapDomain, prod_embDomain]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
f : α → β
hf : Injective f
⊢ Injective (mapDomain f)
[PROOFSTEP]
intro v₁ v₂ eq
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
f : α → β
hf : Injective f
v₁ v₂ : α →₀ M
eq : mapDomain f v₁ = mapDomain f v₂
⊢ v₁ = v₂
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
f : α → β
hf : Injective f
v₁ v₂ : α →₀ M
eq : mapDomain f v₁ = mapDomain f v₂
a : α
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
have : mapDomain f v₁ (f a) = mapDomain f v₂ (f a) := by rw [eq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
f : α → β
hf : Injective f
v₁ v₂ : α →₀ M
eq : mapDomain f v₁ = mapDomain f v₂
a : α
⊢ ↑(mapDomain f v₁) (f a) = ↑(mapDomain f v₂) (f a)
[PROOFSTEP]
rw [eq]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
f : α → β
hf : Injective f
v₁ v₂ : α →₀ M
eq : mapDomain f v₁ = mapDomain f v₂
a : α
this : ↑(mapDomain f v₁) (f a) = ↑(mapDomain f v₂) (f a)
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
rwa [mapDomain_apply hf, mapDomain_apply hf] at this 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : AddCommMonoid N
f : α → β
g : M →+ N
⊢ AddMonoidHom.comp (addMonoidHom f) (mapRange.addMonoidHom g) =
    AddMonoidHom.comp (mapRange.addMonoidHom g) (addMonoidHom f)
[PROOFSTEP]
ext
[GOAL]
case H.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝ : AddCommMonoid N
f : α → β
g : M →+ N
x✝¹ : α
x✝ : M
a✝ : β
⊢ ↑(↑(AddMonoidHom.comp (AddMonoidHom.comp (addMonoidHom f) (mapRange.addMonoidHom g)) (singleAddHom x✝¹)) x✝) a✝ =
    ↑(↑(AddMonoidHom.comp (AddMonoidHom.comp (mapRange.addMonoidHom g) (addMonoidHom f)) (singleAddHom x✝¹)) x✝) a✝
[PROOFSTEP]
simp only [AddMonoidHom.coe_comp, Finsupp.mapRange_single, Finsupp.mapDomain.addMonoidHom_apply,
  Finsupp.singleAddHom_apply, eq_self_iff_true, Function.comp_apply, Finsupp.mapDomain_single,
  Finsupp.mapRange.addMonoidHom_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
⊢ sum (update f i a) g + g i (↑f i) = sum f g + g i a
[PROOFSTEP]
rw [update_eq_erase_add_single, sum_add_index' hg hgg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
⊢ ((sum (erase i f) fun a => g a) + sum (single i a) fun a => g a) + g i (↑f i) = sum f g + g i a
[PROOFSTEP]
conv_rhs => rw [← Finsupp.update_self f i]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
| sum f g + g i a
[PROOFSTEP]
rw [← Finsupp.update_self f i]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
| sum f g + g i a
[PROOFSTEP]
rw [← Finsupp.update_self f i]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
| sum f g + g i a
[PROOFSTEP]
rw [← Finsupp.update_self f i]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
⊢ ((sum (erase i f) fun a => g a) + sum (single i a) fun a => g a) + g i (↑f i) = sum (update f i (↑f i)) g + g i a
[PROOFSTEP]
rw [update_eq_erase_add_single, sum_add_index' hg hgg, add_assoc, add_assoc]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
⊢ (sum (erase i f) fun a => g a) + ((sum (single i a) fun a => g a) + g i (↑f i)) =
    (sum (erase i f) fun a => g a) + ((sum (single i (↑f i)) fun a => g a) + g i a)
[PROOFSTEP]
congr 1
[GOAL]
case e_a
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
v v₁ v₂ : α →₀ M
inst✝¹ : AddCommMonoid α
inst✝ : AddCommMonoid β
f : ι →₀ α
i : ι
a : α
g : ι → α → β
hg : ∀ (i : ι), g i 0 = 0
hgg : ∀ (j : ι) (a₁ a₂ : α), g j (a₁ + a₂) = g j a₁ + g j a₂
⊢ (sum (single i a) fun a => g a) + g i (↑f i) = (sum (single i (↑f i)) fun a => g a) + g i a
[PROOFSTEP]
rw [add_comm, sum_single_index (hg _), sum_single_index (hg _)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁ v₂ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
⊢ Set.InjOn (mapDomain f) {w | ↑w.support ⊆ S}
[PROOFSTEP]
intro v₁ hv₁ v₂ hv₂ eq
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
⊢ v₁ = v₂
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
classical
by_cases h : a ∈ v₁.support ∪ v₂.support
·
  rw [← mapDomain_apply' S _ hv₁ hf _, ← mapDomain_apply' S _ hv₂ hf _, eq] <;>
    · apply Set.union_subset hv₁ hv₂
      exact_mod_cast h
· simp only [not_or, mem_union, not_not, mem_support_iff] at h 
  simp [h]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
by_cases h : a ∈ v₁.support ∪ v₂.support
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : a ∈ v₁.support ∪ v₂.support
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
rw [← mapDomain_apply' S _ hv₁ hf _, ← mapDomain_apply' S _ hv₂ hf _, eq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : a ∈ v₁.support ∪ v₂.support
⊢ a ∈ S
[PROOFSTEP]
apply Set.union_subset hv₁ hv₂
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : a ∈ v₁.support ∪ v₂.support
⊢ a ∈ ↑v₁.support ∪ ↑v₂.support
[PROOFSTEP]
exact_mod_cast h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : a ∈ v₁.support ∪ v₂.support
⊢ a ∈ S
[PROOFSTEP]
apply Set.union_subset hv₁ hv₂
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : a ∈ v₁.support ∪ v₂.support
⊢ a ∈ ↑v₁.support ∪ ↑v₂.support
[PROOFSTEP]
exact_mod_cast h
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : ¬a ∈ v₁.support ∪ v₂.support
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
simp only [not_or, mem_union, not_not, mem_support_iff] at h 
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S✝ : Type u_12
inst✝ : AddCommMonoid M
v v₁✝ v₂✝ : α →₀ M
S : Set α
f : α → β
hf : Set.InjOn f S
v₁ : α →₀ M
hv₁ : v₁ ∈ {w | ↑w.support ⊆ S}
v₂ : α →₀ M
hv₂ : v₂ ∈ {w | ↑w.support ⊆ S}
eq : mapDomain f v₁ = mapDomain f v₂
a : α
h : ↑v₁ a = 0 ∧ ↑v₂ a = 0
⊢ ↑v₁ a = ↑v₂ a
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M✝
v v₁ v₂ : α →₀ M✝
M : Type u_13
inst✝ : AddCommMonoid M
f : α ≃ β
l : α →₀ M
⊢ equivMapDomain f l = mapDomain (↑f) l
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M✝
v v₁ v₂ : α →₀ M✝
M : Type u_13
inst✝ : AddCommMonoid M
f : α ≃ β
l : α →₀ M
x : β
⊢ ↑(equivMapDomain f l) x = ↑(mapDomain (↑f) l) x
[PROOFSTEP]
simp [mapDomain_equiv_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
l : β →₀ M
hf : Set.InjOn f (f ⁻¹' ↑l.support)
⊢ ∀ (a : α), a ∈ preimage l.support f hf ↔ (fun a => ↑l (f a)) a ≠ 0
[PROOFSTEP]
intro a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
l : β →₀ M
hf : Set.InjOn f (f ⁻¹' ↑l.support)
a : α
⊢ a ∈ preimage l.support f hf ↔ (fun a => ↑l (f a)) a ≠ 0
[PROOFSTEP]
simp only [Finset.mem_def.symm, Finset.mem_preimage]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
l : β →₀ M
hf : Set.InjOn f (f ⁻¹' ↑l.support)
a : α
⊢ f a ∈ l.support ↔ ↑l (f a) ≠ 0
[PROOFSTEP]
exact l.mem_support_toFun (f a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : AddCommMonoid N
f : α → β
l : β →₀ M
g : β → M → N
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
⊢ sum (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support))) (g ∘ f) = sum l g
[PROOFSTEP]
simp only [sum, comapDomain_apply, (· ∘ ·), comapDomain]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : AddCommMonoid N
f : α → β
l : β →₀ M
g : β → M → N
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
⊢ ∑ x in preimage l.support f (_ : Set.InjOn f (f ⁻¹' ↑l.support)),
      g (f x)
        (↑{ support := preimage l.support f (_ : Set.InjOn f (f ⁻¹' ↑l.support)), toFun := fun a => ↑l (f a),
              mem_support_toFun :=
                (_ :
                  ∀ (a : α),
                    a ∈ preimage l.support f (_ : Set.InjOn f (f ⁻¹' ↑l.support)) ↔ (fun a => ↑l (f a)) a ≠ 0) }
          x) =
    ∑ x in l.support, g x (↑l x)
[PROOFSTEP]
exact Finset.sum_preimage_of_bij f _ hf fun x => g x (l x)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
l : β →₀ M
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
⊢ comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support)) = 0 → l = 0
[PROOFSTEP]
rw [← support_eq_empty, ← support_eq_empty, comapDomain]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
l : β →₀ M
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
⊢ { support := preimage l.support f (_ : Set.InjOn f (f ⁻¹' ↑l.support)), toFun := fun a => ↑l (f a),
          mem_support_toFun :=
            (_ :
              ∀ (a : α),
                a ∈ preimage l.support f (_ : Set.InjOn f (f ⁻¹' ↑l.support)) ↔ (fun a => ↑l (f a)) a ≠ 0) }.support =
      ∅ →
    l.support = ∅
[PROOFSTEP]
simp only [Finset.ext_iff, Finset.not_mem_empty, iff_false_iff, mem_preimage]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
l : β →₀ M
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
⊢ (∀ (a : α), ¬f a ∈ l.support) → ∀ (a : β), ¬a ∈ l.support
[PROOFSTEP]
intro h a ha
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
l : β →₀ M
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
h : ∀ (a : α), ¬f a ∈ l.support
a : β
ha : a ∈ l.support
⊢ False
[PROOFSTEP]
cases' hf.2.2 ha with b hb
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
l : β →₀ M
hf : Set.BijOn f (f ⁻¹' ↑l.support) ↑l.support
h : ∀ (a : α), ¬f a ∈ l.support
a : β
ha : a ∈ l.support
b : α
hb : b ∈ f ⁻¹' ↑l.support ∧ f b = a
⊢ False
[PROOFSTEP]
exact h b (hb.2.symm ▸ ha)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
hif : optParam (Set.InjOn f (f ⁻¹' ↑0.support)) (_ : Set.InjOn f (f ⁻¹' ↑∅))
⊢ comapDomain f 0 hif = 0
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
hif : optParam (Set.InjOn f (f ⁻¹' ↑0.support)) (_ : Set.InjOn f (f ⁻¹' ↑∅))
a✝ : α
⊢ ↑(comapDomain f 0 hif) a✝ = ↑0 a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
a : α
m : M
hif : Set.InjOn f (f ⁻¹' ↑(single (f a) m).support)
⊢ comapDomain f (single (f a) m) hif = single a m
[PROOFSTEP]
rcases eq_or_ne m 0 with (rfl | hm)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
a : α
hif : Set.InjOn f (f ⁻¹' ↑(single (f a) 0).support)
⊢ comapDomain f (single (f a) 0) hif = single a 0
[PROOFSTEP]
simp only [single_zero, comapDomain_zero]
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
a : α
m : M
hif : Set.InjOn f (f ⁻¹' ↑(single (f a) m).support)
hm : m ≠ 0
⊢ comapDomain f (single (f a) m) hif = single a m
[PROOFSTEP]
rw [eq_single_iff, comapDomain_apply, comapDomain_support, ← Finset.coe_subset, coe_preimage,
  support_single_ne_zero _ hm, coe_singleton, coe_singleton, single_eq_same]
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
a : α
m : M
hif : Set.InjOn f (f ⁻¹' ↑(single (f a) m).support)
hm : m ≠ 0
⊢ f ⁻¹' {f a} ⊆ {a} ∧ m = m
[PROOFSTEP]
rw [support_single_ne_zero _ hm, coe_singleton] at hif 
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α → β
a : α
m : M
hif : Set.InjOn f (f ⁻¹' {f a})
hm : m ≠ 0
⊢ f ⁻¹' {f a} ⊆ {a} ∧ m = m
[PROOFSTEP]
exact ⟨fun x hx => hif hx rfl hx, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddZeroClass M
f : α → β
v₁ v₂ : β →₀ M
hv₁ : Set.InjOn f (f ⁻¹' ↑v₁.support)
hv₂ : Set.InjOn f (f ⁻¹' ↑v₂.support)
hv₁₂ : Set.InjOn f (f ⁻¹' ↑(v₁ + v₂).support)
⊢ comapDomain f (v₁ + v₂) hv₁₂ = comapDomain f v₁ hv₁ + comapDomain f v₂ hv₂
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddZeroClass M
f : α → β
v₁ v₂ : β →₀ M
hv₁ : Set.InjOn f (f ⁻¹' ↑v₁.support)
hv₂ : Set.InjOn f (f ⁻¹' ↑v₂.support)
hv₁₂ : Set.InjOn f (f ⁻¹' ↑(v₁ + v₂).support)
a✝ : α
⊢ ↑(comapDomain f (v₁ + v₂) hv₁₂) a✝ = ↑(comapDomain f v₁ hv₁ + comapDomain f v₂ hv₂) a✝
[PROOFSTEP]
simp only [comapDomain_apply, coe_add, Pi.add_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
⊢ mapDomain f (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support))) = l
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
⊢ ↑(mapDomain f (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support)))) a = ↑l a
[PROOFSTEP]
by_cases h_cases : a ∈ Set.range f
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
h_cases : a ∈ Set.range f
⊢ ↑(mapDomain f (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support)))) a = ↑l a
[PROOFSTEP]
rcases Set.mem_range.1 h_cases with ⟨b, hb⟩
[GOAL]
case pos.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
h_cases : a ∈ Set.range f
b : α
hb : f b = a
⊢ ↑(mapDomain f (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support)))) a = ↑l a
[PROOFSTEP]
rw [hb.symm, mapDomain_apply hf, comapDomain_apply]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
h_cases : ¬a ∈ Set.range f
⊢ ↑(mapDomain f (comapDomain f l (_ : Set.InjOn f (f ⁻¹' ↑l.support)))) a = ↑l a
[PROOFSTEP]
rw [mapDomain_notin_range _ _ h_cases]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
h_cases : ¬a ∈ Set.range f
⊢ 0 = ↑l a
[PROOFSTEP]
by_contra h_contr
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f : α → β
hf : Injective f
l : β →₀ M
hl : ↑l.support ⊆ Set.range f
a : β
h_cases : ¬a ∈ Set.range f
h_contr : ¬0 = ↑l a
⊢ False
[PROOFSTEP]
apply h_cases (hl <| Finset.mem_coe.2 <| mem_support_iff.2 fun h => h_contr h.symm)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : Option α →₀ M
x✝ : α
⊢ x✝ ∈ Option.some ⁻¹' ↑f.support →
    ∀ ⦃x₂ : α⦄, x₂ ∈ Option.some ⁻¹' ↑f.support → Option.some x✝ = Option.some x₂ → x✝ = x₂
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
⊢ some 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a✝ : α
⊢ ↑(some 0) a✝ = ↑0 a✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f g : Option α →₀ M
⊢ some (f + g) = some f + some g
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
f g : Option α →₀ M
a✝ : α
⊢ ↑(some (f + g)) a✝ = ↑(some f + some g) a✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
m : M
⊢ some (single none m) = 0
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
m : M
a✝ : α
⊢ ↑(some (single none m)) a✝ = ↑0 a✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
⊢ some (single (Option.some a) m) = single a m
[PROOFSTEP]
classical
ext b
simp [single_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
⊢ some (single (Option.some a) m) = single a m
[PROOFSTEP]
ext b
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
a : α
m : M
b : α
⊢ ↑(some (single (Option.some a) m)) b = ↑(single a m) b
[PROOFSTEP]
simp [single_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ prod f b = b none (↑f none) * prod (some f) fun a => b (Option.some a)
[PROOFSTEP]
classical
apply induction_linear f
· simp [some_zero, h_zero]
· intro f₁ f₂ h₁ h₂
  rw [Finsupp.prod_add_index, h₁, h₂, some_add, Finsupp.prod_add_index]
  simp only [h_add, Pi.add_apply, Finsupp.coe_add]
  rw [mul_mul_mul_comm]
  all_goals simp [h_zero, h_add]
· rintro (_ | a) m <;> simp [h_zero, h_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ prod f b = b none (↑f none) * prod (some f) fun a => b (Option.some a)
[PROOFSTEP]
apply induction_linear f
[GOAL]
case h0
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ prod 0 b = b none (↑0 none) * prod (some 0) fun a => b (Option.some a)
[PROOFSTEP]
simp [some_zero, h_zero]
[GOAL]
case hadd
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ ∀ (f g : Option α →₀ M),
    (prod f b = b none (↑f none) * prod (some f) fun a => b (Option.some a)) →
      (prod g b = b none (↑g none) * prod (some g) fun a => b (Option.some a)) →
        prod (f + g) b = b none (↑(f + g) none) * prod (some (f + g)) fun a => b (Option.some a)
[PROOFSTEP]
intro f₁ f₂ h₁ h₂
[GOAL]
case hadd
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ prod (f₁ + f₂) b = b none (↑(f₁ + f₂) none) * prod (some (f₁ + f₂)) fun a => b (Option.some a)
[PROOFSTEP]
rw [Finsupp.prod_add_index, h₁, h₂, some_add, Finsupp.prod_add_index]
[GOAL]
case hadd
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ (b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)) *
      (b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)) =
    b none (↑(f₁ + f₂) none) * ((prod (some f₁) fun a => b (Option.some a)) * prod (some f₂) fun a => b (Option.some a))
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂
[PROOFSTEP]
simp only [h_add, Pi.add_apply, Finsupp.coe_add]
[GOAL]
case hadd
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ (b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)) *
      (b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)) =
    b none (↑f₁ none) * b none (↑f₂ none) *
      ((prod (some f₁) fun a => b (Option.some a)) * prod (some f₂) fun a => b (Option.some a))
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂
[PROOFSTEP]
rw [mul_mul_mul_comm]
[GOAL]
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂
[PROOFSTEP]
all_goals simp [h_zero, h_add]
[GOAL]
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
case hadd.h_zero
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
case hadd.h_add
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
case hsingle
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ ∀ (a : Option α) (b_1 : M),
    prod (single a b_1) b = b none (↑(single a b_1) none) * prod (some (single a b_1)) fun a => b (Option.some a)
[PROOFSTEP]
rintro (_ | a) m
[GOAL]
case hsingle.none
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
m : M
⊢ prod (single none m) b = b none (↑(single none m) none) * prod (some (single none m)) fun a => b (Option.some a)
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
case hsingle.some
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
a : α
m : M
⊢ prod (single (Option.some a) m) b =
    b none (↑(single (Option.some a) m) none) * prod (some (single (Option.some a) m)) fun a => b (Option.some a)
[PROOFSTEP]
simp [h_zero, h_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
⊢ a ∈ Finset.filter (fun a => p a) f.support ↔ (fun a => if p a then ↑f a else 0) a ≠ 0
[PROOFSTEP]
simp only
  -- porting note: necessary to beta reduce to activate `split_ifs`
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
⊢ a ∈ Finset.filter (fun a => p a) f.support ↔ (if p a then ↑f a else 0) ≠ 0
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
h : p a
⊢ a ∈ Finset.filter (fun a => p a) f.support ↔ ↑f a ≠ 0
[PROOFSTEP]
simp only [h, @mem_filter _ _ (Classical.decPred p), mem_support_iff]
  -- porting note: I needed to provide the instance explicitly
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
h : p a
⊢ ↑f a ≠ 0 ∧ True ↔ ↑f a ≠ 0
[PROOFSTEP]
tauto
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
h : ¬p a
⊢ a ∈ Finset.filter (fun a => p a) f.support ↔ 0 ≠ 0
[PROOFSTEP]
simp only [h, @mem_filter _ _ (Classical.decPred p), mem_support_iff]
  -- porting note: I needed to provide the instance explicitly
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ : α → Prop
f✝ : α →₀ M
p : α → Prop
f : α →₀ M
a : α
h : ¬p a
⊢ ↑f a ≠ 0 ∧ False ↔ 0 ≠ 0
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
a : α
D : Decidable (p a)
⊢ ↑(filter p f) a = if p a then ↑f a else 0
[PROOFSTEP]
rw [Subsingleton.elim D]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
a : α
D : Decidable (p a)
⊢ ↑(filter p f) a = if p a then ↑f a else 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ filter p f = 0 ↔ ∀ (x : α), p x → ↑f x = 0
[PROOFSTEP]
simp only [FunLike.ext_iff, filter_eq_indicator, zero_apply, Set.indicator_apply_eq_zero, Set.mem_setOf_eq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ filter p f = f ↔ ∀ (x : α), ↑f x ≠ 0 → p x
[PROOFSTEP]
simp only [FunLike.ext_iff, filter_eq_indicator, Set.indicator_apply_eq_self, Set.mem_setOf_eq, not_imp_comm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
D : DecidablePred p
⊢ (filter p f).support = Finset.filter p f.support
[PROOFSTEP]
rw [Subsingleton.elim D]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
D : DecidablePred p
⊢ (filter p f).support = Finset.filter p f.support
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ filter p 0 = 0
[PROOFSTEP]
classical rw [← support_eq_empty, support_filter, support_zero, Finset.filter_empty]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ filter p 0 = 0
[PROOFSTEP]
rw [← support_eq_empty, support_filter, support_zero, Finset.filter_empty]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
⊢ prod (filter p f) g = ∏ x in (filter p f).support, g x (↑f x)
[PROOFSTEP]
classical
refine' Finset.prod_congr rfl fun x hx => _
rw [support_filter, Finset.mem_filter] at hx 
rw [filter_apply_pos _ _ hx.2]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
⊢ prod (filter p f) g = ∏ x in (filter p f).support, g x (↑f x)
[PROOFSTEP]
refine' Finset.prod_congr rfl fun x hx => _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
x : α
hx : x ∈ (filter p f).support
⊢ g x (↑(filter p f) x) = g x (↑f x)
[PROOFSTEP]
rw [support_filter, Finset.mem_filter] at hx 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
x : α
hx : x ∈ f.support ∧ p x
⊢ g x (↑(filter p f) x) = g x (↑f x)
[PROOFSTEP]
rw [filter_apply_pos _ _ hx.2]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
⊢ prod (filter p f) g * prod (filter (fun a => ¬p a) f) g = prod f g
[PROOFSTEP]
classical simp_rw [prod_filter_index, support_filter, Finset.prod_filter_mul_prod_filter_not, Finsupp.prod]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
f : α →₀ M
inst✝ : CommMonoid N
g : α → M → N
⊢ prod (filter p f) g * prod (filter (fun a => ¬p a) f) g = prod f g
[PROOFSTEP]
simp_rw [prod_filter_index, support_filter, Finset.prod_filter_mul_prod_filter_not, Finsupp.prod]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α →₀ M
y : M
⊢ y ∈ frange f ↔ y ≠ 0 ∧ ∃ x, ↑f x = y
[PROOFSTEP]
rw [frange, @Finset.mem_image _ _ (Classical.decEq _) _ f.support]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
f : α →₀ M
y : M
⊢ (∃ a, a ∈ f.support ∧ ↑f a = y) ↔ y ≠ 0 ∧ ∃ x, ↑f x = y
[PROOFSTEP]
exact
  ⟨fun ⟨x, hx1, hx2⟩ => ⟨hx2 ▸ mem_support_iff.1 hx1, x, hx2⟩, fun ⟨hy, x, hx⟩ =>
    ⟨x, mem_support_iff.2 (hx.symm ▸ hy), hx⟩⟩
    -- porting note: maybe there is a better way to fix this, but (1) it wasn't seeing past `frange`
      -- the definition, and (2) it needed the `Classical.decEq` instance again.
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α
y r : M
hr : r ∈ frange (single x y)
t : r ≠ 0
ht1 : α
ht2 : ↑(single x y) ht1 = r
⊢ ↑(single x y) ht1 ∈ {y}
[PROOFSTEP]
classical
rw [single_apply] at ht2 ⊢
split_ifs at ht2 ⊢
· exact Finset.mem_singleton_self _
· exact (t ht2.symm).elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α
y r : M
hr : r ∈ frange (single x y)
t : r ≠ 0
ht1 : α
ht2 : ↑(single x y) ht1 = r
⊢ ↑(single x y) ht1 ∈ {y}
[PROOFSTEP]
rw [single_apply] at ht2 ⊢
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α
y r : M
hr : r ∈ frange (single x y)
t : r ≠ 0
ht1 : α
ht2✝ : ↑(single x y) ht1 = r
ht2 : (if x = ht1 then y else 0) = r
⊢ (if x = ht1 then y else 0) ∈ {y}
[PROOFSTEP]
split_ifs at ht2 ⊢
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α
y r : M
hr : r ∈ frange (single x y)
t : r ≠ 0
ht1 : α
ht2✝ : ↑(single x y) ht1 = r
h✝ : x = ht1
ht2 : y = r
⊢ y ∈ {y}
[PROOFSTEP]
exact Finset.mem_singleton_self _
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
x : α
y r : M
hr : r ∈ frange (single x y)
t : r ≠ 0
ht1 : α
ht2✝ : ↑(single x y) ht1 = r
h✝ : ¬x = ht1
ht2 : 0 = r
⊢ 0 ∈ {y}
[PROOFSTEP]
exact (t ht2.symm).elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ p : α → Prop
f : α →₀ M
a : Subtype p
⊢ a ∈ Finset.subtype p f.support ↔ (↑f ∘ Subtype.val) a ≠ 0
[PROOFSTEP]
simp only [@mem_subtype _ _ (Classical.decPred p), mem_support_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p✝ p : α → Prop
f : α →₀ M
a : Subtype p
⊢ ↑f ↑a ≠ 0 ↔ (↑f ∘ Subtype.val) a ≠ 0
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
D : DecidablePred p
f : α →₀ M
⊢ (subtypeDomain p f).support = Finset.subtype p f.support
[PROOFSTEP]
rw [Subsingleton.elim D]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
D : DecidablePred p
f : α →₀ M
⊢ (subtypeDomain p f).support = Finset.subtype p f.support
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ subtypeDomain p f = 0 ↔ ∀ (x : α), p x → ↑f x = 0
[PROOFSTEP]
classical simp_rw [← support_eq_empty, support_subtypeDomain, subtype_eq_empty, not_mem_support_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
⊢ subtypeDomain p f = 0 ↔ ∀ (x : α), p x → ↑f x = 0
[PROOFSTEP]
simp_rw [← support_eq_empty, support_subtypeDomain, subtype_eq_empty, not_mem_support_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H✝ : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
hf : ∀ (x : α), x ∈ f.support → p x
H : ∀ (x : α), p x → ↑f x = 0
x : α
⊢ ↑f x = ↑0 x
[PROOFSTEP]
classical exact if hx : p x then H x hx else not_mem_support_iff.1 <| mt (hf x) hx
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H✝ : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
hf : ∀ (x : α), x ∈ f.support → p x
H : ∀ (x : α), p x → ↑f x = 0
x : α
⊢ ↑f x = ↑0 x
[PROOFSTEP]
exact if hx : p x then H x hx else not_mem_support_iff.1 <| mt (hf x) hx
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H✝ : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Zero M
p : α → Prop
f : α →₀ M
hf : ∀ (x : α), x ∈ f.support → p x
H : f = 0
x : α
x✝ : p x
⊢ ↑f x = 0
[PROOFSTEP]
simp [H]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
inst✝ : CommMonoid N
v : α →₀ M
h : α → M → N
hp : ∀ (x : α), x ∈ v.support → p x
x✝ : Subtype p
⊢ ∀ (ha : x✝ ∈ (subtypeDomain p v).support), (fun p_1 x => ↑p_1) x✝ ha ∈ v.support
[PROOFSTEP]
classical exact mem_subtype.1
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
inst✝ : CommMonoid N
v : α →₀ M
h : α → M → N
hp : ∀ (x : α), x ∈ v.support → p x
x✝ : Subtype p
⊢ ∀ (ha : x✝ ∈ (subtypeDomain p v).support), (fun p_1 x => ↑p_1) x✝ ha ∈ v.support
[PROOFSTEP]
exact mem_subtype.1
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
inst✝ : CommMonoid N
v : α →₀ M
h : α → M → N
hp : ∀ (x : α), x ∈ v.support → p x
b : α
hb : b ∈ v.support
⊢ { val := b, property := (_ : p b) } ∈ (subtypeDomain p v).support
[PROOFSTEP]
classical exact mem_subtype.2 hb
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
p : α → Prop
inst✝ : CommMonoid N
v : α →₀ M
h : α → M → N
hp : ∀ (x : α), x ∈ v.support → p x
b : α
hb : b ∈ v.support
⊢ { val := b, property := (_ : p b) } ∈ (subtypeDomain p v).support
[PROOFSTEP]
exact mem_subtype.2 hb
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
p✝ p : α → Prop
D : DecidablePred p
f : α →₀ M
⊢ (filter p f).support = Finset.filter p f.support
[PROOFSTEP]
rw [Subsingleton.elim D]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
p✝ p : α → Prop
D : DecidablePred p
f : α →₀ M
⊢ (filter p f).support = Finset.filter p f.support
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
p✝ p : α → Prop
D : DecidablePred p
f : α →₀ M
x : α
hx : x ∈ Finset.filter p f.support
⊢ single x (↑(filter p f) x) = single x (↑f x)
[PROOFSTEP]
rw [filter_apply_pos _ _ (mem_filter.1 hx).2]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s : Multiset (α →₀ M)
a : α
h : a ∈ (Multiset.sum 0).support
⊢ False
[PROOFSTEP]
simp at h 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s : Multiset (α →₀ M)
a : α
⊢ ∀ ⦃a_1 : α →₀ M⦄ {s : Multiset (α →₀ M)},
    (a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support) →
      a ∈ (Multiset.sum (a_1 ::ₘ s)).support → ∃ f, f ∈ a_1 ::ₘ s ∧ a ∈ f.support
[PROOFSTEP]
intro f s ih ha
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s✝ : Multiset (α →₀ M)
a : α
f : α →₀ M
s : Multiset (α →₀ M)
ih : a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support
ha : a ∈ (Multiset.sum (f ::ₘ s)).support
⊢ ∃ f_1, f_1 ∈ f ::ₘ s ∧ a ∈ f_1.support
[PROOFSTEP]
by_cases h : a ∈ f.support
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s✝ : Multiset (α →₀ M)
a : α
f : α →₀ M
s : Multiset (α →₀ M)
ih : a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support
ha : a ∈ (Multiset.sum (f ::ₘ s)).support
h : a ∈ f.support
⊢ ∃ f_1, f_1 ∈ f ::ₘ s ∧ a ∈ f_1.support
[PROOFSTEP]
exact ⟨f, Multiset.mem_cons_self _ _, h⟩
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s✝ : Multiset (α →₀ M)
a : α
f : α →₀ M
s : Multiset (α →₀ M)
ih : a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support
ha : a ∈ (Multiset.sum (f ::ₘ s)).support
h : ¬a ∈ f.support
⊢ ∃ f_1, f_1 ∈ f ::ₘ s ∧ a ∈ f_1.support
[PROOFSTEP]
simp only [Multiset.sum_cons, mem_support_iff, add_apply, not_mem_support_iff.1 h, zero_add] at ha 
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s✝ : Multiset (α →₀ M)
a : α
f : α →₀ M
s : Multiset (α →₀ M)
ih : a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support
h : ¬a ∈ f.support
ha : ↑(Multiset.sum s) a ≠ 0
⊢ ∃ f_1, f_1 ∈ f ::ₘ s ∧ a ∈ f_1.support
[PROOFSTEP]
rcases ih (mem_support_iff.2 ha) with ⟨f', h₀, h₁⟩
[GOAL]
case neg.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
s✝ : Multiset (α →₀ M)
a : α
f : α →₀ M
s : Multiset (α →₀ M)
ih : a ∈ (Multiset.sum s).support → ∃ f, f ∈ s ∧ a ∈ f.support
h : ¬a ∈ f.support
ha : ↑(Multiset.sum s) a ≠ 0
f' : α →₀ M
h₀ : f' ∈ s
h₁ : a ∈ f'.support
⊢ ∃ f_1, f_1 ∈ f ::ₘ s ∧ a ∈ f_1.support
[PROOFSTEP]
exact ⟨f', Multiset.mem_cons_of_mem h₀, h₁⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
⊢ ↑(↑(Finsupp.curry f) x) y = ↑f (x, y)
[PROOFSTEP]
classical
have : ∀ b : α × β, single b.fst (single b.snd (f b)) x y = if b = (x, y) then f b else 0 :=
  by
  rintro ⟨b₁, b₂⟩
  simp [single_apply, ite_apply, Prod.ext_iff, ite_and]
  split_ifs <;> simp [single_apply, *]
rw [Finsupp.curry, sum_apply, sum_apply, Finsupp.sum, Finset.sum_eq_single, this, if_pos rfl]
· intro b _ b_ne
  rw [this b, if_neg b_ne]
· intro hxy
  rw [this (x, y), if_pos rfl, not_mem_support_iff.mp hxy]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
⊢ ↑(↑(Finsupp.curry f) x) y = ↑f (x, y)
[PROOFSTEP]
have : ∀ b : α × β, single b.fst (single b.snd (f b)) x y = if b = (x, y) then f b else 0 :=
  by
  rintro ⟨b₁, b₂⟩
  simp [single_apply, ite_apply, Prod.ext_iff, ite_and]
  split_ifs <;> simp [single_apply, *]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
⊢ ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
[PROOFSTEP]
rintro ⟨b₁, b₂⟩
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
⊢ ↑(↑(single (b₁, b₂).fst (single (b₁, b₂).snd (↑f (b₁, b₂)))) x) y = if (b₁, b₂) = (x, y) then ↑f (b₁, b₂) else 0
[PROOFSTEP]
simp [single_apply, ite_apply, Prod.ext_iff, ite_and]
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
⊢ ↑(if b₁ = x then single b₂ (↑f (b₁, b₂)) else 0) y = if b₁ = x then if b₂ = y then ↑f (b₁, b₂) else 0 else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
h✝¹ : b₁ = x
h✝ : b₂ = y
⊢ ↑(single b₂ (↑f (b₁, b₂))) y = ↑f (b₁, b₂)
[PROOFSTEP]
simp [single_apply, *]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
h✝¹ : b₁ = x
h✝ : ¬b₂ = y
⊢ ↑(single b₂ (↑f (b₁, b₂))) y = 0
[PROOFSTEP]
simp [single_apply, *]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
h✝ : ¬b₁ = x
⊢ ↑0 y = 0
[PROOFSTEP]
simp [single_apply, *]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ↑(↑(Finsupp.curry f) x) y = ↑f (x, y)
[PROOFSTEP]
rw [Finsupp.curry, sum_apply, sum_apply, Finsupp.sum, Finset.sum_eq_single, this, if_pos rfl]
[GOAL]
case h₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ∀ (b : α × β), b ∈ f.support → b ≠ (x, y) → ↑(↑(single b.fst (single b.snd (↑f b))) x) y = 0
[PROOFSTEP]
intro b _ b_ne
[GOAL]
case h₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
b : α × β
a✝ : b ∈ f.support
b_ne : b ≠ (x, y)
⊢ ↑(↑(single b.fst (single b.snd (↑f b))) x) y = 0
[PROOFSTEP]
rw [this b, if_neg b_ne]
[GOAL]
case h₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ¬(x, y) ∈ f.support → ↑(↑(single (x, y).fst (single (x, y).snd (↑f (x, y)))) x) y = 0
[PROOFSTEP]
intro hxy
[GOAL]
case h₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
hxy : ¬(x, y) ∈ f.support
⊢ ↑(↑(single (x, y).fst (single (x, y).snd (↑f (x, y)))) x) y = 0
[PROOFSTEP]
rw [this (x, y), if_pos rfl, not_mem_support_iff.mp hxy]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
⊢ (sum (Finsupp.curry f) fun a f => sum f (g a)) = sum f fun p c => g p.fst p.snd c
[PROOFSTEP]
rw [Finsupp.curry]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
⊢ (sum (sum f fun p c => single p.fst (single p.snd c)) fun a f => sum f (g a)) = sum f fun p c => g p.fst p.snd c
[PROOFSTEP]
trans
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
⊢ (sum (sum f fun p c => single p.fst (single p.snd c)) fun a f => sum f (g a)) = ?m.537688
[PROOFSTEP]
exact
  sum_sum_index (fun a => sum_zero_index) fun a b₀ b₁ => sum_add_index' (fun a => hg₀ _ _) fun c d₀ d₁ => hg₁ _ _ _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
⊢ (sum f fun a b => sum (single a.fst (single a.snd b)) fun a f => sum f (g a)) = sum f fun p c => g p.fst p.snd c
[PROOFSTEP]
congr
[GOAL]
case e_g
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
⊢ (fun a b => sum (single a.fst (single a.snd b)) fun a f => sum f (g a)) = fun p c => g p.fst p.snd c
[PROOFSTEP]
funext p c
[GOAL]
case e_g.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
p : α × β
c : M
⊢ (sum (single p.fst (single p.snd c)) fun a f => sum f (g a)) = g p.fst p.snd c
[PROOFSTEP]
trans
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
p : α × β
c : M
⊢ (sum (single p.fst (single p.snd c)) fun a f => sum f (g a)) = ?m.538719
[PROOFSTEP]
exact sum_single_index sum_zero_index
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
g : α → β → M → N
hg₀ : ∀ (a : α) (b : β), g a b 0 = 0
hg₁ : ∀ (a : α) (b : β) (c₀ c₁ : M), g a b (c₀ + c₁) = g a b c₀ + g a b c₁
p : α × β
c : M
⊢ sum (single p.snd c) (g p.fst) = g p.fst p.snd c
[PROOFSTEP]
exact sum_single_index (hg₀ _ _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
⊢ Finsupp.uncurry (Finsupp.curry f) = f
[PROOFSTEP]
rw [Finsupp.uncurry, sum_curry_index]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
⊢ (sum f fun p c => single (p.fst, p.snd) c) = f
[PROOFSTEP]
simp_rw [Prod.mk.eta, sum_single]
[GOAL]
case hg₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
⊢ ∀ (a : α) (b : β), single (a, b) 0 = 0
[PROOFSTEP]
intros
[GOAL]
case hg₀
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
a✝ : α
b✝ : β
⊢ single (a✝, b✝) 0 = 0
[PROOFSTEP]
apply single_zero
[GOAL]
case hg₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
⊢ ∀ (a : α) (b : β) (c₀ c₁ : M), single (a, b) (c₀ + c₁) = single (a, b) c₀ + single (a, b) c₁
[PROOFSTEP]
intros
[GOAL]
case hg₁
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
a✝ : α
b✝ : β
c₀✝ c₁✝ : M
⊢ single (a✝, b✝) (c₀✝ + c₁✝) = single (a✝, b✝) c₀✝ + single (a✝, b✝) c₁✝
[PROOFSTEP]
apply single_add
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α →₀ β →₀ M
⊢ Finsupp.curry (Finsupp.uncurry f) = f
[PROOFSTEP]
simp only [Finsupp.curry, Finsupp.uncurry, sum_sum_index, sum_zero_index, sum_add_index, sum_single_index, single_zero,
  single_add, eq_self_iff_true, forall_true_iff, forall₃_true_iff, Prod.mk.eta, (single_sum _ _ _).symm, sum_single]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
⊢ Finsupp.curry (filter (fun a => p a.fst) f) = filter p (Finsupp.curry f)
[PROOFSTEP]
classical
rw [Finsupp.curry, Finsupp.curry, Finsupp.sum, Finsupp.sum, filter_sum, support_filter, sum_filter]
refine' Finset.sum_congr rfl _
rintro ⟨a₁, a₂⟩ _
dsimp only
split_ifs with h
· rw [filter_apply_pos, filter_single_of_pos] <;> exact h
· rwa [filter_single_of_neg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
⊢ Finsupp.curry (filter (fun a => p a.fst) f) = filter p (Finsupp.curry f)
[PROOFSTEP]
rw [Finsupp.curry, Finsupp.curry, Finsupp.sum, Finsupp.sum, filter_sum, support_filter, sum_filter]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
⊢ (∑ a in f.support, if p a.fst then single a.fst (single a.snd (↑(filter (fun a => p a.fst) f) a)) else 0) =
    ∑ a in f.support, filter p (single a.fst (single a.snd (↑f a)))
[PROOFSTEP]
refine' Finset.sum_congr rfl _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
⊢ ∀ (x : α × β),
    x ∈ f.support →
      (if p x.fst then single x.fst (single x.snd (↑(filter (fun a => p a.fst) f) x)) else 0) =
        filter p (single x.fst (single x.snd (↑f x)))
[PROOFSTEP]
rintro ⟨a₁, a₂⟩ _
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
⊢ (if p (a₁, a₂).fst then single (a₁, a₂).fst (single (a₁, a₂).snd (↑(filter (fun a => p a.fst) f) (a₁, a₂))) else 0) =
    filter p (single (a₁, a₂).fst (single (a₁, a₂).snd (↑f (a₁, a₂))))
[PROOFSTEP]
dsimp only
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
⊢ (if p a₁ then single a₁ (single a₂ (↑(filter (fun a => p a.fst) f) (a₁, a₂))) else 0) =
    filter p (single a₁ (single a₂ (↑f (a₁, a₂))))
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : p a₁
⊢ single a₁ (single a₂ (↑(filter (fun a => p a.fst) f) (a₁, a₂))) = filter p (single a₁ (single a₂ (↑f (a₁, a₂))))
[PROOFSTEP]
rw [filter_apply_pos, filter_single_of_pos]
[GOAL]
case pos.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : p a₁
⊢ p a₁
[PROOFSTEP]
exact h
[GOAL]
case pos.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : p a₁
⊢ p (a₁, a₂).fst
[PROOFSTEP]
exact h
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : ¬p a₁
⊢ 0 = filter p (single a₁ (single a₂ (↑f (a₁, a₂))))
[PROOFSTEP]
rwa [filter_single_of_neg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : DecidableEq α
f : α × β →₀ M
⊢ (Finsupp.curry f).support ⊆ image Prod.fst f.support
[PROOFSTEP]
rw [← Finset.biUnion_singleton]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : DecidableEq α
f : α × β →₀ M
⊢ (Finsupp.curry f).support ⊆ Finset.biUnion f.support fun a => {a.fst}
[PROOFSTEP]
refine' Finset.Subset.trans support_sum _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
inst✝ : DecidableEq α
f : α × β →₀ M
⊢ (Finset.biUnion f.support fun a => (single a.fst (single a.snd (↑f a))).support) ⊆
    Finset.biUnion f.support fun a => {a.fst}
[PROOFSTEP]
refine' Finset.biUnion_mono fun a _ => support_single_subset
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
⊢ Finset (α ⊕ β)
[PROOFSTEP]
haveI := Classical.decEq α
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
this : DecidableEq α
⊢ Finset (α ⊕ β)
[PROOFSTEP]
haveI := Classical.decEq β
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
this✝ : DecidableEq α
this : DecidableEq β
⊢ Finset (α ⊕ β)
[PROOFSTEP]
exact f.support.map ⟨_, Sum.inl_injective⟩ ∪ g.support.map ⟨_, Sum.inr_injective⟩
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
ab : α ⊕ β
h : Sum.elim (↑f) (↑g) ab ≠ 0
⊢ ab ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
cases' ab with a b
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
a : α
h : Sum.elim (↑f) (↑g) (Sum.inl a) ≠ 0
⊢ Sum.inl a ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
letI := Classical.decEq α
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
b : β
h : Sum.elim (↑f) (↑g) (Sum.inr b) ≠ 0
⊢ Sum.inr b ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
letI := Classical.decEq α
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
a : α
h : Sum.elim (↑f) (↑g) (Sum.inl a) ≠ 0
this : DecidableEq α := Classical.decEq α
⊢ Sum.inl a ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
letI := Classical.decEq β
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
b : β
h : Sum.elim (↑f) (↑g) (Sum.inr b) ≠ 0
this : DecidableEq α := Classical.decEq α
⊢ Sum.inr b ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
letI := Classical.decEq β
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
a : α
h : Sum.elim (↑f) (↑g) (Sum.inl a) ≠ 0
this✝ : DecidableEq α := Classical.decEq α
this : DecidableEq β := Classical.decEq β
⊢ Sum.inl a ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
simp only [Sum.elim_inl, Sum.elim_inr] at h 
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
b : β
h : Sum.elim (↑f) (↑g) (Sum.inr b) ≠ 0
this✝ : DecidableEq α := Classical.decEq α
this : DecidableEq β := Classical.decEq β
⊢ Sum.inr b ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
simp only [Sum.elim_inl, Sum.elim_inr] at h 
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
a : α
h : ↑f a ≠ 0
this✝ : DecidableEq α := Classical.decEq α
this : DecidableEq β := Classical.decEq β
⊢ Sum.inl a ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
simpa
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α →₀ γ
g : β →₀ γ
b : β
h : ↑g b ≠ 0
this✝ : DecidableEq α := Classical.decEq α
this : DecidableEq β := Classical.decEq β
⊢ Sum.inr b ∈
    map { toFun := Sum.inl, inj' := (_ : Injective Sum.inl) } f.support ∪
      map { toFun := Sum.inr, inj' := (_ : Injective Sum.inr) } g.support
[PROOFSTEP]
simpa
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α ⊕ β →₀ γ
⊢ (fun fg => sumElim fg.fst fg.snd)
      ((fun f =>
          (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
            comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
        f) =
    f
[PROOFSTEP]
ext ab
[GOAL]
case h
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α ⊕ β →₀ γ
ab : α ⊕ β
⊢ ↑((fun fg => sumElim fg.fst fg.snd)
          ((fun f =>
              (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
                comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
            f))
      ab =
    ↑f ab
[PROOFSTEP]
cases' ab with a b
[GOAL]
case h.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α ⊕ β →₀ γ
a : α
⊢ ↑((fun fg => sumElim fg.fst fg.snd)
          ((fun f =>
              (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
                comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
            f))
      (Sum.inl a) =
    ↑f (Sum.inl a)
[PROOFSTEP]
simp
[GOAL]
case h.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
f : α ⊕ β →₀ γ
b : β
⊢ ↑((fun fg => sumElim fg.fst fg.snd)
          ((fun f =>
              (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
                comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
            f))
      (Sum.inr b) =
    ↑f (Sum.inr b)
[PROOFSTEP]
simp
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
fg : (α →₀ γ) × (β →₀ γ)
⊢ (fun f =>
        (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
          comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
      ((fun fg => sumElim fg.fst fg.snd) fg) =
    fg
[PROOFSTEP]
ext
[GOAL]
case h₁.h
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
fg : (α →₀ γ) × (β →₀ γ)
a✝ : α
⊢ ↑((fun f =>
              (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
                comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
            ((fun fg => sumElim fg.fst fg.snd) fg)).fst
      a✝ =
    ↑fg.fst a✝
[PROOFSTEP]
simp
[GOAL]
case h₂.h
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
α : Type u_13
β : Type u_14
γ : Type u_15
inst✝ : Zero γ
fg : (α →₀ γ) × (β →₀ γ)
a✝ : β
⊢ ↑((fun f =>
              (comapDomain Sum.inl f (_ : Set.InjOn Sum.inl (Sum.inl ⁻¹' ↑f.support)),
                comapDomain Sum.inr f (_ : Set.InjOn Sum.inr (Sum.inr ⁻¹' ↑f.support))))
            ((fun fg => sumElim fg.fst fg.snd) fg)).snd
      a✝ =
    ↑fg.snd a✝
[PROOFSTEP]
simp
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddMonoid M
α : Type u_13
β : Type u_14
src✝ : (α ⊕ β →₀ M) ≃ (α →₀ M) × (β →₀ M) := sumFinsuppEquivProdFinsupp
⊢ ∀ (x y : α ⊕ β →₀ M),
    Equiv.toFun
        { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
          right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        (x + y) =
      Equiv.toFun
          { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
          x +
        Equiv.toFun
          { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
          y
[PROOFSTEP]
intros
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddMonoid M
α : Type u_13
β : Type u_14
src✝ : (α ⊕ β →₀ M) ≃ (α →₀ M) × (β →₀ M) := sumFinsuppEquivProdFinsupp
x✝ y✝ : α ⊕ β →₀ M
⊢ Equiv.toFun
      { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
        right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
      (x✝ + y✝) =
    Equiv.toFun
        { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
          right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        x✝ +
      Equiv.toFun
        { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
          right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        y✝
[PROOFSTEP]
ext
[GOAL]
case h₁.h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddMonoid M
α : Type u_13
β : Type u_14
src✝ : (α ⊕ β →₀ M) ≃ (α →₀ M) × (β →₀ M) := sumFinsuppEquivProdFinsupp
x✝ y✝ : α ⊕ β →₀ M
a✝ : α
⊢ ↑(Equiv.toFun
            { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
              right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
            (x✝ + y✝)).fst
      a✝ =
    ↑(Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              x✝ +
            Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              y✝).fst
      a✝
[PROOFSTEP]
simp only [Equiv.toFun_as_coe, Prod.fst_add, Prod.snd_add, add_apply, snd_sumFinsuppEquivProdFinsupp,
  fst_sumFinsuppEquivProdFinsupp]
[GOAL]
case h₂.h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddMonoid M
α : Type u_13
β : Type u_14
src✝ : (α ⊕ β →₀ M) ≃ (α →₀ M) × (β →₀ M) := sumFinsuppEquivProdFinsupp
x✝ y✝ : α ⊕ β →₀ M
a✝ : β
⊢ ↑(Equiv.toFun
            { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
              right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
            (x✝ + y✝)).snd
      a✝ =
    ↑(Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              x✝ +
            Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              y✝).snd
      a✝
[PROOFSTEP]
simp only [Equiv.toFun_as_coe, Prod.fst_add, Prod.snd_add, add_apply, snd_sumFinsuppEquivProdFinsupp,
  fst_sumFinsuppEquivProdFinsupp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : MonoidWithZero R
inst✝ : MulActionWithZero R M
a b : α
f : α → M
r : R
⊢ ↑(single a r) b • f a = ↑(single a (r • f b)) b
[PROOFSTEP]
by_cases h : a = b
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : MonoidWithZero R
inst✝ : MulActionWithZero R M
a b : α
f : α → M
r : R
h : a = b
⊢ ↑(single a r) b • f a = ↑(single a (r • f b)) b
[PROOFSTEP]
simp [h]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Zero M
inst✝¹ : MonoidWithZero R
inst✝ : MulActionWithZero R M
a b : α
f : α → M
r : R
h : ¬a = b
⊢ ↑(single a r) b • f a = ↑(single a (r • f b)) b
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
f : α →₀ M
⊢ 1 • f = f
[PROOFSTEP]
rw [comapSMul_def, one_smul_eq_id, mapDomain_id]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g g' : G
f : α →₀ M
⊢ (g * g') • f = g • g' • f
[PROOFSTEP]
rw [comapSMul_def, comapSMul_def, comapSMul_def, ← comp_smul_left, mapDomain_comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
⊢ g • 0 = 0
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
a : α
⊢ ↑(g • 0) a = ↑0 a
[PROOFSTEP]
simp only [comapSMul_def]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
a : α
⊢ ↑(mapDomain (fun x => g • x) 0) a = ↑0 a
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f f' : α →₀ M
⊢ g • (f + f') = g • f + g • f'
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f f' : α →₀ M
a✝ : α
⊢ ↑(g • (f + f')) a✝ = ↑(g • f + g • f') a✝
[PROOFSTEP]
simp only [comapSMul_def]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Monoid G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f f' : α →₀ M
a✝ : α
⊢ ↑(mapDomain (fun x => g • x) (f + f')) a✝ = ↑(mapDomain (fun x => g • x) f + mapDomain (fun x => g • x) f') a✝
[PROOFSTEP]
simp [mapDomain_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f : α →₀ M
a : α
⊢ ↑(g • f) a = ↑f (g⁻¹ • a)
[PROOFSTEP]
conv_lhs => rw [← smul_inv_smul g a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f : α →₀ M
a : α
| ↑(g • f) a
[PROOFSTEP]
rw [← smul_inv_smul g a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f : α →₀ M
a : α
| ↑(g • f) a
[PROOFSTEP]
rw [← smul_inv_smul g a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f : α →₀ M
a : α
| ↑(g • f) a
[PROOFSTEP]
rw [← smul_inv_smul g a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : AddCommMonoid M
g : G
f : α →₀ M
a : α
⊢ ↑(g • f) (g • g⁻¹ • a) = ↑f (g⁻¹ • a)
[PROOFSTEP]
exact mapDomain_apply (MulAction.injective g) _ (g⁻¹ • a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : SMulZeroClass R M
a : R
⊢ a • 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : SMulZeroClass R M
a : R
a✝ : α
⊢ ↑(a • 0) a✝ = ↑0 a✝
[PROOFSTEP]
apply smul_zero
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝³ : Nonempty α
inst✝² : Zero M
inst✝¹ : SMulZeroClass R M
inst✝ : FaithfulSMul R M
m₁✝ m₂✝ : R
h : ∀ (a : α →₀ M), m₁✝ • a = m₂✝ • a
a : α
m : M
⊢ m₁✝ • m = m₂✝ • m
[PROOFSTEP]
simpa using FunLike.congr_fun (h (single a m)) a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddMonoid M
inst✝ : SMulZeroClass R M
b : R
g : α →₀ M
a : α
⊢ a ∈ (b • g).support → a ∈ g.support
[PROOFSTEP]
simp only [smul_apply, mem_support_iff, Ne.def]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : AddMonoid M
inst✝ : SMulZeroClass R M
b : R
g : α →₀ M
a : α
⊢ ¬b • ↑g a = 0 → ¬↑g a = 0
[PROOFSTEP]
exact mt fun h => h.symm ▸ smul_zero _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝³ : Semiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
inst✝ : NoZeroSMulDivisors R M
b : R
hb : b ≠ 0
g : α →₀ M
a : α
⊢ a ∈ (b • g).support ↔ a ∈ g.support
[PROOFSTEP]
simp [Finsupp.smul_apply, hb]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ mapRange f hf (c • v) = c • mapRange f hf v
[PROOFSTEP]
erw [← mapRange_comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ mapRange (f ∘ (fun x x_1 => x • x_1) c) ?h v = c • mapRange f hf v
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ (f ∘ (fun x x_1 => x • x_1) c) 0 = 0
[PROOFSTEP]
have : f ∘ (· • ·) c = (· • ·) c ∘ f := funext hsmul
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
this : f ∘ (fun x x_1 => x • x_1) c = (fun x x_1 => x • x_1) c ∘ f
⊢ mapRange (f ∘ (fun x x_1 => x • x_1) c) ?h v = c • mapRange f hf v
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ (f ∘ (fun x x_1 => x • x_1) c) 0 = 0
[PROOFSTEP]
simp_rw [this]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
this : f ∘ (fun x x_1 => x • x_1) c = (fun x x_1 => x • x_1) c ∘ f
⊢ mapRange ((fun x => c • x) ∘ f) (_ : ((fun x => c • x) ∘ f) 0 = 0) v = c • mapRange f hf v
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ (f ∘ (fun x x_1 => x • x_1) c) 0 = 0
[PROOFSTEP]
apply mapRange_comp
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
x✝ : Monoid R
inst✝³ : AddMonoid M
inst✝² : DistribMulAction R M
inst✝¹ : AddMonoid N
inst✝ : DistribMulAction R N
f : M → N
hf : f 0 = 0
c : R
v : α →₀ M
hsmul : ∀ (x : M), f (c • x) = c • f x
⊢ (f ∘ (fun x x_1 => x • x_1) c) 0 = 0
[PROOFSTEP]
simp only [Function.comp_apply, smul_zero, hf]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : Semiring R
a : α
b : R
⊢ b • single a 1 = single a b
[PROOFSTEP]
rw [smul_single, smul_eq_mul, mul_one]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddMonoid M
inst✝¹ : Monoid R
inst✝ : DistribMulAction R M
f : α → β
r : R
v : β →₀ M
hfv : Set.InjOn f (f ⁻¹' ↑v.support)
hfrv : optParam (Set.InjOn f (f ⁻¹' ↑(r • v).support)) (_ : Set.InjOn f (f ⁻¹' ↑(r • v).support))
⊢ comapDomain f (r • v) hfrv = r • comapDomain f v hfv
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddMonoid M
inst✝¹ : Monoid R
inst✝ : DistribMulAction R M
f : α → β
r : R
v : β →₀ M
hfv : Set.InjOn f (f ⁻¹' ↑v.support)
hfrv : optParam (Set.InjOn f (f ⁻¹' ↑(r • v).support)) (_ : Set.InjOn f (f ⁻¹' ↑(r • v).support))
a✝ : α
⊢ ↑(comapDomain f (r • v) hfrv) a✝ = ↑(r • comapDomain f v hfv) a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : DistribMulAction R M
inst✝ : DistribMulAction R N
a : α
src✝ : M →+ α →₀ M := singleAddHom a
k : R
m : M
⊢ ZeroHom.toFun (↑src✝) (k • m) = k • ZeroHom.toFun (↑src✝) m
[PROOFSTEP]
simp only
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : DistribMulAction R M
inst✝ : DistribMulAction R N
a : α
src✝ : M →+ α →₀ M := singleAddHom a
k : R
m : M
⊢ ZeroHom.toFun (↑(singleAddHom a)) (k • m) = k • ZeroHom.toFun (↑(singleAddHom a)) m
[PROOFSTEP]
show singleAddHom a (k • m) = k • singleAddHom a m
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : DistribMulAction R M
inst✝ : DistribMulAction R N
a : α
src✝ : M →+ α →₀ M := singleAddHom a
k : R
m : M
⊢ ↑(singleAddHom a) (k • m) = k • ↑(singleAddHom a) m
[PROOFSTEP]
change
  Finsupp.single a (k • m) =
    k •
      (Finsupp.single a m)
        -- porting note: because `singleAddHom_apply` is missing
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : DistribMulAction R M
inst✝ : DistribMulAction R N
a : α
src✝ : M →+ α →₀ M := singleAddHom a
k : R
m : M
⊢ Finsupp.single a (k • m) = k • Finsupp.single a m
[PROOFSTEP]
simp only [smul_single]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : ↑s →₀ M
⊢ ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s
[PROOFSTEP]
rw [support_embDomain, Finset.coe_map, Set.image_subset_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : ↑s →₀ M
⊢ ↑f.support ⊆ ↑(Embedding.subtype fun x => x ∈ s) ⁻¹' s
[PROOFSTEP]
exact fun x _ => x.2
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
⊢ LeftInverse
    (fun f =>
      { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
        property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
    fun f => subtypeDomain (fun x => x ∈ s) ↑f
[PROOFSTEP]
rintro ⟨f, hf⟩
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
⊢ (fun f =>
        { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
          property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
      ((fun f => subtypeDomain (fun x => x ∈ s) ↑f) { val := f, property := hf }) =
    { val := f, property := hf }
[PROOFSTEP]
ext a
[GOAL]
case mk.a.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : α
⊢ ↑↑((fun f =>
              { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
                property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
            ((fun f => subtypeDomain (fun x => x ∈ s) ↑f) { val := f, property := hf }))
      a =
    ↑↑{ val := f, property := hf } a
[PROOFSTEP]
by_cases h : a ∈ s
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : α
h : a ∈ s
⊢ ↑↑((fun f =>
              { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
                property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
            ((fun f => subtypeDomain (fun x => x ∈ s) ↑f) { val := f, property := hf }))
      a =
    ↑↑{ val := f, property := hf } a
[PROOFSTEP]
lift a to s using h
[GOAL]
case pos.intro
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : { x // x ∈ s }
⊢ ↑↑((fun f =>
              { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
                property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
            ((fun f => subtypeDomain (fun x => x ∈ s) ↑f) { val := f, property := hf }))
      ↑a =
    ↑↑{ val := f, property := hf } ↑a
[PROOFSTEP]
exact embDomain_apply _ _ _
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : α
h : ¬a ∈ s
⊢ ↑↑((fun f =>
              { val := embDomain (Embedding.subtype fun x => x ∈ s) f,
                property := (_ : ↑(embDomain (Embedding.subtype fun x => x ∈ s) f).support ⊆ s) })
            ((fun f => subtypeDomain (fun x => x ∈ s) ↑f) { val := f, property := hf }))
      a =
    ↑↑{ val := f, property := hf } a
[PROOFSTEP]
rw [embDomain_notin_range, eq_comm, ← Finsupp.not_mem_support_iff]
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : α
h : ¬a ∈ s
⊢ ¬a ∈ (↑{ val := f, property := hf }).support
[PROOFSTEP]
exact fun hs => h <| hf hs
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M✝ : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
s : Set α
M : Type u_13
inst✝ : AddCommMonoid M
f : α →₀ M
hf : ↑f.support ⊆ s
a : α
h : ¬a ∈ s
⊢ ¬a ∈ Set.range ↑(Embedding.subtype fun x => x ∈ s)
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
v : α →₀ M
⊢ equivMapDomain e.symm (equivMapDomain e v) = v
[PROOFSTEP]
simp only [← equivMapDomain_trans, Equiv.self_trans_symm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
v : α →₀ M
⊢ equivMapDomain (Equiv.refl α) v = v
[PROOFSTEP]
exact equivMapDomain_refl _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
⊢ Function.RightInverse (equivMapDomain e.symm) (equivMapDomain e)
[PROOFSTEP]
intro v
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
v : β →₀ M
⊢ equivMapDomain e (equivMapDomain e.symm v) = v
[PROOFSTEP]
simp only [← equivMapDomain_trans, Equiv.symm_trans_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
v : β →₀ M
⊢ equivMapDomain (Equiv.refl β) v = v
[PROOFSTEP]
exact equivMapDomain_refl _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
a b : α →₀ M
⊢ Equiv.toFun
      { toFun := equivMapDomain e, invFun := equivMapDomain e.symm,
        left_inv := (_ : ∀ (v : α →₀ M), equivMapDomain e.symm (equivMapDomain e v) = v),
        right_inv := (_ : ∀ (v : β →₀ M), equivMapDomain e (equivMapDomain e.symm v) = v) }
      (a + b) =
    Equiv.toFun
        { toFun := equivMapDomain e, invFun := equivMapDomain e.symm,
          left_inv := (_ : ∀ (v : α →₀ M), equivMapDomain e.symm (equivMapDomain e v) = v),
          right_inv := (_ : ∀ (v : β →₀ M), equivMapDomain e (equivMapDomain e.symm v) = v) }
        a +
      Equiv.toFun
        { toFun := equivMapDomain e, invFun := equivMapDomain e.symm,
          left_inv := (_ : ∀ (v : α →₀ M), equivMapDomain e.symm (equivMapDomain e v) = v),
          right_inv := (_ : ∀ (v : β →₀ M), equivMapDomain e (equivMapDomain e.symm v) = v) }
        b
[PROOFSTEP]
simp only [equivMapDomain_eq_mapDomain]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝ : AddCommMonoid M
e : α ≃ β
a b : α →₀ M
⊢ mapDomain (↑e) (a + b) = mapDomain (↑e) a + mapDomain (↑e) b
[PROOFSTEP]
exact mapDomain_add
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
i : ι
x : αs i
⊢ ↑(split l i) x = ↑l { fst := i, snd := x }
[PROOFSTEP]
dsimp only [split]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
i : ι
x : αs i
⊢ ↑(comapDomain (Sigma.mk i) l
          (_ :
            ∀ (x : αs i),
              x ∈ Sigma.mk i ⁻¹' ↑l.support →
                ∀ (x_2 : αs i),
                  x_2 ∈ Sigma.mk i ⁻¹' ↑l.support → { fst := i, snd := x } = { fst := i, snd := x_2 } → x = x_2))
      x =
    ↑l { fst := i, snd := x }
[PROOFSTEP]
rw [comapDomain_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
i : ι
⊢ i ∈ splitSupport l ↔ split l i ≠ 0
[PROOFSTEP]
rw [splitSupport, @mem_image _ _ (Classical.decEq _), Ne.def, ← support_eq_empty, ← Ne.def, ←
  Finset.nonempty_iff_ne_empty, split, comapDomain, Finset.Nonempty]
  -- porting note: had to add the `Classical.decEq` instance manually
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
i : ι
⊢ (∃ a, a ∈ l.support ∧ a.fst = i) ↔
    ∃ x,
      x ∈
        {
            support :=
              preimage l.support (Sigma.mk i)
                (_ :
                  ∀ (x : αs i),
                    x ∈ Sigma.mk i ⁻¹' ↑l.support →
                      ∀ (x_2 : αs i),
                        x_2 ∈ Sigma.mk i ⁻¹' ↑l.support → { fst := i, snd := x } = { fst := i, snd := x_2 } → x = x_2),
            toFun := fun a => ↑l { fst := i, snd := a },
            mem_support_toFun :=
              (_ :
                ∀ (a : αs i),
                  a ∈
                      preimage l.support (Sigma.mk i)
                        (_ :
                          ∀ (x : αs i),
                            x ∈ Sigma.mk i ⁻¹' ↑l.support →
                              ∀ (x_2 : αs i),
                                x_2 ∈ Sigma.mk i ⁻¹' ↑l.support →
                                  { fst := i, snd := x } = { fst := i, snd := x_2 } → x = x_2) ↔
                    (fun a => ↑l { fst := i, snd := a }) a ≠ 0) }.support
[PROOFSTEP]
simp only [exists_prop, Finset.mem_preimage, exists_and_right, exists_eq_right, mem_support_iff, Sigma.exists, Ne.def]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝¹ : Zero M
l : (i : ι) × αs i →₀ M
inst✝ : Zero N
g : (i : ι) → (αs i →₀ M) → N
hg : ∀ (i : ι) (x : αs i →₀ M), x = 0 ↔ g i x = 0
⊢ ∀ (a : ι), a ∈ splitSupport l ↔ (fun i => g i (split l i)) a ≠ 0
[PROOFSTEP]
intro i
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝¹ : Zero M
l : (i : ι) × αs i →₀ M
inst✝ : Zero N
g : (i : ι) → (αs i →₀ M) → N
hg : ∀ (i : ι) (x : αs i →₀ M), x = 0 ↔ g i x = 0
i : ι
⊢ i ∈ splitSupport l ↔ (fun i => g i (split l i)) i ≠ 0
[PROOFSTEP]
rw [mem_splitSupport_iff_nonzero, not_iff_not, hg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
⊢ l.support = Finset.sigma (splitSupport l) fun i => (split l i).support
[PROOFSTEP]
simp only [Finset.ext_iff, splitSupport, split, comapDomain, @mem_image _ _ (Classical.decEq _), mem_preimage,
  Sigma.forall, mem_sigma]
  -- porting note: had to add the `Classical.decEq` instance manually
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝ : Zero M
l : (i : ι) × αs i →₀ M
⊢ ∀ (a : ι) (b : αs a),
    { fst := a, snd := b } ∈ l.support ↔ (∃ a_1, a_1 ∈ l.support ∧ a_1.fst = a) ∧ { fst := a, snd := b } ∈ l.support
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝¹ : Zero M
l : (i : ι) × αs i →₀ M
inst✝ : AddCommMonoid N
f : (i : ι) × αs i → M → N
⊢ sum l f = ∑ i in splitSupport l, sum (split l i) fun a b => f { fst := i, snd := a } b
[PROOFSTEP]
simp only [sum, sigma_support, sum_sigma, split_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝² : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝¹ : Fintype η
ιs : η → Type u_15
inst✝ : Zero α
f : (j : η) × ιs j →₀ α
⊢ (fun f =>
        onFinset (Finset.sigma univ fun j => (f j).support) (fun ji => ↑(f ji.fst) ji.snd)
          (_ :
            ∀ (g : (j : η) × ιs j),
              (fun ji => ↑(f ji.fst) ji.snd) g ≠ 0 → g ∈ Finset.sigma univ fun j => (f j).support))
      (split f) =
    f
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝² : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝¹ : Fintype η
ιs : η → Type u_15
inst✝ : Zero α
f : (j : η) × ιs j →₀ α
a✝ : (j : η) × ιs j
⊢ ↑((fun f =>
            onFinset (Finset.sigma univ fun j => (f j).support) (fun ji => ↑(f ji.fst) ji.snd)
              (_ :
                ∀ (g : (j : η) × ιs j),
                  (fun ji => ↑(f ji.fst) ji.snd) g ≠ 0 → g ∈ Finset.sigma univ fun j => (f j).support))
          (split f))
      a✝ =
    ↑f a✝
[PROOFSTEP]
simp [split]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝² : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝¹ : Fintype η
ιs : η → Type u_15
inst✝ : Zero α
f : (j : η) → ιs j →₀ α
⊢ split
      ((fun f =>
          onFinset (Finset.sigma univ fun j => (f j).support) (fun ji => ↑(f ji.fst) ji.snd)
            (_ :
              ∀ (g : (j : η) × ιs j),
                (fun ji => ↑(f ji.fst) ji.snd) g ≠ 0 → g ∈ Finset.sigma univ fun j => (f j).support))
        f) =
    f
[PROOFSTEP]
ext
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝² : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝¹ : Fintype η
ιs : η → Type u_15
inst✝ : Zero α
f : (j : η) → ιs j →₀ α
x✝ : η
a✝ : ιs x✝
⊢ ↑(split
          ((fun f =>
              onFinset (Finset.sigma univ fun j => (f j).support) (fun ji => ↑(f ji.fst) ji.snd)
                (_ :
                  ∀ (g : (j : η) × ιs j),
                    (fun ji => ↑(f ji.fst) ji.snd) g ≠ 0 → g ∈ Finset.sigma univ fun j => (f j).support))
            f)
          x✝)
      a✝ =
    ↑(f x✝) a✝
[PROOFSTEP]
simp [split]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝³ : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝² : Fintype η
ιs✝ : η → Type u_15
inst✝¹ : Zero α✝
α : Type u_16
ιs : η → Type u_17
inst✝ : AddMonoid α
src✝ : ((j : η) × ιs j →₀ α) ≃ ((j : η) → ιs j →₀ α) := sigmaFinsuppEquivPiFinsupp
f g : (j : η) × ιs j →₀ α
⊢ Equiv.toFun
      { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
        right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
      (f + g) =
    Equiv.toFun
        { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
          right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        f +
      Equiv.toFun
        { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
          right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
        g
[PROOFSTEP]
ext
[GOAL]
case h.h
α✝ : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
αs : ι → Type u_13
inst✝³ : Zero M
l : (i : ι) × αs i →₀ M
η : Type u_14
inst✝² : Fintype η
ιs✝ : η → Type u_15
inst✝¹ : Zero α✝
α : Type u_16
ιs : η → Type u_17
inst✝ : AddMonoid α
src✝ : ((j : η) × ιs j →₀ α) ≃ ((j : η) → ιs j →₀ α) := sigmaFinsuppEquivPiFinsupp
f g : (j : η) × ιs j →₀ α
x✝ : η
a✝ : ιs x✝
⊢ ↑(Equiv.toFun
          { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
            right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
          (f + g) x✝)
      a✝ =
    ↑((Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              f +
            Equiv.toFun
              { toFun := src✝.toFun, invFun := src✝.invFun, left_inv := (_ : LeftInverse src✝.invFun src✝.toFun),
                right_inv := (_ : Function.RightInverse src✝.invFun src✝.toFun) }
              g)
          x✝)
      a✝
[PROOFSTEP]
simp
