/- Copyright (c) 2026 Ryotaro Tanaka. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Ryotaro Tanaka -/ module public import Mathlib.Analysis.Normed.Module.Dual /-! # Supporting functionals and unions of kernels The scalar field may be real or complex. The continuous dual is Mathlib's `StrongDual`. A union of kernels is a `Set`, not a submodule or an ideal. No nonemptiness of the supporting family is built into its definition. -/ @[expose] public section set_option autoImplicit false universe u v namespace NormedSpace variable (π•œ : Type v) [RCLike π•œ] variable {E : Type u} [SeminormedAddCommGroup E] [NormedSpace π•œ E] /-- The closed-dual-ball functionals taking the norm value at a vector. -/ def normingFunctionals (x : E) : Set (StrongDual π•œ E) := {f | β€–fβ€– ≀ 1 ∧ f x = (β€–xβ€– : π•œ)} @[simp] theorem mem_normingFunctionals (x : E) (f : StrongDual π•œ E) : f ∈ normingFunctionals π•œ x ↔ β€–fβ€– ≀ 1 ∧ f x = (β€–xβ€– : π•œ) := Iff.rfl /-- Hahn-Banach supplies norming functionals, including at zero in the zero space. -/ theorem nonempty_normingFunctionals (x : E) : (normingFunctionals π•œ x).Nonempty := exists_dual_vector'' π•œ x /-- The closed-dual-ball functionals taking value one at every point of a set. -/ def supportFunctionals (F : Set E) : Set (StrongDual π•œ E) := {f | β€–fβ€– ≀ 1 ∧ βˆ€ x ∈ F, f x = 1} @[simp] theorem mem_supportFunctionals (F : Set E) (f : StrongDual π•œ E) : f ∈ supportFunctionals π•œ F ↔ β€–fβ€– ≀ 1 ∧ βˆ€ x ∈ F, f x = 1 := Iff.rfl /-- The norm bound is exactly membership in the closed dual unit ball. -/ theorem supportFunctionals_eq_setOf_mem_closedBall (F : Set E) : supportFunctionals π•œ F = {f : StrongDual π•œ E | f ∈ Metric.closedBall 0 1 ∧ βˆ€ x ∈ F, f x = 1} := by apply Set.ext intro f simp only [mem_supportFunctionals, Set.mem_setOf_eq, mem_closedBall_zero_iff] /-- For a nonempty set, the pointwise support condition is the paper's image equality. Nonemptiness is essential for the converse from a constant-value condition to that equality. -/ theorem mem_supportFunctionals_iff_image_eq (F : Set E) (hF : F.Nonempty) (f : StrongDual π•œ E) : f ∈ supportFunctionals π•œ F ↔ β€–fβ€– ≀ 1 ∧ (f : E β†’ π•œ) '' F = {1} := by constructor Β· intro hf refine ⟨hf.1, ?_⟩ apply Set.ext intro a constructor Β· rintro ⟨x, hx, rfl⟩ exact Set.mem_singleton_iff.2 (hf.2 x hx) Β· intro ha obtain ⟨x, hx⟩ := hF exact ⟨x, hx, (hf.2 x hx).trans (Set.mem_singleton_iff.1 ha).symm⟩ Β· rintro ⟨hf, himage⟩ refine ⟨hf, ?_⟩ intro x hx apply Set.mem_singleton_iff.1 rw [← himage] exact ⟨x, hx, rfl⟩ /-- A supporting functional of a nonempty subset of the closed unit ball has norm one. This does not assert existence of such a functional. -/ theorem norm_eq_one_of_mem_supportFunctionals {F : Set E} (hF : F.Nonempty) (hball : βˆ€ x ∈ F, β€–xβ€– ≀ 1) {f : StrongDual π•œ E} (hf : f ∈ supportFunctionals π•œ F) : β€–fβ€– = 1 := by apply le_antisymm hf.1 obtain ⟨x, hx⟩ := hF calc 1 = β€–f xβ€– := by rw [hf.2 x hx, norm_one] _ ≀ β€–fβ€– * β€–xβ€– := f.le_opNorm x _ ≀ β€–fβ€– * 1 := mul_le_mul_of_nonneg_left (hball x hx) (norm_nonneg f) _ = β€–fβ€– := mul_one _ theorem supportFunctionals_antitone {F G : Set E} (hFG : F βŠ† G) : supportFunctionals π•œ G βŠ† supportFunctionals π•œ F := fun _ hf => ⟨hf.1, fun x hx => hf.2 x (hFG hx)⟩ /-- A unit vector is supported by at least one closed-dual-ball functional. -/ theorem nonempty_supportFunctionals_singleton (x : E) (hx : β€–xβ€– = 1) : (supportFunctionals π•œ {x}).Nonempty := by obtain ⟨f, hf, hfx⟩ := exists_dual_vector'' π•œ x refine ⟨f, hf, ?_⟩ intro y hy have hyx : y = x := Set.mem_singleton_iff.1 hy subst y simpa [hx] using hfx /-- The set-theoretic union of the kernels of all supporting functionals. -/ def supportKernelUnion (F : Set E) : Set E := {x | βˆƒ f ∈ supportFunctionals π•œ F, f x = 0} @[simp] theorem mem_supportKernelUnion (F : Set E) (x : E) : x ∈ supportKernelUnion π•œ F ↔ βˆƒ f ∈ supportFunctionals π•œ F, f x = 0 := Iff.rfl /-- The defining union, written using ordinary inverse images of zero. -/ theorem supportKernelUnion_eq_iUnion (F : Set E) : supportKernelUnion π•œ F = ⋃ f ∈ supportFunctionals π•œ F, (f : E β†’ π•œ) ⁻¹' {0} := by apply Set.ext intro x simp only [mem_supportKernelUnion, Set.mem_iUnion, Set.mem_preimage, Set.mem_singleton_iff, exists_prop] theorem supportKernelUnion_antitone {F G : Set E} (hFG : F βŠ† G) : supportKernelUnion π•œ G βŠ† supportKernelUnion π•œ F := by rintro x ⟨f, hf, hfx⟩ exact ⟨f, supportFunctionals_antitone π•œ hFG hf, hfx⟩ /-- Every point of a nonempty supporting set lies outside the union of kernels. -/ theorem notMem_supportKernelUnion_of_mem {F : Set E} {x : E} (hx : x ∈ F) : x βˆ‰ supportKernelUnion π•œ F := by rintro ⟨f, hf, hfx⟩ exact one_ne_zero ((hf.2 x hx).symm.trans hfx) /-- The hull-kernel admissibility condition needs no existence theorem for support. -/ theorem supportKernelUnion_ne_univ {F : Set E} (hF : F.Nonempty) : supportKernelUnion π•œ F β‰  Set.univ := by intro h obtain ⟨x, hx⟩ := hF apply notMem_supportKernelUnion_of_mem π•œ hx rw [h] exact Set.mem_univ x /-- At zero, membership detects whether the supporting family is nonempty. -/ theorem zero_mem_supportKernelUnion_iff (F : Set E) : (0 : E) ∈ supportKernelUnion π•œ F ↔ (supportFunctionals π•œ F).Nonempty := by constructor Β· rintro ⟨f, hf, _⟩ exact ⟨f, hf⟩ Β· rintro ⟨f, hf⟩ exact ⟨f, hf, f.map_zero⟩ /-- Nonemptiness in `supportKernelUnion_ne_univ` cannot simply be dropped. -/ @[simp] theorem supportKernelUnion_empty : supportKernelUnion π•œ (βˆ… : Set E) = Set.univ := by apply Set.Subset.antisymm (Set.subset_univ _) intro x _ refine ⟨0, ⟨by simp, ?_⟩, ?_⟩ Β· intro y hy exact False.elim hy Β· rfl /-- A singleton-support identity converts the union into one kernel. This theorem does not assert that the supporting family is a singleton. -/ theorem supportKernelUnion_eq_preimage_zero_of_supportFunctionals_eq_singleton (F : Set E) (f : StrongDual π•œ E) (hF : supportFunctionals π•œ F = {f}) : supportKernelUnion π•œ F = (f : E β†’ π•œ) ⁻¹' {0} := by apply Set.ext intro x constructor Β· rintro ⟨g, hg, hgx⟩ rw [hF] at hg have hgf : g = f := Set.mem_singleton_iff.1 hg subst g exact hgx Β· intro hx refine ⟨f, ?_, hx⟩ rw [hF] exact Set.mem_singleton f end NormedSpace