module Cat.Diagram.Separator.Strong
  {o }
  (C : Precategory o )
  (coprods : (I : Set )  has-coproducts-indexed-by C  I )
  where

Strong separators🔗

Recall that a separating object lets us determine equality of morphisms solely by examining objects. This leads to a natural question: what other properties of morphisms can we compute like this? In our case: can we determine if a map is invertible by restricting to generalized objects? Generally speaking, the answer is no, but it is possible if we strengthen our notion of separating object.

Let be a category with set-indexed coproducts. An object is a strong separator if the canonical map is a strong epi.

is-strong-separator : Ob  Type (o  )
is-strong-separator s =  {x}  is-strong-epi (⊗!.match (Hom s x) s λ e  e)

We can also weaken this definition to a family of objects.

A family of objects is a strong separating family if the canonical map is a strong epi.

is-strong-separating-family
  :  (Idx : Set )
   (sᵢ :  Idx   Ob)
   Type (o  )
is-strong-separating-family Idx sᵢ =
   {x}  is-strong-epi (∐!.match (Σ[ i   Idx  ] (Hom (sᵢ i) x)) (sᵢ  fst) snd)

Strong separators are separators. This follows from the fact that an object is a separator if and only if the canonical map is an epi.

strong-separator→separator
  : is-strong-separator s
   is-separator s
strong-separator→separator strong =
  epi→separator coprods (strong .fst)

A similar line of reasoning shows that strong separating families are separating families.

strong-separating-family→separating-family
  :  (Idx : Set ) (sᵢ :  Idx   Ob)
   is-strong-separating-family Idx sᵢ
   is-separating-family sᵢ
strong-separating-family→separating-family Idx sᵢ strong =
  epi→separating-family coprods Idx sᵢ (strong .fst)

Extremal separators🔗

For reasons that we will see shortly, it is useful to weaken the notion of strong separators to extremal epimorphisms.

Let be a category with set-indexed coproducts. An object is a strong separator if the canonical map is an extremal epi.

is-extremal-separator : Ob  Type (o  )
is-extremal-separator s =  {x}  is-extremal-epi (⊗!.match (Hom s x) s λ e  e)

A family of objects is a extremal separating family if the canonical map is a strong epi.

is-extremal-separating-family
  :  (Idx : Set )
   (sᵢ :  Idx   Ob)
   Type (o  )
is-extremal-separating-family Idx sᵢ =
   {x}  is-extremal-epi (∐!.match (Σ[ i   Idx  ] (Hom (sᵢ i) x)) (sᵢ  fst) snd)

Via a general result involving strong and extremal epis, strong separators are extremal.

strong-separator→extremal-separator
  : is-strong-separator s
   is-extremal-separator s
strong-separator→extremal-separator strong =
  is-strong-epi→is-extremal-epi strong

strong-separating-family→extremal-separating-family
  :  (Idx : Set )
   (sᵢ :  Idx   Ob)
   is-strong-separating-family Idx sᵢ
   is-extremal-separating-family Idx sᵢ
strong-separating-family→extremal-separating-family Idx sᵢ strong =
  is-strong-epi→is-extremal-epi strong

Moreover, if has all finite limits, then extremal separators are strong.

lex+extremal-separator→strong-separator
  : Finitely-complete C
   is-extremal-separator s
   is-strong-separator s
lex+extremal-separator→strong-separator lex extremal =
  is-extremal-epi→is-strong-epi lex extremal

lex+extremal-separating-family→strong-separating-family
  :  (Idx : Set )
   (sᵢ :  Idx   Ob)
   Finitely-complete C
   is-extremal-separating-family Idx sᵢ
   is-strong-separating-family Idx sᵢ
lex+extremal-separating-family→strong-separating-family Idx sᵢ lex extremal =
  is-extremal-epi→is-strong-epi lex extremal

Functorial definitions🔗

We shall now prove our claim that a strong separator allows us to distinguish invertible morphisms purely by checking invertibility at elements. More precisely, if is a strong separator, then is conservative.

strong-separator→conservative
  :  {s}
   is-strong-separator s
   is-conservative (Hom-from C s)

Suppose that is a morphism such that is invertible for every We shall show that itself is invertible by showing that it is both a strong epi and a monomorphism.

strong-separator→conservative {s = s} strong {A = a} {B = b} {f = f} f∘-inv =
  strong-epi+mono→invertible
    f-strong-epi
    f-mono
  where
    module f∘- = Equiv (f ∘_ , is-invertible→is-equiv f∘-inv)

Showing that is monic is pretty straightforward. Suppose that we have such that Because is a separator, we can show that by showing that for some element Moreover, postcomposition with is injective on morphisms with domain so it suffices to prove that this follows directly from our hypothesis.

    f-mono : is-monic f
    f-mono u v p =
      strong-separator→separator strong λ e 
      f∘-.injective (extendl p)

Proving that is a strong epi is a bit more work. First, note that we can construct a map by applying the inverse of moreover, this map factorizes the canonical map

    f* : Hom ((Hom s b) ⊗! s) a
    f* = ⊗!.match (Hom s b) s λ e  f∘-.from e

    f*-factors : f  f*  ⊗!.match (Hom s b) s  e  e)
    f*-factors = ⊗!.unique _ _ _ λ e 
      (f  f*)  ⊗!.ι (Hom s b) s e ≡⟨ pullr (⊗!.commute (Hom s b) s) 
      f  f∘-.from e                ≡⟨ f∘-.ε e 
      e                             

By definition, the canonical map is a strong epi. Moreover, if a composite is a strong epi, then is a strong epi. If we apply this observation to our factorization, we immediately see that is a strong epi.

    f-strong-epi : is-strong-epi f
    f-strong-epi =
      strong-epi-cancelr f f* $
      subst is-strong-epi (sym f*-factors) strong

Conversely, if is conservative, then is an extremal separator. The proof here is some basic data manipulation, so we do not dwell on it too deeply.

conservative→extremal-separator
  :  {s}
   is-conservative (Hom-from C s)
   is-extremal-separator s
conservative→extremal-separator f∘-conservative m f p =
  f∘-conservative $
  is-equiv→is-invertible $
  is-iso→is-equiv $ iso
     e  f  ⊗!.ι _ _ e)
     f*  pulll (sym p)  ⊗!.commute _ _)
     e  m .monic _ _ (pulll (sym p)  ⊗!.commute _ _))

In particular, if is finitely complete, then conservativity of implies that is a strong separator.

lex+conservative→strong-separator
  :  {s}
   Finitely-complete C
   is-conservative (Hom-from C s)
   is-strong-separator s
lex+conservative→strong-separator lex f∘-conservative =
  is-extremal-epi→is-strong-epi lex $
  conservative→extremal-separator f∘-conservative

We can generalize these results to separating families by considering jointly conservative functors.

strong-separating-family→jointly-conservative
  :  (Idx : Set ) (sᵢ :  Idx   Ob)
   is-strong-separating-family Idx sᵢ
   is-jointly-conservative  i  Hom-from C (sᵢ i))

jointly-conservative→extremal-separating-family
  :  (Idx : Set ) (sᵢ :  Idx   Ob)
   Finitely-complete C
   is-jointly-conservative  i  Hom-from C (sᵢ i))
   is-extremal-separating-family Idx sᵢ

lex+jointly-conservative→strong-separating-family
  :  (Idx : Set ) (sᵢ :  Idx   Ob)
   Finitely-complete C
   is-jointly-conservative  i  Hom-from C (sᵢ i))
   is-strong-separating-family Idx sᵢ
The proofs are identical to their non-familial counterparts, so we omit the details.
strong-separating-family→jointly-conservative Idx sᵢ strong {x = a} {y = b} {f = f} f∘ᵢ-inv =
  strong-epi+mono→invertible
    f-strong-epi
    f-mono
  where
    module f∘- {i :  Idx } = Equiv (_ , is-invertible→is-equiv (f∘ᵢ-inv i))

    f-mono : is-monic f
    f-mono u v p =
      strong-separating-family→separating-family Idx sᵢ strong λ eᵢ 
      f∘-.injective (extendl p)

    f* : Hom (∐! (Σ[ i   Idx  ] (Hom (sᵢ i) b)) (sᵢ  fst)) a
    f* = ∐!.match _ _ (f∘-.from  snd)

    f*-factors : f  f*  ∐!.match (Σ[ i   Idx  ] (Hom (sᵢ i) b)) (sᵢ  fst) snd
    f*-factors =
      ∐!.unique _ _ _ λ (i , eᵢ) 
      (f  f*)  ∐!.ι _ _ (i , eᵢ) ≡⟨ pullr (∐!.commute _ _) 
      f  f∘-.from eᵢ              ≡⟨ f∘-.ε eᵢ 
      eᵢ                           

    f-strong-epi : is-strong-epi f
    f-strong-epi =
      strong-epi-cancelr f f* $
      subst is-strong-epi (sym f*-factors) strong

jointly-conservative→extremal-separating-family Idx sᵢ lex f∘-conservative m f p =
  f∘-conservative $ λ i 
  is-equiv→is-invertible $
  is-iso→is-equiv $ iso
     eᵢ  f  ∐!.ι _ _ (i , eᵢ))
     f*  pulll (sym p)  ∐!.commute _ _)
     eᵢ  m .monic _ _ (pulll (sym p)  ∐!.commute _ _))

lex+jointly-conservative→strong-separating-family Idx sᵢ lex f∘-conservative =
  is-extremal-epi→is-strong-epi lex $
  jointly-conservative→extremal-separating-family Idx sᵢ lex f∘-conservative