|
| 1 | +/- |
| 2 | +Copyright (c) 2022 Yaël Dillies. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Yaël Dillies |
| 5 | +-/ |
| 6 | +import topology.continuous_function.basic |
| 7 | + |
| 8 | +/-! |
| 9 | +# Spectral maps |
| 10 | +
|
| 11 | +This file defines spectral maps. A map is spectral when it's continuous and the preimage of a |
| 12 | +compact open set is compact open. |
| 13 | +
|
| 14 | +## Main declarations |
| 15 | +
|
| 16 | +* `is_spectral_map`: Predicate for a map to be spectral. |
| 17 | +* `spectral_map`: Bundled spectral maps. |
| 18 | +* `spectral_map_class`: Typeclass for a type to be a type of spectral maps. |
| 19 | +
|
| 20 | +## TODO |
| 21 | +
|
| 22 | +Once we have `spectral_space`, `is_spectral_map` should move to `topology.spectral.basic`. |
| 23 | +-/ |
| 24 | + |
| 25 | +open function order_dual |
| 26 | + |
| 27 | +variables {F α β γ δ : Type*} |
| 28 | + |
| 29 | +section unbundled |
| 30 | +variables [topological_space α] [topological_space β] [topological_space γ] {f : α → β} {s : set β} |
| 31 | + |
| 32 | +/-- A function between topological spaces is spectral if it is continuous and the preimage of every |
| 33 | +compact open set is compact open. -/ |
| 34 | +structure is_spectral_map (f : α → β) extends continuous f : Prop := |
| 35 | +(compact_preimage_of_open ⦃s : set β⦄ : is_open s → is_compact s → is_compact (f ⁻¹' s)) |
| 36 | + |
| 37 | +lemma is_compact.preimage_of_open (hf : is_spectral_map f) (h₀ : is_compact s) (h₁ : is_open s) : |
| 38 | + is_compact (f ⁻¹' s) := |
| 39 | +hf.compact_preimage_of_open h₁ h₀ |
| 40 | + |
| 41 | +lemma is_spectral_map.continuous {f : α → β} (hf : is_spectral_map f) : continuous f := |
| 42 | +hf.to_continuous |
| 43 | + |
| 44 | +lemma is_spectral_map_id : is_spectral_map (@id α) := ⟨continuous_id, λ s _, id⟩ |
| 45 | + |
| 46 | +lemma is_spectral_map.comp {f : β → γ} {g : α → β} (hf : is_spectral_map f) |
| 47 | + (hg : is_spectral_map g) : |
| 48 | + is_spectral_map (f ∘ g) := |
| 49 | +⟨hf.continuous.comp hg.continuous, |
| 50 | + λ s hs₀ hs₁, (hs₁.preimage_of_open hf hs₀).preimage_of_open hg (hs₀.preimage hf.continuous)⟩ |
| 51 | + |
| 52 | +end unbundled |
| 53 | + |
| 54 | +/-- The type of spectral maps from `α` to `β`. -/ |
| 55 | +structure spectral_map (α β : Type*) [topological_space α] [topological_space β] := |
| 56 | +(to_fun : α → β) |
| 57 | +(spectral' : is_spectral_map to_fun) |
| 58 | + |
| 59 | +/-- `spectral_map_class F α β` states that `F` is a type of spectral maps. |
| 60 | +
|
| 61 | +You should extend this class when you extend `spectral_map`. -/ |
| 62 | +class spectral_map_class (F : Type*) (α β : out_param $ Type*) [topological_space α] |
| 63 | + [topological_space β] |
| 64 | + extends fun_like F α (λ _, β) := |
| 65 | +(map_spectral (f : F) : is_spectral_map f) |
| 66 | + |
| 67 | +export spectral_map_class (map_spectral) |
| 68 | + |
| 69 | +attribute [simp] map_spectral |
| 70 | + |
| 71 | +@[priority 100] -- See note [lower instance priority] |
| 72 | +instance spectral_map_class.to_continuous_map_class [topological_space α] [topological_space β] |
| 73 | + [spectral_map_class F α β] : |
| 74 | + continuous_map_class F α β := |
| 75 | +⟨λ f, (map_spectral f).continuous⟩ |
| 76 | + |
| 77 | +instance [topological_space α] [topological_space β] [spectral_map_class F α β] : |
| 78 | + has_coe_t F (spectral_map α β) := |
| 79 | +⟨λ f, ⟨_, map_spectral f⟩⟩ |
| 80 | + |
| 81 | +/-! ### Spectral maps -/ |
| 82 | + |
| 83 | +namespace spectral_map |
| 84 | +variables [topological_space α] [topological_space β] [topological_space γ] [topological_space δ] |
| 85 | + |
| 86 | +/-- Reinterpret a `spectral_map` as a `continuous_map`. -/ |
| 87 | +def to_continuous_map (f : spectral_map α β) : continuous_map α β := ⟨_, f.spectral'.continuous⟩ |
| 88 | + |
| 89 | +instance : spectral_map_class (spectral_map α β) α β := |
| 90 | +{ coe := spectral_map.to_fun, |
| 91 | + coe_injective' := λ f g h, by { cases f, cases g, congr' }, |
| 92 | + map_spectral := λ f, f.spectral' } |
| 93 | + |
| 94 | +/-- Helper instance for when there's too many metavariables to apply `fun_like.has_coe_to_fun` |
| 95 | +directly. -/ |
| 96 | +instance : has_coe_to_fun (spectral_map α β) (λ _, α → β) := fun_like.has_coe_to_fun |
| 97 | + |
| 98 | +@[simp] lemma to_fun_eq_coe {f : spectral_map α β} : f.to_fun = (f : α → β) := rfl |
| 99 | + |
| 100 | +@[ext] lemma ext {f g : spectral_map α β} (h : ∀ a, f a = g a) : f = g := fun_like.ext f g h |
| 101 | + |
| 102 | +/-- Copy of a `spectral_map` with a new `to_fun` equal to the old one. Useful to fix definitional |
| 103 | +equalities. -/ |
| 104 | +protected def copy (f : spectral_map α β) (f' : α → β) (h : f' = f) : spectral_map α β := |
| 105 | +⟨f', h.symm.subst f.spectral'⟩ |
| 106 | + |
| 107 | +variables (α) |
| 108 | + |
| 109 | +/-- `id` as a `spectral_map`. -/ |
| 110 | +protected def id : spectral_map α α := ⟨id, is_spectral_map_id⟩ |
| 111 | + |
| 112 | +instance : inhabited (spectral_map α α) := ⟨spectral_map.id α⟩ |
| 113 | + |
| 114 | +@[simp] lemma coe_id : ⇑(spectral_map.id α) = id := rfl |
| 115 | + |
| 116 | +variables {α} |
| 117 | + |
| 118 | +@[simp] lemma id_apply (a : α) : spectral_map.id α a = a := rfl |
| 119 | + |
| 120 | +/-- Composition of `spectral_map`s as a `spectral_map`. -/ |
| 121 | +def comp (f : spectral_map β γ) (g : spectral_map α β) : spectral_map α γ := |
| 122 | +⟨f.to_continuous_map.comp g.to_continuous_map, f.spectral'.comp g.spectral'⟩ |
| 123 | + |
| 124 | +@[simp] lemma coe_comp (f : spectral_map β γ) (g : spectral_map α β) : (f.comp g : α → γ) = f ∘ g := |
| 125 | +rfl |
| 126 | +@[simp] lemma comp_apply (f : spectral_map β γ) (g : spectral_map α β) (a : α) : |
| 127 | + (f.comp g) a = f (g a) := rfl |
| 128 | +@[simp] lemma coe_comp_continuous_map (f : spectral_map β γ) (g : spectral_map α β) : |
| 129 | + (f.comp g : continuous_map α γ) = (f : continuous_map β γ).comp g := rfl |
| 130 | +@[simp] lemma comp_assoc (f : spectral_map γ δ) (g : spectral_map β γ) (h : spectral_map α β) : |
| 131 | + (f.comp g).comp h = f.comp (g.comp h) := rfl |
| 132 | +@[simp] lemma comp_id (f : spectral_map α β) : f.comp (spectral_map.id α) = f := |
| 133 | +ext $ λ a, rfl |
| 134 | +@[simp] lemma id_comp (f : spectral_map α β) : (spectral_map.id β).comp f = f := |
| 135 | +ext $ λ a, rfl |
| 136 | + |
| 137 | +lemma cancel_right {g₁ g₂ : spectral_map β γ} {f : spectral_map α β} (hf : surjective f) : |
| 138 | + g₁.comp f = g₂.comp f ↔ g₁ = g₂ := |
| 139 | +⟨λ h, ext $ hf.forall.2 $ fun_like.ext_iff.1 h, congr_arg _⟩ |
| 140 | + |
| 141 | +lemma cancel_left {g : spectral_map β γ} {f₁ f₂ : spectral_map α β} (hg : injective g) : |
| 142 | + g.comp f₁ = g.comp f₂ ↔ f₁ = f₂ := |
| 143 | +⟨λ h, ext $ λ a, hg $ by rw [←comp_apply, h, comp_apply], congr_arg _⟩ |
| 144 | + |
| 145 | +end spectral_map |
0 commit comments