module Cat.Allegory.Maps where

Maps in allegories🔗

Suppose we have an allegory — for definiteness you could consider the archetypal allegory — but what we really wanted was to get our hands on an ordinary category. That is: we want, given some category of “sets and relations”, to recover the associated category of “sets and functions”. So, let’s start by thinking about

If you have a relation when does it correspond to a function Well, it must definitely be functional: if we want to represent “”, then surely if we must have In allegorical language, we would say which we can calculate to mean (in that, for all

It must also be an entire relation: Every must at least one it is related to, and by functionality, exactly one it is related to. This is the “value of” the function at

module _ {o  h} (A : Allegory o  h) where
  open Cat.Allegory.Morphism A
  record is-map x y (f : Hom x y) : Type h where
    constructor mapping
    field
      functional : is-functional f
      entire     : is-entire f

module _ {o  h} {A : Allegory o  h} where
  open Allegory A
  open is-map
  instance
    H-Level-is-map :  {x y} {f : Hom x y} {n}  H-Level (is-map A x y f) (suc n)
    H-Level-is-map = prop-instance {T = is-map A _ _ _} λ where
      x y i .functional  ≤-thin (x .functional) (y .functional) i
      x y i .entire      ≤-thin (x .entire) (y .entire) i

We can calculate that a functional entire relation is precisely a function between sets: Functionality ensures that (fixing a point in the domain) the space of “points in the codomain related to ” is a subsingleton, and entireness ensures that it is inhabited; By unique choice, we can project the value of the function.

Rel-map→function
  :  {} {x y : Set } {f : Allegory.Hom (Rel ) x y}
   is-map (Rel ) x y f
    x    y 
Rel-map→function {x = x} {y} {rel} map elt =
  ∥-∥-rec {P = Σ  y  λ b   rel elt b }
     { (x , p) (y , q)  Σ-prop-path! (functional' p q) })
     x  x)
    (entire' elt) .fst
  where
    module map = is-map map
    functional' :  {a b c}   rel a b    rel a c   b  c
    functional' r1 r2 = □-out! (map.functional _ _ (inc (_ , r1 , r2)))

    entire' :  a    y  λ b   rel a b 
    entire' a = case map.entire a a (inc refl) of λ x _ a~x  inc (x , a~x)

The category of maps🔗

Given an allegory we can form a category with the same objects as but considering only the maps (rather than arbitrary relations).

module _ {o  h} (A : Allegory o  h) where
  private module A = Cat.Allegory.Morphism A
  open is-map
  open Precategory hiding (_∘_ ; id)
  open A using (_† ; _∘_ ; id ; _◀_ ; _▶_)

  Maps[_] : Precategory _ _
  Maps[_] .Ob  = A.Ob
  Maps[_] .Hom x y = Σ (A.Hom x y) (is-map A x y)
  Maps[_] .Hom-set x y = hlevel 2

Proving that maps compose is a bit annoying, but it follows from the properties of the duality involution. By the way: This is essentially the proof that adjunctions compose! This is because, sneakily, the property “being a map” is defined to be but without using those words.

  Maps[_] .Precategory.id = A.id , mapping
    A.functional-id
    A.entire-id
  Maps[_] .Precategory._∘_ (f , m) (g , m') =
    f A.∘ g , mapping
      (A.functional-∘ (m .functional) (m' .functional))
      (A.entire-∘ (m .entire) (m' .entire))
  Maps[_] .idr f = Σ-prop-path! (A.idr _)
  Maps[_] .idl f = Σ-prop-path! (A.idl _)
  Maps[_] .assoc f g h = Σ-prop-path! (A.assoc _ _ _)