Prove that UltrafilterInBasis is a sufficient condition for convergence

laurent-lost-commits
Shad Amethyst 10 months ago
parent 431a2931d7
commit 5fb9162950

@ -280,6 +280,14 @@ by
rw [Set.nonempty_coe_sort] rw [Set.nonempty_coe_sort]
exact Filter.InBasis.basis_nonempty F_basis exact Filter.InBasis.basis_nonempty F_basis
theorem Filter.InBasis.principal {S : Set α} (S_in_B : S ∈ B) :
(Filter.principal S).InBasis B :=
by
intro T
simp only [mem_principal]
intro T_in_pS
use S
theorem Filter.InBasis.basis_hasBasis (F_basis : Filter.InBasis F B): theorem Filter.InBasis.basis_hasBasis (F_basis : Filter.InBasis F B):
F.HasBasis (fun S => S ∈ Filter.InBasis.basis F B) id := F.HasBasis (fun S => S ∈ Filter.InBasis.basis F B) id :=
by by
@ -913,6 +921,10 @@ instance : CoeOut (@UltrafilterInBasis α B) (Filter α) where
instance : Membership (Set α) (UltrafilterInBasis B) where instance : Membership (Set α) (UltrafilterInBasis B) where
mem := fun s U => s ∈ U.filter mem := fun s U => s ∈ U.filter
@[simp]
theorem UltrafilterInBasis.mem_coe (U : UltrafilterInBasis B) (S : Set α):
S ∈ U.filter ↔ S ∈ U := by rfl
instance (U : UltrafilterInBasis B): Filter.NeBot (U.filter) where instance (U : UltrafilterInBasis B): Filter.NeBot (U.filter) where
ne' := U.ne_bot.ne ne' := U.ne_bot.ne
@ -965,13 +977,19 @@ by
theorem UltrafilterInBasis.coe_in_basis (U : UltrafilterInBasis B) : Filter.InBasis U B := U.in_basis theorem UltrafilterInBasis.coe_in_basis (U : UltrafilterInBasis B) : Filter.InBasis U B := U.in_basis
theorem UltrafilterInBasis.map_basis_ultra [Nonempty α] {β : Type _} theorem UltrafilterInBasis.map_basis_ultra {β : Type _}
(empty_notin_B : ∅ ∉ B) (empty_notin_B : ∅ ∉ B)
(map : OrderIsoOn (Set α) (Set β) B) (map : OrderIsoOn (Set α) (Set β) B)
(U : UltrafilterInBasis B) : (U : UltrafilterInBasis B) :
∀ (F : Filter β), F.InBasis (map.toFun '' B) → F.NeBot → ∀ (F : Filter β), F.InBasis (map.toFun '' B) → F.NeBot →
F ≤ Filter.InBasis.map_basis U B map → Filter.InBasis.map_basis U B map ≤ F := F ≤ Filter.InBasis.map_basis U B map → Filter.InBasis.map_basis U B map ≤ F :=
by by
have α_nonempty: Nonempty α := by
by_contra α_trivial
rw [not_nonempty_iff] at α_trivial
apply U.ne_bot.ne
exact Filter.filter_eq_bot_of_isEmpty U.filter
intro F F_in_basis F_neBot F_le_map intro F F_in_basis F_neBot F_le_map
intro S S_in_F intro S S_in_F
@ -1003,7 +1021,7 @@ by
· rw [map.rightInv_on T T_in_mB] · rw [map.rightInv_on T T_in_mB]
exact T_ss_S exact T_ss_S
def UltrafilterInBasis.map_basis [Nonempty α] {β : Type _} [Nonempty β] def UltrafilterInBasis.map_basis {β : Type _}
(empty_notin_B : ∅ ∉ B) (empty_notin_B : ∅ ∉ B)
(map : OrderIsoOn (Set α) (Set β) B) (map : OrderIsoOn (Set α) (Set β) B)
(empty_notin_mB : ∅ ∉ map.toFun '' B) (empty_notin_mB : ∅ ∉ map.toFun '' B)
@ -1011,16 +1029,102 @@ def UltrafilterInBasis.map_basis [Nonempty α] {β : Type _} [Nonempty β]
UltrafilterInBasis (map.toFun '' B) UltrafilterInBasis (map.toFun '' B)
where where
filter := Filter.InBasis.map_basis U.filter B map.toFun filter := Filter.InBasis.map_basis U.filter B map.toFun
in_basis := Filter.InBasis.map_basis_inBasis' map U.in_basis in_basis := U.in_basis.map_basis_inBasis' map
ne_bot := by ne_bot := by
have β_nonempty : Nonempty β := by
by_contra β_trivial
rw [not_nonempty_iff] at β_trivial
apply empty_notin_mB
rw [Subsingleton.mem_iff_nonempty]
simp
let ⟨T, _, T_in_B, _⟩ := U.in_basis _ (Filter.univ_mem)
use T
apply Filter.InBasis.map_basis_neBot_of_neBot U.in_basis _ map.toFun_doubleMonotone.monotoneOn apply Filter.InBasis.map_basis_neBot_of_neBot U.in_basis _ map.toFun_doubleMonotone.monotoneOn
intro S S_in_B _ intro S S_in_B _
by_contra empty by_contra empty
rw [Set.not_nonempty_iff_eq_empty] at empty rw [Set.not_nonempty_iff_eq_empty] at empty
apply empty_notin_mB apply empty_notin_mB
use S use S
ultra := by ultra := U.map_basis_ultra empty_notin_B map
apply map_basis_ultra
exact empty_notin_B /-
theorem compl_not_mem_iff : sᶜ ∉ f ↔ s ∈ f :=
⟨fun hsc =>
le_principal_iff.1 <|
f.le_of_inf_neBot ⟨fun h => hsc <| mem_of_eq_bot <| by rwa [compl_compl]⟩,
compl_not_mem⟩
-/
theorem UltrafilterInBasis.unique (U : UltrafilterInBasis B) {F : Filter α} [Filter.NeBot F] (F_in_basis : F.InBasis B) :
F ≤ U.filter → U.filter = F :=
by
intro F_le_U
apply le_antisymm
apply U.ultra
all_goals assumption
-- TODO: show that clusterpt iff le nhds if B is a topological basis theorem UltrafilterInBasis.le_of_inf_neBot (U : UltrafilterInBasis B)
(B_closed : ∀ (b1 b2 : Set α), b1 ∈ B → b2 ∈ B → Set.Nonempty (b1 ∩ b2) → b1 ∩ b2 ∈ B)
{F : Filter α} (F_in_basis : F.InBasis B)
(inf_neBot : Filter.NeBot (U.filter ⊓ F)) : U.filter ≤ F :=
by
apply le_of_inf_eq
symm
apply U.unique
· exact Filter.InBasis.inf B_closed U.in_basis F_in_basis inf_neBot
· exact inf_le_left
theorem UltrafilterInBasis.mem_of_compl_not_mem (U : UltrafilterInBasis B)
(B_closed : ∀ (b1 b2 : Set α), b1 ∈ B → b2 ∈ B → Set.Nonempty (b1 ∩ b2) → b1 ∩ b2 ∈ B)
{S : Set α} (S_in_B : S ∈ B):
Sᶜ ∉ U → S ∈ U :=
by
intro sc_notin_U
rw [<-mem_coe, <-Filter.le_principal_iff]
apply le_of_inf_neBot U B_closed
· exact Filter.InBasis.principal S_in_B
· constructor
intro eq_bot
apply sc_notin_U
apply Filter.mem_of_eq_bot
rwa [compl_compl]
theorem UltrafilterInBasis.mem_or_compl_mem (U : UltrafilterInBasis B)
(B_closed : ∀ (b1 b2 : Set α), b1 ∈ B → b2 ∈ B → Set.Nonempty (b1 ∩ b2) → b1 ∩ b2 ∈ B)
{S : Set α} (S_in_B : S ∈ B):
Sᶜ ∈ U S ∈ U :=
by
by_cases S_in_U? : S ∈ U
right; exact S_in_U?
left
by_contra Sc_notin_U
apply (U.mem_of_compl_not_mem B_closed S_in_B) at Sc_notin_U
exact S_in_U? Sc_notin_U
theorem UltrafilterInBasis.clusterPt_iff_le_nhds [TopologicalSpace α]
(U : UltrafilterInBasis B)
(B_basis : TopologicalSpace.IsTopologicalBasis B)
(B_closed : ∀ (b1 b2 : Set α), b1 ∈ B → b2 ∈ B → Set.Nonempty (b1 ∩ b2) → b1 ∩ b2 ∈ B)
(p : α) :
ClusterPt p U.filter ↔ U.filter ≤ nhds p :=
by
constructor
swap
exact fun h => ClusterPt.of_le_nhds h
intro p_clusterPt
intro S S_in_nhds
let ⟨T, T_in_B, p_in_T, T_ss_S⟩ := B_basis.mem_nhds_iff.mp S_in_nhds
have T_in_nhds : T ∈ nhds p := by
rw [B_basis.mem_nhds_iff]
use T
apply Filter.mem_of_superset _ T_ss_S
cases U.mem_or_compl_mem B_closed T_in_B with
| inr res => exact res
| inl Tc_in_U =>
exfalso
rw [clusterPt_iff] at p_clusterPt
specialize p_clusterPt T_in_nhds Tc_in_U
rw [Set.inter_compl_self] at p_clusterPt
exact Set.not_nonempty_empty p_clusterPt

Loading…
Cancel
Save