Skip to content

Commit 97b14cb

Browse files
goliath-kleinbryangingechen
authored andcommitted
refactor(PiTensorProduct/{InjectiveNorm, ProjectiveNorm}): deprecate injectiveSeminorm (leanprover-community#35569)
This PR: * Deprecates `PiTensorProduct.injectiveSeminorm` and supporting lemmas. * Moves the theory of `liftEquiv` from InjectiveSeminorm.lean to ProjectiveSeminorm.lean. No changes are introduced beyond adding deprecation notices, adapting docstrings, and moving material between files. The PR leaves InjectiveSeminorm.lean almost empty. A new implementation of `injectiveSeminorm`, one which reflects the common mathematical definition, is to be done. This is the third in a series of three PRs with the goal to [deprecate `PiTensorProuduct.injectiveSeminorm`](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/injectiveSeminorm/with/568798633).
1 parent 3c6297f commit 97b14cb

2 files changed

Lines changed: 227 additions & 241 deletions

File tree

Mathlib/Analysis/Normed/Module/PiTensorProduct/InjectiveSeminorm.lean

Lines changed: 27 additions & 231 deletions
Original file line numberDiff line numberDiff line change
@@ -11,79 +11,36 @@ import Mathlib.LinearAlgebra.Isomorphisms
1111
/-!
1212
# Injective seminorm on the tensor of a finite family of normed spaces.
1313
14-
Let `𝕜` be a nontrivially normed field and `E` be a family of normed `𝕜`-vector spaces `Eᵢ`,
15-
indexed by a finite type `ι`. We define a seminorm on `⨂[𝕜] i, Eᵢ`, which we call the
16-
"injective seminorm". It is chosen to satisfy the following property: for every
17-
normed `𝕜`-vector space `F`, the linear equivalence
18-
`MultilinearMap 𝕜 E F ≃ₗ[𝕜] (⨂[𝕜] i, Eᵢ) →ₗ[𝕜] F`
19-
expressing the universal property of the tensor product induces an isometric linear equivalence
20-
`ContinuousMultilinearMap 𝕜 E F ≃ₗᵢ[𝕜] (⨂[𝕜] i, Eᵢ) →L[𝕜] F`.
14+
The purpose of this file is to develop the theory of the injective tensor norm.
2115
22-
The idea is the following: Every normed `𝕜`-vector space `F` defines a linear map
23-
from `⨂[𝕜] i, Eᵢ` to `ContinuousMultilinearMap 𝕜 E F →ₗ[𝕜] F`, which sends `x` to the map
24-
`f ↦ f.lift x`. Thanks to `PiTensorProduct.norm_eval_le_projectiveSeminorm`, this map lands in
25-
`ContinuousMultilinearMap 𝕜 E F →L[𝕜] F`. As this last space has a natural operator (semi)norm,
26-
we get an induced seminorm on `⨂[𝕜] i, Eᵢ`, which, by
27-
`PiTensorProduct.norm_eval_le_projectiveSeminorm`, is bounded above by the projective seminorm
28-
`PiTensorProduct.projectiveSeminorm`. We then take the `sup` of these seminorms as `F` varies;
29-
as this family of seminorms is bounded, its `sup` has good properties.
16+
A first formalization turned out not to capture the common mathematical definition and is
17+
now deprecated. See
3018
31-
In fact, we cannot take the `sup` over all normed spaces `F` because of set-theoretical issues,
32-
so we only take spaces `F` in the same universe as `⨂[𝕜] i, Eᵢ`. We prove in
33-
`norm_eval_le_injectiveSeminorm` that this gives the same result, because every multilinear map
34-
from `E = Πᵢ Eᵢ` to `F` factors though a normed vector space in the same universe as
35-
`⨂[𝕜] i, Eᵢ`.
36-
37-
We then prove the universal property and the functoriality of `⨂[𝕜] i, Eᵢ` as a normed vector
38-
space.
19+
https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/injectiveSeminorm/with/568798633
3920
4021
## Main definitions
4122
4223
* `PiTensorProduct.toDualContinuousMultilinearMap`: The `𝕜`-linear map from
4324
`⨂[𝕜] i, Eᵢ` to `ContinuousMultilinearMap 𝕜 E F →L[𝕜] F` sending `x` to the map
4425
`f ↦ f x`.
45-
* `PiTensorProduct.injectiveSeminorm`: The injective seminorm on `⨂[𝕜] i, Eᵢ`.
46-
* `PiTensorProduct.liftEquiv`: The bijection between `ContinuousMultilinearMap 𝕜 E F`
47-
and `(⨂[𝕜] i, Eᵢ) →L[𝕜] F`, as a continuous linear equivalence.
48-
* `PiTensorProduct.liftIsometry`: The bijection between `ContinuousMultilinearMap 𝕜 E F`
49-
and `(⨂[𝕜] i, Eᵢ) →L[𝕜] F`, as an isometric linear equivalence.
50-
* `PiTensorProduct.tprodL`: The canonical continuous multilinear map from `E = Πᵢ Eᵢ`
51-
to `⨂[𝕜] i, Eᵢ`.
52-
* `PiTensorProduct.mapL`: The continuous linear map from `⨂[𝕜] i, Eᵢ` to `⨂[𝕜] i, E'ᵢ`
53-
induced by a family of continuous linear maps `Eᵢ →L[𝕜] E'ᵢ`.
54-
* `PiTensorProduct.mapLMultilinear`: The continuous multilinear map from
55-
`Πᵢ (Eᵢ →L[𝕜] E'ᵢ)` to `(⨂[𝕜] i, Eᵢ) →L[𝕜] (⨂[𝕜] i, E'ᵢ)` sending a family
56-
`f` to `PiTensorProduct.mapL f`.
57-
58-
## Main results
59-
60-
* `PiTensorProduct.norm_eval_le_injectiveSeminorm`: The main property of the injective seminorm
61-
on `⨂[𝕜] i, Eᵢ`: for every `x` in `⨂[𝕜] i, Eᵢ` and every continuous multilinear map `f` from
62-
`E = Πᵢ Eᵢ` to a normed space `F`, we have `‖f.lift x‖ ≤ ‖f‖ * injectiveSeminorm x `.
63-
* `PiTensorProduct.mapL_opNorm`: If `f` is a family of continuous linear maps
64-
`fᵢ : Eᵢ →L[𝕜] Fᵢ`, then `‖PiTensorProduct.mapL f‖ ≤ ∏ i, ‖fᵢ‖`.
65-
* `PiTensorProduct.mapLMultilinear_opNorm` : If `F` is a normed vector space, then
66-
`‖mapLMultilinear 𝕜 E F‖ ≤ 1`.
6726
6827
## TODO
6928
70-
* If all `Eᵢ` are separated and satisfy `SeparatingDual`, then the seminorm on
71-
`⨂[𝕜] i, Eᵢ` is a norm. This uses the construction of a basis of the `PiTensorProduct`, hence
72-
depends on PR https://github.com/leanprover-community/mathlib4/pull/11156.
73-
It should probably go in a separate file.
74-
75-
* Adapt the remaining functoriality constructions/properties from `PiTensorProduct`.
29+
* Reimplement `injectiveSeminorm`.
7630
7731
-/
7832

7933
@[expose] public section
8034

81-
universe uι u𝕜 uE uF
35+
-- These explicit universe variables are required by `injectiveSeminorm`, which
36+
-- has been marked as deprecated on 2026-06-10. TBD: delete the variables after the
37+
-- deprecated material has been removed or re-implemented.
38+
universe uι u𝕜 uE
8239

8340
variable {ι : Type uι} [Fintype ι]
8441
variable {𝕜 : Type u𝕜} [NontriviallyNormedField 𝕜]
8542
variable {E : ι → Type uE} [∀ i, SeminormedAddCommGroup (E i)] [∀ i, NormedSpace 𝕜 (E i)]
86-
variable {F : Type uF} [SeminormedAddCommGroup F] [NormedSpace 𝕜 F]
43+
variable {F : Type*} [SeminormedAddCommGroup F] [NormedSpace 𝕜 F]
8744

8845
open scoped TensorProduct
8946

@@ -116,11 +73,15 @@ theorem toDualContinuousMultilinearMap_le_projectiveSeminorm (x : ⨂[𝕜] i, E
11673
normed vector spaces `F`. In fact, we only take in the same universe as `⨂[𝕜] i, Eᵢ`, and then
11774
prove in `PiTensorProduct.norm_eval_le_injectiveSeminorm` that this gives the same result.
11875
-/
76+
@[deprecated
77+
"`injectiveSeminorm` is deprecated in favor of the extensionally equal `projectiveSeminorm`"
78+
(since := "2026-06-10")]
11979
noncomputable irreducible_def injectiveSeminorm : Seminorm 𝕜 (⨂[𝕜] i, E i) :=
12080
sSup {p | ∃ (G : Type (max uι u𝕜 uE)) (_ : SeminormedAddCommGroup G)
12181
(_ : NormedSpace 𝕜 G), p = Seminorm.comp (normSeminorm 𝕜 (ContinuousMultilinearMap 𝕜 E G →L[𝕜] G))
12282
(toDualContinuousMultilinearMap G (𝕜 := 𝕜) (E := E))}
12383

84+
@[deprecated "no replacement" (since := "2026-06-10")]
12485
lemma dualSeminorms_bounded : BddAbove {p | ∃ (G : Type (max uι u𝕜 uE))
12586
(_ : SeminormedAddCommGroup G) (_ : NormedSpace 𝕜 G),
12687
p = Seminorm.comp (normSeminorm 𝕜 (ContinuousMultilinearMap 𝕜 E G →L[𝕜] G))
@@ -130,6 +91,9 @@ lemma dualSeminorms_bounded : BddAbove {p | ∃ (G : Type (max uι u𝕜 uE))
13091
intro p G _ _ hp x
13192
simpa [hp] using toDualContinuousMultilinearMap_le_projectiveSeminorm _
13293

94+
@[deprecated
95+
"`injectiveSeminorm` is deprecated in favor of the extensionally equal `projectiveSeminorm`"
96+
(since := "2026-06-10")]
13397
theorem injectiveSeminorm_apply (x : ⨂[𝕜] i, E i) :
13498
injectiveSeminorm x = ⨆ p : {p | ∃ (G : Type (max uι u𝕜 uE))
13599
(_ : SeminormedAddCommGroup G) (_ : NormedSpace 𝕜 G), p = Seminorm.comp (normSeminorm 𝕜
@@ -138,6 +102,10 @@ theorem injectiveSeminorm_apply (x : ⨂[𝕜] i, E i) :
138102
simpa only [injectiveSeminorm, Set.coe_setOf, Set.mem_setOf_eq]
139103
using Seminorm.sSup_apply dualSeminorms_bounded
140104

105+
attribute [-instance] instSeminormedAddCommGroup in
106+
@[deprecated
107+
"`injectiveSeminorm` is deprecated in favor of the extensionally equal `projectiveSeminorm`"
108+
(since := "2026-06-10")]
141109
theorem norm_eval_le_injectiveSeminorm (f : ContinuousMultilinearMap 𝕜 E F) (x : ⨂[𝕜] i, E i) :
142110
‖lift f.toMultilinearMap x‖ ≤ ‖f‖ * injectiveSeminorm x := by
143111
/- If `F` were in `Type (max uι u𝕜 uE)` (which is the type of `⨂[𝕜] i, E i`), then the
@@ -191,6 +159,9 @@ theorem norm_eval_le_injectiveSeminorm (f : ContinuousMultilinearMap 𝕜 E F) (
191159
rw [mul_comm]
192160
exact ContinuousLinearMap.le_opNorm _ _
193161

162+
@[deprecated
163+
"`injectiveSeminorm` is deprecated in favor of the extensionally equal `projectiveSeminorm`"
164+
(since := "2026-06-10")]
194165
theorem injectiveSeminorm_le_projectiveSeminorm :
195166
injectiveSeminorm (𝕜 := 𝕜) (E := E) ≤ projectiveSeminorm := by
196167
rw [injectiveSeminorm]
@@ -208,188 +179,13 @@ theorem injectiveSeminorm_le_projectiveSeminorm :
208179
rw [h]; intro x; simp only [Seminorm.comp_apply, coe_normSeminorm]
209180
exact toDualContinuousMultilinearMap_le_projectiveSeminorm _
210181

182+
@[deprecated
183+
"`injectiveSeminorm` is deprecated in favor of the extensionally equal `projectiveSeminorm`"
184+
(since := "2026-06-10")]
211185
theorem injectiveSeminorm_tprod_le (m : Π (i : ι), E i) :
212186
injectiveSeminorm (⨂ₜ[𝕜] i, m i) ≤ ∏ i, ‖m i‖ :=
213187
le_trans (injectiveSeminorm_le_projectiveSeminorm _) (projectiveSeminorm_tprod_le m)
214188

215-
-- Use `projectiveSeminorm` to turn the `PiTensorProduct` into a seminormed space.
216-
-- The definition `injectiveSeminorm` is subject to deprecation in a follow-up PR. See:
217-
-- https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/injectiveSeminorm/with/568798633
218-
noncomputable instance : SeminormedAddCommGroup (⨂[𝕜] i, E i) :=
219-
fast_instance% AddGroupSeminorm.toSeminormedAddCommGroup projectiveSeminorm.toAddGroupSeminorm
220-
221-
noncomputable instance : NormedSpace 𝕜 (⨂[𝕜] i, E i) := ⟨projectiveSeminorm_smul_le⟩
222-
223-
variable (𝕜 E F)
224-
225-
/-- The linear equivalence between `ContinuousMultilinearMap 𝕜 E F` and `(⨂[𝕜] i, Eᵢ) →L[𝕜] F`
226-
induced by `PiTensorProduct.lift`, for every normed space `F`.
227-
-/
228-
@[simps]
229-
noncomputable def liftEquiv : ContinuousMultilinearMap 𝕜 E F ≃ₗ[𝕜] (⨂[𝕜] i, E i) →L[𝕜] F where
230-
toFun f := LinearMap.mkContinuous (lift f.toMultilinearMap) ‖f‖ fun x ↦
231-
norm_eval_le_projectiveSeminorm f x
232-
map_add' f g := by ext; simp
233-
map_smul' a f := by ext; simp
234-
invFun l := MultilinearMap.mkContinuous (lift.symm l.toLinearMap) ‖l‖ fun x ↦
235-
ContinuousLinearMap.le_opNorm_of_le _ (projectiveSeminorm_tprod_le x)
236-
left_inv f := by ext; simp
237-
right_inv l := by
238-
rw [← ContinuousLinearMap.coe_inj]
239-
ext; simp
240-
241-
/-- For a normed space `F`, we have constructed in `PiTensorProduct.liftEquiv` the canonical
242-
linear equivalence between `ContinuousMultilinearMap 𝕜 E F` and `(⨂[𝕜] i, Eᵢ) →L[𝕜] F`
243-
(induced by `PiTensorProduct.lift`). Here we give the upgrade of this equivalence to
244-
an isometric linear equivalence; in particular, it is a continuous linear equivalence. -/
245-
noncomputable def liftIsometry : ContinuousMultilinearMap 𝕜 E F ≃ₗᵢ[𝕜] (⨂[𝕜] i, E i) →L[𝕜] F :=
246-
LinearIsometryEquiv.ofBounds (liftEquiv 𝕜 E F)
247-
(fun f ↦ LinearMap.mkContinuous_norm_le _ (norm_nonneg f) (norm_eval_le_projectiveSeminorm f))
248-
(fun f ↦ by
249-
rw [liftEquiv_symm_apply]
250-
exact MultilinearMap.mkContinuous_norm_le _ (norm_nonneg f) _)
251-
252-
variable {𝕜 E F}
253-
254-
-- API missing for `LinearIsometryEquiv.ofBounds`?
255-
@[simp]
256-
theorem liftIsometry_apply_apply (f : ContinuousMultilinearMap 𝕜 E F) (x : ⨂[𝕜] i, E i) :
257-
liftIsometry 𝕜 E F f x = lift f.toMultilinearMap x := by
258-
simp [LinearIsometryEquiv.ofBounds, liftIsometry]
259-
260-
variable (𝕜) in
261-
/-- The canonical continuous multilinear map from `E = Πᵢ Eᵢ` to `⨂[𝕜] i, Eᵢ`. -/
262-
@[simps! toFun]
263-
noncomputable def tprodL : ContinuousMultilinearMap 𝕜 E (⨂[𝕜] i, E i) :=
264-
(liftIsometry 𝕜 E _).symm (ContinuousLinearMap.id 𝕜 _)
265-
266-
@[simp]
267-
theorem tprodL_coe : (tprodL 𝕜).toMultilinearMap = tprod 𝕜 (s := E) := by
268-
ext; simp
269-
270-
@[simp]
271-
theorem liftIsometry_symm_apply (l : (⨂[𝕜] i, E i) →L[𝕜] F) :
272-
(liftIsometry 𝕜 E F).symm l = l.compContinuousMultilinearMap (tprodL 𝕜) := by
273-
rfl
274-
275-
@[simp]
276-
theorem liftIsometry_tprodL :
277-
liftIsometry 𝕜 E _ (tprodL 𝕜) = ContinuousLinearMap.id 𝕜 (⨂[𝕜] i, E i) := by
278-
ext; simp
279-
280189
end seminorm
281190

282-
section map
283-
284-
variable {E' E'' : ι → Type*}
285-
variable [∀ i, SeminormedAddCommGroup (E' i)] [∀ i, NormedSpace 𝕜 (E' i)]
286-
variable [∀ i, SeminormedAddCommGroup (E'' i)] [∀ i, NormedSpace 𝕜 (E'' i)]
287-
variable (g : Π i, E' i →L[𝕜] E'' i) (f : Π i, E i →L[𝕜] E' i)
288-
289-
/-- Let `Eᵢ` and `E'ᵢ` be two families of normed `𝕜`-vector spaces.
290-
Let `f` be a family of continuous `𝕜`-linear maps between `Eᵢ` and `E'ᵢ`, i.e.
291-
`f : Πᵢ Eᵢ →L[𝕜] E'ᵢ`, then there is an induced continuous linear map
292-
`⨂ᵢ Eᵢ → ⨂ᵢ E'ᵢ` by `⨂ aᵢ ↦ ⨂ fᵢ aᵢ`. -/
293-
noncomputable def mapL : (⨂[𝕜] i, E i) →L[𝕜] ⨂[𝕜] i, E' i :=
294-
liftIsometry 𝕜 E _ <| (tprodL 𝕜).compContinuousLinearMap f
295-
296-
@[simp]
297-
theorem mapL_coe : (mapL f).toLinearMap = map (fun i ↦ (f i).toLinearMap) := by
298-
ext; simp [mapL]
299-
300-
@[simp]
301-
theorem mapL_apply (x : ⨂[𝕜] i, E i) : mapL f x = map (fun i ↦ (f i).toLinearMap) x := by
302-
rfl
303-
304-
/-- Given submodules `pᵢ ⊆ Eᵢ`, this is the natural map: `⨂[𝕜] i, pᵢ → ⨂[𝕜] i, Eᵢ`.
305-
This is the continuous version of `PiTensorProduct.mapIncl`. -/
306-
@[simp]
307-
noncomputable def mapLIncl (p : Π i, Submodule 𝕜 (E i)) : (⨂[𝕜] i, p i) →L[𝕜] ⨂[𝕜] i, E i :=
308-
mapL fun (i : ι) ↦ (p i).subtypeL
309-
310-
theorem mapL_comp : mapL (fun (i : ι) ↦ g i ∘L f i) = mapL g ∘L mapL f := by
311-
apply ContinuousLinearMap.coe_injective
312-
ext; simp
313-
314-
theorem liftIsometry_comp_mapL (h : ContinuousMultilinearMap 𝕜 E' F) :
315-
liftIsometry 𝕜 E' F h ∘L mapL f = liftIsometry 𝕜 E F (h.compContinuousLinearMap f) := by
316-
apply ContinuousLinearMap.coe_injective
317-
ext; simp
318-
319-
@[simp]
320-
theorem mapL_id : mapL (fun i ↦ ContinuousLinearMap.id 𝕜 (E i)) = ContinuousLinearMap.id _ _ := by
321-
apply ContinuousLinearMap.coe_injective
322-
ext; simp
323-
324-
@[simp]
325-
theorem mapL_one : mapL (fun (i : ι) ↦ (1 : E i →L[𝕜] E i)) = 1 :=
326-
mapL_id
327-
328-
theorem mapL_mul (f₁ f₂ : Π i, E i →L[𝕜] E i) :
329-
mapL (fun i ↦ f₁ i * f₂ i) = mapL f₁ * mapL f₂ :=
330-
mapL_comp f₁ f₂
331-
332-
/-- Upgrading `PiTensorProduct.mapL` to a `MonoidHom` when `E = E'`. -/
333-
@[simps]
334-
noncomputable def mapLMonoidHom : (Π i, E i →L[𝕜] E i) →* ((⨂[𝕜] i, E i) →L[𝕜] ⨂[𝕜] i, E i) where
335-
toFun := mapL
336-
map_one' := mapL_one
337-
map_mul' := mapL_mul
338-
339-
@[simp]
340-
protected theorem mapL_pow (f : Π i, E i →L[𝕜] E i) (n : ℕ) :
341-
mapL (f ^ n) = mapL f ^ n := MonoidHom.map_pow mapLMonoidHom f n
342-
343-
-- We redeclare `ι` here, and later dependent arguments,
344-
-- to avoid the `[Fintype ι]` assumption present throughout the rest of the file.
345-
open Function in
346-
private theorem mapL_add_smul_aux {ι : Type uι}
347-
{E : ι → Type uE} [(i : ι) → SeminormedAddCommGroup (E i)] [(i : ι) → NormedSpace 𝕜 (E i)]
348-
{E' : ι → Type u_1} [(i : ι) → SeminormedAddCommGroup (E' i)] [(i : ι) → NormedSpace 𝕜 (E' i)]
349-
(f : (i : ι) → E i →L[𝕜] E' i) [DecidableEq ι] (i : ι) (u : E i →L[𝕜] E' i) :
350-
(fun j ↦ (update f i u j).toLinearMap) =
351-
update (fun j ↦ (f j).toLinearMap) i u.toLinearMap := by
352-
grind
353-
354-
open Function in
355-
protected theorem mapL_add [DecidableEq ι] (i : ι) (u v : E i →L[𝕜] E' i) :
356-
mapL (update f i (u + v)) = mapL (update f i u) + mapL (update f i v) := by
357-
ext
358-
simp [mapL_add_smul_aux, PiTensorProduct.map_update_add]
359-
360-
open Function in
361-
protected theorem mapL_smul [DecidableEq ι] (i : ι) (c : 𝕜) (u : E i →L[𝕜] E' i) :
362-
mapL (update f i (c • u)) = c • mapL (update f i u) := by
363-
ext
364-
simp [mapL_add_smul_aux, PiTensorProduct.map_update_smul]
365-
366-
theorem mapL_opNorm : ‖mapL f‖ ≤ ∏ i, ‖f i‖ := by
367-
refine (ContinuousLinearMap.opNorm_le_iff (by positivity)).mpr fun x ↦ ?_
368-
apply le_trans (norm_eval_le_projectiveSeminorm ..) (mul_le_mul_of_nonneg_right _ (norm_nonneg x))
369-
refine (ContinuousMultilinearMap.opNorm_le_iff (by positivity)).mpr fun m ↦ ?_
370-
apply le_trans (projectiveSeminorm_tprod_le fun i ↦ f i (m i))
371-
rw [← Finset.prod_mul_distrib]
372-
gcongr
373-
exact ContinuousLinearMap.le_opNorm _ _
374-
375-
variable (𝕜 E E')
376-
377-
/-- The tensor of a family of linear maps from `Eᵢ` to `E'ᵢ`, as a continuous multilinear map of
378-
the family. -/
379-
@[simps! toFun_apply]
380-
noncomputable def mapLMultilinear : ContinuousMultilinearMap 𝕜 (fun (i : ι) ↦ E i →L[𝕜] E' i)
381-
((⨂[𝕜] i, E i) →L[𝕜] ⨂[𝕜] i, E' i) :=
382-
MultilinearMap.mkContinuous
383-
{ toFun := mapL
384-
map_update_smul' := fun _ _ _ _ ↦ PiTensorProduct.mapL_smul _ _ _ _
385-
map_update_add' := fun _ _ _ _ ↦ PiTensorProduct.mapL_add _ _ _ _ }
386-
1 (fun f ↦ by rw [one_mul]; exact mapL_opNorm f)
387-
388-
variable {𝕜 E E'}
389-
390-
theorem mapLMultilinear_opNorm : ‖mapLMultilinear 𝕜 E E'‖ ≤ 1 :=
391-
MultilinearMap.mkContinuous_norm_le _ zero_le_one _
392-
393-
end map
394-
395191
end PiTensorProduct

0 commit comments

Comments
 (0)