@@ -22,9 +22,9 @@ in linear functions), called respectively `multilinearCurryLeftEquiv` and
2222
2323open Fin Function Finset Set
2424
25- universe uR uS uι v v' v₁ v₂ v₃
25+ universe uR uS uι uι' v v' v₁ v₂ v₃
2626
27- variable {R : Type uR} {S : Type uS} {ι : Type uι} {n : ℕ}
27+ variable {R : Type uR} {S : Type uS} {ι : Type uι} {ι' : Type uι'} { n : ℕ}
2828 {M : Fin n.succ → Type v} {M₁ : ι → Type v₁} {M₂ : Type v₂} {M₃ : Type v₃} {M' : Type v'}
2929
3030/-!
@@ -223,87 +223,119 @@ def multilinearCurryRightEquiv :
223223
224224namespace MultilinearMap
225225
226- variable {ι' : Type *} {R M₂}
227226
228- /-- A multilinear map on `∀ i : ι ⊕ ι', M'` defines a multilinear map on `∀ i : ι, M'`
229- taking values in the space of multilinear maps on `∀ i : ι', M'`. -/
230- def currySum (f : MultilinearMap R (fun _ : ι ⊕ ι' => M') M₂) :
231- MultilinearMap R (fun _ : ι => M') (MultilinearMap R (fun _ : ι' => M') M₂) where
227+ variable {R M₂} {N : (ι ⊕ ι') → Type *}
228+ [∀ i, AddCommMonoid (N i)] [∀ i, Module R (N i)]
229+
230+ /-- Given a family of modules `N : (ι ⊕ ι') → Type*`, a multilinear map
231+ on `(fun _ : ι ⊕ ι' => M')` induces a multilinear map on
232+ `(fun (i : ι) ↦ N (.inl i))` taking values in the space of
233+ linear maps on `(fun (i : ι') ↦ N (.inr i))`. -/
234+ def currySum (f : MultilinearMap R N M₂) :
235+ MultilinearMap R (fun i : ι ↦ N (.inl i)) (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂) where
232236 toFun u :=
233- { toFun := fun v => f (Sum.elim u v)
234- map_update_add' := fun v i x y => by
235- letI := Classical.decEq ι
236- simp only [← Sum.update_elim_inr, f.map_update_add]
237- map_update_smul' := fun v i c x => by
238- letI := Classical.decEq ι
239- simp only [← Sum.update_elim_inr, f.map_update_smul] }
237+ { toFun v := f (Sum.rec u v)
238+ map_update_add' := by letI := Classical.decEq ι; aesop
239+ map_update_smul' := by letI := Classical.decEq ι; aesop }
240240 map_update_add' u i x y :=
241- ext fun v => by
242- letI := Classical.decEq ι'
243- simp only [MultilinearMap.coe_mk, add_apply, ← Sum.update_elim_inl, f.map_update_add]
241+ ext fun _ ↦ by letI := Classical.decEq ι'; simp
244242 map_update_smul' u i c x :=
245- ext fun v => by
246- letI := Classical.decEq ι'
247- simp only [MultilinearMap.coe_mk, smul_apply, ← Sum.update_elim_inl, f.map_update_smul]
243+ ext fun _ ↦ by letI := Classical.decEq ι'; simp
244+
245+ @ [simp low]
246+ theorem currySum_apply (f : MultilinearMap R N M₂)
247+ (u : (i : ι) → N (Sum.inl i)) (v : (i : ι') → N (Sum.inr i)) :
248+ currySum f u v = f (Sum.rec u v) := rfl
248249
249250@[simp]
250- theorem currySum_apply (f : MultilinearMap R (fun _ : ι ⊕ ι' => M') M₂) (u : ι → M')
251- (v : ι' → M') : f.currySum u v = f (Sum.elim u v) :=
252- rfl
251+ theorem currySum_apply' {N : Type *} [AddCommMonoid N] [Module R N]
252+ (f : MultilinearMap R (fun _ : ι ⊕ ι' ↦ N) M₂)
253+ (u : ι → N) (v : ι' → N) :
254+ currySum f u v = f (Sum.elim u v) := rfl
253255
254- /-- A multilinear map on `∀ i : ι, M'` taking values in the space of multilinear maps
255- on `∀ i : ι', M'` defines a multilinear map on `∀ i : ι ⊕ ι', M'`. -/
256- def uncurrySum (f : MultilinearMap R (fun _ : ι => M') (MultilinearMap R (fun _ : ι' => M') M₂)) :
257- MultilinearMap R (fun _ : ι ⊕ ι' => M') M₂ where
258- toFun u := f (u ∘ Sum.inl) (u ∘ Sum.inr)
259- map_update_add' u i x y := by
260- letI := (@Sum.inl_injective ι ι').decidableEq
261- letI := (@Sum.inr_injective ι ι').decidableEq
262- cases i <;>
263- simp only [MultilinearMap.map_update_add, add_apply, Sum.update_inl_comp_inl,
264- Sum.update_inl_comp_inr, Sum.update_inr_comp_inl, Sum.update_inr_comp_inr]
265- map_update_smul' u i c x := by
266- letI := (@Sum.inl_injective ι ι').decidableEq
267- letI := (@Sum.inr_injective ι ι').decidableEq
268- cases i <;>
269- simp only [MultilinearMap.map_update_smul, smul_apply, Sum.update_inl_comp_inl,
270- Sum.update_inl_comp_inr, Sum.update_inr_comp_inl, Sum.update_inr_comp_inr]
256+ @[simp]
257+ lemma currySum_add (f₁ f₂ : MultilinearMap R N M₂):
258+ currySum (f₁ + f₂) = currySum f₁ + currySum f₂ := rfl
271259
272260@[simp]
273- theorem uncurrySum_aux_apply
274- (f : MultilinearMap R (fun _ : ι => M') (MultilinearMap R (fun _ : ι' => M') M₂))
275- (u : ι ⊕ ι' → M') : f.uncurrySum u = f (u ∘ Sum.inl) (u ∘ Sum.inr) :=
261+ lemma currySum_smul (r : R) (f : MultilinearMap R N M₂):
262+ currySum (r • f) = r • currySum f := rfl
263+
264+ /-- Given a family of modules `N : (ι ⊕ ι') → Type*`, a multilinear map on
265+ `(fun (i : ι) ↦ N (.inl i))` taking values in the space of
266+ linear maps on `(fun (i : ι') ↦ N (.inr i))` induces a multilinear map
267+ on `(fun _ : ι ⊕ ι' => M')` induces. -/
268+ def uncurrySum
269+ (g : MultilinearMap R (fun i : ι ↦ N (.inl i))
270+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂)) :
271+ MultilinearMap R N M₂ where
272+ toFun u := g (fun i ↦ u (.inl i)) (fun i' ↦ u (.inr i'))
273+ map_update_add' := by
274+ letI := Classical.decEq ι
275+ letI := Classical.decEq ι'
276+ rintro _ _ (_ | _) _ _ <;> simp
277+ map_update_smul' := by
278+ letI := Classical.decEq ι
279+ letI := Classical.decEq ι'
280+ rintro _ _ (_ | _) _ _ <;> simp
281+
282+ @[simp]
283+ theorem uncurrySum_apply
284+ (g : MultilinearMap R (fun i : ι ↦ N (.inl i))
285+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂)) (u) :
286+ g.uncurrySum u =
287+ g (fun i ↦ u (.inl i)) (fun i' ↦ u (.inr i')) := rfl
288+
289+ @[simp]
290+ lemma uncurrySum_add
291+ (g₁ g₂ : MultilinearMap R (fun i : ι ↦ N (.inl i))
292+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂)) :
293+ uncurrySum (g₁ + g₂) = uncurrySum g₁ + uncurrySum g₂ :=
294+ rfl
295+
296+ lemma uncurrySum_smul
297+ (r : R) (g : MultilinearMap R (fun i : ι ↦ N (.inl i))
298+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂)) :
299+ uncurrySum (r • g) = r • uncurrySum g :=
276300 rfl
277301
278- variable (ι ι' R M₂ M')
302+ @ [ deprecated (since := "2025-04-23" )] alias uncurrySum_aux_apply := uncurrySum_apply
279303
280- /-- Linear equivalence between the space of multilinear maps on `∀ i : ι ⊕ ι', M'` and the space
281- of multilinear maps on `∀ i : ι, M'` taking values in the space of multilinear maps
282- on `∀ i : ι', M'`. -/
283- def currySumEquiv :
284- MultilinearMap R (fun _ : ι ⊕ ι' => M') M₂ ≃ₗ[R]
285- MultilinearMap R (fun _ : ι => M') (MultilinearMap R (fun _ : ι' => M') M₂) where
286- toFun := currySum
287- invFun := uncurrySum
288- left_inv f := ext fun u => by simp
289- right_inv f := by
290- ext
291- simp
292- map_add' f g := by
293- ext
294- rfl
295- map_smul' c f := by
296- ext
304+ @[simp]
305+ lemma uncurrySum_currySum (f : MultilinearMap R N M₂) :
306+ uncurrySum (currySum f) = f := by
307+ ext
308+ simp only [uncurrySum_apply, currySum_apply]
309+ congr
310+ ext (_ | _) <;> simp
311+
312+ @[simp]
313+ lemma currySum_uncurrySum
314+ (g : MultilinearMap R (fun i : ι ↦ N (.inl i))
315+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂)) :
316+ currySum (uncurrySum g) = g :=
297317 rfl
298318
299- variable {ι ι' R M₂ M'}
319+ /-- Multilinear maps on `N : (ι ⊕ ι') → Type*` identify to multilinear maps
320+ from `(fun (i : ι) ↦ N (.inl i))` taking values in the space of
321+ linear maps on `(fun (i : ι') ↦ N (.inr i))`. -/
322+ @[simps]
323+ def currySumEquiv : MultilinearMap R N M₂ ≃ₗ[R]
324+ MultilinearMap R (fun i : ι ↦ N (.inl i))
325+ (MultilinearMap R (fun i : ι' ↦ N (.inr i)) M₂) where
326+ toFun := currySum
327+ invFun := uncurrySum
328+ left_inv _ := by simp
329+ right_inv _ := rfl
330+ map_add' := by aesop
331+ map_smul' := by aesop
300332
301333@[simp]
302- theorem coe_currySumEquiv : ⇑(currySumEquiv R ι M₂ M' ι' ) = currySum :=
334+ theorem coe_currySumEquiv : ⇑(currySumEquiv (R := R) (N := N) ( M₂ := M₂) ) = currySum :=
303335 rfl
304336
305337@[simp]
306- theorem coe_currySumEquiv_symm : ⇑(currySumEquiv R ι M₂ M' ι' ).symm = uncurrySum :=
338+ theorem coe_currySumEquiv_symm : ⇑(currySumEquiv (R := R) (N := N) ( M₂ := M₂) ).symm = uncurrySum :=
307339 rfl
308340
309341variable (R M₂ M')
@@ -316,7 +348,7 @@ def curryFinFinset {k l n : ℕ} {s : Finset (Fin n)} (hk : #s = k) (hl : #sᶜ
316348 MultilinearMap R (fun _ : Fin n => M') M₂ ≃ₗ[R]
317349 MultilinearMap R (fun _ : Fin k => M') (MultilinearMap R (fun _ : Fin l => M') M₂) :=
318350 (domDomCongrLinearEquiv R R M' M₂ (finSumEquivOfFinset hk hl).symm).trans
319- ( currySumEquiv R (Fin k) M₂ M' (Fin l))
351+ currySumEquiv
320352
321353variable {R M₂ M'}
322354
0 commit comments