[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
x✝¹ x✝ : Π₀ (i : ι), β i
f₁ : (i : ι) → β i
s₁✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f₁ i = 0 }
f₂ : (i : ι) → β i
s₁ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f₂ i = 0 }
h : f₁ = f₂
⊢ { toFun := f₁, support' := s₁✝ } = { toFun := f₂, support' := s₁ }
[PROOFSTEP]
subst h
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
x✝¹ x✝ : Π₀ (i : ι), β i
f₁ : (i : ι) → β i
s₁✝ s₁ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f₁ i = 0 }
⊢ { toFun := f₁, support' := s₁✝ } = { toFun := f₁, support' := s₁ }
[PROOFSTEP]
congr
[GOAL]
case e_support'
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
x✝¹ x✝ : Π₀ (i : ι), β i
f₁ : (i : ι) → β i
s₁✝ s₁ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f₁ i = 0 }
⊢ s₁✝ = s₁
[PROOFSTEP]
apply Subsingleton.elim
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
x : Π₀ (i : ι), β₁ i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
i : ι
h : ↑x i = 0
⊢ (fun i => f i (↑x i)) i = 0
[PROOFSTEP]
rw [← hf i, ← h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
h : optParam (∀ (i : ι), id 0 = 0) (_ : ∀ (i : ι), id 0 = id 0)
g : Π₀ (i : ι), β₁ i
⊢ mapRange (fun i => id) h g = g
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
h : optParam (∀ (i : ι), id 0 = 0) (_ : ∀ (i : ι), id 0 = id 0)
g : Π₀ (i : ι), β₁ i
i✝ : ι
⊢ ↑(mapRange (fun i => id) h g) i✝ = ↑g i✝
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
f₂ : (i : ι) → β i → β₁ i
hf : ∀ (i : ι), f i 0 = 0
hf₂ : ∀ (i : ι), f₂ i 0 = 0
h : ∀ (i : ι), (f i ∘ f₂ i) 0 = 0
g : Π₀ (i : ι), β i
⊢ mapRange (fun i => f i ∘ f₂ i) h g = mapRange f hf (mapRange f₂ hf₂ g)
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
f₂ : (i : ι) → β i → β₁ i
hf : ∀ (i : ι), f i 0 = 0
hf₂ : ∀ (i : ι), f₂ i 0 = 0
h : ∀ (i : ι), (f i ∘ f₂ i) 0 = 0
g : Π₀ (i : ι), β i
i✝ : ι
⊢ ↑(mapRange (fun i => f i ∘ f₂ i) h g) i✝ = ↑(mapRange f hf (mapRange f₂ hf₂ g)) i✝
[PROOFSTEP]
simp only [mapRange_apply]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
f₂ : (i : ι) → β i → β₁ i
hf : ∀ (i : ι), f i 0 = 0
hf₂ : ∀ (i : ι), f₂ i 0 = 0
h : ∀ (i : ι), (f i ∘ f₂ i) 0 = 0
g : Π₀ (i : ι), β i
i✝ : ι
⊢ (f i✝ ∘ f₂ i✝) (↑g i✝) = f i✝ (f₂ i✝ (↑g i✝))
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
⊢ mapRange f hf 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
i✝ : ι
⊢ ↑(mapRange f hf 0) i✝ = ↑0 i✝
[PROOFSTEP]
simp only [mapRange_apply, coe_zero, Pi.zero_apply, hf]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
⊢ Trunc { s // ∀ (i : ι), i ∈ s ∨ (fun i => f i (↑x i) (↑y i)) i = 0 }
[PROOFSTEP]
refine' x.support'.bind fun xs => _
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
⊢ Trunc { s // ∀ (i : ι), i ∈ s ∨ (fun i => f i (↑x i) (↑y i)) i = 0 }
[PROOFSTEP]
refine' y.support'.map fun ys => _
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
⊢ { s // ∀ (i : ι), i ∈ s ∨ (fun i => f i (↑x i) (↑y i)) i = 0 }
[PROOFSTEP]
refine' ⟨xs + ys, fun i => _⟩
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
⊢ i ∈ ↑xs + ↑ys ∨ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
obtain h1 | (h1 : x i = 0) := xs.prop i
[GOAL]
case inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : i ∈ ↑xs
⊢ i ∈ ↑xs + ↑ys ∨ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
left
[GOAL]
case inl.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : i ∈ ↑xs
⊢ i ∈ ↑xs + ↑ys
[PROOFSTEP]
rw [Multiset.mem_add]
[GOAL]
case inl.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : i ∈ ↑xs
⊢ i ∈ ↑xs ∨ i ∈ ↑ys
[PROOFSTEP]
left
[GOAL]
case inl.h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : i ∈ ↑xs
⊢ i ∈ ↑xs
[PROOFSTEP]
exact h1
[GOAL]
case inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
⊢ i ∈ ↑xs + ↑ys ∨ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
obtain h2 | (h2 : y i = 0) := ys.prop i
[GOAL]
case inr.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : i ∈ ↑ys
⊢ i ∈ ↑xs + ↑ys ∨ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
left
[GOAL]
case inr.inl.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : i ∈ ↑ys
⊢ i ∈ ↑xs + ↑ys
[PROOFSTEP]
rw [Multiset.mem_add]
[GOAL]
case inr.inl.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : i ∈ ↑ys
⊢ i ∈ ↑xs ∨ i ∈ ↑ys
[PROOFSTEP]
right
[GOAL]
case inr.inl.h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : i ∈ ↑ys
⊢ i ∈ ↑ys
[PROOFSTEP]
exact h2
[GOAL]
case inr.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : ↑y i = 0
⊢ i ∈ ↑xs + ↑ys ∨ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
right
[GOAL]
case inr.inr.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
x : Π₀ (i : ι), β₁ i
y : Π₀ (i : ι), β₂ i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
ys : { s // ∀ (i : ι), i ∈ s ∨ toFun y i = 0 }
i : ι
h1 : ↑x i = 0
h2 : ↑y i = 0
⊢ (fun i => f i (↑x i) (↑y i)) i = 0
[PROOFSTEP]
rw [← hf, ← h1, ← h2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
x y : Π₀ (i : ι), β i
s : Set ι
inst✝ : (i : ι) → Decidable (i ∈ s)
⊢ ↑(piecewise x y s) = Set.piecewise s ↑x ↑y
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
x y : Π₀ (i : ι), β i
s : Set ι
inst✝ : (i : ι) → Decidable (i ∈ s)
x✝ : ι
⊢ ↑(piecewise x y s) x✝ = Set.piecewise s (↑x) (↑y) x✝
[PROOFSTEP]
apply piecewise_apply
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
δ : Type u_1
inst✝⁵ : Monoid γ
inst✝⁴ : Monoid δ
inst✝³ : (i : ι) → AddMonoid (β i)
inst✝² : (i : ι) → DistribMulAction γ (β i)
inst✝¹ : (i : ι) → DistribMulAction δ (β i)
inst✝ : ∀ (i : ι), SMulCommClass γ δ (β i)
r : γ
s : δ
m : Π₀ (i : ι), β i
i : ι
⊢ ↑(r • s • m) i = ↑(s • r • m) i
[PROOFSTEP]
simp only [smul_apply, smul_comm r s (m i)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
δ : Type u_1
inst✝⁶ : Monoid γ
inst✝⁵ : Monoid δ
inst✝⁴ : (i : ι) → AddMonoid (β i)
inst✝³ : (i : ι) → DistribMulAction γ (β i)
inst✝² : (i : ι) → DistribMulAction δ (β i)
inst✝¹ : SMul γ δ
inst✝ : ∀ (i : ι), IsScalarTower γ δ (β i)
r : γ
s : δ
m : Π₀ (i : ι), β i
i : ι
⊢ ↑((r • s) • m) i = ↑(r • s • m) i
[PROOFSTEP]
simp only [smul_apply, smul_assoc r s (m i)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : Monoid γ
inst✝³ : (i : ι) → AddMonoid (β i)
inst✝² : (i : ι) → DistribMulAction γ (β i)
inst✝¹ : (i : ι) → DistribMulAction γᵐᵒᵖ (β i)
inst✝ : ∀ (i : ι), IsCentralScalar γ (β i)
r : γ
m : Π₀ (i : ι), β i
i : ι
⊢ ↑(MulOpposite.op r • m) i = ↑(r • m) i
[PROOFSTEP]
simp only [smul_apply, op_smul_eq_smul r (m i)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : Semiring γ
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → Module γ (β i)
src✝ : DistribMulAction γ (Π₀ (i : ι), β i) := inferInstanceAs (DistribMulAction γ (Π₀ (i : ι), β i))
c x : γ
y : Π₀ (i : ι), β i
i : ι
⊢ ↑((c + x) • y) i = ↑(c • y + x • y) i
[PROOFSTEP]
simp only [add_apply, smul_apply, add_smul]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝² : Semiring γ
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → Module γ (β i)
src✝ : DistribMulAction γ (Π₀ (i : ι), β i) := inferInstanceAs (DistribMulAction γ (Π₀ (i : ι), β i))
c : Π₀ (i : ι), β i
i : ι
⊢ ↑(0 • c) i = ↑0 i
[PROOFSTEP]
simp only [smul_apply, zero_smul, zero_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → Zero (β i)
p : ι → Prop
inst✝ : DecidablePred p
x : Π₀ (i : ι), β i
xs : { s // ∀ (i : ι), i ∈ s ∨ toFun x i = 0 }
i : ι
H : ↑x i = 0
⊢ (fun i => if p i then ↑x i else 0) i = 0
[PROOFSTEP]
simp only [H, ite_self]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → Zero (β i)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h : p i
⊢ ↑(filter p f) i = ↑f i
[PROOFSTEP]
simp only [filter_apply, if_pos h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → Zero (β i)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h : ¬p i
⊢ ↑(filter p f) i = 0
[PROOFSTEP]
simp only [filter_apply, if_neg h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
i : ι
⊢ ↑(filter p f + filter (fun i => ¬p i) f) i = ↑f i
[PROOFSTEP]
simp only [add_apply, filter_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
i : ι
⊢ ((if p i then ↑f i else 0) + if ¬p i then ↑f i else 0) = ↑f i
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
i : ι
h✝ : p i
⊢ ↑f i + 0 = ↑f i
[PROOFSTEP]
simp only [add_zero, zero_add]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
i : ι
h✝ : ¬p i
⊢ 0 + ↑f i = ↑f i
[PROOFSTEP]
simp only [add_zero, zero_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → Zero (β i)
p : ι → Prop
inst✝ : DecidablePred p
⊢ filter p 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → Zero (β i)
p : ι → Prop
inst✝ : DecidablePred p
i✝ : ι
⊢ ↑(filter p 0) i✝ = ↑0 i✝
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
p : ι → Prop
inst✝ : DecidablePred p
f g : Π₀ (i : ι), β i
⊢ filter p (f + g) = filter p f + filter p g
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝¹ : (i : ι) → AddZeroClass (β i)
p : ι → Prop
inst✝ : DecidablePred p
f g : Π₀ (i : ι), β i
i✝ : ι
⊢ ↑(filter p (f + g)) i✝ = ↑(filter p f + filter p g) i✝
[PROOFSTEP]
simp [ite_add_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝³ : Monoid γ
inst✝² : (i : ι) → AddMonoid (β i)
inst✝¹ : (i : ι) → DistribMulAction γ (β i)
p : ι → Prop
inst✝ : DecidablePred p
r : γ
f : Π₀ (i : ι), β i
⊢ filter p (r • f) = r • filter p f
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝³ : Monoid γ
inst✝² : (i : ι) → AddMonoid (β i)
inst✝¹ : (i : ι) → DistribMulAction γ (β i)
p : ι → Prop
inst✝ : DecidablePred p
r : γ
f : Π₀ (i : ι), β i
i✝ : ι
⊢ ↑(filter p (r • f)) i✝ = ↑(r • filter p f) i✝
[PROOFSTEP]
simp [smul_apply, smul_ite]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
f : Π₀ (i : ι), β i
⊢ Set.Finite {i | ↑f i ≠ 0}
[PROOFSTEP]
classical!
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
f : Π₀ (i : ι), β i
em✝ : (a : Prop) → Decidable a
⊢ Set.Finite {i | ↑f i ≠ 0}
[PROOFSTEP]
exact
  Trunc.induction_on f.support' fun xs =>
    (Multiset.toFinset xs.1).finite_toSet.subset fun i H => Multiset.mem_toFinset.2 ((xs.prop i).resolve_right H)
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
s : Finset ι
⊢ Function.Injective (mk s)
[PROOFSTEP]
intro x y H
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
⊢ x = y
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i✝ : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
i : ↑↑s
⊢ x i = y i
[PROOFSTEP]
have h1 : (mk s x : ∀ i, β i) i = (mk s y : ∀ i, β i) i := by rw [H]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i✝ : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
i : ↑↑s
⊢ ↑(mk s x) ↑i = ↑(mk s y) ↑i
[PROOFSTEP]
rw [H]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i✝ : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
i : ↑↑s
h1 : ↑(mk s x) ↑i = ↑(mk s y) ↑i
⊢ x i = y i
[PROOFSTEP]
obtain ⟨i, hi : i ∈ s⟩ := i
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i✝ : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
i : ι
hi : i ∈ s
h1 : ↑(mk s x) ↑{ val := i, property := hi } = ↑(mk s y) ↑{ val := i, property := hi }
⊢ x { val := i, property := hi } = y { val := i, property := hi }
[PROOFSTEP]
dsimp only [mk_apply, Subtype.coe_mk] at h1 
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x✝ : (i : ↑↑s✝) → β ↑i
i✝ : ι
s : Finset ι
x y : (i : ↑↑s) → β ↑i
H : mk s x = mk s y
i : ι
hi : i ∈ s
h1 : (if H : i ∈ s then x { val := i, property := H } else 0) = if H : i ∈ s then y { val := i, property := H } else 0
⊢ x { val := i, property := hi } = y { val := i, property := hi }
[PROOFSTEP]
simpa only [dif_pos hi] using h1
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
b : β i
j : ι
⊢ j = i → j ∈ {i}
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i i' : ι
b : β i
⊢ ↑(single i b) i' = if h : i = i' then Eq.recOn h b else 0
[PROOFSTEP]
rw [single_eq_pi_single, Pi.single, Function.update]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i i' : ι
b : β i
⊢ (if h : i' = i then (_ : i = i') ▸ b else OfNat.ofNat 0 i') = if h : i = i' then Eq.recOn h b else 0
[PROOFSTEP]
simp [@eq_comm _ i i']
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
b : β i
⊢ ↑(single i b) i = b
[PROOFSTEP]
simp only [single_apply, dite_eq_ite, ite_true]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i i' : ι
b : β i
h : i ≠ i'
⊢ ↑(single i b) i' = 0
[PROOFSTEP]
simp only [single_apply, dif_neg h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
⊢ single i xi = single j xj ↔ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
constructor
[GOAL]
case mp
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
⊢ single i xi = single j xj → i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
intro h
[GOAL]
case mp
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
by_cases hij : i = j
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : i = j
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
subst hij
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
xi xj : β i
h : single i xi = single i xj
⊢ i = i ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
exact Or.inl ⟨rfl, heq_of_eq (DFinsupp.single_injective h)⟩
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
have h_coe : ⇑(DFinsupp.single i xi) = DFinsupp.single j xj := congr_arg (⇑) h
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
have hci := congr_fun h_coe i
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
hci : ↑(single i xi) i = ↑(single j xj) i
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
have hcj := congr_fun h_coe j
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
hci : ↑(single i xi) i = ↑(single j xj) i
hcj : ↑(single i xi) j = ↑(single j xj) j
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
rw [DFinsupp.single_eq_same] at hci hcj 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
hci : xi = ↑(single j xj) i
hcj : ↑(single i xi) j = xj
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
rw [DFinsupp.single_eq_of_ne (Ne.symm hij)] at hci 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
hci : xi = 0
hcj : ↑(single i xi) j = xj
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
rw [DFinsupp.single_eq_of_ne hij] at hcj 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : single i xi = single j xj
hij : ¬i = j
h_coe : ↑(single i xi) = ↑(single j xj)
hci : xi = 0
hcj : 0 = xj
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0
[PROOFSTEP]
exact Or.inr ⟨hci, hcj.symm⟩
[GOAL]
case mpr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
⊢ i = j ∧ HEq xi xj ∨ xi = 0 ∧ xj = 0 → single i xi = single j xj
[PROOFSTEP]
rintro (⟨rfl, hxi⟩ | ⟨hi, hj⟩)
[GOAL]
case mpr.inl.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
xi xj : β i
hxi : HEq xi xj
⊢ single i xi = single i xj
[PROOFSTEP]
rw [eq_of_heq hxi]
[GOAL]
case mpr.inr.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
hi : xi = 0
hj : xj = 0
⊢ single i xi = single j xj
[PROOFSTEP]
rw [hi, hj, DFinsupp.single_zero, DFinsupp.single_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
xi : β i
⊢ single i xi = 0 ↔ xi = 0
[PROOFSTEP]
rw [← single_zero i, single_eq_single_iff]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
xi : β i
⊢ i = i ∧ HEq xi 0 ∨ xi = 0 ∧ 0 = 0 ↔ xi = 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
⊢ filter p (single i x) = if p i then single i x else 0
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
j : ι
⊢ ↑(filter p (single i x)) j = ↑(if p i then single i x else 0) j
[PROOFSTEP]
have := apply_ite (fun x : Π₀ i, β i => x j) (p i) (single i x) 0
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
j : ι
this : ↑(if p i then single i x else 0) j = if p i then ↑(single i x) j else ↑0 j
⊢ ↑(filter p (single i x)) j = ↑(if p i then single i x else 0) j
[PROOFSTEP]
dsimp at this 
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
j : ι
this : ↑(if p i then single i x else 0) j = if p i then ↑(single i x) j else 0
⊢ ↑(filter p (single i x)) j = ↑(if p i then single i x else 0) j
[PROOFSTEP]
rw [filter_apply, this]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
j : ι
this : ↑(if p i then single i x else 0) j = if p i then ↑(single i x) j else 0
⊢ (if p j then ↑(single i x) j else 0) = if p i then ↑(single i x) j else 0
[PROOFSTEP]
obtain rfl | hij := Decidable.eq_or_ne i j
[GOAL]
case h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
this : ↑(if p i then single i x else 0) i = if p i then ↑(single i x) i else 0
⊢ (if p i then ↑(single i x) i else 0) = if p i then ↑(single i x) i else 0
[PROOFSTEP]
rfl
[GOAL]
case h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
j : ι
this : ↑(if p i then single i x else 0) j = if p i then ↑(single i x) j else 0
hij : i ≠ j
⊢ (if p j then ↑(single i x) j else 0) = if p i then ↑(single i x) j else 0
[PROOFSTEP]
rw [single_eq_of_ne hij, ite_self, ite_self]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
h : p i
⊢ filter p (single i x) = single i x
[PROOFSTEP]
rw [filter_single, if_pos h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
p : ι → Prop
inst✝ : DecidablePred p
i : ι
x : β i
h : ¬p i
⊢ filter p (single i x) = 0
[PROOFSTEP]
rw [filter_single, if_neg h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i j : ι
xi : β i
xj : β j
h : { fst := i, snd := xi } = { fst := j, snd := xj }
⊢ single i xi = single j xj
[PROOFSTEP]
cases h
[GOAL]
case refl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
xi : β i
⊢ single i xi = single i xi
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
inst✝ : Fintype ι
i : ι
m : β i
⊢ ↑equivFunOnFintype (single i m) = Pi.single i m
[PROOFSTEP]
ext x
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
inst✝ : Fintype ι
i : ι
m : β i
x : ι
⊢ ↑equivFunOnFintype (single i m) x = Pi.single i m x
[PROOFSTEP]
dsimp [Pi.single, Function.update]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
inst✝ : Fintype ι
i : ι
m : β i
x : ι
⊢ ↑(single i m) x = if h : x = i then (_ : i = x) ▸ m else 0
[PROOFSTEP]
simp [DFinsupp.single_eq_pi_single, @eq_comm _ i]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
inst✝ : Fintype ι
i : ι
m : β i
⊢ ↑equivFunOnFintype.symm (Pi.single i m) = single i m
[PROOFSTEP]
ext i'
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
inst✝ : Fintype ι
i : ι
m : β i
i' : ι
⊢ ↑(↑equivFunOnFintype.symm (Pi.single i m)) i' = ↑(single i m) i'
[PROOFSTEP]
simp only [← single_eq_pi_single, equivFunOnFintype_symm_coe]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i : ι
f : Π₀ (i : ι), β i
⊢ ↑(erase i f) i = 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ i i' : ι
f : Π₀ (i : ι), β i
h : i' ≠ i
⊢ ↑(erase i f) i' = ↑f i'
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
x : Π₀ (i : ι), β i
i : ι
inst✝ : (i' : ι) → Decidable (i' ∈ {i})
⊢ piecewise (single i (↑x i)) (erase i x) {i} = x
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
x : Π₀ (i : ι), β i
i : ι
inst✝ : (i' : ι) → Decidable (i' ∈ {i})
j : ι
⊢ ↑(piecewise (single i (↑x i)) (erase i x) {i}) j = ↑x j
[PROOFSTEP]
rw [piecewise_apply]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
x : Π₀ (i : ι), β i
i : ι
inst✝ : (i' : ι) → Decidable (i' ∈ {i})
j : ι
⊢ (if j ∈ {i} then ↑(single i (↑x i)) j else ↑(erase i x) j) = ↑x j
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
x : Π₀ (i : ι), β i
i : ι
inst✝ : (i' : ι) → Decidable (i' ∈ {i})
j : ι
h : j ∈ {i}
⊢ ↑(single i (↑x i)) j = ↑x j
[PROOFSTEP]
rw [(id h : j = i), single_eq_same]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ : ι
x : Π₀ (i : ι), β i
i : ι
inst✝ : (i' : ι) → Decidable (i' ∈ {i})
j : ι
h : ¬j ∈ {i}
⊢ ↑(erase i x) j = ↑x j
[PROOFSTEP]
exact erase_ne h
[GOAL]
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddGroup (β i)
f : Π₀ (i : ι), β i
i : ι
⊢ erase i f = f - single i (↑f i)
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddGroup (β i)
f : Π₀ (i : ι), β i
i j : ι
⊢ ↑(erase i f) j = ↑(f - single i (↑f i)) j
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | h)
[GOAL]
case h.inl
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddGroup (β i)
f : Π₀ (i : ι), β i
i : ι
⊢ ↑(erase i f) i = ↑(f - single i (↑f i)) i
[PROOFSTEP]
simp
[GOAL]
case h.inr
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddGroup (β i)
f : Π₀ (i : ι), β i
i j : ι
h : i ≠ j
⊢ ↑(erase i f) j = ↑(f - single i (↑f i)) j
[PROOFSTEP]
simp [erase_ne h.symm, single_eq_of_ne h, @eq_comm _ j, h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
f : Π₀ (i : ι), β i
i : ι
⊢ filter (fun x => x ≠ i) f = erase i f
[PROOFSTEP]
ext1 j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
f : Π₀ (i : ι), β i
i j : ι
⊢ ↑(filter (fun x => x ≠ i) f) j = ↑(erase i f) j
[PROOFSTEP]
simp only [DFinsupp.filter_apply, DFinsupp.erase_apply, ite_not]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
f : Π₀ (i : ι), β i
i : ι
⊢ filter ((fun x x_1 => x ≠ x_1) i) f = erase i f
[PROOFSTEP]
rw [← filter_ne_eq_erase f i]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
f : Π₀ (i : ι), β i
i : ι
⊢ filter ((fun x x_1 => x ≠ x_1) i) f = filter (fun x => x ≠ i) f
[PROOFSTEP]
congr with j
[GOAL]
case e_p.h.a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i✝ : ι
f : Π₀ (i : ι), β i
i j : ι
⊢ (fun x x_1 => x ≠ x_1) i j ↔ j ≠ i
[PROOFSTEP]
exact ne_comm
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ j i : ι
x : β i
⊢ erase j (single i x) = if i = j then 0 else single i x
[PROOFSTEP]
rw [← filter_ne_eq_erase, filter_single, ite_not]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ i : ι
x : β i
⊢ erase i (single i x) = 0
[PROOFSTEP]
rw [erase_single, if_pos rfl]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x✝ : (i : ↑↑s) → β ↑i
i✝ i j : ι
x : β i
h : i ≠ j
⊢ erase j (single i x) = single i x
[PROOFSTEP]
rw [erase_single, if_neg h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
j : ι
⊢ j ∈ i ::ₘ ↑s ∨ Function.update (↑f) i b j = 0
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | hi)
[GOAL]
case inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
⊢ i ∈ i ::ₘ ↑s ∨ Function.update (↑f) i b i = 0
[PROOFSTEP]
simp
[GOAL]
case inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
j : ι
hi : i ≠ j
⊢ j ∈ i ::ₘ ↑s ∨ Function.update (↑f) i b j = 0
[PROOFSTEP]
obtain hj | (hj : f j = 0) := s.prop j
[GOAL]
case inr.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
j : ι
hi : i ≠ j
hj : j ∈ ↑s
⊢ j ∈ i ::ₘ ↑s ∨ Function.update (↑f) i b j = 0
[PROOFSTEP]
exact Or.inl (Multiset.mem_cons_of_mem hj)
[GOAL]
case inr.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s✝ : Finset ι
x : (i : ↑↑s✝) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
j : ι
hi : i ≠ j
hj : ↑f j = 0
⊢ j ∈ i ::ₘ ↑s ∨ Function.update (↑f) i b j = 0
[PROOFSTEP]
exact Or.inr ((Function.update_noteq hi.symm b _).trans hj)
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j : ι
⊢ update i f (↑f i) = f
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j i✝ : ι
⊢ ↑(update i f (↑f i)) i✝ = ↑f i✝
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j : ι
⊢ update i f 0 = erase i f
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j✝ j : ι
⊢ ↑(update i f 0) j = ↑(erase i f) j
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | hi)
[GOAL]
case h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j : ι
⊢ ↑(update i f 0) i = ↑(erase i f) i
[PROOFSTEP]
simp
[GOAL]
case h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
f : Π₀ (i : ι), β i
b : β i
j✝ j : ι
hi : i ≠ j
⊢ ↑(update i f 0) j = ↑(erase i f) j
[PROOFSTEP]
simp [hi.symm]
[GOAL]
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
⊢ update i f b = single i b + erase i f
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
j : ι
⊢ ↑(update i f b) j = ↑(single i b + erase i f) j
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | h)
[GOAL]
case h.inl
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
⊢ ↑(update i f b) i = ↑(single i b + erase i f) i
[PROOFSTEP]
simp
[GOAL]
case h.inr
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
j : ι
h : i ≠ j
⊢ ↑(update i f b) j = ↑(single i b + erase i f) j
[PROOFSTEP]
simp [Function.update_noteq h.symm, h, erase_ne, h.symm]
[GOAL]
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
⊢ update i f b = erase i f + single i b
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
j : ι
⊢ ↑(update i f b) j = ↑(erase i f + single i b) j
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | h)
[GOAL]
case h.inl
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
⊢ ↑(update i f b) i = ↑(erase i f + single i b) i
[PROOFSTEP]
simp
[GOAL]
case h.inr
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j✝ : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
j : ι
h : i ≠ j
⊢ ↑(update i f b) j = ↑(erase i f + single i b) j
[PROOFSTEP]
simp [Function.update_noteq h.symm, h, erase_ne, h.symm]
[GOAL]
ι : Type u
γ : Type w
β✝ : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β✝ i)
s : Finset ι
x : (i : ↑↑s) → β✝ ↑i
i✝ : ι
f✝ : Π₀ (i : ι), β✝ i
b✝ : β✝ i✝
j : ι
β : ι → Type u_1
inst✝ : (i : ι) → AddGroup (β i)
f : Π₀ (i : ι), β i
i : ι
b : β i
⊢ update i f b = f - single i (↑f i) + single i b
[PROOFSTEP]
rw [update_eq_erase_add_single f i b, erase_eq_sub_single f i]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
b₁ b₂ : β i
i' : ι
⊢ ↑(single i (b₁ + b₂)) i' = ↑(single i b₁ + single i b₂) i'
[PROOFSTEP]
by_cases h : i = i'
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
b₁ b₂ : β i
i' : ι
h : i = i'
⊢ ↑(single i (b₁ + b₂)) i' = ↑(single i b₁ + single i b₂) i'
[PROOFSTEP]
subst h
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
b₁ b₂ : β i
⊢ ↑(single i (b₁ + b₂)) i = ↑(single i b₁ + single i b₂) i
[PROOFSTEP]
simp only [add_apply, single_eq_same]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
b₁ b₂ : β i
i' : ι
h : ¬i = i'
⊢ ↑(single i (b₁ + b₂)) i' = ↑(single i b₁ + single i b₂) i'
[PROOFSTEP]
simp only [add_apply, single_eq_of_ne h, zero_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f₁ f₂ : Π₀ (i : ι), β i
x✝ : ι
⊢ ↑(erase i (f₁ + f₂)) x✝ = ↑(erase i f₁ + erase i f₂) x✝
[PROOFSTEP]
simp [ite_zero_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
i' : ι
h : i = i'
⊢ ↑(single i (↑f i) + erase i f) i' = ↑f i'
[PROOFSTEP]
subst h
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
⊢ ↑(single i (↑f i) + erase i f) i = ↑f i
[PROOFSTEP]
simp only [add_apply, single_apply, erase_apply, add_zero, dite_eq_ite, if_true]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
i' : ι
h : ¬i = i'
⊢ ↑(single i (↑f i) + erase i f) i' = ↑f i'
[PROOFSTEP]
simp only [add_apply, single_apply, erase_apply, dif_neg h, if_neg (Ne.symm h), zero_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
i' : ι
h : i = i'
⊢ ↑(erase i f + single i (↑f i)) i' = ↑f i'
[PROOFSTEP]
subst h
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
⊢ ↑(erase i f + single i (↑f i)) i = ↑f i
[PROOFSTEP]
simp only [add_apply, single_apply, erase_apply, zero_add, dite_eq_ite, if_true]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
i : ι
f : Π₀ (i : ι), β i
i' : ι
h : ¬i = i'
⊢ ↑(erase i f + single i (↑f i)) i' = ↑f i'
[PROOFSTEP]
simp only [add_apply, single_apply, erase_apply, dif_neg h, if_neg (Ne.symm h), add_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
⊢ p f
[PROOFSTEP]
cases' f with f s
[GOAL]
case mk'
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f : (i : ι) → β i
s : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ p { toFun := f, support' := s }
[PROOFSTEP]
induction' s using Trunc.induction_on with s
[GOAL]
case mk'.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f : (i : ι) → β i
s : { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ p { toFun := f, support' := Trunc.mk s }
[PROOFSTEP]
cases' s with s H
[GOAL]
case mk'.h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f : (i : ι) → β i
s : Multiset ι
H : ∀ (i : ι), i ∈ s ∨ f i = 0
⊢ p { toFun := f, support' := Trunc.mk { val := s, property := H } }
[PROOFSTEP]
induction' s using Multiset.induction_on with i s ih generalizing f
[GOAL]
case mk'.h.mk.empty
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s : Multiset ι
H✝ : ∀ (i : ι), i ∈ s ∨ f✝ i = 0
f : (i : ι) → β i
H : ∀ (i : ι), i ∈ 0 ∨ f i = 0
⊢ p { toFun := f, support' := Trunc.mk { val := 0, property := H } }
[PROOFSTEP]
have : f = 0 := funext fun i => (H i).resolve_left (Multiset.not_mem_zero _)
[GOAL]
case mk'.h.mk.empty
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s : Multiset ι
H✝ : ∀ (i : ι), i ∈ s ∨ f✝ i = 0
f : (i : ι) → β i
H : ∀ (i : ι), i ∈ 0 ∨ f i = 0
this : f = 0
⊢ p { toFun := f, support' := Trunc.mk { val := 0, property := H } }
[PROOFSTEP]
subst this
[GOAL]
case mk'.h.mk.empty
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f : (i : ι) → β i
s : Multiset ι
H✝ : ∀ (i : ι), i ∈ s ∨ f i = 0
H : ∀ (i : ι), i ∈ 0 ∨ OfNat.ofNat 0 i = 0
⊢ p { toFun := 0, support' := Trunc.mk { val := 0, property := H } }
[PROOFSTEP]
exact h0
[GOAL]
case mk'.h.mk.cons
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
⊢ p { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
[PROOFSTEP]
have H2 : p (erase i ⟨f, Trunc.mk ⟨i ::ₘ s, H⟩⟩) :=
  by
  dsimp only [erase, Trunc.map, Trunc.bind, Trunc.liftOn, Trunc.lift_mk, Function.comp, Subtype.coe_mk]
  have H2 : ∀ j, j ∈ s ∨ ite (j = i) 0 (f j) = 0 := by
    intro j
    cases' H j with H2 H2
    · cases' Multiset.mem_cons.1 H2 with H3 H3
      · right; exact if_pos H3
      · left; exact H3
    right
    split_ifs <;> [rfl; exact H2]
  have H3 :
    ∀ aux,
      (⟨fun j : ι => ite (j = i) 0 (f j), Trunc.mk ⟨i ::ₘ s, aux⟩⟩ : Π₀ i, β i) =
        ⟨fun j : ι => ite (j = i) 0 (f j), Trunc.mk ⟨s, H2⟩⟩ :=
    fun _ ↦ ext fun _ => rfl
  rw [H3]
  apply ih
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
⊢ p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
dsimp only [erase, Trunc.map, Trunc.bind, Trunc.liftOn, Trunc.lift_mk, Function.comp, Subtype.coe_mk]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
⊢ p
    { toFun := fun j => if j = i then 0 else f j,
      support' :=
        Trunc.mk
          { val := i ::ₘ s,
            property :=
              (_ :
                ∀ (j : ι),
                  j ∈ ↑{ val := i ::ₘ s, property := H } ∨
                    (fun j =>
                          if j = i then 0
                          else toFun { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } j)
                        j =
                      0) } }
[PROOFSTEP]
have H2 : ∀ j, j ∈ s ∨ ite (j = i) 0 (f j) = 0 := by
  intro j
  cases' H j with H2 H2
  · cases' Multiset.mem_cons.1 H2 with H3 H3
    · right; exact if_pos H3
    · left; exact H3
  right
  split_ifs <;> [rfl; exact H2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
⊢ ∀ (j : ι), j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
intro j
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
⊢ j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
cases' H j with H2 H2
[GOAL]
case inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : j ∈ i ::ₘ s
⊢ j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
cases' Multiset.mem_cons.1 H2 with H3 H3
[GOAL]
case inl.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : j ∈ i ::ₘ s
H3 : j = i
⊢ j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
right
[GOAL]
case inl.inl.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : j ∈ i ::ₘ s
H3 : j = i
⊢ (if j = i then 0 else f j) = 0
[PROOFSTEP]
exact if_pos H3
[GOAL]
case inl.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : j ∈ i ::ₘ s
H3 : j ∈ s
⊢ j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
left
[GOAL]
case inl.inr.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : j ∈ i ::ₘ s
H3 : j ∈ s
⊢ j ∈ s
[PROOFSTEP]
exact H3
[GOAL]
case inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : f j = 0
⊢ j ∈ s ∨ (if j = i then 0 else f j) = 0
[PROOFSTEP]
right
[GOAL]
case inr.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : f j = 0
⊢ (if j = i then 0 else f j) = 0
[PROOFSTEP]
split_ifs <;> [rfl; exact H2]
[GOAL]
case inr.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : f j = 0
⊢ (if j = i then 0 else f j) = 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : f j = 0
h✝ : j = i
⊢ 0 = 0
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
j : ι
H2 : f j = 0
h✝ : ¬j = i
⊢ f j = 0
[PROOFSTEP]
exact H2
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : ∀ (j : ι), j ∈ s ∨ (if j = i then 0 else f j) = 0
⊢ p
    { toFun := fun j => if j = i then 0 else f j,
      support' :=
        Trunc.mk
          { val := i ::ₘ s,
            property :=
              (_ :
                ∀ (j : ι),
                  j ∈ ↑{ val := i ::ₘ s, property := H } ∨
                    (fun j =>
                          if j = i then 0
                          else toFun { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } j)
                        j =
                      0) } }
[PROOFSTEP]
have H3 :
  ∀ aux,
    (⟨fun j : ι => ite (j = i) 0 (f j), Trunc.mk ⟨i ::ₘ s, aux⟩⟩ : Π₀ i, β i) =
      ⟨fun j : ι => ite (j = i) 0 (f j), Trunc.mk ⟨s, H2⟩⟩ :=
  fun _ ↦ ext fun _ => rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : ∀ (j : ι), j ∈ s ∨ (if j = i then 0 else f j) = 0
H3 :
  ∀ (aux : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ (fun j => if j = i then 0 else f j) i_1 = 0),
    { toFun := fun j => if j = i then 0 else f j, support' := Trunc.mk { val := i ::ₘ s, property := aux } } =
      { toFun := fun j => if j = i then 0 else f j, support' := Trunc.mk { val := s, property := H2 } }
⊢ p
    { toFun := fun j => if j = i then 0 else f j,
      support' :=
        Trunc.mk
          { val := i ::ₘ s,
            property :=
              (_ :
                ∀ (j : ι),
                  j ∈ ↑{ val := i ::ₘ s, property := H } ∨
                    (fun j =>
                          if j = i then 0
                          else toFun { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } j)
                        j =
                      0) } }
[PROOFSTEP]
rw [H3]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : ∀ (j : ι), j ∈ s ∨ (if j = i then 0 else f j) = 0
H3 :
  ∀ (aux : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ (fun j => if j = i then 0 else f j) i_1 = 0),
    { toFun := fun j => if j = i then 0 else f j, support' := Trunc.mk { val := i ::ₘ s, property := aux } } =
      { toFun := fun j => if j = i then 0 else f j, support' := Trunc.mk { val := s, property := H2 } }
⊢ p { toFun := fun j => if j = i then 0 else f j, support' := Trunc.mk { val := s, property := H2 } }
[PROOFSTEP]
apply ih
[GOAL]
case mk'.h.mk.cons
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
⊢ p { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
[PROOFSTEP]
have H3 : single i _ + _ = (⟨f, Trunc.mk ⟨i ::ₘ s, H⟩⟩ : Π₀ i, β i) := single_add_erase _ _
[GOAL]
case mk'.h.mk.cons
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
⊢ p { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
[PROOFSTEP]
rw [← H3]
[GOAL]
case mk'.h.mk.cons
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
⊢ p
    (single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
change p (single i (f i) + _)
[GOAL]
case mk'.h.mk.cons
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
⊢ p (single i (f i) + erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
cases' Classical.em (f i = 0) with h h
[GOAL]
case mk'.h.mk.cons.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
h : f i = 0
⊢ p (single i (f i) + erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
rw [h, single_zero, zero_add]
[GOAL]
case mk'.h.mk.cons.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
h : f i = 0
⊢ p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
exact H2
[GOAL]
case mk'.h.mk.cons.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
h : ¬f i = 0
⊢ p (single i (f i) + erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
[PROOFSTEP]
refine' ha _ _ _ _ h H2
[GOAL]
case mk'.h.mk.cons.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (single i b + f)
f✝ : (i : ι) → β i
s✝ : Multiset ι
H✝ : ∀ (i : ι), i ∈ s✝ ∨ f✝ i = 0
i : ι
s : Multiset ι
ih :
  ∀ (f : (i : ι) → β i) (H : ∀ (i : ι), i ∈ s ∨ f i = 0),
    p { toFun := f, support' := Trunc.mk { val := s, property := H } }
f : (i : ι) → β i
H : ∀ (i_1 : ι), i_1 ∈ i ::ₘ s ∨ f i_1 = 0
H2 : p (erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } })
H3 :
  single i (↑{ toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } i) +
      erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } } =
    { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }
h : ¬f i = 0
⊢ ↑(erase i { toFun := f, support' := Trunc.mk { val := i ::ₘ s, property := H } }) i = 0
[PROOFSTEP]
rw [erase_same]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f✝ : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (f + single i b)
i : ι
b : β i
f : Π₀ (i : ι), β i
h1 : ↑f i = 0
h2 : b ≠ 0
h3 : p f
⊢ f + single i b = single i b + f
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f✝ : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (f + single i b)
i : ι
b : β i
f : Π₀ (i : ι), β i
h1 : ↑f i = 0
h2 : b ≠ 0
h3 : p f
j : ι
⊢ ↑(f + single i b) j = ↑(single i b + f) j
[PROOFSTEP]
by_cases H : i = j
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f✝ : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (f + single i b)
i : ι
b : β i
f : Π₀ (i : ι), β i
h1 : ↑f i = 0
h2 : b ≠ 0
h3 : p f
j : ι
H : i = j
⊢ ↑(f + single i b) j = ↑(single i b + f) j
[PROOFSTEP]
subst H
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f✝ : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (f + single i b)
i : ι
b : β i
f : Π₀ (i : ι), β i
h1 : ↑f i = 0
h2 : b ≠ 0
h3 : p f
⊢ ↑(f + single i b) i = ↑(single i b + f) i
[PROOFSTEP]
simp [h1]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
p : (Π₀ (i : ι), β i) → Prop
f✝ : Π₀ (i : ι), β i
h0 : p 0
ha : ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i), ↑f i = 0 → b ≠ 0 → p f → p (f + single i b)
i : ι
b : β i
f : Π₀ (i : ι), β i
h1 : ↑f i = 0
h2 : b ≠ 0
h3 : p f
j : ι
H : ¬i = j
⊢ ↑(f + single i b) j = ↑(single i b + f) j
[PROOFSTEP]
simp [H]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
x : Π₀ (i : ι), β i
x✝ : x ∈ ⊤
⊢ x ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i))
[PROOFSTEP]
apply DFinsupp.induction x
[GOAL]
case h0
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
x : Π₀ (i : ι), β i
x✝ : x ∈ ⊤
⊢ 0 ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i))
case ha
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
x : Π₀ (i : ι), β i
x✝ : x ∈ ⊤
⊢ ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i),
    ↑f i = 0 →
      b ≠ 0 →
        f ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i)) →
          single i b + f ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i))
[PROOFSTEP]
exact AddSubmonoid.zero_mem _
[GOAL]
case ha
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
x : Π₀ (i : ι), β i
x✝ : x ∈ ⊤
⊢ ∀ (i : ι) (b : β i) (f : Π₀ (i : ι), β i),
    ↑f i = 0 →
      b ≠ 0 →
        f ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i)) →
          single i b + f ∈ AddSubmonoid.closure (⋃ (i : ι), Set.range (single i))
[PROOFSTEP]
exact fun a b f _ _ hf =>
  AddSubmonoid.add_mem _ (AddSubmonoid.subset_closure <| Set.mem_iUnion.2 ⟨a, Set.mem_range_self _⟩) hf
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
γ : Type w
inst✝ : AddZeroClass γ
f g : (Π₀ (i : ι), β i) →+ γ
H : ∀ (i : ι) (y : β i), ↑f (single i y) = ↑g (single i y)
⊢ f = g
[PROOFSTEP]
refine' AddMonoidHom.eq_of_eqOn_denseM add_closure_iUnion_range_single fun f hf => _
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
γ : Type w
inst✝ : AddZeroClass γ
f✝ g : (Π₀ (i : ι), β i) →+ γ
H : ∀ (i : ι) (y : β i), ↑f✝ (single i y) = ↑g (single i y)
f : Π₀ (i : ι), β i
hf : f ∈ ⋃ (i : ι), Set.range (single i)
⊢ ↑f✝ f = ↑g f
[PROOFSTEP]
simp only [Set.mem_iUnion, Set.mem_range] at hf 
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
γ : Type w
inst✝ : AddZeroClass γ
f✝ g : (Π₀ (i : ι), β i) →+ γ
H : ∀ (i : ι) (y : β i), ↑f✝ (single i y) = ↑g (single i y)
f : Π₀ (i : ι), β i
hf : ∃ i y, single i y = f
⊢ ↑f✝ f = ↑g f
[PROOFSTEP]
rcases hf with ⟨x, y, rfl⟩
[GOAL]
case intro.intro
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
γ : Type w
inst✝ : AddZeroClass γ
f g : (Π₀ (i : ι), β i) →+ γ
H : ∀ (i : ι) (y : β i), ↑f (single i y) = ↑g (single i y)
x : ι
y : β x
⊢ ↑f (single x y) = ↑g (single x y)
[PROOFSTEP]
apply H
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ ↑(mk s (x + y)) i = ↑(mk s x + mk s y) i
[PROOFSTEP]
simp only [add_apply, mk_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (x + y) { val := i, property := H } else 0) =
    (if H : i ∈ s then x { val := i, property := H } else 0) + if H : i ∈ s then y { val := i, property := H } else 0
[PROOFSTEP]
split_ifs <;> [rfl; rw [zero_add]]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (x + y) { val := i, property := H } else 0) =
    (if H : i ∈ s then x { val := i, property := H } else 0) + if H : i ∈ s then y { val := i, property := H } else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
h✝ : i ∈ s
⊢ (x + y) { val := i, property := h✝ } = x { val := i, property := h✝ } + y { val := i, property := h✝ }
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddZeroClass (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
h✝ : ¬i ∈ s
⊢ 0 = 0 + 0
[PROOFSTEP]
rw [zero_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
i : ι
⊢ ↑(mk s 0) i = ↑0 i
[PROOFSTEP]
simp only [mk_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
i : ι
⊢ (if H : i ∈ s then OfNat.ofNat 0 { val := i, property := H } else 0) = ↑0 i
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
i : ι
h✝ : i ∈ s
⊢ OfNat.ofNat 0 { val := i, property := h✝ } = ↑0 i
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → Zero (β i)
s : Finset ι
i : ι
h✝ : ¬i ∈ s
⊢ 0 = ↑0 i
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
⊢ ↑(mk s (-x)) i = ↑(-mk s x) i
[PROOFSTEP]
simp only [neg_apply, mk_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (-x) { val := i, property := H } else 0) = -if H : i ∈ s then x { val := i, property := H } else 0
[PROOFSTEP]
split_ifs <;> [rfl; rw [neg_zero]]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (-x) { val := i, property := H } else 0) = -if H : i ∈ s then x { val := i, property := H } else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
h✝ : i ∈ s
⊢ (-x) { val := i, property := h✝ } = -x { val := i, property := h✝ }
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x : (i : ↑↑s) → β ↑i
i : ι
h✝ : ¬i ∈ s
⊢ 0 = -0
[PROOFSTEP]
rw [neg_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ ↑(mk s (x - y)) i = ↑(mk s x - mk s y) i
[PROOFSTEP]
simp only [sub_apply, mk_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (x - y) { val := i, property := H } else 0) =
    (if H : i ∈ s then x { val := i, property := H } else 0) - if H : i ∈ s then y { val := i, property := H } else 0
[PROOFSTEP]
split_ifs <;> [rfl; rw [sub_zero]]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (x - y) { val := i, property := H } else 0) =
    (if H : i ∈ s then x { val := i, property := H } else 0) - if H : i ∈ s then y { val := i, property := H } else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
h✝ : i ∈ s
⊢ (x - y) { val := i, property := h✝ } = x { val := i, property := h✝ } - y { val := i, property := h✝ }
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : (i : ι) → AddGroup (β i)
s : Finset ι
x y : (i : ↑↑s) → β ↑i
i : ι
h✝ : ¬i ∈ s
⊢ 0 = 0 - 0
[PROOFSTEP]
rw [sub_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
s : Finset ι
c : γ
x : (i : ↑↑s) → β ↑i
i : ι
⊢ ↑(mk s (c • x)) i = ↑(c • mk s x) i
[PROOFSTEP]
simp only [smul_apply, mk_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
s : Finset ι
c : γ
x : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (c • x) { val := i, property := H } else 0) =
    c • if H : i ∈ s then x { val := i, property := H } else 0
[PROOFSTEP]
split_ifs <;> [rfl; rw [smul_zero]]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
s : Finset ι
c : γ
x : (i : ↑↑s) → β ↑i
i : ι
⊢ (if H : i ∈ s then (c • x) { val := i, property := H } else 0) =
    c • if H : i ∈ s then x { val := i, property := H } else 0
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
s : Finset ι
c : γ
x : (i : ↑↑s) → β ↑i
i : ι
h✝ : i ∈ s
⊢ (c • x) { val := i, property := h✝ } = c • x { val := i, property := h✝ }
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
s : Finset ι
c : γ
x : (i : ↑↑s) → β ↑i
i : ι
h✝ : ¬i ∈ s
⊢ 0 = c • 0
[PROOFSTEP]
rw [smul_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
i✝ : ι
c : γ
x : β i✝
i : ι
⊢ ↑(single i✝ (c • x)) i = ↑(c • single i✝ x) i
[PROOFSTEP]
simp only [smul_apply, single_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
i✝ : ι
c : γ
x : β i✝
i : ι
⊢ (if h : i✝ = i then (_ : i✝ = i) ▸ (c • x) else 0) = c • if h : i✝ = i then (_ : i✝ = i) ▸ x else 0
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
i✝ : ι
c : γ
x : β i✝
i : ι
h : i✝ = i
⊢ (_ : i✝ = i) ▸ (c • x) = c • (_ : i✝ = i) ▸ x
[PROOFSTEP]
cases h
[GOAL]
case pos.refl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
i : ι
c : γ
x : β i
⊢ (_ : i = i) ▸ (c • x) = c • (_ : i = i) ▸ x
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
i✝ : ι
c : γ
x : β i✝
i : ι
h : ¬i✝ = i
⊢ 0 = c • 0
[PROOFSTEP]
rw [smul_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
    (fun xs => Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset ↑xs)) a =
      (fun xs => Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset ↑xs)) b
[PROOFSTEP]
rintro ⟨sx, hx⟩ ⟨sy, hy⟩
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
⊢ (fun xs => Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset ↑xs)) { val := sx, property := hx } =
    (fun xs => Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset ↑xs)) { val := sy, property := hy }
[PROOFSTEP]
dsimp only [Subtype.coe_mk, toFun_eq_coe] at *
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
⊢ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx) = Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
[PROOFSTEP]
ext i
[GOAL]
case mk.mk.a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx) ↔
    i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
[PROOFSTEP]
constructor
[GOAL]
case mk.mk.a.mp
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx) →
    i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
[PROOFSTEP]
intro H
[GOAL]
case mk.mk.a.mp
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
H : i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx)
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
[PROOFSTEP]
rcases Finset.mem_filter.1 H with ⟨_, h⟩
[GOAL]
case mk.mk.a.mp.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
H : i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx)
left✝ : i ∈ Multiset.toFinset sx
h : ↑f i ≠ 0
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
[PROOFSTEP]
exact Finset.mem_filter.2 ⟨Multiset.mem_toFinset.2 <| (hy i).resolve_right h, h⟩
[GOAL]
case mk.mk.a.mpr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy) →
    i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx)
[PROOFSTEP]
intro H
[GOAL]
case mk.mk.a.mpr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
H : i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx)
[PROOFSTEP]
rcases Finset.mem_filter.1 H with ⟨_, h⟩
[GOAL]
case mk.mk.a.mpr.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
i : ι
H : i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sy)
left✝ : i ∈ Multiset.toFinset sy
h : ↑f i ≠ 0
⊢ i ∈ Finset.filter (fun i => ↑f i ≠ 0) (Multiset.toFinset sx)
[PROOFSTEP]
exact Finset.mem_filter.2 ⟨Multiset.mem_toFinset.2 <| (hx i).resolve_right h, h⟩
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : (i : ι) → β i
s : Multiset ι
h : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
H : i ∈ support { toFun := f, support' := Trunc.mk { val := s, property := h } }
⊢ i ∈ Multiset.toFinset (Multiset.toFinset s).val
[PROOFSTEP]
simpa using (Finset.mem_filter.1 H).1
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
⊢ i ∈ support f ↔ ↑f i ≠ 0
[PROOFSTEP]
cases' f with f s
[GOAL]
case mk'
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : (i : ι) → β i
s : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ i ∈ support { toFun := f, support' := s } ↔ ↑{ toFun := f, support' := s } i ≠ 0
[PROOFSTEP]
induction' s using Trunc.induction_on with s
[GOAL]
case mk'.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : (i : ι) → β i
s : { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ i ∈ support { toFun := f, support' := Trunc.mk s } ↔ ↑{ toFun := f, support' := Trunc.mk s } i ≠ 0
[PROOFSTEP]
dsimp only [support, Trunc.lift_mk]
[GOAL]
case mk'.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : (i : ι) → β i
s : { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ i ∈ Finset.filter (fun i => ↑{ toFun := f, support' := Trunc.mk s } i ≠ 0) (Multiset.toFinset ↑s) ↔
    ↑{ toFun := f, support' := Trunc.mk s } i ≠ 0
[PROOFSTEP]
rw [Finset.mem_filter, Multiset.mem_toFinset, coe_mk']
[GOAL]
case mk'.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : (i : ι) → β i
s : { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
⊢ i ∈ ↑s ∧ f i ≠ 0 ↔ f i ≠ 0
[PROOFSTEP]
exact and_iff_right_of_imp (s.prop i).resolve_right
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ f = mk (support f) fun i => ↑f ↑i
[PROOFSTEP]
change f = mk f.support fun i => f i.1
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ f = mk (support f) fun i => ↑f ↑i
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
by_cases h : f i ≠ 0 <;> [skip; rw [not_not] at h ]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
by_cases h : f i ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
h : ↑f i ≠ 0
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
skip
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
h : ¬↑f i ≠ 0
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
rw [not_not] at h 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
h : ↑f i ≠ 0
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
h : ↑f i = 0
⊢ ↑f i = ↑(mk (support f) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
i : ι
⊢ i ∈ support (mk s fun i => ↑(f i)) ↔ i ∈ s
[PROOFSTEP]
calc
  i ∈ support (mk s fun i ↦ (f i).1) ↔ ∃ h : i ∈ s, (f ⟨i, h⟩).1 ≠ 0 := by simp
  _ ↔ ∃ _ : i ∈ s, True := (exists_congr fun h ↦ (iff_true _).mpr (f _).2)
  _ ↔ i ∈ s := by simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
i : ι
⊢ i ∈ support (mk s fun i => ↑(f i)) ↔ ∃ h, ↑(f { val := i, property := h }) ≠ 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
i : ι
⊢ (∃ x, True) ↔ i ∈ s
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
⊢ Function.LeftInverse (fun f => { val := mk s fun i => ↑(f i), property := (_ : support (mk s fun i => ↑(f i)) = s) })
    fun x =>
    match (motive := { f // support f = s } → (i : { x // x ∈ s }) → { x // x ≠ 0 }) x with
    | { val := f, property := hf } => fun x =>
      match x with
      | { val := i, property := hi } => { val := ↑f i, property := (_ : ↑f i ≠ 0) }
[PROOFSTEP]
rintro ⟨f, rfl⟩
[GOAL]
case mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ (fun f_1 =>
        { val := mk (support f) fun i => ↑(f_1 i),
          property := (_ : support (mk (support f) fun i => ↑(f_1 i)) = support f) })
      ((fun x =>
          match (motive := { f_1 // support f_1 = support f } → (i : { x // x ∈ support f }) → { x // x ≠ 0 }) x with
          | { val := f_1, property := hf } => fun x =>
            match x with
            | { val := i, property := hi } => { val := ↑f_1 i, property := (_ : ↑f_1 i ≠ 0) })
        { val := f, property := (_ : support f = support f) }) =
    { val := f, property := (_ : support f = support f) }
[PROOFSTEP]
ext i
[GOAL]
case mk.a.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
⊢ ↑↑((fun f_1 =>
              { val := mk (support f) fun i => ↑(f_1 i),
                property := (_ : support (mk (support f) fun i => ↑(f_1 i)) = support f) })
            ((fun x =>
                match (motive := { f_1 // support f_1 = support f } → (i : { x // x ∈ support f }) → { x // x ≠ 0 })
                  x with
                | { val := f_1, property := hf } => fun x =>
                  match x with
                  | { val := i, property := hi } => { val := ↑f_1 i, property := (_ : ↑f_1 i ≠ 0) })
              { val := f, property := (_ : support f = support f) }))
      i =
    ↑↑{ val := f, property := (_ : support f = support f) } i
[PROOFSTEP]
simpa using Eq.symm
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
⊢ (fun x =>
        match (motive := { f // support f = s } → (i : { x // x ∈ s }) → { x // x ≠ 0 }) x with
        | { val := f, property := hf } => fun x =>
          match x with
          | { val := i, property := hi } => { val := ↑f i, property := (_ : ↑f i ≠ 0) })
      ((fun f => { val := mk s fun i => ↑(f i), property := (_ : support (mk s fun i => ↑(f i)) = s) }) f) =
    f
[PROOFSTEP]
ext1
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
x✝ : { x // x ∈ s }
⊢ (fun x =>
        match (motive := { f // support f = s } → (i : { x // x ∈ s }) → { x // x ≠ 0 }) x with
        | { val := f, property := hf } => fun x =>
          match x with
          | { val := i, property := hi } => { val := ↑f i, property := (_ : ↑f i ≠ 0) })
      ((fun f => { val := mk s fun i => ↑(f i), property := (_ : support (mk s fun i => ↑(f i)) = s) }) f) x✝ =
    f x✝
[PROOFSTEP]
simp [Subtype.eta]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Finset ι
f : (i : { x // x ∈ s }) → { x // x ≠ 0 }
x✝ : { x // x ∈ s }
⊢ f { val := ↑x✝, property := (_ : ↑x✝ ∈ s) } = f x✝
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
H : support f = ∅
⊢ ∀ (i : ι), ↑f i = ↑0 i
[PROOFSTEP]
simpa [Finset.ext_iff] using H
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ f = 0 → support f = ∅
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Set ι
f : Π₀ (i : ι), β i
⊢ ↑(support f) ⊆ s ↔ ∀ (i : ι), ¬i ∈ s → ↑f i = 0
[PROOFSTEP]
simp [Set.subset_def]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
s : Set ι
f : Π₀ (i : ι), β i
⊢ (∀ (x : ι), ¬↑f x = 0 → x ∈ s) ↔ ∀ (i : ι), ¬i ∈ s → ↑f i = 0
[PROOFSTEP]
exact forall_congr' fun i => not_imp_comm
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
b : β i
hb : b ≠ 0
⊢ support (single i b) = {i}
[PROOFSTEP]
ext j
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
b : β i
hb : b ≠ 0
j : ι
⊢ j ∈ support (single i b) ↔ j ∈ {i}
[PROOFSTEP]
by_cases h : i = j
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
b : β i
hb : b ≠ 0
j : ι
h : i = j
⊢ j ∈ support (single i b) ↔ j ∈ {i}
[PROOFSTEP]
subst h
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
b : β i
hb : b ≠ 0
⊢ i ∈ support (single i b) ↔ i ∈ {i}
[PROOFSTEP]
simp [hb]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
b : β i
hb : b ≠ 0
j : ι
h : ¬i = j
⊢ j ∈ support (single i b) ↔ j ∈ {i}
[PROOFSTEP]
simp [Ne.symm h, h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
⊢ mapRange f hf g = mk (support g) fun i => f (↑i) (↑g ↑i)
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
i : ι
⊢ ↑(mapRange f hf g) i = ↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i
[PROOFSTEP]
by_cases h : g i ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
i : ι
h : ↑g i ≠ 0
⊢ ↑(mapRange f hf g) i = ↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i
[PROOFSTEP]
simp at h 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
i : ι
h : ¬↑g i ≠ 0
⊢ ↑(mapRange f hf g) i = ↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i
[PROOFSTEP]
simp at h 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
i : ι
h : ¬↑g i = 0
⊢ ↑(mapRange f hf g) i = ↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i
[PROOFSTEP]
simp [h, hf]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝² : (i : ι) → Zero (β₁ i)
inst✝¹ : (i : ι) → Zero (β₂ i)
inst✝ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
i : ι
h : ↑g i = 0
⊢ ↑(mapRange f hf g) i = ↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i
[PROOFSTEP]
simp [h, hf]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
i : ι
b : β₁ i
i' : ι
⊢ ↑(mapRange f hf (single i b)) i' = ↑(single i (f i b)) i'
[PROOFSTEP]
by_cases h : i = i'
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
i : ι
b : β₁ i
i' : ι
h : i = i'
⊢ ↑(mapRange f hf (single i b)) i' = ↑(single i (f i b)) i'
[PROOFSTEP]
subst i'
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
i : ι
b : β₁ i
⊢ ↑(mapRange f hf (single i b)) i = ↑(single i (f i b)) i
[PROOFSTEP]
simp
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → Zero (β₁ i)
inst✝ : (i : ι) → Zero (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
i : ι
b : β₁ i
i' : ι
h : ¬i = i'
⊢ ↑(mapRange f hf (single i b)) i' = ↑(single i (f i b)) i'
[PROOFSTEP]
simp [h, hf]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁵ : (i : ι) → Zero (β i)
inst✝⁴ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
⊢ support (mapRange f hf g) ⊆ support g
[PROOFSTEP]
simp [mapRange_def]
[GOAL]
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
⊢ zipWith f hf g₁ g₂ = mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)
[PROOFSTEP]
ext i
[GOAL]
case h
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
by_cases h1 : g₁ i ≠ 0
[GOAL]
case pos
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ↑g₁ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
by_cases h2 : g₂ i ≠ 0
[GOAL]
case neg
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ¬↑g₁ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
by_cases h2 : g₂ i ≠ 0
[GOAL]
case pos
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ↑g₁ i ≠ 0
h2 : ↑g₂ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp only [not_not, Ne.def] at h1 h2 
[GOAL]
case neg
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ↑g₁ i ≠ 0
h2 : ¬↑g₂ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp only [not_not, Ne.def] at h1 h2 
[GOAL]
case pos
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ¬↑g₁ i ≠ 0
h2 : ↑g₂ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp only [not_not, Ne.def] at h1 h2 
[GOAL]
case neg
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ¬↑g₁ i ≠ 0
h2 : ¬↑g₂ i ≠ 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp only [not_not, Ne.def] at h1 h2 
[GOAL]
case pos
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ¬↑g₁ i = 0
h2 : ¬↑g₂ i = 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp [h1, h2, hf]
[GOAL]
case neg
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ¬↑g₁ i = 0
h2 : ↑g₂ i = 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp [h1, h2, hf]
[GOAL]
case pos
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h2 : ¬↑g₂ i = 0
h1 : ↑g₁ i = 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp [h1, h2, hf]
[GOAL]
case neg
ι✝ : Type u
γ : Type w
β✝ : ι✝ → Type v
β₁✝ : ι✝ → Type v₁
β₂✝ : ι✝ → Type v₂
dec✝ : DecidableEq ι✝
inst✝¹⁰ : (i : ι✝) → Zero (β✝ i)
inst✝⁹ : (i : ι✝) → (x : β✝ i) → Decidable (x ≠ 0)
inst✝⁸ : (i : ι✝) → Zero (β₁✝ i)
inst✝⁷ : (i : ι✝) → Zero (β₂✝ i)
inst✝⁶ : (i : ι✝) → (x : β₁✝ i) → Decidable (x ≠ 0)
inst✝⁵ : (i : ι✝) → (x : β₂✝ i) → Decidable (x ≠ 0)
ι : Type u
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁴ : (i : ι) → Zero (β i)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
i : ι
h1 : ↑g₁ i = 0
h2 : ↑g₂ i = 0
⊢ ↑(zipWith f hf g₁ g₂) i = ↑(mk (support g₁ ∪ support g₂) fun i => f (↑i) (↑g₁ ↑i) (↑g₂ ↑i)) i
[PROOFSTEP]
simp [h1, h2, hf]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝⁵ : (i : ι) → Zero (β i)
inst✝⁴ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝³ : (i : ι) → Zero (β₁ i)
inst✝² : (i : ι) → Zero (β₂ i)
inst✝¹ : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
f : (i : ι) → β₁ i → β₂ i → β i
hf : ∀ (i : ι), f i 0 0 = 0
g₁ : Π₀ (i : ι), β₁ i
g₂ : Π₀ (i : ι), β₂ i
⊢ support (zipWith f hf g₁ g₂) ⊆ support g₁ ∪ support g₂
[PROOFSTEP]
simp [zipWith_def]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
⊢ erase i f = mk (Finset.erase (support f) i) fun j => ↑f ↑j
[PROOFSTEP]
ext j
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
by_cases h1 : j = i
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
by_cases h2 : f j ≠ 0
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
by_cases h2 : f j ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
h2 : ↑f j ≠ 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
h2 : ¬↑f j ≠ 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ↑f j ≠ 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ¬↑f j ≠ 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
h2 : ¬↑f j = 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
h2 : ↑f j = 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ¬↑f j = 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ↑f j = 0
⊢ ↑(erase i f) j = ↑(mk (Finset.erase (support f) i) fun j => ↑f ↑j) j
[PROOFSTEP]
simp [h1, h2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
⊢ support (erase i f) = Finset.erase (support f) i
[PROOFSTEP]
ext j
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
by_cases h1 : j = i
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : j = i
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
simp [h1]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
by_cases h2 : f j ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ↑f j ≠ 0
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ¬↑f j ≠ 0
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ¬↑f j = 0
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
i : ι
f : Π₀ (i : ι), β i
j : ι
h1 : ¬j = i
h2 : ↑f j = 0
⊢ j ∈ support (erase i f) ↔ j ∈ Finset.erase (support f) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
h : b ≠ 0
⊢ support (update i f b) = insert i (support f)
[PROOFSTEP]
ext j
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
h : b ≠ 0
j : ι
⊢ j ∈ support (update i f b) ↔ j ∈ insert i (support f)
[PROOFSTEP]
rcases eq_or_ne i j with (rfl | hi)
[GOAL]
case a.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
h : b ≠ 0
⊢ i ∈ support (update i f b) ↔ i ∈ insert i (support f)
[PROOFSTEP]
simp [h]
[GOAL]
case a.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
h : b ≠ 0
j : ι
hi : i ≠ j
⊢ j ∈ support (update i f b) ↔ j ∈ insert i (support f)
[PROOFSTEP]
simp [hi.symm]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
inst✝ : Decidable (b = 0)
⊢ support (update i f b) = if b = 0 then support (erase i f) else insert i (support f)
[PROOFSTEP]
ext j
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
inst✝ : Decidable (b = 0)
j : ι
⊢ j ∈ support (update i f b) ↔ j ∈ if b = 0 then support (erase i f) else insert i (support f)
[PROOFSTEP]
split_ifs with hb
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
inst✝ : Decidable (b = 0)
j : ι
hb : b = 0
⊢ j ∈ support (update i f b) ↔ j ∈ support (erase i f)
[PROOFSTEP]
subst hb
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i j : ι
inst✝ : Decidable (0 = 0)
⊢ j ∈ support (update i f 0) ↔ j ∈ support (erase i f)
[PROOFSTEP]
simp [update_eq_erase, support_erase]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
b : β i
inst✝ : Decidable (b = 0)
j : ι
hb : ¬b = 0
⊢ j ∈ support (update i f b) ↔ j ∈ insert i (support f)
[PROOFSTEP]
rw [support_update_ne_zero f _ hb]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
⊢ filter p f = mk (Finset.filter p (support f)) fun i => ↑f ↑i
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
by_cases h1 : p i
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : p i
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
by_cases h2 : f i ≠ 0
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : ¬p i
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
by_cases h2 : f i ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : p i
h2 : ↑f i ≠ 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : p i
h2 : ¬↑f i ≠ 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : ¬p i
h2 : ↑f i ≠ 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : ¬p i
h2 : ¬↑f i ≠ 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : p i
h2 : ¬↑f i = 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : p i
h2 : ↑f i = 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : ¬p i
h2 : ¬↑f i = 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h1 : ¬p i
h2 : ↑f i = 0
⊢ ↑(filter p f) i = ↑(mk (Finset.filter p (support f)) fun i => ↑f ↑i) i
[PROOFSTEP]
simp [h1, h2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
⊢ support (filter p f) = Finset.filter p (support f)
[PROOFSTEP]
ext i
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
⊢ i ∈ support (filter p f) ↔ i ∈ Finset.filter p (support f)
[PROOFSTEP]
by_cases h : p i
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h : p i
⊢ i ∈ support (filter p f) ↔ i ∈ Finset.filter p (support f)
[PROOFSTEP]
simp [h]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : ι
h : ¬p i
⊢ i ∈ support (filter p f) ↔ i ∈ Finset.filter p (support f)
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
⊢ subtypeDomain p f = mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
by_cases h2 : f i ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ↑f ↑i ≠ 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
try simp at h2 ; dsimp; simp [h2]
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ↑f ↑i ≠ 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ¬↑f ↑i = 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
dsimp
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ¬↑f ↑i = 0
⊢ ↑f ↑i = if i ∈ Finset.subtype p (support f) then ↑f ↑i else 0
[PROOFSTEP]
simp [h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ¬↑f ↑i ≠ 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
try simp at h2 ; dsimp; simp [h2]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ¬↑f ↑i ≠ 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
simp at h2 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ↑f ↑i = 0
⊢ ↑(subtypeDomain p f) i = ↑(mk (Finset.subtype p (support f)) fun i => ↑f ↑↑i) i
[PROOFSTEP]
dsimp
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
h2 : ↑f ↑i = 0
⊢ ↑f ↑i = if i ∈ Finset.subtype p (support f) then ↑f ↑i else 0
[PROOFSTEP]
simp [h2]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
⊢ support (subtypeDomain p f) = Finset.subtype p (support f)
[PROOFSTEP]
ext i
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
p : ι → Prop
inst✝ : DecidablePred p
f : Π₀ (i : ι), β i
i : Subtype p
⊢ i ∈ support (subtypeDomain p f) ↔ i ∈ Finset.subtype p (support f)
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddGroup (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ support (-f) = support f
[PROOFSTEP]
ext i
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddGroup (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
i : ι
⊢ i ∈ support (-f) ↔ i ∈ support f
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
x✝ : support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
h₁ : support f = support g
h₂ : ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
i : ι
h : ¬i ∈ support f
⊢ ↑f i = ↑g i
[PROOFSTEP]
have hf : f i = 0 := by rwa [mem_support_iff, not_not] at h 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
x✝ : support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
h₁ : support f = support g
h₂ : ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
i : ι
h : ¬i ∈ support f
⊢ ↑f i = 0
[PROOFSTEP]
rwa [mem_support_iff, not_not] at h 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
x✝ : support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
h₁ : support f = support g
h₂ : ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
i : ι
h : ¬i ∈ support f
hf : ↑f i = 0
⊢ ↑f i = ↑g i
[PROOFSTEP]
have hg : g i = 0 := by rwa [h₁, mem_support_iff, not_not] at h 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
x✝ : support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
h₁ : support f = support g
h₂ : ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
i : ι
h : ¬i ∈ support f
hf : ↑f i = 0
⊢ ↑g i = 0
[PROOFSTEP]
rwa [h₁, mem_support_iff, not_not] at h 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
x✝ : support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
h₁ : support f = support g
h₂ : ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
i : ι
h : ¬i ∈ support f
hf : ↑f i = 0
hg : ↑g i = 0
⊢ ↑f i = ↑g i
[PROOFSTEP]
rw [hf, hg]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f g : Π₀ (i : ι), β i
⊢ f = g → support f = support g ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑g i
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → Zero (β i)
inst✝ : (i : ι) → DecidableEq (β i)
f : Π₀ (i : ι), β i
⊢ support f = support f ∧ ∀ (i : ι), i ∈ support f → ↑f i = ↑f i
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
⊢ comapDomain h hh 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
i✝ : κ
⊢ ↑(comapDomain h hh 0) i✝ = ↑0 i✝
[PROOFSTEP]
rw [zero_apply, comapDomain_apply, zero_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
h : κ → ι
hh : Function.Injective h
f g : Π₀ (i : ι), β i
⊢ comapDomain h hh (f + g) = comapDomain h hh f + comapDomain h hh g
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
h : κ → ι
hh : Function.Injective h
f g : Π₀ (i : ι), β i
i✝ : κ
⊢ ↑(comapDomain h hh (f + g)) i✝ = ↑(comapDomain h hh f + comapDomain h hh g) i✝
[PROOFSTEP]
rw [add_apply, comapDomain_apply, comapDomain_apply, comapDomain_apply, add_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
h : κ → ι
hh : Function.Injective h
r : γ
f : Π₀ (i : ι), β i
⊢ comapDomain h hh (r • f) = r • comapDomain h hh f
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
h : κ → ι
hh : Function.Injective h
r : γ
f : Π₀ (i : ι), β i
i✝ : κ
⊢ ↑(comapDomain h hh (r • f)) i✝ = ↑(r • comapDomain h hh f) i✝
[PROOFSTEP]
rw [smul_apply, comapDomain_apply, smul_apply, comapDomain_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
k : κ
x : β (h k)
⊢ comapDomain h hh (single (h k) x) = single k x
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
k : κ
x : β (h k)
i : κ
⊢ ↑(comapDomain h hh (single (h k) x)) i = ↑(single k x) i
[PROOFSTEP]
rw [comapDomain_apply]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
k : κ
x : β (h k)
i : κ
⊢ ↑(single (h k) x) (h i) = ↑(single k x) i
[PROOFSTEP]
obtain rfl | hik := Decidable.eq_or_ne i k
[GOAL]
case h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
i : κ
x : β (h i)
⊢ ↑(single (h i) x) (h i) = ↑(single i x) i
[PROOFSTEP]
rw [single_eq_same, single_eq_same]
[GOAL]
case h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
hh : Function.Injective h
k : κ
x : β (h k)
i : κ
hik : i ≠ k
⊢ ↑(single (h k) x) (h i) = ↑(single k x) i
[PROOFSTEP]
rw [single_eq_of_ne hik.symm, single_eq_of_ne (hh.ne hik.symm)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
⊢ comapDomain' h hh' 0 = 0
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
i✝ : κ
⊢ ↑(comapDomain' h hh' 0) i✝ = ↑0 i✝
[PROOFSTEP]
rw [zero_apply, comapDomain'_apply, zero_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
f g : Π₀ (i : ι), β i
⊢ comapDomain' h hh' (f + g) = comapDomain' h hh' f + comapDomain' h hh' g
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → AddZeroClass (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
f g : Π₀ (i : ι), β i
i✝ : κ
⊢ ↑(comapDomain' h hh' (f + g)) i✝ = ↑(comapDomain' h hh' f + comapDomain' h hh' g) i✝
[PROOFSTEP]
rw [add_apply, comapDomain'_apply, comapDomain'_apply, comapDomain'_apply, add_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
r : γ
f : Π₀ (i : ι), β i
⊢ comapDomain' h hh' (r • f) = r • comapDomain' h hh' f
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : Monoid γ
inst✝¹ : (i : ι) → AddMonoid (β i)
inst✝ : (i : ι) → DistribMulAction γ (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
r : γ
f : Π₀ (i : ι), β i
i✝ : κ
⊢ ↑(comapDomain' h hh' (r • f)) i✝ = ↑(r • comapDomain' h hh' f) i✝
[PROOFSTEP]
rw [smul_apply, comapDomain'_apply, smul_apply, comapDomain'_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
k : κ
x : β (h k)
⊢ comapDomain' h hh' (single (h k) x) = single k x
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
k : κ
x : β (h k)
i : κ
⊢ ↑(comapDomain' h hh' (single (h k) x)) i = ↑(single k x) i
[PROOFSTEP]
rw [comapDomain'_apply]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
k : κ
x : β (h k)
i : κ
⊢ ↑(single (h k) x) (h i) = ↑(single k x) i
[PROOFSTEP]
obtain rfl | hik := Decidable.eq_or_ne i k
[GOAL]
case h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
i : κ
x : β (h i)
⊢ ↑(single (h i) x) (h i) = ↑(single i x) i
[PROOFSTEP]
rw [single_eq_same, single_eq_same]
[GOAL]
case h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : DecidableEq κ
inst✝ : (i : ι) → Zero (β i)
h : κ → ι
h' : ι → κ
hh' : Function.LeftInverse h' h
k : κ
x : β (h k)
i : κ
hik : i ≠ k
⊢ ↑(single (h k) x) (h i) = ↑(single k x) i
[PROOFSTEP]
rw [single_eq_of_ne hik.symm, single_eq_of_ne (hh'.injective.ne hik.symm)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : ι ≃ κ
f : Π₀ (k : κ), β (↑h.symm k)
i : ι
⊢ HEq 0 0
[PROOFSTEP]
rw [Equiv.symm_apply_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : ι ≃ κ
f : Π₀ (i : ι), β i
⊢ (fun f =>
        mapRange (fun i => ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)))
          (_ : ∀ (i : ι), ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)) 0 = 0)
          (comapDomain' ↑h (_ : Function.LeftInverse h.invFun h.toFun) f))
      (comapDomain' ↑h.symm (_ : Function.RightInverse h.invFun h.toFun) f) =
    f
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : ι ≃ κ
f : Π₀ (i : ι), β i
i : ι
⊢ ↑((fun f =>
            mapRange (fun i => ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)))
              (_ : ∀ (i : ι), ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)) 0 = 0)
              (comapDomain' ↑h (_ : Function.LeftInverse h.invFun h.toFun) f))
          (comapDomain' ↑h.symm (_ : Function.RightInverse h.invFun h.toFun) f))
      i =
    ↑f i
[PROOFSTEP]
rw [mapRange_apply, comapDomain'_apply, comapDomain'_apply, Equiv.cast_eq_iff_heq, h.symm_apply_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : ι ≃ κ
f : Π₀ (k : κ), β (↑h.symm k)
⊢ comapDomain' ↑h.symm (_ : Function.RightInverse h.invFun h.toFun)
      ((fun f =>
          mapRange (fun i => ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)))
            (_ : ∀ (i : ι), ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)) 0 = 0)
            (comapDomain' ↑h (_ : Function.LeftInverse h.invFun h.toFun) f))
        f) =
    f
[PROOFSTEP]
ext k
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
inst✝ : (i : ι) → Zero (β i)
h : ι ≃ κ
f : Π₀ (k : κ), β (↑h.symm k)
k : κ
⊢ ↑(comapDomain' ↑h.symm (_ : Function.RightInverse h.invFun h.toFun)
          ((fun f =>
              mapRange (fun i => ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)))
                (_ : ∀ (i : ι), ↑(Equiv.cast (_ : β (↑h.symm (↑h i)) = β i)) 0 = 0)
                (comapDomain' ↑h (_ : Function.LeftInverse h.invFun h.toFun) f))
            f))
      k =
    ↑f k
[PROOFSTEP]
rw [comapDomain'_apply, mapRange_apply, comapDomain'_apply, Equiv.cast_eq_iff_heq, h.apply_symm_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝ : (i : ι) → (j : α i) → AddZeroClass (δ i j)
f g : Π₀ (i : (x : ι) × α x), δ i.fst i.snd
⊢ sigmaCurry (f + g) = sigmaCurry f + sigmaCurry g
[PROOFSTEP]
ext (i j)
[GOAL]
case h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝ : (i : ι) → (j : α i) → AddZeroClass (δ i j)
f g : Π₀ (i : (x : ι) × α x), δ i.fst i.snd
i : ι
j : α i
⊢ ↑(↑(sigmaCurry (f + g)) i) j = ↑(↑(sigmaCurry f + sigmaCurry g) i) j
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : Monoid γ
inst✝¹ : (i : ι) → (j : α i) → AddMonoid (δ i j)
inst✝ : (i : ι) → (j : α i) → DistribMulAction γ (δ i j)
r : γ
f : Π₀ (i : (x : ι) × α x), δ i.fst i.snd
⊢ sigmaCurry (r • f) = r • sigmaCurry f
[PROOFSTEP]
ext (i j)
[GOAL]
case h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : Monoid γ
inst✝¹ : (i : ι) → (j : α i) → AddMonoid (δ i j)
inst✝ : (i : ι) → (j : α i) → DistribMulAction γ (δ i j)
r : γ
f : Π₀ (i : (x : ι) × α x), δ i.fst i.snd
i : ι
j : α i
⊢ ↑(↑(sigmaCurry (r • f)) i) j = ↑(↑(r • sigmaCurry f) i) j
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
ij : (i : ι) × α i
x : δ ij.fst ij.snd
⊢ sigmaCurry (single ij x) = single ij.fst (single ij.snd x)
[PROOFSTEP]
obtain ⟨i, j⟩ := ij
[GOAL]
case mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
⊢ sigmaCurry (single { fst := i, snd := j } x) = single { fst := i, snd := j }.fst (single { fst := i, snd := j }.snd x)
[PROOFSTEP]
ext i' j'
[GOAL]
case mk.h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
i' : ι
j' : α i'
⊢ ↑(↑(sigmaCurry (single { fst := i, snd := j } x)) i') j' =
    ↑(↑(single { fst := i, snd := j }.fst (single { fst := i, snd := j }.snd x)) i') j'
[PROOFSTEP]
dsimp only
[GOAL]
case mk.h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
i' : ι
j' : α i'
⊢ ↑(↑(sigmaCurry (single { fst := i, snd := j } x)) i') j' = ↑(↑(single i (single j x)) i') j'
[PROOFSTEP]
rw [sigmaCurry_apply]
[GOAL]
case mk.h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
i' : ι
j' : α i'
⊢ ↑(single { fst := i, snd := j } x) { fst := i', snd := j' } = ↑(↑(single i (single j x)) i') j'
[PROOFSTEP]
obtain rfl | hi := eq_or_ne i i'
[GOAL]
case mk.h.h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
j' : α i
⊢ ↑(single { fst := i, snd := j } x) { fst := i, snd := j' } = ↑(↑(single i (single j x)) i) j'
[PROOFSTEP]
rw [single_eq_same]
[GOAL]
case mk.h.h.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
j' : α i
⊢ ↑(single { fst := i, snd := j } x) { fst := i, snd := j' } = ↑(single j x) j'
[PROOFSTEP]
obtain rfl | hj := eq_or_ne j j'
[GOAL]
case mk.h.h.inl.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
⊢ ↑(single { fst := i, snd := j } x) { fst := i, snd := j } = ↑(single j x) j
[PROOFSTEP]
rw [single_eq_same, single_eq_same]
[GOAL]
case mk.h.h.inl.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
j' : α i
hj : j ≠ j'
⊢ ↑(single { fst := i, snd := j } x) { fst := i, snd := j' } = ↑(single j x) j'
[PROOFSTEP]
rw [single_eq_of_ne, single_eq_of_ne hj]
[GOAL]
case mk.h.h.inl.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
j' : α i
hj : j ≠ j'
⊢ { fst := i, snd := j } ≠ { fst := i, snd := j' }
[PROOFSTEP]
simpa using hj
[GOAL]
case mk.h.h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
i' : ι
j' : α i'
hi : i ≠ i'
⊢ ↑(single { fst := i, snd := j } x) { fst := i', snd := j' } = ↑(↑(single i (single j x)) i') j'
[PROOFSTEP]
rw [single_eq_of_ne, single_eq_of_ne hi, zero_apply]
[GOAL]
case mk.h.h.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → Zero (δ i j)
i : ι
j : α i
x : δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
i' : ι
j' : α i'
hi : i ≠ i'
⊢ { fst := i, snd := j } ≠ { fst := i', snd := j' }
[PROOFSTEP]
simp [hi]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
⊢ (i ∈
      Multiset.bind ↑s fun i =>
        (map { toFun := Sigma.mk i, inj' := (_ : Function.Injective (Sigma.mk i)) } (support (↑f i))).val) ∨
    (fun i => ↑(↑f i.fst) i.snd) i = 0
[PROOFSTEP]
simp_rw [Multiset.mem_bind, map_val, Multiset.mem_map, Function.Embedding.coeFn_mk, ← Finset.mem_def, mem_support_toFun]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
⊢ (∃ a, a ∈ ↑s ∧ ∃ a_1, ↑(↑f a) a_1 ≠ 0 ∧ { fst := a, snd := a_1 } = i) ∨ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
obtain hi | (hi : f i.1 = 0) := s.prop i.1
[GOAL]
case inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
hi : i.fst ∈ ↑s
⊢ (∃ a, a ∈ ↑s ∧ ∃ a_1, ↑(↑f a) a_1 ≠ 0 ∧ { fst := a, snd := a_1 } = i) ∨ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
by_cases hi' : f i.1 i.2 = 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
hi : i.fst ∈ ↑s
hi' : ↑(↑f i.fst) i.snd = 0
⊢ (∃ a, a ∈ ↑s ∧ ∃ a_1, ↑(↑f a) a_1 ≠ 0 ∧ { fst := a, snd := a_1 } = i) ∨ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
exact Or.inr hi'
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
hi : i.fst ∈ ↑s
hi' : ¬↑(↑f i.fst) i.snd = 0
⊢ (∃ a, a ∈ ↑s ∧ ∃ a_1, ↑(↑f a) a_1 ≠ 0 ∧ { fst := a, snd := a_1 } = i) ∨ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
exact Or.inl ⟨_, hi, i.2, hi', Sigma.eta _⟩
[GOAL]
case inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
hi : ↑f i.fst = 0
⊢ (∃ a, a ∈ ↑s ∧ ∃ a_1, ↑(↑f a) a_1 ≠ 0 ∧ { fst := a, snd := a_1 } = i) ∨ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
right
[GOAL]
case inr.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
s : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }
i : (i : ι) × α i
hi : ↑f i.fst = 0
⊢ ↑(↑f i.fst) i.snd = 0
[PROOFSTEP]
rw [hi, zero_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
⊢ δ { fst := i, snd := j }.fst { fst := i, snd := j }.snd
[PROOFSTEP]
exact x
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
⊢ sigmaUncurry (single i (single j x)) = single { fst := i, snd := j } x
[PROOFSTEP]
ext ⟨i', j'⟩
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
i' : ι
j' : α i'
⊢ ↑(sigmaUncurry (single i (single j x))) { fst := i', snd := j' } =
    ↑(single { fst := i, snd := j } x) { fst := i', snd := j' }
[PROOFSTEP]
dsimp only
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
i' : ι
j' : α i'
⊢ ↑(sigmaUncurry (single i (single j x))) { fst := i', snd := j' } =
    ↑(single { fst := i, snd := j } x) { fst := i', snd := j' }
[PROOFSTEP]
rw [sigmaUncurry_apply]
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
i' : ι
j' : α i'
⊢ ↑(↑(single i (single j x)) i') j' = ↑(single { fst := i, snd := j } x) { fst := i', snd := j' }
[PROOFSTEP]
obtain rfl | hi := eq_or_ne i i'
[GOAL]
case h.mk.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
j' : α i
⊢ ↑(↑(single i (single j x)) i) j' = ↑(single { fst := i, snd := j } x) { fst := i, snd := j' }
[PROOFSTEP]
rw [single_eq_same]
[GOAL]
case h.mk.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
j' : α i
⊢ ↑(single j x) j' = ↑(single { fst := i, snd := j } x) { fst := i, snd := j' }
[PROOFSTEP]
obtain rfl | hj := eq_or_ne j j'
[GOAL]
case h.mk.inl.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
⊢ ↑(single j x) j = ↑(single { fst := i, snd := j } x) { fst := i, snd := j }
[PROOFSTEP]
rw [single_eq_same, single_eq_same]
[GOAL]
case h.mk.inl.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
j' : α i
hj : j ≠ j'
⊢ ↑(single j x) j' = ↑(single { fst := i, snd := j } x) { fst := i, snd := j' }
[PROOFSTEP]
rw [single_eq_of_ne hj, single_eq_of_ne]
[GOAL]
case h.mk.inl.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
j' : α i
hj : j ≠ j'
⊢ { fst := i, snd := j } ≠ { fst := i, snd := j' }
[PROOFSTEP]
simpa using hj
[GOAL]
case h.mk.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
i' : ι
j' : α i'
hi : i ≠ i'
⊢ ↑(↑(single i (single j x)) i') j' = ↑(single { fst := i, snd := j } x) { fst := i', snd := j' }
[PROOFSTEP]
rw [single_eq_of_ne hi, single_eq_of_ne, zero_apply]
[GOAL]
case h.mk.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
i : ι
j : α i
x : δ i j
i' : ι
j' : α i'
hi : i ≠ i'
⊢ { fst := i, snd := j } ≠ { fst := i', snd := j' }
[PROOFSTEP]
simp [hi]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : (i : ι) × α i), δ i.fst i.snd
⊢ sigmaUncurry (sigmaCurry f) = f
[PROOFSTEP]
ext ⟨i, j⟩
[GOAL]
case h.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : (i : ι) × α i), δ i.fst i.snd
i : ι
j : α i
⊢ ↑(sigmaUncurry (sigmaCurry f)) { fst := i, snd := j } = ↑f { fst := i, snd := j }
[PROOFSTEP]
rw [sigmaUncurry_apply, sigmaCurry_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
⊢ sigmaCurry (sigmaUncurry f) = f
[PROOFSTEP]
ext i j
[GOAL]
case h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : ι → Type u_2
δ : (i : ι) → α i → Type v
inst✝² : (i : ι) → (j : α i) → Zero (δ i j)
inst✝¹ : (i : ι) → DecidableEq (α i)
inst✝ : (i : ι) → (j : α i) → (x : δ i j) → Decidable (x ≠ 0)
f : Π₀ (i : ι) (j : α i), δ i j
i : ι
j : α i
⊢ ↑(↑(sigmaCurry (sigmaUncurry f)) i) j = ↑(↑f i) j
[PROOFSTEP]
rw [sigmaCurry_apply, sigmaUncurry_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
⊢ extendWith 0 (single i x) = single (some i) x
[PROOFSTEP]
ext (_ | j)
[GOAL]
case h.none
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
⊢ ↑(extendWith 0 (single i x)) none = ↑(single (some i) x) none
[PROOFSTEP]
rw [extendWith_none, single_eq_of_ne (Option.some_ne_none _)]
[GOAL]
case h.some
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
j : ι
⊢ ↑(extendWith 0 (single i x)) (some j) = ↑(single (some i) x) (some j)
[PROOFSTEP]
rw [extendWith_some]
[GOAL]
case h.some
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
j : ι
⊢ ↑(single i x) j = ↑(single (some i) x) (some j)
[PROOFSTEP]
obtain rfl | hij := Decidable.eq_or_ne i j
[GOAL]
case h.some.inl
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
⊢ ↑(single i x) i = ↑(single (some i) x) (some i)
[PROOFSTEP]
rw [single_eq_same, single_eq_same]
[GOAL]
case h.some.inr
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
i : ι
x : α (some i)
j : ι
hij : i ≠ j
⊢ ↑(single i x) j = ↑(single (some i) x) (some j)
[PROOFSTEP]
rw [single_eq_of_ne hij, single_eq_of_ne ((Option.some_injective _).ne hij)]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
x : α none
⊢ extendWith x 0 = single none x
[PROOFSTEP]
ext (_ | j)
[GOAL]
case h.none
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
x : α none
⊢ ↑(extendWith x 0) none = ↑(single none x) none
[PROOFSTEP]
rw [extendWith_none, single_eq_same]
[GOAL]
case h.some
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝¹ : DecidableEq ι
inst✝ : (i : Option ι) → Zero (α i)
x : α none
j : ι
⊢ ↑(extendWith x 0) (some j) = ↑(single none x) (some j)
[PROOFSTEP]
rw [extendWith_some, single_eq_of_ne (Option.some_ne_none _).symm, zero_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
f : Π₀ (i : Option ι), α i
⊢ (fun f => extendWith f.fst f.snd) ((fun f => (↑f none, comapDomain some (_ : Function.Injective some) f)) f) = f
[PROOFSTEP]
ext i
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
f : Π₀ (i : Option ι), α i
i : Option ι
⊢ ↑((fun f => extendWith f.fst f.snd) ((fun f => (↑f none, comapDomain some (_ : Function.Injective some) f)) f)) i =
    ↑f i
[PROOFSTEP]
cases' i with i
[GOAL]
case h.none
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
f : Π₀ (i : Option ι), α i
⊢ ↑((fun f => extendWith f.fst f.snd) ((fun f => (↑f none, comapDomain some (_ : Function.Injective some) f)) f)) none =
    ↑f none
[PROOFSTEP]
rw [extendWith_none]
[GOAL]
case h.some
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
f : Π₀ (i : Option ι), α i
i : ι
⊢ ↑((fun f => extendWith f.fst f.snd) ((fun f => (↑f none, comapDomain some (_ : Function.Injective some) f)) f))
      (some i) =
    ↑f (some i)
[PROOFSTEP]
rw [extendWith_some, comapDomain_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
x : α none × Π₀ (i : ι), α (some i)
⊢ (fun f => (↑f none, comapDomain some (_ : Function.Injective some) f)) ((fun f => extendWith f.fst f.snd) x) = x
[PROOFSTEP]
dsimp only
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
x : α none × Π₀ (i : ι), α (some i)
⊢ (↑(extendWith x.fst x.snd) none, comapDomain some (_ : Function.Injective some) (extendWith x.fst x.snd)) = x
[PROOFSTEP]
ext
[GOAL]
case h₁
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
x : α none × Π₀ (i : ι), α (some i)
⊢ (↑(extendWith x.fst x.snd) none, comapDomain some (_ : Function.Injective some) (extendWith x.fst x.snd)).fst = x.fst
[PROOFSTEP]
exact extendWith_none x.snd _
[GOAL]
case h₂.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
κ : Type u_1
α : Option ι → Type v
inst✝ : (i : Option ι) → Zero (α i)
x : α none × Π₀ (i : ι), α (some i)
i✝ : ι
⊢ ↑(↑(extendWith x.fst x.snd) none, comapDomain some (_ : Function.Injective some) (extendWith x.fst x.snd)).snd i✝ =
    ↑x.snd i✝
[PROOFSTEP]
rw [comapDomain_apply, extendWith_some]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
⊢ prod (mapRange f hf g) h = prod g fun i b => h i (f i b)
[PROOFSTEP]
rw [mapRange_def]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
⊢ prod (mk (support g) fun i => f (↑i) (↑g ↑i)) h = prod g fun i b => h i (f i b)
[PROOFSTEP]
refine' (Finset.prod_subset support_mk_subset _).trans _
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
⊢ ∀ (x : ι),
    x ∈ support g →
      ¬x ∈ support (mk (support g) fun i => f (↑i) (↑g ↑i)) → h x (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) x) = 1
[PROOFSTEP]
intro i h1 h2
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
i : ι
h1 : i ∈ support g
h2 : ¬i ∈ support (mk (support g) fun i => f (↑i) (↑g ↑i))
⊢ h i (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i) = 1
[PROOFSTEP]
simp only [mem_support_toFun, ne_eq] at h1 
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
i : ι
h2 : ¬i ∈ support (mk (support g) fun i => f (↑i) (↑g ↑i))
h1 : ¬↑g i = 0
⊢ h i (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i) = 1
[PROOFSTEP]
simp only [Finset.coe_sort_coe, mem_support_toFun, mk_apply, ne_eq, h1, not_false_iff, dite_eq_ite, ite_true,
  not_not] at h2 
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
i : ι
h1 : ¬↑g i = 0
h2 : f i (↑g i) = 0
⊢ h i (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i) = 1
[PROOFSTEP]
simp [h2, h0]
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
⊢ ∏ x in support g, h x (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) x) = prod g fun i b => h i (f i b)
[PROOFSTEP]
refine' Finset.prod_congr rfl _
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
⊢ ∀ (x : ι), x ∈ support g → h x (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) x) = (fun i b => h i (f i b)) x (↑g x)
[PROOFSTEP]
intro i h1
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
i : ι
h1 : i ∈ support g
⊢ h i (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i) = (fun i b => h i (f i b)) i (↑g i)
[PROOFSTEP]
simp only [mem_support_toFun, ne_eq] at h1 
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
β₁ : ι → Type v₁
β₂ : ι → Type v₂
inst✝⁴ : (i : ι) → Zero (β₁ i)
inst✝³ : (i : ι) → Zero (β₂ i)
inst✝² : (i : ι) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → (x : β₂ i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
g : Π₀ (i : ι), β₁ i
h : (i : ι) → β₂ i → γ
h0 : ∀ (i : ι), h i 0 = 1
i : ι
h1 : ¬↑g i = 0
⊢ h i (↑(mk (support g) fun i => f (↑i) (↑g ↑i)) i) = (fun i b => h i (f i b)) i (↑g i)
[PROOFSTEP]
simp [h1]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
i : ι
b : β i
h : (i : ι) → β i → γ
h_zero : h i 0 = 1
⊢ prod (single i b) h = h i b
[PROOFSTEP]
by_cases h : b ≠ 0
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
i : ι
b : β i
h✝ : (i : ι) → β i → γ
h_zero : h✝ i 0 = 1
h : b ≠ 0
⊢ prod (single i b) h✝ = h✝ i b
[PROOFSTEP]
simp [DFinsupp.prod, support_single_ne_zero h]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
i : ι
b : β i
h✝ : (i : ι) → β i → γ
h_zero : h✝ i 0 = 1
h : ¬b ≠ 0
⊢ prod (single i b) h✝ = h✝ i b
[PROOFSTEP]
rw [not_not] at h 
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
i : ι
b : β i
h✝ : (i : ι) → β i → γ
h_zero : h✝ i 0 = 1
h : b = 0
⊢ prod (single i b) h✝ = h✝ i b
[PROOFSTEP]
simp [h, prod_zero_index, h_zero]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
i : ι
b : β i
h✝ : (i : ι) → β i → γ
h_zero : h✝ i 0 = 1
h : b = 0
⊢ prod 0 h✝ = 1
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
ι₁ : Type u₁
inst✝⁴ : DecidableEq ι₁
β₁ : ι₁ → Type v₁
inst✝³ : (i₁ : ι₁) → Zero (β₁ i₁)
inst✝² : (i : ι₁) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i₁ : ι₁), β₁ i₁
g : (i₁ : ι₁) → β₁ i₁ → Π₀ (i : ι), β i
⊢ support (sum f g) ⊆ Finset.biUnion (support f) fun i => support (g i (↑f i))
[PROOFSTEP]
have : ∀ i₁ : ι, (f.sum fun (i : ι₁) (b : β₁ i) => (g i b) i₁) ≠ 0 → ∃ i : ι₁, f i ≠ 0 ∧ ¬(g i (f i)) i₁ = 0 :=
  fun i₁ h =>
  let ⟨i, hi, Ne⟩ := Finset.exists_ne_zero_of_sum_ne_zero h
  ⟨i, mem_support_iff.1 hi, Ne⟩
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
ι₁ : Type u₁
inst✝⁴ : DecidableEq ι₁
β₁ : ι₁ → Type v₁
inst✝³ : (i₁ : ι₁) → Zero (β₁ i₁)
inst✝² : (i : ι₁) → (x : β₁ i) → Decidable (x ≠ 0)
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i₁ : ι₁), β₁ i₁
g : (i₁ : ι₁) → β₁ i₁ → Π₀ (i : ι), β i
this : ∀ (i₁ : ι), (sum f fun i b => ↑(g i b) i₁) ≠ 0 → ∃ i, ↑f i ≠ 0 ∧ ¬↑(g i (↑f i)) i₁ = 0
⊢ support (sum f g) ⊆ Finset.biUnion (support f) fun i => support (g i (↑f i))
[PROOFSTEP]
simpa [Finset.subset_iff, mem_support_iff, Finset.mem_biUnion, sum_apply] using this
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
⊢ ∀ (x : ι), x ∈ support f ∪ support g → ¬x ∈ support f → h x (↑f x) = 1
[PROOFSTEP]
simp (config := { contextual := true }) [mem_support_iff, h_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
f_eq : ∏ i in support f ∪ support g, h i (↑f i) = prod f h
⊢ ∀ (x : ι), x ∈ support f ∪ support g → ¬x ∈ support g → h x (↑g x) = 1
[PROOFSTEP]
simp (config := { contextual := true }) [mem_support_iff, h_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
f_eq : ∏ i in support f ∪ support g, h i (↑f i) = prod f h
g_eq : ∏ i in support f ∪ support g, h i (↑g i) = prod g h
⊢ ∀ (x : ι), x ∈ support f ∪ support g → ¬x ∈ support (f + g) → h x (↑(f + g) x) = 1
[PROOFSTEP]
simp (config := { contextual := true }) [mem_support_iff, h_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
f_eq : ∏ i in support f ∪ support g, h i (↑f i) = prod f h
g_eq : ∏ i in support f ∪ support g, h i (↑g i) = prod g h
⊢ ∏ i in support f ∪ support g, h i (↑(f + g) i) =
    (∏ i in support f ∪ support g, h i (↑f i)) * ∏ i in support f ∪ support g, h i (↑g i)
[PROOFSTEP]
{simp [h_add, Finset.prod_mul_distrib]
}
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
f_eq : ∏ i in support f ∪ support g, h i (↑f i) = prod f h
g_eq : ∏ i in support f ∪ support g, h i (↑g i) = prod g h
⊢ ∏ i in support f ∪ support g, h i (↑(f + g) i) =
    (∏ i in support f ∪ support g, h i (↑f i)) * ∏ i in support f ∪ support g, h i (↑g i)
[PROOFSTEP]
simp [h_add, Finset.prod_mul_distrib]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
f_eq : ∏ i in support f ∪ support g, h i (↑f i) = prod f h
g_eq : ∏ i in support f ∪ support g, h i (↑g i) = prod g h
⊢ (∏ i in support f ∪ support g, h i (↑f i)) * ∏ i in support f ∪ support g, h i (↑g i) = prod f h * prod g h
[PROOFSTEP]
rw [f_eq, g_eq]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
⊢ prod v f = ∏ i : ι, f i (↑equivFunOnFintype v i)
[PROOFSTEP]
suffices (∏ i in v.support, f i (v i)) = ∏ i, f i (v i) by simp [DFinsupp.prod, this]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
this : ∏ i in support v, f i (↑v i) = ∏ i : ι, f i (↑v i)
⊢ prod v f = ∏ i : ι, f i (↑equivFunOnFintype v i)
[PROOFSTEP]
simp [DFinsupp.prod, this]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
⊢ ∏ i in support v, f i (↑v i) = ∏ i : ι, f i (↑v i)
[PROOFSTEP]
apply Finset.prod_subset v.support.subset_univ
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
⊢ ∀ (x : ι), x ∈ Finset.univ → ¬x ∈ support v → f x (↑v x) = 1
[PROOFSTEP]
intro i _ hi
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
i : ι
a✝ : i ∈ Finset.univ
hi : ¬i ∈ support v
⊢ f i (↑v i) = 1
[PROOFSTEP]
rw [mem_support_iff, not_not] at hi 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : Fintype ι
inst✝² : (i : ι) → Zero (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
v : Π₀ (i : ι), β i
f : (i : ι) → β i → γ
hf : ∀ (i : ι), f i 0 = 1
i : ι
a✝ : i ∈ Finset.univ
hi : ↑v i = 0
⊢ f i (↑v i) = 1
[PROOFSTEP]
rw [hi, hf]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
⊢ ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a = (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b
[PROOFSTEP]
rintro ⟨sx, hx⟩ ⟨sy, hy⟩
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
⊢ (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) { val := sx, property := hx } =
    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) { val := sy, property := hy }
[PROOFSTEP]
dsimp only [Subtype.coe_mk, toFun_eq_coe] at *
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
⊢ ∑ i in Multiset.toFinset sx, ↑(φ i) (↑f i) = ∑ i in Multiset.toFinset sy, ↑(φ i) (↑f i)
[PROOFSTEP]
have H1 : sx.toFinset ∩ sy.toFinset ⊆ sx.toFinset := Finset.inter_subset_left _ _
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
⊢ ∑ i in Multiset.toFinset sx, ↑(φ i) (↑f i) = ∑ i in Multiset.toFinset sy, ↑(φ i) (↑f i)
[PROOFSTEP]
have H2 : sx.toFinset ∩ sy.toFinset ⊆ sy.toFinset := Finset.inter_subset_right _ _
[GOAL]
case mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
⊢ ∑ i in Multiset.toFinset sx, ↑(φ i) (↑f i) = ∑ i in Multiset.toFinset sy, ↑(φ i) (↑f i)
[PROOFSTEP]
refine' (Finset.sum_subset H1 _).symm.trans ((Finset.sum_congr rfl _).trans (Finset.sum_subset H2 _))
[GOAL]
case mk.mk.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
⊢ ∀ (x : ι), x ∈ Multiset.toFinset sx → ¬x ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy → ↑(φ x) (↑f x) = 0
[PROOFSTEP]
intro i H1 H2
[GOAL]
case mk.mk.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ Multiset.toFinset sx
H2 : ¬i ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
rw [Finset.mem_inter] at H2 
[GOAL]
case mk.mk.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ Multiset.toFinset sx
H2 : ¬(i ∈ Multiset.toFinset sx ∧ i ∈ Multiset.toFinset sy)
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
simp only [Multiset.mem_toFinset] at H1 H2 
[GOAL]
case mk.mk.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ sx
H2 : ¬(i ∈ sx ∧ i ∈ sy)
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
convert AddMonoidHom.map_zero (φ i)
[GOAL]
case h.e'_2.h.e'_6
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ sx
H2 : ¬(i ∈ sx ∧ i ∈ sy)
⊢ ↑f i = 0
[PROOFSTEP]
exact (hy i).resolve_left (mt (And.intro H1) H2)
[GOAL]
case mk.mk.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
⊢ ∀ (x : ι), x ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy → ↑(φ x) (↑f x) = ↑(φ x) (↑f x)
[PROOFSTEP]
intro i _
[GOAL]
case mk.mk.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
a✝ : i ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy
⊢ ↑(φ i) (↑f i) = ↑(φ i) (↑f i)
[PROOFSTEP]
rfl
[GOAL]
case mk.mk.refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2 : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
⊢ ∀ (x : ι), x ∈ Multiset.toFinset sy → ¬x ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy → ↑(φ x) (↑f x) = 0
[PROOFSTEP]
intro i H1 H2
[GOAL]
case mk.mk.refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ Multiset.toFinset sy
H2 : ¬i ∈ Multiset.toFinset sx ∩ Multiset.toFinset sy
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
rw [Finset.mem_inter] at H2 
[GOAL]
case mk.mk.refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ Multiset.toFinset sy
H2 : ¬(i ∈ Multiset.toFinset sx ∧ i ∈ Multiset.toFinset sy)
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
simp only [Multiset.mem_toFinset] at H1 H2 
[GOAL]
case mk.mk.refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ sy
H2 : ¬(i ∈ sx ∧ i ∈ sy)
⊢ ↑(φ i) (↑f i) = 0
[PROOFSTEP]
convert AddMonoidHom.map_zero (φ i)
[GOAL]
case h.e'_2.h.e'_6
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
sx : Multiset ι
hx : ∀ (i : ι), i ∈ sx ∨ toFun f i = 0
sy : Multiset ι
hy : ∀ (i : ι), i ∈ sy ∨ toFun f i = 0
H1✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sx
H2✝ : Multiset.toFinset sx ∩ Multiset.toFinset sy ⊆ Multiset.toFinset sy
i : ι
H1 : i ∈ sy
H2 : ¬(i ∈ sx ∧ i ∈ sy)
⊢ ↑f i = 0
[PROOFSTEP]
exact (hx i).resolve_left (mt (fun H3 => And.intro H3 H1) H2)
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
⊢ (fun f =>
        (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
          (_ :
            ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
              (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
      0 =
    0
[PROOFSTEP]
simp only [toFun_eq_coe, coe_zero, Pi.zero_apply, map_zero, Finset.sum_const_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
⊢ Trunc.lift (fun s => 0) (_ : ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun 0 i = 0 }), (fun s => 0) a = (fun s => 0) b)
      0.support' =
    0
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
⊢ ∀ (x y : Π₀ (i : ι), β i),
    ZeroHom.toFun
        {
          toFun := fun f =>
            (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
              (_ :
                ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                  (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
          map_zero' :=
            (_ :
              (fun f =>
                    (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                      (_ :
                        ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                          (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                            (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                  0 =
                0) }
        (x + y) =
      ZeroHom.toFun
          {
            toFun := fun f =>
              (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                (_ :
                  ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                      (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
            map_zero' :=
              (_ :
                (fun f =>
                      (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                        (_ :
                          ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                            (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                              (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                    0 =
                  0) }
          x +
        ZeroHom.toFun
          {
            toFun := fun f =>
              (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                (_ :
                  ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                      (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
            map_zero' :=
              (_ :
                (fun f =>
                      (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                        (_ :
                          ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                            (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                              (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                    0 =
                  0) }
          y
[PROOFSTEP]
rintro ⟨f, sf, hf⟩ ⟨g, sg, hg⟩
[GOAL]
case mk'.mk.mk.mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ZeroHom.toFun
      {
        toFun := fun f =>
          (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
            (_ :
              ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                  (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
        map_zero' :=
          (_ :
            (fun f =>
                  (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                    (_ :
                      ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                        (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                          (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                0 =
              0) }
      ({ toFun := f, support' := Quot.mk Setoid.r { val := sf, property := hf } } +
        { toFun := g, support' := Quot.mk Setoid.r { val := sg, property := hg } }) =
    ZeroHom.toFun
        {
          toFun := fun f =>
            (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
              (_ :
                ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                  (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
          map_zero' :=
            (_ :
              (fun f =>
                    (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                      (_ :
                        ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                          (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                            (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                  0 =
                0) }
        { toFun := f, support' := Quot.mk Setoid.r { val := sf, property := hf } } +
      ZeroHom.toFun
        {
          toFun := fun f =>
            (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
              (_ :
                ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                  (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                    (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b),
          map_zero' :=
            (_ :
              (fun f =>
                    (fun c => Trunc.lift (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) c f.support')
                      (_ :
                        ∀ (a b : { s // ∀ (i : ι), i ∈ s ∨ toFun f i = 0 }),
                          (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) a =
                            (fun s => ∑ i in Multiset.toFinset ↑s, ↑(φ i) (↑f i)) b))
                  0 =
                0) }
        { toFun := g, support' := Quot.mk Setoid.r { val := sg, property := hg } }
[PROOFSTEP]
change (∑ i in _, _) = (∑ i in _, _) + ∑ i in _, _
[GOAL]
case mk'.mk.mk.mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∑ i in
      Multiset.toFinset
        ↑((fun ys =>
              { val := ↑{ val := sf, property := hf } + ↑ys,
                property :=
                  (_ :
                    ∀ (i : ι),
                      i ∈ ↑{ val := sf, property := hf } + ↑ys ∨
                        (fun i =>
                              ↑{ toFun := f, support' := Quot.mk Setoid.r { val := sf, property := hf } } i +
                                ↑{ toFun := g, support' := Quot.mk Setoid.r { val := sg, property := hg } } i)
                            i =
                          0) })
            { val := sg, property := hg }),
      ↑(φ i)
        (↑({ toFun := f, support' := Quot.mk Setoid.r { val := sf, property := hf } } +
              { toFun := g, support' := Quot.mk Setoid.r { val := sg, property := hg } })
          i) =
    ∑ i in Multiset.toFinset ↑{ val := sf, property := hf },
        ↑(φ i) (↑{ toFun := f, support' := Quot.mk Setoid.r { val := sf, property := hf } } i) +
      ∑ i in Multiset.toFinset ↑{ val := sg, property := hg },
        ↑(φ i) (↑{ toFun := g, support' := Quot.mk Setoid.r { val := sg, property := hg } } i)
[PROOFSTEP]
simp only [coe_add, coe_mk', Subtype.coe_mk, Pi.add_apply, map_add, Finset.sum_add_distrib]
[GOAL]
case mk'.mk.mk.mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∑ x in Multiset.toFinset (sf + sg), ↑(φ x) (f x) + ∑ x in Multiset.toFinset (sf + sg), ↑(φ x) (g x) =
    ∑ x in Multiset.toFinset sf, ↑(φ x) (f x) + ∑ x in Multiset.toFinset sg, ↑(φ x) (g x)
[PROOFSTEP]
congr 1
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∑ x in Multiset.toFinset (sf + sg), ↑(φ x) (f x) = ∑ x in Multiset.toFinset sf, ↑(φ x) (f x)
[PROOFSTEP]
refine' (Finset.sum_subset _ _).symm
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ Multiset.toFinset sf ⊆ Multiset.toFinset (sf + sg)
[PROOFSTEP]
intro i
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
⊢ i ∈ Multiset.toFinset sf → i ∈ Multiset.toFinset (sf + sg)
[PROOFSTEP]
simp only [Multiset.mem_toFinset, Multiset.mem_add]
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
⊢ i ∈ sf → i ∈ sf ∨ i ∈ sg
[PROOFSTEP]
exact Or.inl
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∀ (x : ι), x ∈ Multiset.toFinset (sf + sg) → ¬x ∈ Multiset.toFinset sf → ↑(φ x) (f x) = 0
[PROOFSTEP]
intro i _ H2
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
a✝ : i ∈ Multiset.toFinset (sf + sg)
H2 : ¬i ∈ Multiset.toFinset sf
⊢ ↑(φ i) (f i) = 0
[PROOFSTEP]
simp only [Multiset.mem_toFinset, Multiset.mem_add] at H2 
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
a✝ : i ∈ Multiset.toFinset (sf + sg)
H2 : ¬i ∈ sf
⊢ ↑(φ i) (f i) = 0
[PROOFSTEP]
rw [(hf i).resolve_left H2, AddMonoidHom.map_zero]
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∑ x in Multiset.toFinset (sf + sg), ↑(φ x) (g x) = ∑ x in Multiset.toFinset sg, ↑(φ x) (g x)
[PROOFSTEP]
refine' (Finset.sum_subset _ _).symm
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ Multiset.toFinset sg ⊆ Multiset.toFinset (sf + sg)
[PROOFSTEP]
intro i
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
⊢ i ∈ Multiset.toFinset sg → i ∈ Multiset.toFinset (sf + sg)
[PROOFSTEP]
simp only [Multiset.mem_toFinset, Multiset.mem_add]
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
⊢ i ∈ sg → i ∈ sf ∨ i ∈ sg
[PROOFSTEP]
exact Or.inr
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
⊢ ∀ (x : ι), x ∈ Multiset.toFinset (sf + sg) → ¬x ∈ Multiset.toFinset sg → ↑(φ x) (g x) = 0
[PROOFSTEP]
intro i _ H2
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
a✝ : i ∈ Multiset.toFinset (sf + sg)
H2 : ¬i ∈ Multiset.toFinset sg
⊢ ↑(φ i) (g i) = 0
[PROOFSTEP]
simp only [Multiset.mem_toFinset, Multiset.mem_add] at H2 
[GOAL]
case mk'.mk.mk.mk'.mk.mk.e_a.refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝¹ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
sf : Multiset ι
hf : ∀ (i : ι), i ∈ sf ∨ f i = 0
g : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ g i = 0 }
sg : Multiset ι
hg : ∀ (i : ι), i ∈ sg ∨ g i = 0
i : ι
a✝ : i ∈ Multiset.toFinset (sf + sg)
H2 : ¬i ∈ sg
⊢ ↑(φ i) (g i) = 0
[PROOFSTEP]
rw [(hg i).resolve_left H2, AddMonoidHom.map_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
i : ι
x : β i
⊢ ↑(sumAddHom φ) (single i x) = ↑(φ i) x
[PROOFSTEP]
dsimp [sumAddHom, single, Trunc.lift_mk]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
i : ι
x : β i
⊢ ∑ i_1 in Multiset.toFinset {i}, ↑(φ i_1) (Pi.single i x i_1) = ↑(φ i) x
[PROOFSTEP]
rw [Multiset.toFinset_singleton, Finset.sum_singleton, Pi.single_eq_same]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : Π₀ (i : ι), β i
⊢ ↑(sumAddHom φ) f = sum f fun x => ↑(φ x)
[PROOFSTEP]
rcases f with ⟨f, s, hf⟩
[GOAL]
case mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
⊢ ↑(sumAddHom φ) { toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } =
    sum { toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } fun x => ↑(φ x)
[PROOFSTEP]
change (∑ i in _, _) = ∑ i in Finset.filter _ _, _
[GOAL]
case mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
⊢ ∑ i in Multiset.toFinset ↑{ val := s, property := hf },
      ↑(φ i) (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i) =
    ∑ i in
      Finset.filter (fun i => ↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i ≠ 0)
        (Multiset.toFinset ↑{ val := s, property := hf }),
      (fun x => ↑(φ x)) i (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i)
[PROOFSTEP]
rw [Finset.sum_filter, Finset.sum_congr rfl]
[GOAL]
case mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
⊢ ∀ (x : ι),
    x ∈ Multiset.toFinset ↑{ val := s, property := hf } →
      ↑(φ x) (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } x) =
        if ↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } x ≠ 0 then
          (fun x => ↑(φ x)) x (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } x)
        else 0
[PROOFSTEP]
intro i _
[GOAL]
case mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
a✝ : i ∈ Multiset.toFinset ↑{ val := s, property := hf }
⊢ ↑(φ i) (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i) =
    if ↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i ≠ 0 then
      (fun x => ↑(φ x)) i (↑{ toFun := f, support' := Quot.mk Setoid.r { val := s, property := hf } } i)
    else 0
[PROOFSTEP]
dsimp only [coe_mk', Subtype.coe_mk] at *
[GOAL]
case mk'.mk.mk
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
a✝ : i ∈ Multiset.toFinset s
⊢ ↑(φ i) (f i) = if f i ≠ 0 then ↑(φ i) (f i) else 0
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
a✝ : i ∈ Multiset.toFinset s
h : f i ≠ 0
⊢ ↑(φ i) (f i) = ↑(φ i) (f i)
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
a✝ : i ∈ Multiset.toFinset s
h : ¬f i ≠ 0
⊢ ↑(φ i) (f i) = 0
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommMonoid γ
φ : (i : ι) → β i →+ γ
f : (i : ι) → β i
support'✝ : Trunc { s // ∀ (i : ι), i ∈ s ∨ f i = 0 }
s : Multiset ι
hf : ∀ (i : ι), i ∈ s ∨ f i = 0
i : ι
a✝ : i ∈ Multiset.toFinset s
h : ¬f i ≠ 0
⊢ ↑(φ i) (f i) = 0
[PROOFSTEP]
rw [not_not.mp h, AddMonoidHom.map_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → AddZeroClass (β i)
inst✝² : AddCommMonoid γ
S : Type u_1
inst✝¹ : SetLike S γ
inst✝ : AddSubmonoidClass S γ
s : S
f : Π₀ (i : ι), β i
g : (i : ι) → β i →+ γ
h : ∀ (c : ι), ↑f c ≠ 0 → ↑(g c) (↑f c) ∈ s
⊢ ↑(sumAddHom g) f ∈ s
[PROOFSTEP]
classical
rw [DFinsupp.sumAddHom_apply]
exact dfinsupp_sum_mem s f (g ·) h
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → AddZeroClass (β i)
inst✝² : AddCommMonoid γ
S : Type u_1
inst✝¹ : SetLike S γ
inst✝ : AddSubmonoidClass S γ
s : S
f : Π₀ (i : ι), β i
g : (i : ι) → β i →+ γ
h : ∀ (c : ι), ↑f c ≠ 0 → ↑(g c) (↑f c) ∈ s
⊢ ↑(sumAddHom g) f ∈ s
[PROOFSTEP]
rw [DFinsupp.sumAddHom_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → AddZeroClass (β i)
inst✝² : AddCommMonoid γ
S : Type u_1
inst✝¹ : SetLike S γ
inst✝ : AddSubmonoidClass S γ
s : S
f : Π₀ (i : ι), β i
g : (i : ι) → β i →+ γ
h : ∀ (c : ι), ↑f c ≠ 0 → ↑(g c) (↑f c) ∈ s
⊢ (sum f fun x => ↑(g x)) ∈ s
[PROOFSTEP]
exact dfinsupp_sum_mem s f (g ·) h
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ iSup S = AddMonoidHom.mrange (sumAddHom fun i => AddSubmonoid.subtype (S i))
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ iSup S ≤ AddMonoidHom.mrange (sumAddHom fun i => AddSubmonoid.subtype (S i))
[PROOFSTEP]
apply iSup_le _
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ ∀ (i : ι), S i ≤ AddMonoidHom.mrange (sumAddHom fun i => AddSubmonoid.subtype (S i))
[PROOFSTEP]
intro i y hy
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
i : ι
y : γ
hy : y ∈ S i
⊢ y ∈ AddMonoidHom.mrange (sumAddHom fun i => AddSubmonoid.subtype (S i))
[PROOFSTEP]
exact ⟨DFinsupp.single i ⟨y, hy⟩, DFinsupp.sumAddHom_single _ _ _⟩
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ AddMonoidHom.mrange (sumAddHom fun i => AddSubmonoid.subtype (S i)) ≤ iSup S
[PROOFSTEP]
rintro x ⟨v, rfl⟩
[GOAL]
case a.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
⊢ ↑(sumAddHom fun i => AddSubmonoid.subtype (S i)) v ∈ iSup S
[PROOFSTEP]
exact dfinsupp_sumAddHom_mem _ v _ fun i _ => (le_iSup S i : S i ≤ _) (v i).prop
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ ⨆ (i : ι) (_ : p i), S i =
    AddMonoidHom.mrange
      (AddMonoidHom.comp (sumAddHom fun i => AddSubmonoid.subtype (S i))
        (filterAddMonoidHom (fun i => { x // x ∈ S i }) p))
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ ⨆ (i : ι) (_ : p i), S i ≤
    AddMonoidHom.mrange
      (AddMonoidHom.comp (sumAddHom fun i => AddSubmonoid.subtype (S i))
        (filterAddMonoidHom (fun i => { x // x ∈ S i }) p))
[PROOFSTEP]
refine' iSup₂_le fun i hi y hy => ⟨DFinsupp.single i ⟨y, hy⟩, _⟩
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
i : ι
hi : p i
y : γ
hy : y ∈ S i
⊢ ↑(AddMonoidHom.comp (sumAddHom fun i => AddSubmonoid.subtype (S i))
          (filterAddMonoidHom (fun i => { x // x ∈ S i }) p))
      (single i { val := y, property := hy }) =
    y
[PROOFSTEP]
rw [AddMonoidHom.comp_apply, filterAddMonoidHom_apply, filter_single_pos _ _ hi]
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
i : ι
hi : p i
y : γ
hy : y ∈ S i
⊢ ↑(sumAddHom fun i => AddSubmonoid.subtype (S i)) (single i { val := y, property := hy }) = y
[PROOFSTEP]
exact sumAddHom_single _ _ _
[GOAL]
case a
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
⊢ AddMonoidHom.mrange
      (AddMonoidHom.comp (sumAddHom fun i => AddSubmonoid.subtype (S i))
        (filterAddMonoidHom (fun i => { x // x ∈ S i }) p)) ≤
    ⨆ (i : ι) (_ : p i), S i
[PROOFSTEP]
rintro x ⟨v, rfl⟩
[GOAL]
case a.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
⊢ ↑(AddMonoidHom.comp (sumAddHom fun i => AddSubmonoid.subtype (S i))
          (filterAddMonoidHom (fun i => { x // x ∈ S i }) p))
      v ∈
    ⨆ (i : ι) (_ : p i), S i
[PROOFSTEP]
refine' dfinsupp_sumAddHom_mem _ _ _ fun i _ => _
[GOAL]
case a.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
i : ι
x✝ : ↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i ≠ 0
⊢ ↑((fun i => AddSubmonoid.subtype (S i)) i) (↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i) ∈
    ⨆ (i : ι) (_ : p i), S i
[PROOFSTEP]
refine' AddSubmonoid.mem_iSup_of_mem i _
[GOAL]
case a.intro
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
i : ι
x✝ : ↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i ≠ 0
⊢ ↑((fun i => AddSubmonoid.subtype (S i)) i) (↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i) ∈
    ⨆ (_ : p i), S i
[PROOFSTEP]
by_cases hp : p i
[GOAL]
case pos
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
i : ι
x✝ : ↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i ≠ 0
hp : p i
⊢ ↑((fun i => AddSubmonoid.subtype (S i)) i) (↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i) ∈
    ⨆ (_ : p i), S i
[PROOFSTEP]
simp [hp]
[GOAL]
case neg
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
p : ι → Prop
inst✝¹ : DecidablePred p
inst✝ : AddCommMonoid γ
S : ι → AddSubmonoid γ
v : Π₀ (i : ι), { x // x ∈ S i }
i : ι
x✝ : ↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i ≠ 0
hp : ¬p i
⊢ ↑((fun i => AddSubmonoid.subtype (S i)) i) (↑(↑(filterAddMonoidHom (fun i => { x // x ∈ S i }) p) v) i) ∈
    ⨆ (_ : p i), S i
[PROOFSTEP]
simp [hp]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : AddCommMonoid γ
S : ι → AddSubmonoid γ
inst✝ : (i : ι) → (x : { x // x ∈ S i }) → Decidable (x ≠ 0)
x : γ
⊢ x ∈ iSup S ↔ ∃ f, (sum f fun i xi => ↑xi) = x
[PROOFSTEP]
rw [AddSubmonoid.mem_iSup_iff_exists_dfinsupp]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : AddCommMonoid γ
S : ι → AddSubmonoid γ
inst✝ : (i : ι) → (x : { x // x ∈ S i }) → Decidable (x ≠ 0)
x : γ
⊢ (∃ f, ↑(sumAddHom fun i => AddSubmonoid.subtype (S i)) f = x) ↔ ∃ f, (sum f fun i xi => ↑xi) = x
[PROOFSTEP]
simp_rw [sumAddHom_apply]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : AddCommMonoid γ
S : ι → AddSubmonoid γ
inst✝ : (i : ι) → (x : { x // x ∈ S i }) → Decidable (x ≠ 0)
x : γ
⊢ (∃ f, (sum f fun x => ↑(AddSubmonoid.subtype (S x))) = x) ↔ ∃ f, (sum f fun i xi => ↑xi) = x
[PROOFSTEP]
rfl
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
ι₁ : Type u_4
ι₂ : Type u_5
β₁ : ι₁ → Type u_1
β₂ : ι₂ → Type u_2
γ : Type u_3
inst✝⁴ : DecidableEq ι₁
inst✝³ : DecidableEq ι₂
inst✝² : (i : ι₁) → AddZeroClass (β₁ i)
inst✝¹ : (i : ι₂) → AddZeroClass (β₂ i)
inst✝ : AddCommMonoid γ
f₁ : Π₀ (i : ι₁), β₁ i
f₂ : Π₀ (i : ι₂), β₂ i
h : (i : ι₁) → (j : ι₂) → β₁ i →+ β₂ j →+ γ
⊢ ↑(sumAddHom fun i₂ => ↑(sumAddHom fun i₁ => h i₁ i₂) f₁) f₂ =
    ↑(sumAddHom fun i₁ => ↑(sumAddHom fun i₂ => AddMonoidHom.flip (h i₁ i₂)) f₂) f₁
[PROOFSTEP]
obtain ⟨⟨f₁, s₁, h₁⟩, ⟨f₂, s₂, h₂⟩⟩ := f₁, f₂
[GOAL]
case mk'.mk.mk.mk'.mk.mk
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
ι₁ : Type u_4
ι₂ : Type u_5
β₁ : ι₁ → Type u_1
β₂ : ι₂ → Type u_2
γ : Type u_3
inst✝⁴ : DecidableEq ι₁
inst✝³ : DecidableEq ι₂
inst✝² : (i : ι₁) → AddZeroClass (β₁ i)
inst✝¹ : (i : ι₂) → AddZeroClass (β₂ i)
inst✝ : AddCommMonoid γ
h : (i : ι₁) → (j : ι₂) → β₁ i →+ β₂ j →+ γ
f₁ : (i : ι₁) → β₁ i
support'✝¹ : Trunc { s // ∀ (i : ι₁), i ∈ s ∨ f₁ i = 0 }
s₁ : Multiset ι₁
h₁ : ∀ (i : ι₁), i ∈ s₁ ∨ f₁ i = 0
f₂ : (i : ι₂) → β₂ i
support'✝ : Trunc { s // ∀ (i : ι₂), i ∈ s ∨ f₂ i = 0 }
s₂ : Multiset ι₂
h₂ : ∀ (i : ι₂), i ∈ s₂ ∨ f₂ i = 0
⊢ ↑(sumAddHom fun i₂ =>
          ↑(sumAddHom fun i₁ => h i₁ i₂) { toFun := f₁, support' := Quot.mk Setoid.r { val := s₁, property := h₁ } })
      { toFun := f₂, support' := Quot.mk Setoid.r { val := s₂, property := h₂ } } =
    ↑(sumAddHom fun i₁ =>
          ↑(sumAddHom fun i₂ => AddMonoidHom.flip (h i₁ i₂))
            { toFun := f₂, support' := Quot.mk Setoid.r { val := s₂, property := h₂ } })
      { toFun := f₁, support' := Quot.mk Setoid.r { val := s₁, property := h₁ } }
[PROOFSTEP]
simp only [sumAddHom, AddMonoidHom.finset_sum_apply, Quotient.liftOn_mk, AddMonoidHom.coe_mk, AddMonoidHom.flip_apply,
  Trunc.lift, toFun_eq_coe, ZeroHom.coe_mk, coe_mk']
[GOAL]
case mk'.mk.mk.mk'.mk.mk
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁✝ : ι → Type v₁
β₂✝ : ι → Type v₂
dec : DecidableEq ι
ι₁ : Type u_4
ι₂ : Type u_5
β₁ : ι₁ → Type u_1
β₂ : ι₂ → Type u_2
γ : Type u_3
inst✝⁴ : DecidableEq ι₁
inst✝³ : DecidableEq ι₂
inst✝² : (i : ι₁) → AddZeroClass (β₁ i)
inst✝¹ : (i : ι₂) → AddZeroClass (β₂ i)
inst✝ : AddCommMonoid γ
h : (i : ι₁) → (j : ι₂) → β₁ i →+ β₂ j →+ γ
f₁ : (i : ι₁) → β₁ i
support'✝¹ : Trunc { s // ∀ (i : ι₁), i ∈ s ∨ f₁ i = 0 }
s₁ : Multiset ι₁
h₁ : ∀ (i : ι₁), i ∈ s₁ ∨ f₁ i = 0
f₂ : (i : ι₂) → β₂ i
support'✝ : Trunc { s // ∀ (i : ι₂), i ∈ s ∨ f₂ i = 0 }
s₂ : Multiset ι₂
h₂ : ∀ (i : ι₂), i ∈ s₂ ∨ f₂ i = 0
⊢ ∑ x in Multiset.toFinset s₂, ∑ x_1 in Multiset.toFinset s₁, ↑(↑(h x_1 x) (f₁ x_1)) (f₂ x) =
    ∑ x in Multiset.toFinset s₁, ∑ x_1 in Multiset.toFinset s₂, ↑(↑(h x x_1) (f₁ x)) (f₂ x_1)
[PROOFSTEP]
exact Finset.sum_comm
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
x : (i : ι) → β i →+ γ
⊢ (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x
[PROOFSTEP]
ext
[GOAL]
case h.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
x : (i : ι) → β i →+ γ
x✝¹ : ι
x✝ : β x✝¹
⊢ ↑((fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) x✝¹) x✝ = ↑(x x✝¹) x✝
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
ψ : (Π₀ (i : ι), β i) →+ γ
⊢ sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ
[PROOFSTEP]
ext
[GOAL]
case H.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
ψ : (Π₀ (i : ι), β i) →+ γ
x✝¹ : ι
x✝ : β x✝¹
⊢ ↑(AddMonoidHom.comp (sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ))
          (singleAddHom (fun i => β i) x✝¹))
      x✝ =
    ↑(AddMonoidHom.comp ψ (singleAddHom (fun i => β i) x✝¹)) x✝
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
F G : (i : ι) → β i →+ γ
⊢ Equiv.toFun
      { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
        left_inv :=
          (_ : ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
        right_inv :=
          (_ : ∀ (ψ : (Π₀ (i : ι), β i) →+ γ), sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
      (F + G) =
    Equiv.toFun
        { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
          left_inv :=
            (_ : ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
          right_inv :=
            (_ :
              ∀ (ψ : (Π₀ (i : ι), β i) →+ γ), sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
        F +
      Equiv.toFun
        { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
          left_inv :=
            (_ : ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
          right_inv :=
            (_ :
              ∀ (ψ : (Π₀ (i : ι), β i) →+ γ), sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
        G
[PROOFSTEP]
ext
[GOAL]
case H.h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
F G : (i : ι) → β i →+ γ
x✝¹ : ι
x✝ : β x✝¹
⊢ ↑(AddMonoidHom.comp
          (Equiv.toFun
            { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
              left_inv :=
                (_ : ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
              right_inv :=
                (_ :
                  ∀ (ψ : (Π₀ (i : ι), β i) →+ γ),
                    sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
            (F + G))
          (singleAddHom (fun i => β i) x✝¹))
      x✝ =
    ↑(AddMonoidHom.comp
          (Equiv.toFun
              { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
                left_inv :=
                  (_ :
                    ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
                right_inv :=
                  (_ :
                    ∀ (ψ : (Π₀ (i : ι), β i) →+ γ),
                      sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
              F +
            Equiv.toFun
              { toFun := sumAddHom, invFun := fun F i => AddMonoidHom.comp F (singleAddHom β i),
                left_inv :=
                  (_ :
                    ∀ (x : (i : ι) → β i →+ γ), (fun F i => AddMonoidHom.comp F (singleAddHom β i)) (sumAddHom x) = x),
                right_inv :=
                  (_ :
                    ∀ (ψ : (Π₀ (i : ι), β i) →+ γ),
                      sumAddHom ((fun F i => AddMonoidHom.comp F (singleAddHom β i)) ψ) = ψ) }
              G)
          (singleAddHom (fun i => β i) x✝¹))
      x✝
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
f : (i : ι) → β i →+ γ
i : ι
x : β i
⊢ ↑(↑liftAddHom f) (single i x) = ↑(f i) x
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddZeroClass (β i)
inst✝ : AddCommMonoid γ
f : (i : ι) → β i →+ γ
i : ι
⊢ AddMonoidHom.comp (↑liftAddHom f) (singleAddHom β i) = f i
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
δ : Type u_1
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : AddCommMonoid γ
inst✝ : AddCommMonoid δ
g : γ →+ δ
f : (i : ι) → β i →+ γ
a : ι
⊢ ↑(AddEquiv.symm liftAddHom) (AddMonoidHom.comp g (↑liftAddHom f)) a = AddMonoidHom.comp g (f a)
[PROOFSTEP]
rw [liftAddHom_symm_apply, AddMonoidHom.comp_assoc, liftAddHom_comp_single]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddGroup (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommGroup γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_sub : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ - b₂) = h i b₁ - h i b₂
⊢ sum (f - g) h = sum f h - sum g h
[PROOFSTEP]
have := (liftAddHom (β := β) fun a => AddMonoidHom.ofMapSub (h a) (h_sub a)).map_sub f g
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddGroup (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommGroup γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_sub : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ - b₂) = h i b₁ - h i b₂
this :
  ↑(↑liftAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) (f - g) =
    ↑(↑liftAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) f -
      ↑(↑liftAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) g
⊢ sum (f - g) h = sum f h - sum g h
[PROOFSTEP]
rw [liftAddHom_apply, sumAddHom_apply, sumAddHom_apply, sumAddHom_apply] at this 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddGroup (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : AddCommGroup γ
f g : Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_sub : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ - b₂) = h i b₁ - h i b₂
this✝² :
  ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) (f - g) =
    ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) f -
      ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) g
this✝¹ :
  (sum (f - g) fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))) =
    ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) f -
      ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) g
this✝ :
  (sum (f - g) fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))) =
    (sum f fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))) -
      ↑(sumAddHom fun a => AddMonoidHom.ofMapSub (h a) (_ : ∀ (b₁ b₂ : β a), h a (b₁ - b₂) = h a b₁ - h a b₂)) g
this :
  (sum (f - g) fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))) =
    (sum f fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))) -
      sum g fun x => ↑(AddMonoidHom.ofMapSub (h x) (_ : ∀ (b₁ b₂ : β x), h x (b₁ - b₂) = h x b₁ - h x b₂))
⊢ sum (f - g) h = sum f h - sum g h
[PROOFSTEP]
exact this
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
γ : Type w
α : Type x
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
s : Finset α
g : α → Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
⊢ ∏ i in s, prod (g i) h = prod (∑ i in s, g i) h
[PROOFSTEP]
classical exact
  Finset.induction_on s (by simp [prod_zero_index])
    (by simp (config := { contextual := true }) [prod_add_index, h_zero, h_add])
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
γ : Type w
α : Type x
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
s : Finset α
g : α → Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
⊢ ∏ i in s, prod (g i) h = prod (∑ i in s, g i) h
[PROOFSTEP]
exact
  Finset.induction_on s (by simp [prod_zero_index])
    (by simp (config := { contextual := true }) [prod_add_index, h_zero, h_add])
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
γ : Type w
α : Type x
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
s : Finset α
g : α → Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
⊢ ∏ i in ∅, prod (g i) h = prod (∑ i in ∅, g i) h
[PROOFSTEP]
simp [prod_zero_index]
[GOAL]
ι : Type u
γ✝ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
γ : Type w
α : Type x
inst✝² : (i : ι) → AddCommMonoid (β i)
inst✝¹ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝ : CommMonoid γ
s : Finset α
g : α → Π₀ (i : ι), β i
h : (i : ι) → β i → γ
h_zero : ∀ (i : ι), h i 0 = 1
h_add : ∀ (i : ι) (b₁ b₂ : β i), h i (b₁ + b₂) = h i b₁ * h i b₂
⊢ ∀ ⦃a : α⦄ {s : Finset α},
    ¬a ∈ s →
      ∏ i in s, prod (g i) h = prod (∑ i in s, g i) h →
        ∏ i in insert a s, prod (g i) h = prod (∑ i in insert a s, g i) h
[PROOFSTEP]
simp (config := { contextual := true }) [prod_add_index, h_zero, h_add]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
⊢ sum f single = f
[PROOFSTEP]
have := FunLike.congr_fun (liftAddHom_singleAddHom (β := β)) f
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
this : ↑(↑liftAddHom (singleAddHom β)) f = ↑(AddMonoidHom.id (Π₀ (i : ι), β i)) f
⊢ sum f single = f
[PROOFSTEP]
rw [liftAddHom_apply, sumAddHom_apply] at this 
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝¹ : (i : ι) → AddCommMonoid (β i)
inst✝ : (i : ι) → (x : β i) → Decidable (x ≠ 0)
f : Π₀ (i : ι), β i
this✝ : ↑(sumAddHom (singleAddHom β)) f = ↑(AddMonoidHom.id (Π₀ (i : ι), β i)) f
this : (sum f fun x => ↑(singleAddHom β x)) = ↑(AddMonoidHom.id (Π₀ (i : ι), β i)) f
⊢ sum f single = f
[PROOFSTEP]
exact this
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : CommMonoid γ
v : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
h : (i : ι) → β i → γ
hp : ∀ (x : ι), x ∈ support v → p x
⊢ ∀ (a : Subtype p) (ha : a ∈ support (subtypeDomain p v)), (fun p_1 x => ↑p_1) a ha ∈ support v
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : CommMonoid γ
v : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
h : (i : ι) → β i → γ
hp : ∀ (x : ι), x ∈ support v → p x
⊢ ∀ (a : Subtype p) (ha : a ∈ support (subtypeDomain p v)),
    (fun i b => h (↑i) b) a (↑(subtypeDomain p v) a) = h ((fun p_1 x => ↑p_1) a ha) (↑v ((fun p_1 x => ↑p_1) a ha))
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : CommMonoid γ
v : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
h : (i : ι) → β i → γ
hp : ∀ (x : ι), x ∈ support v → p x
x✝¹ x✝ : Subtype p
a₀ : ι
ha₀ : p a₀
a₁ : ι
ha₁ : p a₁
⊢ ∀ (ha₁_1 : { val := a₀, property := ha₀ } ∈ support (subtypeDomain p v))
    (ha₂ : { val := a₁, property := ha₁ } ∈ support (subtypeDomain p v)),
    (fun p_1 x => ↑p_1) { val := a₀, property := ha₀ } ha₁_1 = (fun p_1 x => ↑p_1) { val := a₁, property := ha₁ } ha₂ →
      { val := a₀, property := ha₀ } = { val := a₁, property := ha₁ }
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝³ : (i : ι) → Zero (β i)
inst✝² : (i : ι) → (x : β i) → Decidable (x ≠ 0)
inst✝¹ : CommMonoid γ
v : Π₀ (i : ι), β i
p : ι → Prop
inst✝ : DecidablePred p
h : (i : ι) → β i → γ
hp : ∀ (x : ι), x ∈ support v → p x
i : ι
hi : i ∈ support v
⊢ { val := i, property := (_ : p i) } ∈ support (subtypeDomain p v)
[PROOFSTEP]
simpa using hi
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
hf' : ∀ (i : ι) (x y : β₁ i), f i (x + y) = f i x + f i y
g₁ g₂ : Π₀ (i : ι), β₁ i
⊢ mapRange f hf (g₁ + g₂) = mapRange f hf g₁ + mapRange f hf g₂
[PROOFSTEP]
ext
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i → β₂ i
hf : ∀ (i : ι), f i 0 = 0
hf' : ∀ (i : ι) (x y : β₁ i), f i (x + y) = f i x + f i y
g₁ g₂ : Π₀ (i : ι), β₁ i
i✝ : ι
⊢ ↑(mapRange f hf (g₁ + g₂)) i✝ = ↑(mapRange f hf g₁ + mapRange f hf g₂) i✝
[PROOFSTEP]
simp only [mapRange_apply f, coe_add, Pi.add_apply, hf']
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
⊢ (addMonoidHom fun i => AddMonoidHom.comp (f i) (f₂ i)) = AddMonoidHom.comp (addMonoidHom f) (addMonoidHom f₂)
[PROOFSTEP]
refine' AddMonoidHom.ext <| mapRange_comp (fun i x => f i x) (fun i x => f₂ i x) _ _ _
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
⊢ ∀ (i : ι), (fun i x => ↑(f i) x) i 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
i✝ : ι
⊢ (fun i x => ↑(f i) x) i✝ 0 = 0
[PROOFSTEP]
apply map_zero
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
⊢ ∀ (i : ι), (fun i x => ↑(f₂ i) x) i 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
i✝ : ι
⊢ (fun i x => ↑(f₂ i) x) i✝ 0 = 0
[PROOFSTEP]
apply map_zero
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
⊢ ∀ (i : ι), ((fun i x => ↑(f i) x) i ∘ (fun i x => ↑(f₂ i) x) i) 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
i✝ : ι
⊢ ((fun i x => ↑(f i) x) i✝ ∘ (fun i x => ↑(f₂ i) x) i✝) 0 = 0
[PROOFSTEP]
dsimp
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β₁ i →+ β₂ i
f₂ : (i : ι) → β i →+ β₁ i
i✝ : ι
⊢ ↑(f i✝) (↑(f₂ i✝) 0) = 0
[PROOFSTEP]
simp only [map_zero]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₁ i
⊢ mapRange (fun i x => ↑(AddEquiv.symm (e i)) x) (_ : ∀ (i : ι), ↑(AddEquiv.symm (e i)) 0 = 0)
      (mapRange (fun i x => ↑(e i) x) (_ : ∀ (i : ι), ↑(e i) 0 = 0) x) =
    x
[PROOFSTEP]
rw [← mapRange_comp]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₁ i
⊢ mapRange (fun i => (fun x => ↑(AddEquiv.symm (e i)) x) ∘ fun x => ↑(e i) x) ?h x = x
[PROOFSTEP]
simp_rw [AddEquiv.symm_comp_self]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₁ i
⊢ mapRange (fun i => id) (_ : ∀ (i : ι), (fun i => id) i 0 = 0) x = x
[PROOFSTEP]
simp
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₁ i
⊢ ∀ (i : ι), ((fun x => ↑(AddEquiv.symm (e i)) x) ∘ fun x => ↑(e i) x) 0 = 0
[PROOFSTEP]
simp_rw [AddEquiv.symm_comp_self]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₁ i
⊢ ∀ (i : ι), id 0 = 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₂ i
⊢ mapRange (fun i x => ↑(e i) x) (_ : ∀ (i : ι), ↑(e i) 0 = 0)
      (mapRange (fun i x => ↑(AddEquiv.symm (e i)) x) (_ : ∀ (i : ι), ↑(AddEquiv.symm (e i)) 0 = 0) x) =
    x
[PROOFSTEP]
rw [← mapRange_comp]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₂ i
⊢ mapRange (fun i => (fun x => ↑(e i) x) ∘ fun x => ↑(AddEquiv.symm (e i)) x) ?h x = x
[PROOFSTEP]
simp_rw [AddEquiv.self_comp_symm]
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₂ i
⊢ mapRange (fun i => id) (_ : ∀ (i : ι), (fun i => id) i 0 = 0) x = x
[PROOFSTEP]
simp
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₂ i
⊢ ∀ (i : ι), ((fun x => ↑(e i) x) ∘ fun x => ↑(AddEquiv.symm (e i)) x) 0 = 0
[PROOFSTEP]
simp_rw [AddEquiv.self_comp_symm]
[GOAL]
case h
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
e : (i : ι) → β₁ i ≃+ β₂ i
src✝ : (Π₀ (i : ι), β₁ i) →+ Π₀ (i : ι), β₂ i := addMonoidHom fun i => AddEquiv.toAddMonoidHom (e i)
x : Π₀ (i : ι), β₂ i
⊢ ∀ (i : ι), id 0 = 0
[PROOFSTEP]
simp
[GOAL]
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
⊢ (addEquiv fun i => AddEquiv.trans (f i) (f₂ i)) = AddEquiv.trans (addEquiv f) (addEquiv f₂)
[PROOFSTEP]
refine' AddEquiv.ext <| mapRange_comp (fun i x => f₂ i x) (fun i x => f i x) _ _ _
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
⊢ ∀ (i : ι), (fun i x => ↑(f₂ i) x) i 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_1
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
i✝ : ι
⊢ (fun i x => ↑(f₂ i) x) i✝ 0 = 0
[PROOFSTEP]
apply map_zero
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
⊢ ∀ (i : ι), (fun i x => ↑(f i) x) i 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_2
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
i✝ : ι
⊢ (fun i x => ↑(f i) x) i✝ 0 = 0
[PROOFSTEP]
apply map_zero
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
⊢ ∀ (i : ι), ((fun i x => ↑(f₂ i) x) i ∘ (fun i x => ↑(f i) x) i) 0 = 0
[PROOFSTEP]
intros
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
i✝ : ι
⊢ ((fun i x => ↑(f₂ i) x) i✝ ∘ (fun i x => ↑(f i) x) i✝) 0 = 0
[PROOFSTEP]
dsimp
[GOAL]
case refine'_3
ι : Type u
γ : Type w
β : ι → Type v
β₁ : ι → Type v₁
β₂ : ι → Type v₂
dec : DecidableEq ι
inst✝² : (i : ι) → AddZeroClass (β i)
inst✝¹ : (i : ι) → AddZeroClass (β₁ i)
inst✝ : (i : ι) → AddZeroClass (β₂ i)
f : (i : ι) → β i ≃+ β₁ i
f₂ : (i : ι) → β₁ i ≃+ β₂ i
i✝ : ι
⊢ ↑(f₂ i✝) (↑(f i✝) 0) = 0
[PROOFSTEP]
simp only [map_zero]
[GOAL]
ι✝ : Type u
γ : Type w
β : ι✝ → Type v
β₁ : ι✝ → Type v₁
β₂ : ι✝ → Type v₂
ι : Type ?u.1536688
π : ι → Type ?u.1536671
inst✝² : ∀ (i : ι), Nontrivial (π i)
inst✝¹ : (i : ι) → Zero (π i)
inst✝ : Infinite ι
⊢ Infinite (Π₀ (i : ι), π i)
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
ι✝ : Type u
γ : Type w
β : ι✝ → Type v
β₁ : ι✝ → Type v₁
β₂ : ι✝ → Type v₂
ι : Type ?u.1536688
π : ι → Type ?u.1536671
inst✝² : ∀ (i : ι), Nontrivial (π i)
inst✝¹ : (i : ι) → Zero (π i)
inst✝ : Infinite ι
this : DecidableEq ι := Classical.decEq ι
⊢ Infinite (Π₀ (i : ι), π i)
[PROOFSTEP]
choose m hm using fun i => exists_ne (0 : π i)
[GOAL]
ι✝ : Type u
γ : Type w
β : ι✝ → Type v
β₁ : ι✝ → Type v₁
β₂ : ι✝ → Type v₂
ι : Type ?u.1536688
π : ι → Type ?u.1536671
inst✝² : ∀ (i : ι), Nontrivial (π i)
inst✝¹ : (i : ι) → Zero (π i)
inst✝ : Infinite ι
this : DecidableEq ι := Classical.decEq ι
m : (i : ι) → π i
hm : ∀ (i : ι), m i ≠ 0
⊢ Infinite (Π₀ (i : ι), π i)
[PROOFSTEP]
exact Infinite.of_injective _ (DFinsupp.single_left_injective hm)
