@@ -22,9 +22,9 @@ in linear functions), called respectively `multilinearCurryLeftEquiv` and
22
22
23
23
open Fin Function Finset Set
24
24
25
- universe uR uS uι v v' v₁ v₂ v₃
25
+ universe uR uS uι uι' v v' v₁ v₂ v₃
26
26
27
- variable {R : Type uR} {S : Type uS} {ι : Type uι} {n : ℕ}
27
+ variable {R : Type uR} {S : Type uS} {ι : Type uι} {ι' : Type uι'} { n : ℕ}
28
28
{M : Fin n.succ → Type v} {M₁ : ι → Type v₁} {M₂ : Type v₂} {M₃ : Type v₃} {M' : Type v'}
29
29
30
30
/-!
@@ -223,87 +223,119 @@ def multilinearCurryRightEquiv :
223
223
224
224
namespace MultilinearMap
225
225
226
- variable {ι' : Type *} {R M₂}
227
226
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
232
236
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 }
240
240
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
244
242
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
248
249
249
250
@[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
253
255
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
271
259
272
260
@[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 :=
276
300
rfl
277
301
278
- variable (ι ι' R M₂ M')
302
+ @[deprecated (since := "2025-04-23")] alias uncurrySum_aux_apply := uncurrySum_apply
279
303
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 :=
297
317
rfl
298
318
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
300
332
301
333
@[simp]
302
- theorem coe_currySumEquiv : ⇑(currySumEquiv R ι M₂ M' ι' ) = currySum :=
334
+ theorem coe_currySumEquiv : ⇑(currySumEquiv (R := R) (N := N) ( M₂ := M₂) ) = currySum :=
303
335
rfl
304
336
305
337
@[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 :=
307
339
rfl
308
340
309
341
variable (R M₂ M')
@@ -316,7 +348,7 @@ def curryFinFinset {k l n : ℕ} {s : Finset (Fin n)} (hk : #s = k) (hl : #sᶜ
316
348
MultilinearMap R (fun _ : Fin n => M') M₂ ≃ₗ[R]
317
349
MultilinearMap R (fun _ : Fin k => M') (MultilinearMap R (fun _ : Fin l => M') M₂) :=
318
350
(domDomCongrLinearEquiv R R M' M₂ (finSumEquivOfFinset hk hl).symm).trans
319
- ( currySumEquiv R (Fin k) M₂ M' (Fin l))
351
+ currySumEquiv
320
352
321
353
variable {R M₂ M'}
322
354
0 commit comments