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

Commit dae1dfe

Browse files
committed
feat(topology/spectral/hom): Spectral maps (#12228)
Define spectral maps in three ways: * `is_spectral_map`, the unbundled predicate * `spectral_map`, the bundled type * `spectral_map_class`, the hom class The design for `is_spectral_map` matches `continuous`. The design for `spectral_map` and `spectral_map_class` follows the hom refactor.
1 parent f2fdef6 commit dae1dfe

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed

src/topology/spectral/hom.lean

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
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

Comments
 (0)