Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d81cedb

Browse files
committed
feat(topology/algebra/module/multilinear): relax requirements for continuous_multilinear_map.mk_pi_algebra (#13426)
`continuous_multilinear_map.mk_pi_algebra` and `continuous_multilinear_map.mk_pi_algebra_fin` do not need a norm on either the algebra or base ring; all they need is a topology on the algebra compatible with multiplication. The much weaker typeclasses cause some elaboration issues in a few places, as the normed space can no longer be found by unification. Adding a non-dependent version of `continuous_multilinear_map.has_op_norm` largely resolves this, although a few API proofs about `mk_pi_algebra` and `mk_pi_algebra_fin` end up quite underscore heavy. This is the first step in being able to define `exp` without first choosing a `norm`.
1 parent 1506335 commit d81cedb

File tree

2 files changed

+85
-55
lines changed

2 files changed

+85
-55
lines changed

src/analysis/normed_space/multilinear.lean

Lines changed: 41 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,11 @@ open real
285285
def op_norm := Inf {c | 0 ≤ (c : ℝ) ∧ ∀ m, ∥f m∥ ≤ c * ∏ i, ∥m i∥}
286286
instance has_op_norm : has_norm (continuous_multilinear_map 𝕜 E G) := ⟨op_norm⟩
287287

288+
/-- An alias of `continuous_multilinear_map.has_op_norm` with non-dependent types to help typeclass
289+
search. -/
290+
instance has_op_norm' : has_norm (continuous_multilinear_map 𝕜 (λ (i : ι), G) G') :=
291+
continuous_multilinear_map.has_op_norm
292+
288293
lemma norm_def : ∥f∥ = Inf {c | 0 ≤ (c : ℝ) ∧ ∀ m, ∥f m∥ ≤ c * ∏ i, ∥m i∥} := rfl
289294

290295
-- So that invocations of `le_cInf` make sense: we show that the set of
@@ -669,43 +674,28 @@ end
669674

670675
section
671676

672-
variables (𝕜 ι) (A : Type*) [normed_comm_ring A] [normed_algebra 𝕜 A]
673-
674-
/-- The continuous multilinear map on `A^ι`, where `A` is a normed commutative algebra
675-
over `𝕜`, associating to `m` the product of all the `m i`.
676-
677-
See also `continuous_multilinear_map.mk_pi_algebra_fin`. -/
678-
protected def mk_pi_algebra : continuous_multilinear_map 𝕜 (λ i : ι, A) A :=
679-
multilinear_map.mk_continuous
680-
(multilinear_map.mk_pi_algebra 𝕜 ι A) (if nonempty ι then 1 else ∥(1 : A)∥) $
681-
begin
682-
intro m,
683-
casesI is_empty_or_nonempty ι with hι hι,
684-
{ simp [eq_empty_of_is_empty univ, not_nonempty_iff.2 hι] },
685-
{ simp [norm_prod_le' univ univ_nonempty, hι] }
686-
end
687-
688-
variables {A 𝕜 ι}
689-
690-
@[simp] lemma mk_pi_algebra_apply (m : ι → A) :
691-
continuous_multilinear_map.mk_pi_algebra 𝕜 ι A m = ∏ i, m i :=
692-
rfl
677+
variables {𝕜 ι} {A : Type*} [normed_comm_ring A] [normed_algebra 𝕜 A]
693678

679+
@[simp]
694680
lemma norm_mk_pi_algebra_le [nonempty ι] :
695681
∥continuous_multilinear_map.mk_pi_algebra 𝕜 ι A∥ ≤ 1 :=
696-
calc ∥continuous_multilinear_map.mk_pi_algebra 𝕜 ι A∥ ≤ if nonempty ι then 1 else ∥(1 : A)∥ :
697-
multilinear_map.mk_continuous_norm_le _ (by split_ifs; simp [zero_le_one]) _
698-
... = _ : if_pos ‹_›
682+
begin
683+
have := λ f, @op_norm_le_bound 𝕜 ι (λ i, A) A _ _ _ _ _ _ _ f _ zero_le_one,
684+
refine this _ _,
685+
intros m,
686+
simp only [continuous_multilinear_map.mk_pi_algebra_apply, one_mul],
687+
exact norm_prod_le' _ univ_nonempty _,
688+
end
699689

700690
lemma norm_mk_pi_algebra_of_empty [is_empty ι] :
701691
∥continuous_multilinear_map.mk_pi_algebra 𝕜 ι A∥ = ∥(1 : A)∥ :=
702692
begin
703693
apply le_antisymm,
704-
calc ∥continuous_multilinear_map.mk_pi_algebra 𝕜 ι A∥ ≤ if nonempty ι then 1 else ∥(1 : A)∥ :
705-
multilinear_map.mk_continuous_norm_le _ (by split_ifs; simp [zero_le_one]) _
706-
... = ∥(1 : A)∥ : if_neg (not_nonempty_iff.mpr ‹_›),
707-
convert ratio_le_op_norm _ (λ _, (1 : A)),
708-
simp [eq_empty_of_is_empty (univ : finset ι)],
694+
{ have := λ f, @op_norm_le_bound 𝕜 ι (λ i, A) A _ _ _ _ _ _ _ f _ (norm_nonneg (1 : A)),
695+
refine this _ _,
696+
simp, },
697+
{ convert ratio_le_op_norm _ (λ _, (1 : A)),
698+
simp [eq_empty_of_is_empty (univ : finset ι)], },
709699
end
710700

711701
@[simp] lemma norm_mk_pi_algebra [norm_one_class A] :
@@ -722,42 +712,38 @@ end
722712

723713
section
724714

725-
variables (𝕜 n) (A : Type*) [normed_ring A] [normed_algebra 𝕜 A]
726-
727-
/-- The continuous multilinear map on `A^n`, where `A` is a normed algebra over `𝕜`, associating to
728-
`m` the product of all the `m i`.
729-
730-
See also: `multilinear_map.mk_pi_algebra`. -/
731-
protected def mk_pi_algebra_fin : continuous_multilinear_map 𝕜 (λ i : fin n, A) A :=
732-
multilinear_map.mk_continuous
733-
(multilinear_map.mk_pi_algebra_fin 𝕜 n A) (nat.cases_on n ∥(1 : A)∥ (λ _, 1)) $
734-
begin
735-
intro m,
736-
cases n,
737-
{ simp },
738-
{ have : @list.of_fn A n.succ m ≠ [] := by simp,
739-
simpa [← fin.prod_of_fn] using list.norm_prod_le' this }
740-
end
741-
742-
variables {A 𝕜 n}
743-
744-
@[simp] lemma mk_pi_algebra_fin_apply (m : fin n → A) :
745-
continuous_multilinear_map.mk_pi_algebra_fin 𝕜 n A m = (list.of_fn m).prod :=
746-
rfl
715+
variables {𝕜 n} {A : Type*} [normed_ring A] [normed_algebra 𝕜 A]
747716

748717
lemma norm_mk_pi_algebra_fin_succ_le :
749718
∥continuous_multilinear_map.mk_pi_algebra_fin 𝕜 n.succ A∥ ≤ 1 :=
750-
multilinear_map.mk_continuous_norm_le _ zero_le_one _
719+
begin
720+
have := λ f, @op_norm_le_bound 𝕜 (fin n.succ) (λ i, A) A _ _ _ _ _ _ _ f _ zero_le_one,
721+
refine this _ _,
722+
intros m,
723+
simp only [continuous_multilinear_map.mk_pi_algebra_fin_apply, one_mul, list.of_fn_eq_map,
724+
fin.univ_def, finset.fin_range, finset.prod, multiset.coe_map, multiset.coe_prod],
725+
refine (list.norm_prod_le' _).trans_eq _,
726+
{ rw [ne.def, list.map_eq_nil, list.fin_range_eq_nil],
727+
exact nat.succ_ne_zero _, },
728+
rw list.map_map,
729+
end
751730

752731
lemma norm_mk_pi_algebra_fin_le_of_pos (hn : 0 < n) :
753732
∥continuous_multilinear_map.mk_pi_algebra_fin 𝕜 n A∥ ≤ 1 :=
754-
by cases n; [exact hn.false.elim, exact norm_mk_pi_algebra_fin_succ_le]
733+
begin
734+
obtain ⟨n, rfl⟩ := nat.exists_eq_succ_of_ne_zero hn.ne',
735+
exact norm_mk_pi_algebra_fin_succ_le
736+
end
755737

756738
lemma norm_mk_pi_algebra_fin_zero :
757739
∥continuous_multilinear_map.mk_pi_algebra_fin 𝕜 0 A∥ = ∥(1 : A)∥ :=
758740
begin
759-
refine le_antisymm (multilinear_map.mk_continuous_norm_le _ (norm_nonneg _) _) _,
760-
convert ratio_le_op_norm _ (λ _, 1); [simp, apply_instance]
741+
refine le_antisymm _ _,
742+
{ have := λ f, @op_norm_le_bound 𝕜 (fin 0) (λ i, A) A _ _ _ _ _ _ _ f _ (norm_nonneg (1 : A)),
743+
refine this _ _,
744+
simp, },
745+
{ convert ratio_le_op_norm _ (λ _, (1 : A)),
746+
simp }
761747
end
762748

763749
@[simp] lemma norm_mk_pi_algebra_fin [norm_one_class A] :

src/topology/algebra/module/multilinear.lean

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,4 +409,48 @@ def pi_linear_equiv {ι' : Type*} {M' : ι' → Type*}
409409

410410
end module
411411

412+
section comm_algebra
413+
414+
variables (R ι) (A : Type*) [fintype ι] [comm_semiring R] [comm_semiring A] [algebra R A]
415+
[topological_space A] [has_continuous_mul A]
416+
417+
/-- The continuous multilinear map on `A^ι`, where `A` is a normed commutative algebra
418+
over `𝕜`, associating to `m` the product of all the `m i`.
419+
420+
See also `continuous_multilinear_map.mk_pi_algebra_fin`. -/
421+
protected def mk_pi_algebra : continuous_multilinear_map R (λ i : ι, A) A :=
422+
{ cont := continuous_finset_prod _ $ λ i hi, continuous_apply _,
423+
to_multilinear_map := multilinear_map.mk_pi_algebra R ι A}
424+
425+
@[simp] lemma mk_pi_algebra_apply (m : ι → A) :
426+
continuous_multilinear_map.mk_pi_algebra R ι A m = ∏ i, m i :=
427+
rfl
428+
429+
end comm_algebra
430+
431+
section algebra
432+
433+
variables (R n) (A : Type*) [comm_semiring R] [semiring A] [algebra R A]
434+
[topological_space A] [has_continuous_mul A]
435+
436+
/-- The continuous multilinear map on `A^n`, where `A` is a normed algebra over `𝕜`, associating to
437+
`m` the product of all the `m i`.
438+
439+
See also: `continuous_multilinear_map.mk_pi_algebra`. -/
440+
protected def mk_pi_algebra_fin : A [×n]→L[R] A :=
441+
{ cont := begin
442+
change continuous (λ m, (list.of_fn m).prod),
443+
simp_rw list.of_fn_eq_map,
444+
exact continuous_list_prod _ (λ i hi, continuous_apply _),
445+
end,
446+
to_multilinear_map := multilinear_map.mk_pi_algebra_fin R n A}
447+
448+
variables {R n A}
449+
450+
@[simp] lemma mk_pi_algebra_fin_apply (m : fin n → A) :
451+
continuous_multilinear_map.mk_pi_algebra_fin R n A m = (list.of_fn m).prod :=
452+
rfl
453+
454+
end algebra
455+
412456
end continuous_multilinear_map

0 commit comments

Comments
 (0)