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

Commit f53c776

Browse files
committed
feat(analysis/topology): pi-spaces: topolopgy generation, prove second countability
1 parent da7bbd7 commit f53c776

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

analysis/topology/continuity.lean

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ end quotient
751751

752752
section pi
753753
variables {ι : Type*} {π : ι → Type*}
754+
open topological_space
754755

755756
lemma continuous_pi [topological_space α] [∀i, topological_space (π i)] {f : α → Πi:ι, π i}
756757
(h : ∀i, continuous (λa, f a i)) : continuous f :=
@@ -780,6 +781,73 @@ begin
780781
⟨a, assume i, (ha i).left, assume i, map_le_iff_le_comap.mp $ (ha i).right⟩
781782
end
782783

784+
lemma is_open_set_pi [∀a, topological_space (π a)] {i : set ι} {s : Πa, set (π a)}
785+
(hi : finite i) (hs : ∀a∈i, is_open (s a)) : is_open (pi i s) :=
786+
by rw [pi_def]; exact (is_open_bInter hi $ assume a ha, continuous_apply a _ $ hs a ha)
787+
788+
lemma pi_eq_generate_from [∀a, topological_space (π a)] :
789+
Pi.topological_space =
790+
generate_from {g | ∃(s:Πa, set (π a)) (i : finset ι), (∀a∈i, is_open (s a)) ∧ g = pi ↑i s} :=
791+
le_antisymm
792+
(supr_le $ assume a s ⟨t, ht, s_eq⟩, generate_open.basic _ $
793+
⟨function.update (λa, univ) a t, {a}, by simpa using ht, by ext f; simp [s_eq, pi]⟩)
794+
(generate_from_le $ assume g ⟨s, i, hi, eq⟩, eq.symm ▸ is_open_set_pi (finset.finite_to_set _) hi)
795+
796+
lemma pi_generate_from_eq {g : Πa, set (set (π a))} :
797+
@Pi.topological_space ι π (λa, generate_from (g a)) =
798+
generate_from {t | ∃(s:Πa, set (π a)) (i : finset ι), (∀a∈i, s a ∈ g a) ∧ t = pi ↑i s} :=
799+
let G := {t | ∃(s:Πa, set (π a)) (i : finset ι), (∀a∈i, s a ∈ g a) ∧ t = pi ↑i s} in
800+
begin
801+
rw [pi_eq_generate_from],
802+
refine le_antisymm (generate_from_le _) (generate_from_mono _),
803+
{ rintros s ⟨t, i, hi, rfl⟩,
804+
rw [pi_def],
805+
apply is_open_bInter (finset.finite_to_set _),
806+
assume a ha, show ((generate_from G).coinduced (λf:Πa, π a, f a)).is_open (t a),
807+
refine generate_from_le _ _ (hi a ha),
808+
exact assume s hs, generate_open.basic _ ⟨function.update (λa, univ) a s, {a}, by simp [hs]⟩ },
809+
exact assume s ⟨t, i, ht, eq⟩, ⟨t, i, assume a ha, generate_open.basic _ (ht a ha), eq⟩
810+
end
811+
812+
lemma pi_generate_from_eq_fintype {g : Πa, set (set (π a))} [fintype ι] (hg : ∀a, ⋃₀ g a = univ) :
813+
@Pi.topological_space ι π (λa, generate_from (g a)) =
814+
generate_from {t | ∃(s:Πa, set (π a)), (∀a, s a ∈ g a) ∧ t = pi univ s} :=
815+
let G := {t | ∃(s:Πa, set (π a)), (∀a, s a ∈ g a) ∧ t = pi univ s} in
816+
begin
817+
rw [pi_generate_from_eq],
818+
refine le_antisymm (generate_from_le _) (generate_from_mono _),
819+
{ rintros s ⟨t, i, ht, rfl⟩,
820+
apply is_open_iff_forall_mem_open.2 _,
821+
assume f hf,
822+
have : ∀a, ∃s, s ∈ g a ∧ f a ∈ s,
823+
{ assume a, have : f a ∈ ⋃₀ g a, { rw [hg], apply mem_univ }, simpa },
824+
rcases classical.axiom_of_choice this with ⟨c, hc⟩,
825+
refine ⟨pi univ (λa, if a ∈ i then t a else (c : Πa, set (π a)) a), _, _, _⟩,
826+
{ simp [pi_if] },
827+
{ refine generate_open.basic _ ⟨_, assume a, _, rfl⟩,
828+
by_cases a ∈ i; simp [*, pi] at * },
829+
{ have : f ∈ pi {a | a ∉ i} c, { simp [*, pi] at * },
830+
simpa [pi_if, hf] } },
831+
exact assume s ⟨t, ht, eq⟩, ⟨t, finset.univ, by simp [ht, eq]⟩
832+
end
833+
834+
instance second_countable_topology_fintype
835+
[fintype ι] [t : ∀a, topological_space (π a)] [sc : ∀a, second_countable_topology (π a)] :
836+
second_countable_topology (∀a, π a) :=
837+
have ∀i, ∃b : set (set (π i)), countable b ∧ ∅ ∉ b ∧ is_topological_basis b, from
838+
assume a, @is_open_generated_countable_inter (π a) _ (sc a),
839+
let ⟨g, hg⟩ := classical.axiom_of_choice this in
840+
have t = (λa, generate_from (g a)), from funext $ assume a, (hg a).2.2.2.2,
841+
begin
842+
constructor,
843+
refine ⟨pi univ '' pi univ g, countable_image _ _, _⟩,
844+
{ suffices : countable {f : Πa, set (π a) | ∀a, f a ∈ g a}, { simpa [pi] },
845+
exact countable_pi (assume i, (hg i).1), },
846+
rw [this, pi_generate_from_eq_fintype],
847+
{ congr' 1, ext f, simp [pi, eq_comm] },
848+
exact assume a, (hg a).2.2.2.1
849+
end
850+
783851
end pi
784852

785853
-- TODO: use embeddings from above!

analysis/topology/topological_space.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,10 @@ def gi_generate_from (α : Type*) :
805805
(subset.antisymm hg $ generate_from_le_iff_subset_is_open.1 $ le_refl _),
806806
choice_eq := assume s hs, mk_of_closure_sets }
807807

808+
lemma generate_from_mono {α} {g₁ g₂ : set (set α)} (h : g₁ ⊆ g₂) :
809+
topological_space.generate_from g₁ ≤ topological_space.generate_from g₂ :=
810+
(gi_generate_from _).gc.monotone_l h
811+
808812
instance {α : Type u} : complete_lattice (topological_space α) :=
809813
(gi_generate_from α).lift_complete_lattice
810814

0 commit comments

Comments
 (0)