Tom de Jong, late February - early March 2020.
Jan - Mar 2022: Some additions, most notably on embeddings.

We define the way-below relation and the notion of a compact element in a
directed complete poset.

Contents
* Basic properties of the way-below relation and its interaction with the order.
* Definition of a compact element as an element that is way below itself.
* The compact elements are closed under existing finite joins.
* In an embedding-projection pair, the embedding preserves and reflects the
  way-below relation, and hence, compact elements.

\begin{code}

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

open import MLTT.Spartan
open import UF.FunExt
open import UF.PropTrunc

module DomainTheory.Basics.WayBelow
        (pt : propositional-truncations-exist)
        (fe : Fun-Ext)
        (๐“ฅ : Universe) -- where the index types for directed completeness live
       where

open PropositionalTruncation pt

open import UF.Equiv
open import UF.Subsingletons
open import UF.Subsingletons-FunExt

open import DomainTheory.Basics.Dcpo pt fe ๐“ฅ
open import DomainTheory.Basics.Miscelanea pt fe ๐“ฅ

way-below : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ โŸจ ๐““ โŸฉ โ†’ โŸจ ๐““ โŸฉ โ†’ ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡
way-below ๐““ x y = (I : ๐“ฅ ฬ‡ ) (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ) (ฮด : is-Directed ๐““ ฮฑ)
                โ†’ y โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮด
                โ†’ โˆƒ i ๊ž‰ I , x โŠ‘โŸจ ๐““ โŸฉ ฮฑ i

is-way-upperbound : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I : ๐“ฅ ฬ‡ } (x : โŸจ ๐““ โŸฉ) (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ)
                  โ†’ ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡
is-way-upperbound ๐““ {I} x ฮฑ = (i : I) โ†’ ฮฑ i โ‰ชโŸจ ๐““ โŸฉ x

syntax way-below ๐““ x y = x โ‰ชโŸจ ๐““ โŸฉ y

โ‰ช-to-โŠ‘ : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y : โŸจ ๐““ โŸฉ} โ†’ x โ‰ชโŸจ ๐““ โŸฉ y โ†’ x โŠ‘โŸจ ๐““ โŸฉ y
โ‰ช-to-โŠ‘ ๐““ {x} {y} u = โˆฅโˆฅ-rec (prop-valuedness ๐““ x y) ฮณ g
 where
  ฮฑ : ๐Ÿ™{๐“ฅ} โ†’ โŸจ ๐““ โŸฉ
  ฮฑ โ‹† = y
  ฮณ : (ฮฃ i ๊ž‰ ๐Ÿ™ , x โŠ‘โŸจ ๐““ โŸฉ ฮฑ i) โ†’ x โŠ‘โŸจ ๐““ โŸฉ y
  ฮณ (โ‹† , l) = l
  g : โˆƒ i ๊ž‰ ๐Ÿ™ , x โŠ‘โŸจ ๐““ โŸฉ ฮฑ i
  g = u ๐Ÿ™ ฮฑ ฮด (โˆ-is-upperbound ๐““ ฮด โ‹†)
   where
    ฮด : is-Directed ๐““ ฮฑ
    ฮด = (โˆฃ โ‹† โˆฃ , ฮต)
     where
      ฮต : (i j : ๐Ÿ™)
        โ†’ โˆƒ k ๊ž‰ ๐Ÿ™ , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฑ k ร— ฮฑ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ k
      ฮต โ‹† โ‹† = โˆฃ โ‹† , reflexivity ๐““ y , reflexivity ๐““ y โˆฃ

โŠ‘-โ‰ช-โŠ‘-to-โ‰ช : (๐““ : DCPO {๐“ค} {๐“ฃ}) {a b c d : โŸจ ๐““ โŸฉ}
           โ†’ a โŠ‘โŸจ ๐““ โŸฉ b
           โ†’ b โ‰ชโŸจ ๐““ โŸฉ c
           โ†’ c โŠ‘โŸจ ๐““ โŸฉ d
           โ†’ a โ‰ชโŸจ ๐““ โŸฉ d
โŠ‘-โ‰ช-โŠ‘-to-โ‰ช ๐““ {a} {b} {c} {d} lโ‚ u lโ‚‚ I ฮฑ ฮด m = ฮณ
 where
  ฮณ : โˆƒ i ๊ž‰ I , a โŠ‘โŸจ ๐““ โŸฉ ฮฑ i
  ฮณ = โˆฅโˆฅ-functor g h
   where
    g : (ฮฃ i ๊ž‰ I , b โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
      โ†’ (ฮฃ i ๊ž‰ I , a โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
    g (i , u) = (i , v)
     where
      v = a   โŠ‘โŸจ ๐““ โŸฉ[ lโ‚ ]
          b   โŠ‘โŸจ ๐““ โŸฉ[ u  ]
          ฮฑ i โˆŽโŸจ ๐““ โŸฉ
    h : โˆƒ i ๊ž‰ I , b โŠ‘โŸจ ๐““ โŸฉ ฮฑ i
    h = u I ฮฑ ฮด l
     where
      l = c     โŠ‘โŸจ ๐““ โŸฉ[ lโ‚‚ ]
          d     โŠ‘โŸจ ๐““ โŸฉ[ m  ]
          โˆ ๐““ ฮด โˆŽโŸจ ๐““ โŸฉ

โŠ‘-โ‰ช-to-โ‰ช : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y z : โŸจ ๐““ โŸฉ}
         โ†’ x โŠ‘โŸจ ๐““ โŸฉ y
         โ†’ y โ‰ชโŸจ ๐““ โŸฉ z
         โ†’ x โ‰ชโŸจ ๐““ โŸฉ z
โŠ‘-โ‰ช-to-โ‰ช ๐““ {x} {y} {z} l u = โŠ‘-โ‰ช-โŠ‘-to-โ‰ช ๐““ l u (reflexivity ๐““ z)

โ‰ช-โŠ‘-to-โ‰ช : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y z : โŸจ ๐““ โŸฉ}
         โ†’ x โ‰ชโŸจ ๐““ โŸฉ y
         โ†’ y โŠ‘โŸจ ๐““ โŸฉ z
         โ†’ x โ‰ชโŸจ ๐““ โŸฉ z
โ‰ช-โŠ‘-to-โ‰ช ๐““ {x} {y} {z} = โŠ‘-โ‰ช-โŠ‘-to-โ‰ช ๐““ (reflexivity ๐““ x)

โ‰ช-is-prop-valued : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y : โŸจ ๐““ โŸฉ} โ†’ is-prop (x โ‰ชโŸจ ๐““ โŸฉ y)
โ‰ช-is-prop-valued ๐““ = ฮ โ‚„-is-prop fe (ฮป I ฮฑ ฮด u โ†’ โˆฅโˆฅ-is-prop)

โ‰ช-is-antisymmetric : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y : โŸจ ๐““ โŸฉ}
                   โ†’ x โ‰ชโŸจ ๐““ โŸฉ y โ†’ y โ‰ชโŸจ ๐““ โŸฉ x โ†’ x ๏ผ y
โ‰ช-is-antisymmetric ๐““ {x} {y} u v =
 antisymmetry ๐““ x y (โ‰ช-to-โŠ‘ ๐““ u) (โ‰ช-to-โŠ‘ ๐““ v)

โ‰ช-is-transitive : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y z : โŸจ ๐““ โŸฉ}
                โ†’ x โ‰ชโŸจ ๐““ โŸฉ y โ†’ y โ‰ชโŸจ ๐““ โŸฉ z โ†’ x โ‰ชโŸจ ๐““ โŸฉ z
โ‰ช-is-transitive ๐““ {x} {y} {z} u v I ฮฑ ฮด l = u I ฮฑ ฮด k
 where
  k = y     โŠ‘โŸจ ๐““ โŸฉ[ โ‰ช-to-โŠ‘ ๐““ v ]
      z     โŠ‘โŸจ ๐““ โŸฉ[ l ]
      โˆ ๐““ ฮด โˆŽโŸจ ๐““ โŸฉ

\end{code}

An element is called compact if it way below itself.

\begin{code}

is-compact : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ โŸจ ๐““ โŸฉ โ†’ ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡
is-compact ๐““ x = x โ‰ชโŸจ ๐““ โŸฉ x

being-compact-is-prop : (๐““ : DCPO {๐“ค} {๐“ฃ}) (x : โŸจ ๐““ โŸฉ)
                      โ†’ is-prop (is-compact ๐““ x)
being-compact-is-prop ๐““ x = โ‰ช-is-prop-valued ๐““

compact-โŠ‘-โ‰ƒ-โ‰ช : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x : โŸจ ๐““ โŸฉ}
              โ†’ is-compact ๐““ x
              โ†’ {y : โŸจ ๐““ โŸฉ}
              โ†’ (x โŠ‘โŸจ ๐““ โŸฉ y) โ‰ƒ (x โ‰ชโŸจ ๐““ โŸฉ y)
compact-โŠ‘-โ‰ƒ-โ‰ช ๐““ {x} c {y} =
 logically-equivalent-props-are-equivalent
  (prop-valuedness ๐““ x y) (โ‰ช-is-prop-valued ๐““)
  (โ‰ช-โŠ‘-to-โ‰ช ๐““ c)
  (โ‰ช-to-โŠ‘ ๐““)

\end{code}

The compact elements are closed under existing finite joins.

\begin{code}

module _ where
 open import DomainTheory.Basics.Pointed pt fe ๐“ฅ

 โŠฅ-is-compact : (๐““ : DCPOโŠฅ {๐“ค} {๐“ฃ}) โ†’ is-compact (๐““ โป) (โŠฅ ๐““)
 โŠฅ-is-compact ๐““ I ฮฑ ฮด _ = โˆฅโˆฅ-functor h (inhabited-if-Directed (๐““ โป) ฮฑ ฮด)
  where
   h : I โ†’ ฮฃ i ๊ž‰ I , โŠฅ ๐““ โŠ‘โŸช ๐““ โŸซ ฮฑ i
   h i = (i , โŠฅ-is-least ๐““ (ฮฑ i))

 โŠฅ-โ‰ช : (๐““ : DCPOโŠฅ {๐“ค} {๐“ฃ}) (x : โŸช ๐““ โŸซ) โ†’ โŠฅ ๐““ โ‰ชโŸจ ๐““ โป โŸฉ x
 โŠฅ-โ‰ช ๐““ x = โ‰ช-โŠ‘-to-โ‰ช (๐““ โป) (โŠฅ-is-compact ๐““) (โŠฅ-is-least ๐““ x)

binary-join-is-compact : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y z : โŸจ ๐““ โŸฉ}
                       โ†’ x โŠ‘โŸจ ๐““ โŸฉ z โ†’ y โŠ‘โŸจ ๐““ โŸฉ z
                       โ†’ ((d : โŸจ ๐““ โŸฉ) โ†’ x โŠ‘โŸจ ๐““ โŸฉ d โ†’ y โŠ‘โŸจ ๐““ โŸฉ d โ†’ z โŠ‘โŸจ ๐““ โŸฉ d)
                       โ†’ is-compact ๐““ x โ†’ is-compact ๐““ y โ†’ is-compact ๐““ z
binary-join-is-compact
 ๐““ {x} {y} {z} x-below-z y-below-z z-lb-of-ubs x-cpt y-cpt = ฮณ
  where
   ฮณ : is-compact ๐““ z
   ฮณ I ฮฑ ฮด z-below-โˆฮฑ = โˆฅโˆฅ-recโ‚‚ โˆƒ-is-prop f
                         (x-cpt I ฮฑ ฮด (x     โŠ‘โŸจ ๐““ โŸฉ[ x-below-z ]
                                       z     โŠ‘โŸจ ๐““ โŸฉ[ z-below-โˆฮฑ ]
                                       โˆ ๐““ ฮด โˆŽโŸจ ๐““ โŸฉ))
                         (y-cpt I ฮฑ ฮด (y     โŠ‘โŸจ ๐““ โŸฉ[ y-below-z ]
                                       z     โŠ‘โŸจ ๐““ โŸฉ[ z-below-โˆฮฑ ]
                                       โˆ ๐““ ฮด โˆŽโŸจ ๐““ โŸฉ))
    where
     f : (ฮฃ i ๊ž‰ I , x โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
       โ†’ (ฮฃ j ๊ž‰ I , y โŠ‘โŸจ ๐““ โŸฉ ฮฑ j)
       โ†’ (โˆƒ k ๊ž‰ I , z โŠ‘โŸจ ๐““ โŸฉ ฮฑ k)
     f (i , x-below-ฮฑแตข) (j , y-below-ฮฑโฑผ) =
      โˆฅโˆฅ-functor g (semidirected-if-Directed ๐““ ฮฑ ฮด i j)
       where
        g : (ฮฃ k ๊ž‰ I , (ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฑ k) ร— (ฮฑ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ k))
          โ†’ ฮฃ k ๊ž‰ I , z โŠ‘โŸจ ๐““ โŸฉ ฮฑ k
        g (k , lแตข , lโฑผ) =
         (k , z-lb-of-ubs (ฮฑ k)
               (x   โŠ‘โŸจ ๐““ โŸฉ[ x-below-ฮฑแตข ]
                ฮฑ i โŠ‘โŸจ ๐““ โŸฉ[ lแตข ]
                ฮฑ k โˆŽโŸจ ๐““ โŸฉ)
               (y   โŠ‘โŸจ ๐““ โŸฉ[ y-below-ฮฑโฑผ ]
                ฮฑ j โŠ‘โŸจ ๐““ โŸฉ[ lโฑผ ]
                ฮฑ k โˆŽโŸจ ๐““ โŸฉ))

\end{code}

If we have a continuous section s with continuous retraction r, then y โ‰ช s x
implies r y โ‰ช x for all elements x and y.

\begin{code}

module _
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        (๐“” : DCPO {๐“ค'} {๐“ฃ'})
        (ฯ : ๐““ continuous-retract-of ๐“”)
       where

 open _continuous-retract-of_ ฯ

 continuous-retraction-โ‰ช-criterion : (y : โŸจ ๐“” โŸฉ) (x : โŸจ ๐““ โŸฉ)
                                   โ†’ y โ‰ชโŸจ ๐“” โŸฉ s x
                                   โ†’ r y โ‰ชโŸจ ๐““ โŸฉ x
 continuous-retraction-โ‰ช-criterion y x y-way-below-sx I ฮฑ ฮด x-below-โˆฮฑ =
  โˆฅโˆฅ-functor h (y-way-below-sx I (s โˆ˜ ฮฑ) ฮต l)
   where
    ฮต : is-Directed ๐“” (s โˆ˜ ฮฑ)
    ฮต = image-is-directed' ๐““ ๐“” ๐•ค ฮด
    l : s x โŠ‘โŸจ ๐“” โŸฉ โˆ ๐“” ฮต
    l = s x       โŠ‘โŸจ ๐“” โŸฉ[ monotone-if-continuous ๐““ ๐“” ๐•ค x (โˆ ๐““ ฮด) x-below-โˆฮฑ ]
        s (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ[ continuous-โˆ-โŠ‘ ๐““ ๐“” ๐•ค ฮด ]
        โˆ ๐“” ฮต     โˆŽโŸจ ๐“” โŸฉ
    h : (ฮฃ i ๊ž‰ I , y โŠ‘โŸจ ๐“” โŸฉ s (ฮฑ i))
      โ†’ (ฮฃ i ๊ž‰ I , r y โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
    h (i , u) = (i , v)
     where
      v = r y         โŠ‘โŸจ ๐““ โŸฉ[ monotone-if-continuous ๐“” ๐““ ๐•ฃ y (s (ฮฑ i)) u ]
          r (s (ฮฑ i)) โŠ‘โŸจ ๐““ โŸฉ[ ๏ผ-to-โŠ‘ ๐““ (s-section-of-r (ฮฑ i)) ]
          ฮฑ i         โˆŽโŸจ ๐““ โŸฉ

\end{code}

In an embedding-projection pair, the embedding preserves and reflects the
way-below relation, and hence, compact elements.

\begin{code}

module _
        (๐““ : DCPO {๐“ค}  {๐“ฃ} )
        (๐“” : DCPO {๐“ค'} {๐“ฃ'})
        (ฮต : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ)
        (ฮต-is-continuous : is-continuous ๐““ ๐“” ฮต)
        (ฯ€ : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““ โŸฉ)
        (ฯ€-is-continuous : is-continuous ๐“” ๐““ ฯ€)
        (ฯ€-ฮต-retraction : (x : โŸจ ๐““ โŸฉ) โ†’ ฯ€ (ฮต x) ๏ผ x)
        (ฮต-ฯ€-deflation : (y : โŸจ ๐“” โŸฉ) โ†’ ฮต (ฯ€ y) โŠ‘โŸจ ๐“” โŸฉ y)
       where

 embeddings-preserve-โ‰ช : (x y : โŸจ ๐““ โŸฉ) โ†’ x โ‰ชโŸจ ๐““ โŸฉ y โ†’ ฮต x โ‰ชโŸจ ๐“” โŸฉ ฮต y
 embeddings-preserve-โ‰ช x y x-way-below-y I ฮฑ ฮด ฮตx-below-โˆฮฑ =
  โˆฅโˆฅ-functor h (x-way-below-y I (ฯ€ โˆ˜ ฮฑ) ฮด' y-below-โˆฯ€ฮฑ)
   where
    ฮด' : is-Directed ๐““ (ฯ€ โˆ˜ ฮฑ)
    ฮด' = image-is-directed' ๐“” ๐““ (ฯ€ , ฯ€-is-continuous) ฮด
    y-below-โˆฯ€ฮฑ = y         โŠ‘โŸจ ๐““ โŸฉ[ โฆ…1โฆ† ]
                  ฯ€ (ฮต y)   โŠ‘โŸจ ๐““ โŸฉ[ โฆ…2โฆ† ]
                  ฯ€ (โˆ ๐“” ฮด) โŠ‘โŸจ ๐““ โŸฉ[ โฆ…3โฆ† ]
                  โˆ ๐““ ฮด'    โˆŽโŸจ ๐““ โŸฉ
     where
      โฆ…1โฆ† = ๏ผ-to-โŠ‘ ๐““ ((ฯ€-ฮต-retraction y) โปยน)
      โฆ…2โฆ† = monotone-if-continuous ๐“” ๐““ (ฯ€ , ฯ€-is-continuous) (ฮต y) (โˆ ๐“” ฮด)
             ฮตx-below-โˆฮฑ
      โฆ…3โฆ† = continuous-โˆ-โŠ‘ ๐“” ๐““ (ฯ€ , ฯ€-is-continuous) ฮด
    h : (ฮฃ i ๊ž‰ I , x   โŠ‘โŸจ ๐““ โŸฉ ฯ€ (ฮฑ i))
      โ†’ (ฮฃ i ๊ž‰ I , ฮต x โŠ‘โŸจ ๐“” โŸฉ ฮฑ i)
    h (i , u) = (i , (ฮต x         โŠ‘โŸจ ๐“” โŸฉ[ โฆ…1โฆ† ]
                      ฮต (ฯ€ (ฮฑ i)) โŠ‘โŸจ ๐“” โŸฉ[ โฆ…2โฆ† ]
                      ฮฑ i         โˆŽโŸจ ๐“” โŸฉ))
     where
      โฆ…1โฆ† = monotone-if-continuous ๐““ ๐“” (ฮต , ฮต-is-continuous) x (ฯ€ (ฮฑ i)) u
      โฆ…2โฆ† = ฮต-ฯ€-deflation (ฮฑ i)

 embeddings-preserve-compactness : (x : โŸจ ๐““ โŸฉ)
                                 โ†’ is-compact ๐““ x โ†’ is-compact ๐“” (ฮต x)
 embeddings-preserve-compactness x = embeddings-preserve-โ‰ช x x

 embeddings-reflect-โ‰ช : (x y : โŸจ ๐““ โŸฉ) โ†’ ฮต x โ‰ชโŸจ ๐“” โŸฉ ฮต y โ†’ x โ‰ชโŸจ ๐““ โŸฉ y
 embeddings-reflect-โ‰ช x y l = transport (ฮป - โ†’ - โ‰ชโŸจ ๐““ โŸฉ y) (ฯ€-ฮต-retraction x) lem
  where
   lem : ฯ€ (ฮต x) โ‰ชโŸจ ๐““ โŸฉ y
   lem = continuous-retraction-โ‰ช-criterion ๐““ ๐“” ฯ (ฮต x) y l
    where
     ฯ : ๐““ continuous-retract-of ๐“”
     ฯ = record
           { s = ฮต
           ; r = ฯ€
           ; s-section-of-r = ฯ€-ฮต-retraction
           ; s-is-continuous = ฮต-is-continuous
           ; r-is-continuous = ฯ€-is-continuous
           }

 embeddings-reflect-compactness : (x : โŸจ ๐““ โŸฉ)
                                โ†’ is-compact ๐“” (ฮต x)
                                โ†’ is-compact ๐““ x
 embeddings-reflect-compactness x = embeddings-reflect-โ‰ช x x

\end{code}