--------------------------------------------------------------------------------
title:          Directed families on posets
author:         Ayberk Tosun
date-started:   2024-05-06
--------------------------------------------------------------------------------

This module contains generalizations of notions from the
`Locales.DirectedFamily` module in which things were defined only for frames.

That module is now obsolete and should be removed in favour of this one.

\begin{code}

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

open import Slice.Family
open import UF.FunExt
open import UF.PropTrunc
open import UF.SubtypeClassifier

module Locales.DirectedFamily-Poset (pt : propositional-truncations-exist)
                                    (fe : Fun-Ext) where

open import Locales.Frame pt fe hiding (is-directed)
open import MLTT.Spartan
open import UF.Logic

open AllCombinators pt fe
open PropositionalTruncation pt

\end{code}

We work in a module parameterized by two posets `P` and `Q`.

\begin{code}

module Directed-Families-On-Posets (P : Poset 𝓤 𝓥) (Q : Poset 𝓤' 𝓥') where

\end{code}

We denote the carrier sets of `P` and `Q` by `∣P∣` and `∣Q∣` respectively.

\begin{code}

 ∣P∣ =  P ∣ₚ
 ∣Q∣ =  Q ∣ₚ

 open import Locales.DirectedFamily pt fe  x y  x ≤[ P ] y)
  using ()
  renaming (is-directed to is-directed₁)
 open import Locales.DirectedFamily pt fe  x y  x ≤[ Q ] y)
  using (is-closed-under-binary-upper-bounds)
  renaming (is-directed to is-directed₂)

\end{code}

Given any monotone function `f : P → Q` and any directed family `S`, the image
of `f` on `S` is also a directed family.

\begin{code}

 monotone-image-on-directed-set-is-directed : ((f , _) : P ─m→ Q)
                                             (S : Fam 𝓤   P ∣ₚ)
                                             is-directed₁ S holds
                                             is-directed₂  f x  x ε S  holds
 monotone-image-on-directed-set-is-directed (f , 𝓂) S (ι , υ) = ι , 
  where
    : is-closed-under-binary-upper-bounds  f x  x ε S  holds
    i j = ∥∥-rec ∃-is-prop  (υ i j)
    where
      : Σ k  index S ,
           (S [ i ] ≤[ P ] S [ k ]) holds × ((S [ j ] ≤[ P ] S [ k ]) holds)
         k  index S ,
           (f (S [ i ]) ≤[ Q ] f (S [ k ])  (f (S [ j ]) ≤[ Q ] f (S [ k ])))
         holds
      (k , p , q) =  k , (𝓂 (S [ i ] , S [ k ]) p , 𝓂 (S [ j ] , S [ k ]) q) 

\end{code}