\import Data.Bool
\import Function.Meta
\import Logic
\import Logic.Meta
\import Meta
\import Operations
\import Order.Directed
\import Order.Lattice
\import Order.PartialOrder
\import Paths.Meta
\import Set.Filter
\import Set.Subset
\import Topology.CoverSpace
\import Topology.CoverSpace.Complete
\import Topology.CoverSpace.Product
\open Bounded(top,top-univ)
\func DirectedCoverSpace (I : DirectedSet) : CoverSpace I
=> RegPrecoverSpace precover
\where {
\func precover : PrecoverSpace I \cowith
| isCauchy C => \Sigma (∃ (U : C) (N : I) (\Pi {n : I} -> N <= n -> U n)) (\Pi (n : I) -> ∃ (V : C) (V n))
| cauchy-cover => __.2
| cauchy-top => \case I.isInhabitted \with {
| inP n => (inP (top, idp, n, \lam _ => ()), \lam n => inP (top, idp, ()))
}
| cauchy-refine Cc C<D => \case Cc.1 \with {
| inP (U,CU,N,g) => (\case C<D CU \with {
| inP (V,DV,U<=V) => inP (V, DV, N, \lam p => U<=V (g p))
}, \lam n => \case Cc.2 n \with {
| inP (V,CV,Vn) => \case C<D CV \with {
| inP (W,DW,V<=W) => inP (W, DW, V<=W Vn)
}
})
}
| cauchy-glue Cc Dc => (\case Cc.1 \with {
| inP (U,CU,N,g) => \case (Dc CU).1 \with {
| inP (V,DUV,M,h) => \case isDirected N M \with {
| inP (L,N<=L,M<=L) => inP (U ∧ V, inP (U, V, CU, DUV, idp), L, \lam L<=n => (g $ N<=L <=∘ L<=n, h $ M<=L <=∘ L<=n))
}
}
}, \lam n => \case Cc.2 n \with {
| inP (U,CU,Un) => \case (Dc CU).2 n \with {
| inP (V,DUV,Vn) => inP (U ∧ V, inP (U, V, CU, DUV, idp), (Un, Vn))
}
})
\lemma makePrecover (N : I) : precover.isCauchy \lam V => (V = \lam n => N <= n) || Given (n : I) (V = single n)
=> (inP (_, byLeft idp, N, \lam p => p), \lam n => inP (single n, byRight (n, idp), idp))
}
\func EventualityFilter {I : DirectedSet} : CauchyFilter (DirectedCoverSpace I)
=> regPrecoverCauchyFilter (\new ProperFilter {
| F U => ∃ (N : I) ∀ {n} (N <= n -> U n)
| filter-mono p (inP (N,f)) => inP (N, \lam q => p $ f q)
| filter-top => \case I.isInhabitted \with {
| inP x => inP (x, \lam _ => ())
}
| filter-meet (inP (N,f)) (inP (M,g)) => \case isDirected N M \with {
| inP (L,N<=L,M<=L) => inP (L, \lam p => (f $ N<=L <=∘ p, g $ M<=L <=∘ p))
}
| isProper (inP (N,f)) => inP (N, f <=-refl)
}) $ later \lam (inP (U,CU,N,g), _) => inP (U, CU, inP (N, g))
\func DirectProdCover {I : DirectedSet} {X : CoverSpace} (D : Set (Set (\Sigma I X))) : \Prop
=> \Sigma (X.isCauchy \lam U => ∃ (N : I) (V : D) (\Pi {n : I} {x : X} -> N <= n -> U x -> V (n,x))) (\Pi (n : I) -> X.isCauchy \lam U => ∃ (V : D) ∀ {x : U} (V (n,x)))
\where {
\protected \func Space : PrecoverSpace (\Sigma I X) \cowith
| isCauchy => DirectProdCover
| cauchy-cover Cc s => \case cauchy-cover (Cc.2 s.1) s.2 \with {
| inP (U, inP (V,CV,h), Ux) => inP (V, CV, h Ux)
}
| cauchy-top => (top-cauchy \case I.isInhabitted \with {
| inP N => inP $ later (N, top, idp, \lam _ _ => ())
}, \lam n => top-cauchy $ inP $ later (top, idp, \lam _ => ()))
| cauchy-refine Cc C<D => (cauchy-subset Cc.1 \lam (inP (N,V,CV,p)) => \case C<D CV \with {
| inP (V',DV',V<=V') => inP $ later (N, V', DV', \lam N<=n Ux => V<=V' $ p N<=n Ux)
}, \lam n => cauchy-subset (Cc.2 n) \lam (inP (V,CV,h)) => \case C<D CV \with {
| inP (V',DV',V<=V') => inP $ later (V', DV', \lam Ux => V<=V' (h Ux))
})
| cauchy-glue {C} Cc {D} Dc =>
(cauchy-subset (cauchy-glue Cc.1 {\lam U V => ∃ (U' : C) (N : I) (Set.Prod (N <=) U ⊆ U') (V' : D U') (Set.Prod (N <=) V ⊆ V')}
\lam (inP (N,U',CU',Uh)) => cauchy-subset (Dc CU').1 \lam {V} (inP (M,V',DU'V',Vh)) => \case isDirected N M \with {
| inP (L,L<=N,L<=M) => inP $ later (U', CU', L, \lam (p1,p2) => Uh (L<=N <=∘ p1) p2, V', DU'V', \lam (p1,p2) => Vh (L<=M <=∘ p1) p2)
})
\lam {_} (inP (U, V, _, inP (U',CU',N,Uh,V',DU'V',Vh), idp)) => inP $ later (N, U' ∧ V', inP (U', V', CU', DU'V', idp), \lam p1 p2 => (Uh (p1,p2.1), Vh (p1,p2.2))),
\lam n => cauchy-subset (cauchy-glue (Cc.2 n) {\lam U V => ∃ (U' : C) (V' : D U') (∀ {x : U} (U' (n,x))) (∀ {x : V} (V' (n,x)))}
\lam (inP (U',CU',Uh)) => cauchy-subset ((Dc CU').2 n) \lam {V} (inP (V',DU'V',Vh)) => inP $ later (U', CU', V', DU'V', Uh, Vh))
(\lam {_} (inP (U, V, _, inP (U',CU',V',DU'V',Uh,Vh), idp)) => inP $ later (U' ∧ V', inP (U', V', CU', DU'V', idp), \lam (p1,p2) => (Uh p1, Vh p2))))
}
\lemma directedProdCover-char {I : DirectedSet} {X : CoverSpace} {D : Set (Set (\Sigma I X))} : isCauchy {DirectedCoverSpace.precover ⨯ X} D <-> DirectProdCover D
=> (ClosurePrecoverSpace.closure-cauchy {_} {DirectProdCover.Space} $ later \case \elim __ \with {
| inP (true, (inP (U, inP (V,CV,p), N, g), h)) => (top-cauchy $ inP $ later (N, V, CV, \lam s _ => p $ g s), \lam n => \case h n \with {
| inP (W, inP (W',CW',WW'), Wn) => top-cauchy $ inP $ later (W', CW', \lam _ => WW' Wn)
})
| inP (false, Cc) => (cauchy-subset Cc \lam (inP (V,CV,p)) => \case I.isInhabitted \with {
| inP N => inP $ later (N, V, CV, \lam _ s => p s)
}, \lam n => cauchy-subset Cc \lam (inP (V,CV,p)) => inP $ later (V, CV, p __))
}, \lam Dc => cauchy-refine {DirectedCoverSpace.precover ⨯ X} (cauchy-glue {DirectedCoverSpace.precover {I} ⨯ X} (ProductPrecoverSpace.proj2.func-cover Dc.1)
{\lam U V => ∃ (U' : Set X) (N : I) (V' : D) (Set.Prod (N <=) U' ⊆ V') (U = (\lam s => s.2) ^-1 U') (V ⊆ (\lam s => s.1) ^-1 (N <=) || Given (V' : D) (V ⊆ V'))}
\lam {_} (inP (U', inP (N,U,DU,U'U), idp)) => cauchy-subset {DirectedCoverSpace.precover ⨯ X} (cauchy-glue {DirectedCoverSpace.precover {I} ⨯ X} (ProductPrecoverSpace.proj1.func-cover (DirectedCoverSpace.makePrecover N))
{\lam U V => ∃ (U' : Set I) (U = (\lam s => s.1) ^-1 U') ((U' = (N <=)) || Given (n : I) (U' = single n) (Un : Set X) (Vn : D) (Set.Prod (single n) Un ⊆ Vn) (V = (\lam s => s.2) ^-1 Un))} \lam {V} => \case \elim __ \with {
| inP (V', byLeft p, VV') => top-cauchy {DirectedCoverSpace.precover ⨯ X} $ inP $ later (V', VV', byLeft p)
| inP (V', byRight (n,p), VV') => cauchy-subset {DirectedCoverSpace.precover {I} ⨯ X} (ProductPrecoverSpace.proj2.func-cover (Dc.2 n))
\lam {W} (inP (W', inP (Vn,DVn,h), WW')) => inP $ later (V', VV', byRight (n, p, W', Vn, DVn, \lam (p1,p2) => rewrite p1 in h p2, WW'))
})
\lam {_} (inP (U1, V, _, inP (U1',U1U1',e), idp)) => \case \elim e \with {
| byLeft p => inP $ later (U', N, U, DU, \lam (p1,p2) => U'U p1 p2, idp, byLeft $ rewrite (U1U1',p) meet-left)
| byRight (n,p,Un,Vn,DVn,q,r) => inP $ later (U', N, U, DU, \lam (p1,p2) => U'U p1 p2, idp, byRight (Vn, DVn, rewrite (U1U1',r,p) q))
})
\lam {_} (inP (U, V, _, inP (U',N,V',DV',U'V',p,e), idp)) => \case \elim e \with {
| byLeft q => inP (V', DV', rewrite p \lam (p1,p2) => U'V' (q p2, p1))
| byRight (V',DV',V<=V') => inP (V', DV', meet-right <=∘ V<=V')
})