{-# OPTIONS --allow-unsolved-metas #-} open import Level open import Ordinals module Tychonoff {n : Level } (O : Ordinals {n}) where open import zf open import logic open _∧_ open _∨_ open Bool import OD open import Relation.Nullary open import Data.Empty open import Relation.Binary.Core open import Relation.Binary.Definitions open import Relation.Binary.PropositionalEquality import BAlgebra open BAlgebra O open inOrdinal O open OD O open OD.OD open ODAxiom odAxiom import OrdUtil import ODUtil open Ordinals.Ordinals O open Ordinals.IsOrdinals isOrdinal open Ordinals.IsNext isNext open OrdUtil O open ODUtil O import ODC open ODC O open import filter O open import OPair O open import Topology O open import maximum-filter O open Filter open Topology -- FIP is UFL -- filter Base record FBase (P : HOD ) (X : Ordinal ) (u : Ordinal) : Set n where field b x : Ordinal b⊆X : * b ⊆ * X sb : Subbase (* b) x u⊆P : * u ⊆ P x⊆u : * x ⊆ * u record UFLP {P : HOD} (TP : Topology P) (F : Filter {Power P} {P} (λ x → x) ) (ultra : ultra-filter F ) : Set (suc (suc n)) where field limit : Ordinal P∋limit : odef P limit is-limit : {v : Ordinal} → Neighbor TP limit v → filter F ∋ (* v) UFLP→FIP : {P : HOD} (TP : Topology P) → ((F : Filter {Power P} {P} (λ x → x) ) (UF : ultra-filter F ) → UFLP TP F UF ) → FIP TP UFLP→FIP {P} TP uflp with trio< (& P) o∅ ... | tri< a ¬b ¬c = ⊥-elim ( ¬x<0 a ) ... | tri≈ ¬a P=0 ¬c = record { limit = λ CX fip → o∅ ; is-limit = fip03 } where -- P is empty fip02 : {x : Ordinal } → ¬ odef P x fip02 {x} Px = ⊥-elim ( o<¬≡ (sym P=0) (∈∅< Px) ) fip03 : {X : Ordinal} (CX : * X ⊆ CS TP) (fip : {x : Ordinal} → Subbase (* X) x → o∅ o< x) {x : Ordinal} → odef (* X) x → odef (* x) o∅ -- empty P case -- if 0 < X then 0 < x ∧ P ∋ xfrom fip -- if 0 ≡ X then ¬ odef X x fip03 {X} CX fip {x} xx with trio< o∅ X ... | tri< 0 ¬a ¬b c = ⊥-elim ( ¬x<0 c ) ... | tri> ¬a ¬b 0

x≤0 (fip (fp00 _ _ b⊆X sb)) where x≤0 : x o< osuc o∅ x≤0 = subst₂ (λ j k → j o< osuc k) &iso (trans (cong (&) *iso) ord-od∅ ) (⊆→o≤ (x⊆u)) fp00 : (b x : Ordinal) → * b ⊆ * X → Subbase (* b) x → Subbase (* X) x fp00 b y b ¬a ¬b c = ⊥-elim ( ¬x<0 c ) -- -- the limit is an limit of entire elements of X -- uf01 : {X : Ordinal} (CSX : * X ⊆ CS TP) (fp : fip {X} CSX) {x : Ordinal} → odef (* X) x → odef (* x) (limit CSX fp) uf01 {X} CSX fp {x} xx with trio< o∅ X ... | tri> ¬a ¬b c = ⊥-elim ( ¬x<0 c ) ... | tri≈ ¬a 0=X ¬c = ⊥-elim ( ¬a (subst (λ k → o∅ o< k) &iso ( ∈∅< xx ))) ... | tri< 0 ¬a ¬b c = ⊥-elim (¬x<0 c) -- -- take closure of given filter elements -- CF : HOD CF = Replace (filter F) (λ x → Cl TP x ) CF⊆CS : CF ⊆ CS TP CF⊆CS {x} record { z = z ; az = az ; x=ψz = x=ψz } = subst (λ k → odef (CS TP) k) (sym x=ψz) (CS∋Cl TP (* z)) -- -- it is set of closed set and has FIP ( F is proper ) -- ufl08 : {z : Ordinal} → odef (Power P) (& (Cl TP (* z))) ufl08 {z} w zw with subst (λ k → odef k w ) *iso zw ... | t = proj1 t fx→px : {x : Ordinal} → odef (filter F) x → Power P ∋ * x fx→px {x} fx z xz = f⊆L F fx _ (subst (λ k → odef k z) *iso xz ) F∋sb : {x : Ordinal} → Subbase CF x → odef (filter F) x F∋sb {x} (gi record { z = z ; az = az ; x=ψz = x=ψz }) = ufl07 where ufl09 : * z ⊆ P ufl09 {y} zy = f⊆L F az _ zy ufl07 : odef (filter F) x ufl07 = subst (λ k → odef (filter F) k) &iso ( filter1 F (subst (λ k → odef (Power P) k) (trans (sym x=ψz) (sym &iso)) ufl08 ) (subst (λ k → odef (filter F) k) (sym &iso) az) (subst (λ k → * z ⊆ k ) (trans (sym *iso) (sym (cong (*) x=ψz)) ) (x⊆Clx TP {* z} ufl09 ) )) F∋sb (g∩ {x} {y} sx sy) = filter2 F (subst (λ k → odef (filter F) k) (sym &iso) (F∋sb sx)) (subst (λ k → odef (filter F) k) (sym &iso) (F∋sb sy)) (λ z xz → fx→px (F∋sb sx) _ (subst (λ k → odef k _) (sym *iso) (proj1 (subst (λ k → odef k z) *iso xz) ))) ufl01 : {x : Ordinal} → Subbase (* (& CF)) x → o∅ o< x ufl01 {x} sb = ufl04 where ufl04 : o∅ o< x ufl04 with trio< o∅ x ... | tri< a ¬b ¬c = a ... | tri≈ ¬a b ¬c = ⊥-elim ( ultra-filter.proper UF (subst (λ k → odef (filter F) k) ( begin x ≡⟨ sym b ⟩ o∅ ≡⟨ sym ord-od∅ ⟩ & od∅ ∎ ) (F∋sb (subst (λ k → Subbase k x) *iso sb )) )) where open ≡-Reasoning ... | tri> ¬a ¬b c = ⊥-elim (¬x<0 c) ufl10 : odef P (FIP.limit fip (subst (λ k → k ⊆ CS TP) (sym *iso) CF⊆CS) ufl01) ufl10 = FIP.L∋limit fip (subst (λ k → k ⊆ CS TP) (sym *iso) CF⊆CS) ufl01 {& P} ufl11 where ufl11 : odef (* (& CF)) (& P) ufl11 = subst (λ k → odef k (& P)) (sym *iso) record { z = _ ; az = F∋P ; x=ψz = sym (cong (&) (trans (cong (Cl TP) *iso) (ClL TP))) } -- -- so we have a limit -- limit : Ordinal limit = FIP.limit fip (subst (λ k → k ⊆ CS TP) (sym *iso) CF⊆CS) ufl01 ufl02 : {y : Ordinal } → odef (* (& CF)) y → odef (* y) limit ufl02 = FIP.is-limit fip (subst (λ k → k ⊆ CS TP) (sym *iso) CF⊆CS) ufl01 -- -- Neigbor of limit ⊆ Filter -- -- if odef (* X) x, Cl TP x contains limit (ufl02) -- in (nei : Neighbor TP limit v) , there is an open Set u which contains the limit -- F contains u or P \ u because F is ultra -- if F ∋ u, then F ∋ v from u ⊆ v which is a propetery of Neighbor -- if F ∋ P \ u, it is a closed set (Cl (P \ u) ≡ P \ u) and it does not contains the limit -- this contradicts ufl02 pp : {v : Ordinal} → (nei : Neighbor TP limit v ) → Power P ∋ (* (Neighbor.u nei)) pp {v} record { u = u ; ou = ou ; ux = ux ; v⊆P = v⊆P ; u⊆v = u⊆v } z pz = os⊆L TP (subst (λ k → odef (OS TP) k) (sym &iso) ou ) (subst (λ k → odef k z) *iso pz ) ufl00 : {v : Ordinal} → Neighbor TP limit v → filter F ∋ * v ufl00 {v} nei with ultra-filter.ultra UF (pp nei ) (NEG P (pp nei )) ... | case1 fu = subst (λ k → odef (filter F) k) &iso ( filter1 F (subst (λ k → odef (Power P) k ) (sym &iso) px) fu (subst (λ k → u ⊆ k ) (sym *iso) (Neighbor.u⊆v nei))) where u = * (Neighbor.u nei) px : Power P ∋ * v px z vz = Neighbor.v⊆P nei (subst (λ k → odef k z) *iso vz ) ... | case2 nfu = ⊥-elim ( ¬P\u∋limit P\u∋limit ) where u = * (Neighbor.u nei) P\u : HOD P\u = P \ u P\u∋limit : odef P\u limit P\u∋limit = subst (λ k → odef k limit) *iso ( ufl02 (subst (λ k → odef k (& P\u)) (sym *iso) ufl03 )) where ufl04 : & P\u ≡ & (Cl TP (* (& P\u))) ufl04 = cong (&) (sym (trans (cong (Cl TP) *iso) (CS∋x→Clx=x TP (P\OS=CS TP (subst (λ k → odef (OS TP) k) (sym &iso) (Neighbor.ou nei) ))))) ufl03 : odef CF (& P\u ) ufl03 = record { z = _ ; az = nfu ; x=ψz = ufl04 } ¬P\u∋limit : ¬ odef P\u limit ¬P\u∋limit ⟪ Pl , nul ⟫ = nul ( Neighbor.ux nei ) -- product topology of compact topology is compact Tychonoff : {P Q : HOD } → (TP : Topology P) → (TQ : Topology Q) → Compact TP → Compact TQ → Compact (ProductTopology TP TQ) Tychonoff {P} {Q} TP TQ CP CQ = FIP→Compact (ProductTopology TP TQ) (UFLP→FIP (ProductTopology TP TQ) uflPQ ) where uflP : (F : Filter {Power P} {P} (λ x → x)) (UF : ultra-filter F) → UFLP TP F UF uflP F UF = FIP→UFLP TP (Compact→FIP TP CP) F UF uflQ : (F : Filter {Power Q} {Q} (λ x → x)) (UF : ultra-filter F) → UFLP TQ F UF uflQ F UF = FIP→UFLP TQ (Compact→FIP TQ CQ) F UF -- Product of UFL has a limit point uflPQ : (F : Filter {Power (ZFP P Q)} {ZFP P Q} (λ x → x)) (UF : ultra-filter F) → UFLP (ProductTopology TP TQ) F UF uflPQ F UF = record { limit = & < * ( UFLP.limit uflp ) , * ( UFLP.limit uflq ) > ; P∋limit = Pf ; is-limit = isL } where FP : Filter {Power P} {P} (λ x → x) FP = record { filter = Proj1 (filter F) (Power P) (Power Q) ; f⊆L = ty00 ; filter1 = ? ; filter2 = ? } where ty00 : Proj1 (filter F) (Power P) (Power Q) ⊆ Power P ty00 {x} ⟪ PPx , ppf ⟫ = PPx UFP : ultra-filter FP UFP = record { proper = ? ; ultra = ? } uflp : UFLP TP FP UFP uflp = FIP→UFLP TP (Compact→FIP TP CP) FP UFP FQ : Filter {Power Q} {Q} (λ x → x) FQ = record { filter = Proj2 (filter F) (Power P) (Power Q) ; f⊆L = ty00 ; filter1 = ? ; filter2 = ? } where ty00 : Proj2 (filter F) (Power P) (Power Q) ⊆ Power Q ty00 {x} ⟪ QPx , ppf ⟫ = QPx UFQ : ultra-filter FQ UFQ = record { proper = ? ; ultra = ? } uflq : UFLP TQ FQ UFQ uflq = FIP→UFLP TQ (Compact→FIP TQ CQ) FQ UFQ Pf : odef (ZFP P Q) (& < * (UFLP.limit uflp) , * (UFLP.limit uflq) >) Pf = ? pq⊆F : {p q : HOD} → Neighbor TP (& p) (UFLP.limit uflp) → Neighbor TP (& q) (UFLP.limit uflq) → ? ⊆ filter F pq⊆F = ? isL : {v : Ordinal} → Neighbor (ProductTopology TP TQ) (& < * (UFLP.limit uflp) , * (UFLP.limit uflq) >) v → filter F ∋ * v isL {v} npq = ? where bpq : Base (ZFP P Q) (pbase TP TQ) (Neighbor.u npq) (& < * (UFLP.limit uflp) , * (UFLP.limit uflq) >) bpq = Neighbor.ou npq (Neighbor.ux npq) pqb : Subbase (pbase TP TQ) (Base.b bpq ) pqb = Base.sb bpq pqb⊆opq : * (Base.b bpq) ⊆ * ( Neighbor.u npq ) pqb⊆opq = Base.b⊆u bpq base⊆F : {b : Ordinal } → Subbase (pbase TP TQ) b → * b ⊆ * (Neighbor.u npq) → * b ⊆ filter F base⊆F (gi (case1 px)) b⊆u {z} bz = fz where -- F contains no od∅, because it projection contains no od∅ -- x is an element of BaseP, which is a subset of Neighbor npq -- x is also an elment of Proj1 F because Proj1 F has UFLP (uflp) -- BaseP ∩ F is not empty -- (Base P ∩ F) ⊆ F , (Base P ) ⊆ F , il1 : odef (Power P) z ∧ ZProj1 (filter F) z il1 = ? -- UFLP.is-limit uflp ? bz nei1 : HOD nei1 = Proj1 (* (Neighbor.u npq)) (Power P) (Power Q) plimit : Ordinal plimit = UFLP.limit uflp nproper : {b : Ordinal } → * b ⊆ nei1 → o∅ o< b nproper = ? b∋z : odef nei1 z b∋z = ? bp : BaseP {P} TP Q z bp = record { p = ? ; op = ? ; prod = ? } neip : {p : Ordinal } → ( bp : BaseP TP Q p ) → * p ⊆ filter F neip = ? il2 : * z ⊆ ZFP (Power P) (Power Q) il2 = ? il3 : filter F ∋ ? il3 = ? fz : odef (filter F) z fz = subst (λ k → odef (filter F) k) &iso (filter1 F ? ? ?) base⊆F (gi (case2 qx)) b⊆u {z} bz = ? base⊆F (g∩ b1 b2) b⊆u {z} bz = ?