{-# OPTIONS --without-K --safe #-}

-- Defines Restriction Category
--   https://ncatlab.org/nlab/show/restriction+category
-- but see also
--   https://github.com/jmchapman/restriction-categories

-- Notation choice: one of the interpretations is that the
-- restriction structure captures the "domain of definedness"
-- of a morphism, as a (partial) identity. As this is positive
-- information, we will use f ↓ (as a postfix operation) to
-- denote this. Note that computability theory uses the same
-- notation to mean definedness.

-- Note, as we're working in Setoid-Enriched Categories, we need
-- to add an explicit axiom, that ↓ preserves ≈
module Categories.Category.Restriction where

open import Level using (Level; _⊔_)

open import Categories.Category.Core using (Category)

private
  variable
    o  e : Level

record Restriction (C : Category o  e) : Set (o    e) where
  open Category C using (Obj; _⇒_; _∘_; _≈_; id)

  field
    _↓ :  {A B : Obj}  A  B  A  A
    -- partial identity on the right
    pidʳ : {A B : Obj} {f : A  B}  f  f   f
    -- the domain-of-definition arrows commute
    ↓-comm : {A B C : Obj} {f : A  B} {g : A  C}  f   g   g   f 
    -- domain-of-definition denests (on the right)
    ↓-denestʳ : {A B C : Obj} {f : A  B} {g : A  C}  (g  f )   g   f 
    -- domain-of-definition has a skew-commutative law
    ↓-skew-comm : {A B C : Obj} {g : A  B} {f : C  A}  g   f  f  (g  f) 
    -- and the new axiom, ↓ is a congruence
    ↓-cong : {A B : Obj} {f g : A  B}  f  g  f   g 

  -- it is convenient to define the total predicate in this context
  total : {A B : Obj} (f : A  B)  Set e
  total f = f   id