{-# LANGUAGE AllowAmbiguousTypes #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Proarrow.Category.Enriched.Finitary.Sheaf where
import Data.Kind (Type)
import Data.List (find, genericIndex, genericLength, sort)
import Data.Map.Strict qualified as M
import Data.Maybe (fromMaybe, isJust, listToMaybe, mapMaybe)
import Numeric.Natural (Natural)
import Prelude (type (~))
import Prelude qualified as P
import Proarrow.Category.Enriched.Finitary
( Finitary (..)
, FiniteCat
, LocallyFinite
, factorThrough
, factorsThrough
, foreachOb
)
import Proarrow.Category.Enriched.Finitary.Topos
( FINITARY
, KnownTables
, Tabulated
, equalizeNat
, factorThroughEqualizer
, fromTabulated
, natDomain
, natElements
, natIndex
, natKey
, natPositionsBy
, natTable
, sieveTable
, toTabulated
, withSubobject
, withTables
)
import Proarrow.Category.Enriched.Thin (Enumerable)
import Proarrow.Category.Instance.Opposite (OPPOSITE (..))
import Proarrow.Category.Instance.Prof (Prof (..))
import Proarrow.Category.Instance.Sub (SUBCAT (..), Sub (..))
import Proarrow.Category.Sheaf (HasFiniteCovers (..), Sheaf (..), Site (..), SomeCover (..), SomeLeg (..))
import Proarrow.Category.Topos (HasSubobjectClassifier (..))
import Proarrow.Core
( CategoryOf (..)
, OB
, Profunctor (..)
, Promonad (..)
, UN
, (//)
, (\\)
, type (+->)
, type (:&&:)
, type (:~>)
)
import Proarrow.Limit.BinaryProduct (HasBinaryProducts (..), PROD (..), Prod (..))
import Proarrow.Limit.Equalizer (HasEqualizers (..))
import Proarrow.Limit.Pullback (HasPullbacks)
import Proarrow.Limit.Terminal (HasTerminalObject (..))
import Proarrow.Profunctor.Instance.Product ((:*:) (..))
import Proarrow.Profunctor.Instance.Sieve (Sieve (..), maximalSieve, sieveMeet)
import Proarrow.Profunctor.Instance.Terminal (TerminalProfunctor (..))
import Proarrow.Profunctor.Instance.Yoneda (Yo (..))
generatedSieve
:: forall t {j} {k} (a :: k) (b :: j) c
. (Site t k, LocallyFinite k, CategoryOf j, Ob a, Ob b)
=> Cover t k a c
-> Sieve a b
generatedSieve :: forall t {j} {k} (a :: k) (b :: j) c.
(Site t k, LocallyFinite k, CategoryOf j, Ob a, Ob b) =>
Cover t k a c -> Sieve a b
generatedSieve Cover t k a c
c = (forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
forall {k} {j} (a :: k) (b :: j).
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
Sieve \c ~> a
g b ~> d
_ -> (SomeLeg t k a c -> Bool) -> [SomeLeg t k a c] -> Bool
forall (t :: Type -> Type) a.
Foldable t =>
(a -> Bool) -> t a -> Bool
P.any (\(SomeLeg Leg t k a c x
l) -> let f :: x ~> a
f = Leg t k a c x -> x ~> a
forall (a :: k) c (x :: k). Leg t k a c x -> x ~> a
forall t k (a :: k) c (x :: k). Site t k => Leg t k a c x -> x ~> a
legArrow Leg t k a c x
l in (c ~> a) -> (x ~> a) -> Bool
forall {k} (x :: k) (y :: k) (a :: k).
(LocallyFinite k, Ob x, Ob y, Ob a) =>
(x ~> a) -> (y ~> a) -> Bool
factorsThrough c ~> a
g x ~> a
f ((Ob x, Ob a) => Bool) -> (x ~> a) -> Bool
forall (a :: k) (b :: k) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ x ~> a
f ((Ob c, Ob a) => Bool) -> (c ~> a) -> Bool
forall (a :: k) (b :: k) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ c ~> a
g) (Cover t k a c -> [SomeLeg t k a c]
forall (a :: k) c. Cover t k a c -> [SomeLeg t k a c]
forall t k (a :: k) c.
Site t k =>
Cover t k a c -> [SomeLeg t k a c]
legs Cover t k a c
c)
isMaximal :: forall {j} {k} (a :: k) (b :: j). (FiniteCat j, FiniteCat k) => Sieve a b -> P.Bool
isMaximal :: forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isMaximal Sieve a b
s = [Bool] -> Bool
forall (t :: Type -> Type). Foldable t => t Bool -> Bool
P.and (Sieve a b -> [Bool]
forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> [Bool]
sieveTable Sieve a b
s)
contains :: forall {j} {k} (a :: k) (b :: j). (FiniteCat j, FiniteCat k) => Sieve a b -> Sieve a b -> P.Bool
contains :: forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> Sieve a b -> Bool
contains Sieve a b
s = \Sieve a b
s' -> [Bool] -> Bool
forall (t :: Type -> Type). Foldable t => t Bool -> Bool
P.and ((Bool -> Bool -> Bool) -> [Bool] -> [Bool] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
P.zipWith (\Bool
x Bool
y -> Bool -> Bool
P.not Bool
y Bool -> Bool -> Bool
P.|| Bool
x) [Bool]
ts (Sieve a b -> [Bool]
forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> [Bool]
sieveTable Sieve a b
s'))
where
ts :: [Bool]
ts = Sieve a b -> [Bool]
forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> [Bool]
sieveTable Sieve a b
s
isCovering
:: forall t {j} {k} (a :: k) (b :: j)
. (HasFiniteCovers t k, FiniteCat j, FiniteCat k)
=> Sieve a b
-> P.Bool
isCovering :: forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isCovering Sieve a b
s = Sieve a b -> Bool
forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isMaximal Sieve a b
s Bool -> Bool -> Bool
P.|| Maybe (SomeCover t k a) -> Bool
forall a. Maybe a -> Bool
isJust (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, CategoryOf j) =>
Sieve a b -> Maybe (SomeCover t k a)
coveringCover @t Sieve a b
s)
coveringCover
:: forall t {j} {k} (a :: k) (b :: j)
. (HasFiniteCovers t k, CategoryOf j)
=> Sieve a b
-> P.Maybe (SomeCover t k a)
coveringCover :: forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, CategoryOf j) =>
Sieve a b -> Maybe (SomeCover t k a)
coveringCover (Sieve forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool
s) = (SomeCover t k a -> Bool)
-> [SomeCover t k a] -> Maybe (SomeCover t k a)
forall (t :: Type -> Type) a.
Foldable t =>
(a -> Bool) -> t a -> Maybe a
find (\(SomeCover Cover t k a c
c) -> (SomeLeg t k a c -> Bool) -> [SomeLeg t k a c] -> Bool
forall (t :: Type -> Type) a.
Foldable t =>
(a -> Bool) -> t a -> Bool
P.all (\(SomeLeg Leg t k a c x
l) -> (x ~> a) -> (b ~> b) -> Bool
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool
s (Leg t k a c x -> x ~> a
forall (a :: k) c (x :: k). Leg t k a c x -> x ~> a
forall t k (a :: k) c (x :: k). Site t k => Leg t k a c x -> x ~> a
legArrow Leg t k a c x
l) b ~> b
forall (a :: j). Ob a => a ~> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id) (Cover t k a c -> [SomeLeg t k a c]
forall (a :: k) c. Cover t k a c -> [SomeLeg t k a c]
forall t k (a :: k) c.
Site t k =>
Cover t k a c -> [SomeLeg t k a c]
legs Cover t k a c
c)) (forall t k (a :: k).
(HasFiniteCovers t k, Ob a) =>
[SomeCover t k a]
covers @t @k @a)
closure
:: forall t {j} {k} (a :: k) (b :: j)
. (HasFiniteCovers t k, FiniteCat j, FiniteCat k)
=> Sieve a b
-> Sieve a b
closure :: forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Sieve a b
closure s :: Sieve a b
s@Sieve{} = (forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
forall {k} {j} (a :: k) (b :: j).
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
Sieve \c ~> a
g b ~> d
h -> forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isCovering @t ((c ~> a) -> (b ~> d) -> Sieve a b -> Sieve c d
forall (c :: k) (a :: k) (b :: j) (d :: j).
(c ~> a) -> (b ~> d) -> Sieve a b -> Sieve c d
forall {j} {k} (p :: j +-> k) (c :: k) (a :: k) (b :: j) (d :: j).
Profunctor p =>
(c ~> a) -> (b ~> d) -> p a b -> p c d
dimap c ~> a
g b ~> d
h Sieve a b
s) ((Ob c, Ob a) => Bool) -> (c ~> a) -> Bool
forall (a :: k) (b :: k) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ c ~> a
g ((Ob b, Ob d) => Bool) -> (b ~> d) -> Bool
forall (a :: j) (b :: j) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ b ~> d
h
lawvereTierney
:: forall t j k. (HasFiniteCovers t k, FiniteCat j, FiniteCat k) => (Omega :: PROD (FINITARY j k)) ~> Omega
lawvereTierney :: forall t j k.
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Omega ~> Omega
lawvereTierney = Sub Prof (SUB Sieve) (SUB Sieve)
-> Prod (Sub Prof) (PR (SUB Sieve)) (PR (SUB Sieve))
forall {j} {k} (p :: j +-> k) (a1 :: k) (b1 :: j).
p a1 b1 -> Prod p (PR a1) (PR b1)
Prod (Prof Sieve Sieve -> Sub Prof (SUB Sieve) (SUB Sieve)
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub ((Sieve :~> Sieve) -> Prof Sieve Sieve
forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Profunctor p, Profunctor q) =>
(p :~> q) -> Prof p q
Prof \s :: Sieve a b
s@Sieve{} -> forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Sieve a b
closure @t Sieve a b
s))
isSheaf
:: forall t {j} {k} (p :: j +-> k)
. (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k)
=> P.Bool
isSheaf :: forall t {j} {k} (p :: j +-> k).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) =>
Bool
isSheaf =
[Bool] -> Bool
forall (t :: Type -> Type). Foldable t => t Bool -> Bool
P.and
( forall k r. Enumerable k => (forall (a :: k). Ob a => [r]) -> [r]
foreachOb @k \ @a ->
let cs :: [SomeCover t k a]
cs = forall t k (a :: k).
(HasFiniteCovers t k, Ob a) =>
[SomeCover t k a]
covers @t @k @a
in forall k r. Enumerable k => (forall (a :: k). Ob a => [r]) -> [r]
foreachOb @j \ @b -> [forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j) c.
(Site t k, Finitary p, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Cover t k a c -> Bool
sheafAt @t @p @a @b Cover t k a c
c | SomeCover Cover t k a c
c <- [SomeCover t k a]
cs]
)
sheafAt
:: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j) c
. (Site t k, Finitary p, FiniteCat j, FiniteCat k, Ob a, Ob b)
=> Cover t k a c
-> P.Bool
sheafAt :: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j) c.
(Site t k, Finitary p, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Cover t k a c -> Bool
sheafAt Cover t k a c
c = Sieve a b
-> (forall (q :: j +-> k).
Finitary q =>
(q :~> Yo a (OP b)) -> Bool)
-> Bool
forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (forall t {j} {k} (a :: k) (b :: j) c.
(Site t k, LocallyFinite k, CategoryOf j, Ob a, Ob b) =>
Cover t k a c -> Sieve a b
generatedSieve @t @a @b Cover t k a c
c) \ @q q :~> Yo a (OP b)
incl ->
[[Natural]] -> [[Natural]]
forall a. Ord a => [a] -> [a]
sort [forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
(p :~> q) -> [Natural]
forall (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
(p :~> q) -> [Natural]
natTable @q @p (\q a b
y -> case q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl q a b
y of Yo a ~> a
g b1 ~> b
h -> (a ~> a) -> (b ~> b) -> p a b -> p a b
forall (c :: k) (a :: k) (b :: j) (d :: j).
(c ~> a) -> (b ~> d) -> p a b -> p c d
forall {j} {k} (p :: j +-> k) (c :: k) (a :: k) (b :: j) (d :: j).
Profunctor p =>
(c ~> a) -> (b ~> d) -> p a b -> p c d
dimap a ~> a
g b ~> b
b1 ~> b
h p a b
x) | p a b
x <- forall {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
[p a b]
forall (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
[p a b]
elements @p @a @b]
[[Natural]] -> [[Natural]] -> Bool
forall a. Eq a => a -> a -> Bool
P.== [[Natural]] -> [[Natural]]
forall a. Ord a => [a] -> [a]
sort (forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[[Natural]]
forall (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[[Natural]]
natElements @q @p)
withTabulatedSheaf
:: forall t {j} {k} (p :: j +-> k) r
. (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k)
=> ( forall {lm} {rm} (tab :: j +-> k)
. (tab ~ Tabulated t lm rm, KnownTables j k lm rm, Sheaf t tab)
=> (p :~> tab)
-> (tab :~> p)
-> r
)
-> r
-> r
withTabulatedSheaf :: forall t {j} {k} (p :: j +-> k) r.
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) =>
(forall {lm :: [[[[Nat]]]]} {rm :: [[[[Nat]]]]} (tab :: j +-> k).
(tab ~ Tabulated t lm rm, KnownTables j k lm rm, Sheaf t tab) =>
(p :~> tab) -> (tab :~> p) -> r)
-> r -> r
withTabulatedSheaf forall {lm :: [[[[Nat]]]]} {rm :: [[[[Nat]]]]} (tab :: j +-> k).
(tab ~ Tabulated t lm rm, KnownTables j k lm rm, Sheaf t tab) =>
(p :~> tab) -> (tab :~> p) -> r
ok r
notSheaf = forall {j} {k} (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (lm :: [[[[Nat]]]]) (rm :: [[[[Nat]]]]).
KnownTables j k lm rm =>
r)
-> r
forall (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (lm :: [[[[Nat]]]]) (rm :: [[[[Nat]]]]).
KnownTables j k lm rm =>
r)
-> r
withTables @p \ @lm @rm ->
if forall t {j} {k} (p :: j +-> k).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) =>
Bool
isSheaf @t @(Tabulated t lm rm :: j +-> k)
then forall {lm :: [[[[Nat]]]]} {rm :: [[[[Nat]]]]} (tab :: j +-> k).
(tab ~ Tabulated t lm rm, KnownTables j k lm rm, Sheaf t tab) =>
(p :~> tab) -> (tab :~> p) -> r
forall (tab :: j +-> k).
(tab ~ Tabulated t lm rm, KnownTables j k lm rm, Sheaf t tab) =>
(p :~> tab) -> (tab :~> p) -> r
ok @(Tabulated t lm rm) p a b -> Tabulated t lm rm a b
p :~> Tabulated t lm rm
forall {j} {k} t (lm :: [[[[Nat]]]]) (rm :: [[[[Nat]]]])
(p :: j +-> k).
Finitary p =>
p :~> Tabulated t lm rm
toTabulated Tabulated t lm rm a b -> p a b
Tabulated t lm rm :~> p
forall {j} {k} t (lm :: [[[[Nat]]]]) (rm :: [[[[Nat]]]])
(p :: j +-> k).
Finitary p =>
Tabulated t lm rm :~> p
fromTabulated
else r
notSheaf
withSieve
:: forall {j} {k} (a :: k) (b :: j) r
. (FiniteCat j, FiniteCat k)
=> Sieve a b
-> (forall q. (Finitary q) => (q :~> Yo a (OP b)) -> r)
-> r
withSieve :: forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (Sieve forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool
s) forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r
k =
forall {j} {k} (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> Bool)
-> (forall (q :: j +-> k). Finitary q => (FIN q ~> FIN p) -> r)
-> r
-> r
forall (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> Bool)
-> (forall (q :: j +-> k). Finitary q => (FIN q ~> FIN p) -> r)
-> r
-> r
withSubobject @(Yo a (OP b))
(\(Yo a ~> a
g b1 ~> b
h) -> (a ~> a) -> (b ~> b) -> Bool
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool
s a ~> a
g b ~> b
b1 ~> b
h)
(\ @q (Sub (Prof q :~> Yo a (OP b)
incl)) -> forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r
k @q q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl)
([Char] -> r
forall a. HasCallStack => [Char] -> a
P.error [Char]
"withSieve: not a sieve")
type Plus :: forall {j} {k}. Type -> j +-> k -> j +-> k
data Plus t p a b where
Plus :: (Ob a, Ob b) => (forall c d. c ~> a -> b ~> d -> P.Maybe (p c d)) -> Plus t p a b
instance (CategoryOf j, CategoryOf k) => Profunctor (Plus t p :: j +-> k) where
dimap :: forall (c :: k) (a :: k) (b :: j) (d :: j).
(c ~> a) -> (b ~> d) -> Plus t p a b -> Plus t p c d
dimap c ~> a
l b ~> d
r (Plus forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f) = c ~> a
l (c ~> a) -> ((Ob c, Ob a) => Plus t p c d) -> Plus t p c d
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) r.
Profunctor p =>
p a b -> ((Ob a, Ob b) => r) -> r
// b ~> d
r (b ~> d) -> ((Ob b, Ob d) => Plus t p c d) -> Plus t p c d
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) r.
Profunctor p =>
p a b -> ((Ob a, Ob b) => r) -> r
// (forall (c :: k) (d :: j). (c ~> c) -> (d ~> d) -> Maybe (p c d))
-> Plus t p c d
forall {k} {j} (a :: k) (b :: j) (p :: j +-> k) t.
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
Plus \c ~> c
g d ~> d
h -> (c ~> a) -> (b ~> d) -> Maybe (p c d)
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f (c ~> a
l (c ~> a) -> (c ~> c) -> c ~> a
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. c ~> c
g) (d ~> d
h (d ~> d) -> (b ~> d) -> b ~> d
forall (b :: j) (c :: j) (a :: j). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. b ~> d
r)
(Ob a, Ob b) => r
r \\ :: forall (a :: k) (b :: j) r.
((Ob a, Ob b) => r) -> Plus t p a b -> r
\\ Plus{} = r
(Ob a, Ob b) => r
r
support :: Plus t p :~> Sieve
support :: forall {k1} {k} t (p :: k1 +-> k) (a :: k) (b :: k1).
Plus t p a b -> Sieve a b
support (Plus forall (c :: k) (d :: k1). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f) = (forall (c :: k) (d :: k1). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
forall {k} {j} (a :: k) (b :: j).
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Bool)
-> Sieve a b
Sieve \c ~> a
g b ~> d
h -> Maybe (p c d) -> Bool
forall a. Maybe a -> Bool
isJust ((c ~> a) -> (b ~> d) -> Maybe (p c d)
forall (c :: k) (d :: k1). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f c ~> a
g b ~> d
h)
isDense
:: forall t {j} {k} (a :: k) (b :: j)
. (HasFiniteCovers t k, FiniteCat j, FiniteCat k)
=> Sieve a b
-> P.Bool
isDense :: forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isDense Sieve a b
s = Sieve a b -> Bool
forall {j} {k} (a :: k) (b :: j).
(FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isMaximal (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Sieve a b
closure @t Sieve a b
s)
leastDenseSieve
:: forall t {j} {k} (a :: k) (b :: j)
. (HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b)
=> Sieve a b
leastDenseSieve :: forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Sieve a b
leastDenseSieve
| forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isDense @t Sieve a b
s = Sieve a b
s
| Bool
P.otherwise = [Char] -> Sieve a b
forall a. HasCallStack => [Char] -> a
P.error [Char]
"leastDenseSieve: the dense sieves have no least one -- the covers do not compose"
where
s :: Sieve a b
s = (Sieve a b -> Sieve a b -> Sieve a b)
-> Sieve a b -> [Sieve a b] -> Sieve a b
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
P.foldr Sieve a b -> Sieve a b -> Sieve a b
forall {k} {j} (a :: k) (b :: j).
Sieve a b -> Sieve a b -> Sieve a b
sieveMeet Sieve a b
forall {j} {k} (a :: k) (b :: j).
(CategoryOf j, CategoryOf k, Ob a, Ob b) =>
Sieve a b
maximalSieve ((Sieve a b -> Bool) -> [Sieve a b] -> [Sieve a b]
forall a. (a -> Bool) -> [a] -> [a]
P.filter (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k) =>
Sieve a b -> Bool
isDense @t) (forall {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
[p a b]
forall (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
[p a b]
elements @(Sieve :: j +-> k) @a @b))
plusElements
:: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j)
. (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k, Ob a, Ob b)
=> [Plus t p a b]
plusElements :: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k, Ob a,
Ob b) =>
[Plus t p a b]
plusElements = Sieve a b
-> (forall (q :: j +-> k).
Finitary q =>
(q :~> Yo a (OP b)) -> [Plus t p a b])
-> [Plus t p a b]
forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Sieve a b
leastDenseSieve @t @a @b) \ @q q :~> Yo a (OP b)
incl ->
let pos :: Map NatKey Int
pos = forall {j} {k} (p :: j +-> k).
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> NatKey)
-> Map NatKey Int
forall (p :: j +-> k).
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> NatKey)
-> Map NatKey Int
natPositionsBy @q \q a b
y -> Yo a (OP b) a b -> NatKey
forall {j} {k} (a :: k) (b :: j) (p :: j +-> k).
(FiniteCat j, FiniteCat k, Finitary p, Ob a, Ob b) =>
p a b -> NatKey
natKey (q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl q a b
y)
in [ (forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
forall {k} {j} (a :: k) (b :: j) (p :: j +-> k) t.
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
Plus \c ~> a
g b ~> d
h -> c ~> a
g (c ~> a) -> ((Ob c, Ob a) => Maybe (p c d)) -> Maybe (p c d)
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) r.
Profunctor p =>
p a b -> ((Ob a, Ob b) => r) -> r
// b ~> d
h (b ~> d) -> ((Ob b, Ob d) => Maybe (p c d)) -> Maybe (p c d)
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) r.
Profunctor p =>
p a b -> ((Ob a, Ob b) => r) -> r
// (Int -> p c d) -> Maybe Int -> Maybe (p c d)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
P.fmap (forall {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
Natural -> p a b
forall (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
Natural -> p a b
fromIndex @p (Natural -> p c d) -> (Int -> Natural) -> Int -> p c d
forall b c a. (b -> c) -> (a -> b) -> a -> c
P.. ([Natural]
row [Natural] -> Int -> Natural
forall a. HasCallStack => [a] -> Int -> a
P.!!)) (NatKey -> Map NatKey Int -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (Yo a (OP b) c d -> NatKey
forall {j} {k} (a :: k) (b :: j) (p :: j +-> k).
(FiniteCat j, FiniteCat k, Finitary p, Ob a, Ob b) =>
p a b -> NatKey
natKey ((c ~> a) -> (b ~> d) -> Yo a (OP b) c d
forall {k} {j} (c :: k) (a :: k) (b1 :: j) (d :: j).
(c ~> a) -> (b1 ~> d) -> Yo a (OP b1) c d
Yo c ~> a
g b ~> d
h)) Map NatKey Int
pos)
| [Natural]
row <- forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[[Natural]]
forall (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[[Natural]]
natElements @q @p
]
restrictTo
:: forall {j} {k} q (a :: k) (b :: j) t (p :: j +-> k)
. (q :~> Yo a (OP b))
-> Plus t p a b
-> q :~> p
restrictTo :: forall {j} {k} (q :: k -> j -> Type) (a :: k) (b :: j) t
(p :: k -> j -> Type).
(q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
restrictTo q :~> Yo a (OP b)
incl (Plus forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f) q a b
y = case q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl q a b
y of
Yo a ~> a
g b1 ~> b
h ->
p a b -> Maybe (p a b) -> p a b
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> p a b
forall a. HasCallStack => [Char] -> a
P.error [Char]
"restrictTo: the sieve is not inside the support -- see HasFiniteCovers's Composition law") ((a ~> a) -> (b ~> b) -> Maybe (p a b)
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f a ~> a
g b ~> b
b1 ~> b
h)
plusTable
:: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j)
. (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k)
=> Plus t p a b
-> [Natural]
plusTable :: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) =>
Plus t p a b -> [Natural]
plusTable x :: Plus t p a b
x@Plus{} = Sieve a b
-> (forall (q :: j +-> k).
Finitary q =>
(q :~> Yo a (OP b)) -> [Natural])
-> [Natural]
forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Sieve a b
leastDenseSieve @t @a @b) \ @q q :~> Yo a (OP b)
incl -> forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
(p :~> q) -> [Natural]
forall (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
(p :~> q) -> [Natural]
natTable @q @p ((q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
forall {j} {k} (q :: k -> j -> Type) (a :: k) (b :: j) t
(p :: k -> j -> Type).
(q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
restrictTo q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl Plus t p a b
x)
samePlus
:: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j)
. (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k)
=> Plus t p a b
-> Plus t p a b
-> P.Bool
samePlus :: forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) =>
Plus t p a b -> Plus t p a b -> Bool
samePlus x :: Plus t p a b
x@Plus{} Plus t p a b
y = Sieve a b
-> (forall (q :: j +-> k).
Finitary q =>
(q :~> Yo a (OP b)) -> Bool)
-> Bool
forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Sieve a b
leastDenseSieve @t @a @b) \ @q q :~> Yo a (OP b)
incl ->
[Bool] -> Bool
forall (t :: Type -> Type). Foldable t => t Bool -> Bool
P.and
(forall {j} {k} (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> r) -> [r]
forall (p :: j +-> k) r.
(Finitary p, FiniteCat j, FiniteCat k) =>
(forall (a :: k) (b :: j). (Ob a, Ob b) => p a b -> r) -> [r]
natDomain @q @P.Bool \ @c @d q a b
z -> let ix :: p a b -> Natural
ix = forall {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
p a b -> Natural
forall (p :: j +-> k) (a :: k) (b :: j).
(Finitary p, Ob a, Ob b) =>
p a b -> Natural
toIndex @p @c @d in p a b -> Natural
ix ((q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
forall {j} {k} (q :: k -> j -> Type) (a :: k) (b :: j) t
(p :: k -> j -> Type).
(q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
restrictTo q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl Plus t p a b
x q a b
z) Natural -> Natural -> Bool
forall a. Eq a => a -> a -> Bool
P.== p a b -> Natural
ix ((q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
forall {j} {k} (q :: k -> j -> Type) (a :: k) (b :: j) t
(p :: k -> j -> Type).
(q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
restrictTo q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl Plus t p a b
y q a b
z))
instance (HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k) => Finitary (Plus t p :: j +-> k) where
size :: forall (a :: k) (b :: j). (Ob a, Ob b) => Natural
size @a @b = [Plus t p a b] -> Natural
forall i a. Num i => [a] -> i
genericLength (forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k, Ob a,
Ob b) =>
[Plus t p a b]
plusElements @t @p @a @b)
toIndex :: forall (a :: k) (b :: j). (Ob a, Ob b) => Plus t p a b -> Natural
toIndex @a @b = Sieve a b
-> (forall (q :: j +-> k).
Finitary q =>
(q :~> Yo a (OP b)) -> Plus t p a b -> Natural)
-> Plus t p a b
-> Natural
forall {j} {k} (a :: k) (b :: j) r.
(FiniteCat j, FiniteCat k) =>
Sieve a b
-> (forall (q :: j +-> k). Finitary q => (q :~> Yo a (OP b)) -> r)
-> r
withSieve (forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, FiniteCat j, FiniteCat k, Ob a, Ob b) =>
Sieve a b
leastDenseSieve @t @a @b) \ @q q :~> Yo a (OP b)
incl ->
let ix :: (q :~> p) -> Natural
ix = forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[Char] -> (p :~> q) -> Natural
forall (p :: j +-> k) (q :: j +-> k).
(Finitary p, Finitary q, FiniteCat j, FiniteCat k) =>
[Char] -> (p :~> q) -> Natural
natIndex @q @p [Char]
"toIndex: not natural on the least dense sieve"
in \Plus t p a b
x -> (q :~> p) -> Natural
ix ((q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
forall {j} {k} (q :: k -> j -> Type) (a :: k) (b :: j) t
(p :: k -> j -> Type).
(q :~> Yo a (OP b)) -> Plus t p a b -> q :~> p
restrictTo q a b -> Yo a (OP b) a b
q :~> Yo a (OP b)
incl Plus t p a b
x)
fromIndex :: forall (a :: k) (b :: j). (Ob a, Ob b) => Natural -> Plus t p a b
fromIndex @a @b = [Plus t p a b] -> Natural -> Plus t p a b
forall i a. Integral i => [a] -> i -> a
genericIndex (forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k, Ob a,
Ob b) =>
[Plus t p a b]
plusElements @t @p @a @b)
elements :: forall (a :: k) (b :: j). (Ob a, Ob b) => [Plus t p a b]
elements @a @b = forall t {j} {k} (p :: j +-> k) (a :: k) (b :: j).
(HasFiniteCovers t k, Finitary p, FiniteCat j, FiniteCat k, Ob a,
Ob b) =>
[Plus t p a b]
plusElements @t @p @a @b
type Sheafify :: forall {j} {k}. Type -> j +-> k -> j +-> k
type Sheafify t p = Plus t (Plus t p)
unitPlus :: forall t {j} {k} (p :: j +-> k). (Profunctor p) => p :~> Plus t p
unitPlus :: forall t {j} {k} (p :: j +-> k). Profunctor p => p :~> Plus t p
unitPlus p a b
x = (forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
forall {k} {j} (a :: k) (b :: j) (p :: j +-> k) t.
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
Plus (\c ~> a
g b ~> d
h -> p c d -> Maybe (p c d)
forall a. a -> Maybe a
P.Just ((c ~> a) -> (b ~> d) -> p a b -> p c d
forall (c :: k) (a :: k) (b :: j) (d :: j).
(c ~> a) -> (b ~> d) -> p a b -> p c d
forall {j} {k} (p :: j +-> k) (c :: k) (a :: k) (b :: j) (d :: j).
Profunctor p =>
(c ~> a) -> (b ~> d) -> p a b -> p c d
dimap c ~> a
g b ~> d
h p a b
x)) ((Ob a, Ob b) => Plus t p a b) -> p a b -> Plus t p a b
forall (a :: k) (b :: j) r. ((Ob a, Ob b) => r) -> p a b -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ p a b
x
unitSheafify :: forall t {j} {k} (p :: j +-> k). (Profunctor p) => p :~> Sheafify t p
unitSheafify :: forall t {j} {k} (p :: j +-> k). Profunctor p => p :~> Sheafify t p
unitSheafify p a b
x = forall t {j} {k} (p :: j +-> k). Profunctor p => p :~> Plus t p
unitPlus @t (forall t {j} {k} (p :: j +-> k). Profunctor p => p :~> Plus t p
unitPlus @t p a b
x)
extendPlus
:: forall t {j} {k} (p :: j +-> k) q
. (HasFiniteCovers t k, Sheaf t q)
=> (p :~> q) -> Plus t p :~> q
extendPlus :: forall t {j} {k} (p :: j +-> k) (q :: j +-> k).
(HasFiniteCovers t k, Sheaf t q) =>
(p :~> q) -> Plus t p :~> q
extendPlus p :~> q
n x :: Plus t p a b
x@(Plus forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f) = case (a ~> a) -> (b ~> b) -> Maybe (p a b)
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f a ~> a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id b ~> b
forall (a :: j). Ob a => a ~> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id of
P.Just p a b
v -> p a b -> q a b
p :~> q
n p a b
v
Maybe (p a b)
P.Nothing -> case forall t {j} {k} (a :: k) (b :: j).
(HasFiniteCovers t k, CategoryOf j) =>
Sieve a b -> Maybe (SomeCover t k a)
coveringCover @t (Plus t p a b -> Sieve a b
forall {k1} {k} t (p :: k1 +-> k) (a :: k) (b :: k1).
Plus t p a b -> Sieve a b
support Plus t p a b
x) of
P.Just (SomeCover Cover t k a c
c) -> forall {j} {k} t (p :: j +-> k) (a :: k) c (b :: j).
(Sheaf t p, Ob a, Ob b) =>
Cover t k a c -> (forall (x :: k). Leg t k a c x -> p x b) -> p a b
forall t (p :: j +-> k) (a :: k) c (b :: j).
(Sheaf t p, Ob a, Ob b) =>
Cover t k a c -> (forall (x :: k). Leg t k a c x -> p x b) -> p a b
glue @t Cover t k a c
c \Leg t k a c x
l -> q x b -> (p x b -> q x b) -> Maybe (p x b) -> q x b
forall b a. b -> (a -> b) -> Maybe a -> b
P.maybe ([Char] -> q x b
forall a. HasCallStack => [Char] -> a
P.error [Char]
"extendPlus: a leg outside the support") p x b -> q x b
p :~> q
n ((x ~> a) -> (b ~> b) -> Maybe (p x b)
forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d)
f (Leg t k a c x -> x ~> a
forall (a :: k) c (x :: k). Leg t k a c x -> x ~> a
forall t k (a :: k) c (x :: k). Site t k => Leg t k a c x -> x ~> a
legArrow Leg t k a c x
l) b ~> b
forall (a :: j). Ob a => a ~> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id)
Maybe (SomeCover t k a)
P.Nothing -> [Char] -> q a b
forall a. HasCallStack => [Char] -> a
P.error [Char]
"extendPlus: the support is not dense"
gluePlus
:: forall t {j} {k} (q :: j +-> k) (a :: k) c (b :: j)
. (Site t k, LocallyFinite k, Ob a, Ob b)
=> Cover t k a c
-> (forall x. Leg t k a c x -> Plus t q x b)
-> Plus t q a b
gluePlus :: forall t {j} {k} (q :: j +-> k) (a :: k) c (b :: j).
(Site t k, LocallyFinite k, Ob a, Ob b) =>
Cover t k a c
-> (forall (x :: k). Leg t k a c x -> Plus t q x b) -> Plus t q a b
gluePlus Cover t k a c
c forall (x :: k). Leg t k a c x -> Plus t q x b
m =
let ls :: [SomeLeg t k a c]
ls = Cover t k a c -> [SomeLeg t k a c]
forall (a :: k) c. Cover t k a c -> [SomeLeg t k a c]
forall t k (a :: k) c.
Site t k =>
Cover t k a c -> [SomeLeg t k a c]
legs Cover t k a c
c
in (forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (q c d))
-> Plus t q a b
forall {k} {j} (a :: k) (b :: j) (p :: j +-> k) t.
(Ob a, Ob b) =>
(forall (c :: k) (d :: j). (c ~> a) -> (b ~> d) -> Maybe (p c d))
-> Plus t p a b
Plus \c ~> a
g b ~> d
h ->
c ~> a
g (c ~> a) -> ((Ob c, Ob a) => Maybe (q c d)) -> Maybe (q c d)
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) r.
Profunctor p =>
p a b -> ((Ob a, Ob b) => r) -> r
// [q c d] -> Maybe (q c d)
forall a. [a] -> Maybe a
listToMaybe ((SomeLeg t k a c -> Maybe (q c d)) -> [SomeLeg t k a c] -> [q c d]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (\(SomeLeg Leg t k a c x
l) -> case Leg t k a c x -> Plus t q x b
forall (x :: k). Leg t k a c x -> Plus t q x b
m Leg t k a c x
l of Plus forall (c :: k) (d :: j). (c ~> x) -> (b ~> d) -> Maybe (q c d)
f -> (c ~> a) -> (x ~> a) -> Maybe (c ~> x)
forall {k} (x :: k) (y :: k) (a :: k).
(LocallyFinite k, Ob x, Ob y, Ob a) =>
(x ~> a) -> (y ~> a) -> Maybe (x ~> y)
factorThrough c ~> a
g (Leg t k a c x -> x ~> a
forall (a :: k) c (x :: k). Leg t k a c x -> x ~> a
forall t k (a :: k) c (x :: k). Site t k => Leg t k a c x -> x ~> a
legArrow Leg t k a c x
l) Maybe (c ~> x) -> ((c ~> x) -> Maybe (q c d)) -> Maybe (q c d)
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: Type -> Type) a b. Monad m => m a -> (a -> m b) -> m b
P.>>= \c ~> x
u -> (c ~> x) -> (b ~> d) -> Maybe (q c d)
forall (c :: k) (d :: j). (c ~> x) -> (b ~> d) -> Maybe (q c d)
f c ~> x
u b ~> d
h) [SomeLeg t k a c]
ls)
instance (Site t k, LocallyFinite k, CategoryOf j) => Sheaf t (Sheafify t (p :: j +-> k)) where
glue :: forall (a :: k) c (b :: j).
(Ob a, Ob b) =>
Cover t k a c
-> (forall (x :: k). Leg t k a c x -> Sheafify t p x b)
-> Sheafify t p a b
glue = forall t {j} {k} (q :: j +-> k) (a :: k) c (b :: j).
(Site t k, LocallyFinite k, Ob a, Ob b) =>
Cover t k a c
-> (forall (x :: k). Leg t k a c x -> Plus t q x b) -> Plus t q a b
gluePlus @t
extendSheafify
:: forall t {j} {k} (p :: j +-> k) q
. (HasFiniteCovers t k, Sheaf t q)
=> (p :~> q) -> Sheafify t p :~> q
extendSheafify :: forall t {j} {k} (p :: j +-> k) (q :: j +-> k).
(HasFiniteCovers t k, Sheaf t q) =>
(p :~> q) -> Sheafify t p :~> q
extendSheafify p :~> q
n = forall t {j} {k} (p :: j +-> k) (q :: j +-> k).
(HasFiniteCovers t k, Sheaf t q) =>
(p :~> q) -> Plus t p :~> q
extendPlus @t (forall t {j} {k} (p :: j +-> k) (q :: j +-> k).
(HasFiniteCovers t k, Sheaf t q) =>
(p :~> q) -> Plus t p :~> q
extendPlus @t p a b -> q a b
p :~> q
n)
type SHEAVES t j k = SUBCAT ((Finitary :&&: Sheaf t) :: OB (j +-> k))
type SHF t (p :: j +-> k) = SUB p :: SHEAVES t j k
instance (Site t k, CategoryOf j) => HasTerminalObject (SHEAVES t j k) where
type TerminalObject = SUB TerminalProfunctor
terminate :: forall (a :: SHEAVES t j k). Ob a => a ~> TerminalObject
terminate = Prof (UN SUB a) TerminalProfunctor
-> Sub Prof (SUB (UN SUB a)) (SUB TerminalProfunctor)
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub UN SUB a ~> TerminalObject
Prof (UN SUB a) TerminalProfunctor
forall k (a :: k).
(HasTerminalObject k, Ob a) =>
a ~> TerminalObject
forall (a :: k -> j -> Type). Ob a => a ~> TerminalObject
terminate
instance (Site t k, CategoryOf j) => HasBinaryProducts (SHEAVES t j k) where
type a && b = SUB (UN SUB a :*: UN SUB b)
withObProd :: forall (a :: SHEAVES t j k) (b :: SHEAVES t j k) r.
(Ob a, Ob b) =>
(Ob (a && b) => r) -> r
withObProd Ob (a && b) => r
r = r
Ob (a && b) => r
r
fst :: forall (a :: SHEAVES t j k) (b :: SHEAVES t j k).
(Ob a, Ob b) =>
(a && b) ~> a
fst @(SUB p) @(SUB q) = Prof (UN SUB a :*: UN SUB b) (UN SUB a)
-> Sub Prof (SUB (UN SUB a :*: UN SUB b)) (SUB (UN SUB a))
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub (forall k (a :: k) (b :: k).
(HasBinaryProducts k, Ob a, Ob b) =>
(a && b) ~> a
fst @(j +-> k) @p @q)
snd :: forall (a :: SHEAVES t j k) (b :: SHEAVES t j k).
(Ob a, Ob b) =>
(a && b) ~> b
snd @(SUB p) @(SUB q) = Prof (UN SUB a :*: UN SUB b) (UN SUB b)
-> Sub Prof (SUB (UN SUB a :*: UN SUB b)) (SUB (UN SUB b))
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub (forall k (a :: k) (b :: k).
(HasBinaryProducts k, Ob a, Ob b) =>
(a && b) ~> b
snd @(j +-> k) @p @q)
Sub Prof a1 b1
l &&& :: forall (a :: SHEAVES t j k) (x :: SHEAVES t j k)
(y :: SHEAVES t j k).
(a ~> x) -> (a ~> y) -> a ~> (x && y)
&&& Sub Prof a1 b1
r = Prof a1 (b1 :*: b1) -> Sub Prof (SUB a1) (SUB (b1 :*: b1))
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub (a1 ~> b1
Prof a1 b1
l (a1 ~> b1) -> (a1 ~> b1) -> a1 ~> (b1 && b1)
forall k (a :: k) (x :: k) (y :: k).
HasBinaryProducts k =>
(a ~> x) -> (a ~> y) -> a ~> (x && y)
forall (a :: k -> j -> Type) (x :: k -> j -> Type)
(y :: k -> j -> Type).
(a ~> x) -> (a ~> y) -> a ~> (x && y)
&&& a1 ~> b1
Prof a1 b1
r)
instance (Site t k, Enumerable j, Enumerable k) => HasEqualizers (SHEAVES t j k) where
equalize :: forall (a :: SHEAVES t j k) (b :: SHEAVES t j k) r.
(a ~> b)
-> (a ~> b) -> (forall (e :: SHEAVES t j k). (e ~> a) -> r) -> r
equalize (Sub (Prof a1 :~> b1
f)) (Sub (Prof a1 :~> b1
g)) forall (e :: SHEAVES t j k). (e ~> a) -> r
k = (a1 :~> b1)
-> (a1 :~> b1)
-> (forall (fs :: [[[[Nat]]]]).
KnownTable (Objects j) (Objects k) fs =>
(Reindex Subobject a1 fs :~> a1) -> r)
-> r
forall {j} {k} (p :: j +-> k) (q :: j +-> k) r.
(Finitary p, Finitary q, Enumerable j, Enumerable k) =>
(p :~> q)
-> (p :~> q)
-> (forall (fs :: [[[[Nat]]]]).
KnownTable (Objects j) (Objects k) fs =>
(Reindex Subobject p fs :~> p) -> r)
-> r
equalizeNat a1 a b -> b1 a b
a1 :~> b1
f a1 a b -> b1 a b
a1 :~> b1
g \Reindex Subobject a1 fs :~> a1
incl -> (SUB (Reindex Subobject a1 fs) ~> a) -> r
forall (e :: SHEAVES t j k). (e ~> a) -> r
k (Prof (Reindex Subobject a1 fs) a1
-> Sub Prof (SUB (Reindex Subobject a1 fs)) (SUB a1)
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub ((Reindex Subobject a1 fs :~> a1)
-> Prof (Reindex Subobject a1 fs) a1
forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Profunctor p, Profunctor q) =>
(p :~> q) -> Prof p q
Prof Reindex Subobject a1 fs a b -> a1 a b
Reindex Subobject a1 fs :~> a1
incl))
factorEqualizer :: forall (e :: SHEAVES t j k) (x :: SHEAVES t j k)
(e' :: SHEAVES t j k).
(e ~> x) -> (e' ~> x) -> e' ~> e
factorEqualizer (Sub (Prof a1 :~> b1
incl)) (Sub (Prof a1 :~> b1
h)) = Prof a1 a1 -> Sub Prof (SUB a1) (SUB a1)
forall {k} (ob :: OB k) (a1 :: k) (b1 :: k) (p :: CAT k).
(ob a1, ob b1) =>
p a1 b1 -> Sub p (SUB a1) (SUB b1)
Sub ((a1 :~> a1) -> Prof a1 a1
forall {j} {k} (p :: j +-> k) (q :: j +-> k).
(Profunctor p, Profunctor q) =>
(p :~> q) -> Prof p q
Prof ((a1 :~> b1) -> (a1 :~> b1) -> a1 :~> a1
forall {j} {k} (e :: j +-> k) (x :: j +-> k) (e' :: j +-> k).
(Finitary e, Finitary x, Profunctor e') =>
(e :~> x) -> (e' :~> x) -> e' :~> e
factorThroughEqualizer a1 a b -> b1 a b
a1 :~> b1
incl a1 a b -> b1 a b
a1 :~> b1
h))
instance (Site t k, Enumerable j, Enumerable k) => HasPullbacks (SHEAVES t j k)