Tom de Jong, January 2020.

December 2021: Added material on semidirected and subsingleton suprema.
June 2022: Refactored and moved some material around to/from other files.

A collection of various useful definitions and facts on directed complete posets
and Scott continuous maps between them.

Table of contents
 * Lemmas for establishing Scott continuity of maps between dcpos.
 * Continuity of basic functions (constant functions, identity, composition).
 * Definitions of isomorphisms of dcpos, continuous retracts and
   embedding-projection pairs.
 * Defining local smallness for dcpos and showing it is preserved by continuous
   retracts.
 * Lemmas involving (joins of) cofinal directed families.
 * Reindexing directed families.
 * Suprema of ฯ‰-chains (added 23 June 2024).
 * Subdcpo induced by a subset/property (added 18th Feb 2024 by Martin Escardo).

\begin{code}

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

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

module DomainTheory.Basics.Miscelanea
        (pt : propositional-truncations-exist)
        (fe : Fun-Ext)
        (๐“ฅ : Universe)
       where

private
 fe' : FunExt
 fe' _ _ = fe

open PropositionalTruncation pt

open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.Size hiding (is-small ; is-locally-small)
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.UniverseEmbedding

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

\end{code}

Some preliminary basic lemmas.

\begin{code}

โˆ-is-monotone : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I : ๐“ฅ ฬ‡ } {ฮฑ ฮฒ : I โ†’ โŸจ ๐““ โŸฉ}
                (ฮด : is-Directed ๐““ ฮฑ) (ฮต : is-Directed ๐““ ฮฒ)
              โ†’ ((i : I) โ†’ ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ i)
              โ†’ โˆ ๐““ ฮด โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮต
โˆ-is-monotone ๐““ {I} {ฮฑ} {ฮฒ} ฮด ฮต l = โˆ-is-lowerbound-of-upperbounds ๐““ ฮด (โˆ ๐““ ฮต) ฮณ
 where
  ฮณ : (i : I) โ†’ ฮฑ i โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮต
  ฮณ i = ฮฑ i   โŠ‘โŸจ ๐““ โŸฉ[ l i ]
        ฮฒ i   โŠ‘โŸจ ๐““ โŸฉ[ โˆ-is-upperbound ๐““ ฮต i ]
        โˆ ๐““ ฮต โˆŽโŸจ ๐““ โŸฉ

โˆ-independent-of-directedness-witness : (๐““ : DCPO {๐“ค} {๐“ฃ})
                                        {I : ๐“ฅ ฬ‡ } {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                                        (ฮด ฮต : is-Directed ๐““ ฮฑ)
                                      โ†’ โˆ ๐““ ฮด ๏ผ โˆ ๐““ ฮต
โˆ-independent-of-directedness-witness ๐““ {I} {ฮฑ} ฮด ฮต = ap (โˆ ๐““) p
 where
  p : ฮด ๏ผ ฮต
  p = being-directed-is-prop (underlying-order ๐““) ฮฑ ฮด ฮต

โˆ-family-๏ผ : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I : ๐“ฅ ฬ‡ } {ฮฑ ฮฒ : I โ†’ โŸจ ๐““ โŸฉ}
             (p : ฮฑ ๏ผ ฮฒ) (ฮด : is-Directed ๐““ ฮฑ)
           โ†’ โˆ ๐““ {I} {ฮฑ} ฮด ๏ผ โˆ ๐““ {I} {ฮฒ} (transport (is-Directed ๐““) p ฮด)
โˆ-family-๏ผ ๐““ {I} {ฮฑ} {ฮฑ} refl ฮด = refl

โˆ-family-๏ผ' : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I : ๐“ฅ ฬ‡ } {ฮฑ ฮฒ : I โ†’ โŸจ ๐““ โŸฉ}
              (h : ฮฑ โˆผ ฮฒ) (ฮด : is-Directed ๐““ ฮฑ) (ฮต : is-Directed ๐““ ฮฒ)
            โ†’ โˆ ๐““ {I} {ฮฑ} ฮด ๏ผ โˆ ๐““ {I} {ฮฒ} ฮต
โˆ-family-๏ผ' ๐““ {I} {ฮฑ} {ฮฒ} h ฮด ฮต =
 โˆ-family-๏ผ ๐““ (dfunext fe h) ฮด โˆ™ โˆ-independent-of-directedness-witness ๐““ _ ฮต

to-continuous-function-๏ผ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                           {f g : DCPO[ ๐““ , ๐“” ]}
                         โ†’ [ ๐““ , ๐“” ]โŸจ f โŸฉ โˆผ [ ๐““ , ๐“” ]โŸจ g โŸฉ
                         โ†’ f ๏ผ g
to-continuous-function-๏ผ ๐““ ๐“” h =
 to-subtype-๏ผ (being-continuous-is-prop ๐““ ๐“”) (dfunext fe h)

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

๏ผ-to-โŠ’ : (๐““ : DCPO {๐“ค} {๐“ฃ}) {x y : โŸจ ๐““ โŸฉ} โ†’ y ๏ผ x โ†’ x โŠ‘โŸจ ๐““ โŸฉ y
๏ผ-to-โŠ’ ๐““ p = ๏ผ-to-โŠ‘ ๐““ (p โปยน)

is-monotone : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
            โ†’ (โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ) โ†’ ๐“ค โŠ” ๐“ฃ โŠ” ๐“ฃ' ฬ‡
is-monotone ๐““ ๐“” f = (x y : โŸจ ๐““ โŸฉ) โ†’ x โŠ‘โŸจ ๐““ โŸฉ y โ†’ f x โŠ‘โŸจ ๐“” โŸฉ f y

is-inflationary : (๐““ : DCPO {๐“ค} {๐“ฃ})
                โ†’ (โŸจ ๐““ โŸฉ โ†’ โŸจ ๐““ โŸฉ) โ†’ ๐“ค โŠ” ๐“ฃ ฬ‡
is-inflationary ๐““ f = (x : โŸจ ๐““ โŸฉ) โ†’ x โŠ‘โŸจ ๐““ โŸฉ f x

\end{code}

Lemmas for establishing Scott continuity of maps between dcpos.

\begin{code}

image-is-directed : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                    {f : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ}
                  โ†’ is-monotone ๐““ ๐“” f
                  โ†’ {I : ๐“ฅ ฬ‡ }
                  โ†’ {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                  โ†’ is-Directed ๐““ ฮฑ
                  โ†’ is-Directed ๐“” (f โˆ˜ ฮฑ)
image-is-directed ๐““ ๐“” {f} m {I} {ฮฑ} ฮด =
 inhabited-if-Directed ๐““ ฮฑ ฮด , ฮณ
  where
   ฮณ : is-semidirected (underlying-order ๐“”) (f โˆ˜ ฮฑ)
   ฮณ i j = โˆฅโˆฅ-functor (ฮป (k , u , v) โ†’ k , m (ฮฑ i) (ฮฑ k) u , m (ฮฑ j) (ฮฑ k) v)
                      (semidirected-if-Directed ๐““ ฮฑ ฮด i j)

continuity-criterion : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                       (f : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ)
                     โ†’ (m : is-monotone ๐““ ๐“” f)
                     โ†’ ((I : ๐“ฅ ฬ‡ )
                        (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ)
                        (ฮด : is-Directed ๐““ ฮฑ)
                     โ†’ f (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ โˆ ๐“” (image-is-directed ๐““ ๐“” m ฮด))
                     โ†’ is-continuous ๐““ ๐“” f
continuity-criterion ๐““ ๐“” f m e I ฮฑ ฮด = ub , lb-of-ubs
 where
  ub : (i : I) โ†’ f (ฮฑ i) โŠ‘โŸจ ๐“” โŸฉ f (โˆ ๐““ ฮด)
  ub i = m (ฮฑ i) (โˆ ๐““ ฮด) (โˆ-is-upperbound ๐““ ฮด i)
  ฮต : is-Directed ๐“” (f โˆ˜ ฮฑ)
  ฮต = image-is-directed ๐““ ๐“” m ฮด
  lb-of-ubs : is-lowerbound-of-upperbounds (underlying-order ๐“”)
              (f (โˆ ๐““ ฮด)) (f โˆ˜ ฮฑ)
  lb-of-ubs y u = f (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ[ e I ฮฑ ฮด  ]
                  โˆ ๐“” ฮต     โŠ‘โŸจ ๐“” โŸฉ[ โˆ-is-lowerbound-of-upperbounds ๐“” ฮต y u ]
                  y         โˆŽโŸจ ๐“” โŸฉ

continuity-criterion' : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                        (f : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ)
                      โ†’ (m : is-monotone ๐““ ๐“” f)
                      โ†’ ((I : ๐“ฅ ฬ‡ )
                         (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ)
                         (ฮด : is-Directed ๐““ ฮฑ)
                      โ†’ is-lowerbound-of-upperbounds (underlying-order ๐“”)
                                                     (f (โˆ ๐““ ฮด)) (f โˆ˜ ฮฑ))
                      โ†’ is-continuous ๐““ ๐“” f
continuity-criterion' ๐““ ๐“” f m lb I ฮฑ ฮด = ub , lb I ฮฑ ฮด
 where
  ub : (i : I) โ†’ f (ฮฑ i) โŠ‘โŸจ ๐“” โŸฉ f (โˆ ๐““ ฮด)
  ub i = m (ฮฑ i) (โˆ ๐““ ฮด) (โˆ-is-upperbound ๐““ ฮด i)

monotone-if-continuous : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                         (f : DCPO[ ๐““ , ๐“” ])
                       โ†’ is-monotone ๐““ ๐“” [ ๐““ , ๐“” ]โŸจ f โŸฉ
monotone-if-continuous ๐““ ๐“” (f , cts) x y l = ฮณ
  where
   ฮฑ : ๐Ÿ™ {๐“ฅ} + ๐Ÿ™ {๐“ฅ} โ†’ โŸจ ๐““ โŸฉ
   ฮฑ (inl *) = x
   ฮฑ (inr *) = y
   ฮด : is-Directed ๐““ ฮฑ
   ฮด = (โˆฃ inl โ‹† โˆฃ , ฮต)
    where
     ฮต : (i j : ๐Ÿ™ + ๐Ÿ™) โ†’ โˆƒ k ๊ž‰ ๐Ÿ™ + ๐Ÿ™ , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฑ k ร— ฮฑ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ k
     ฮต (inl โ‹†) (inl โ‹†) = โˆฃ inr โ‹† , l , l โˆฃ
     ฮต (inl โ‹†) (inr โ‹†) = โˆฃ inr โ‹† , l , reflexivity ๐““ y โˆฃ
     ฮต (inr โ‹†) (inl โ‹†) = โˆฃ inr โ‹† , reflexivity ๐““ y , l โˆฃ
     ฮต (inr โ‹†) (inr โ‹†) = โˆฃ inr โ‹† , reflexivity ๐““ y , reflexivity ๐““ y โˆฃ
   a : y ๏ผ โˆ ๐““ ฮด
   a = antisymmetry ๐““ y (โˆ ๐““ ฮด)
           (โˆ-is-upperbound ๐““ ฮด (inr โ‹†))
           (โˆ-is-lowerbound-of-upperbounds ๐““ ฮด y h)
    where
     h : (i : ๐Ÿ™ + ๐Ÿ™) โ†’ ฮฑ i โŠ‘โŸจ ๐““ โŸฉ y
     h (inl โ‹†) = l
     h (inr โ‹†) = reflexivity ๐““ y
   b : is-sup (underlying-order ๐“”) (f y) (f โˆ˜ ฮฑ)
   b = transport (ฮป - โ†’ is-sup (underlying-order ๐“”) - (f โˆ˜ ฮฑ)) (ap f (a โปยน))
       (cts (๐Ÿ™ + ๐Ÿ™) ฮฑ ฮด)
   ฮณ : f x โŠ‘โŸจ ๐“” โŸฉ f y
   ฮณ = sup-is-upperbound (underlying-order ๐“”) b (inl โ‹†)

image-is-directed' : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                     (f : DCPO[ ๐““ , ๐“” ]) {I : ๐“ฅ ฬ‡ } {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                   โ†’ is-Directed ๐““ ฮฑ
                   โ†’ is-Directed ๐“” ([ ๐““ , ๐“” ]โŸจ f โŸฉ โˆ˜ ฮฑ)
image-is-directed' ๐““ ๐“” f {I} {ฮฑ} ฮด = image-is-directed ๐““ ๐“” m ฮด
 where
  m : is-monotone ๐““ ๐“” [ ๐““ , ๐“” ]โŸจ f โŸฉ
  m = monotone-if-continuous ๐““ ๐“” f

continuous-โˆ-โŠ‘ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                 (f : DCPO[ ๐““ , ๐“” ]) {I : ๐“ฅ ฬ‡ } {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                 (ฮด : is-Directed ๐““ ฮฑ)
               โ†’ [ ๐““ , ๐“” ]โŸจ f โŸฉ (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ โˆ ๐“” (image-is-directed' ๐““ ๐“” f ฮด)
continuous-โˆ-โŠ‘ ๐““ ๐“” (f , c) {I} {ฮฑ} ฮด =
 sup-is-lowerbound-of-upperbounds (underlying-order ๐“”) (c I ฮฑ ฮด) (โˆ ๐“” ฮต) u
  where
   ฮต : is-Directed ๐“” (f โˆ˜ ฮฑ)
   ฮต = image-is-directed' ๐““ ๐“” (f , c) ฮด
   u : is-upperbound (underlying-order ๐“”) (โˆ ๐“” ฮต) (f โˆ˜ ฮฑ)
   u = โˆ-is-upperbound ๐“” ฮต

continuous-โˆ-โŠ’ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                 (f : DCPO[ ๐““ , ๐“” ]) {I : ๐“ฅ ฬ‡ } {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                 (ฮด : is-Directed ๐““ ฮฑ)
               โ†’ โˆ ๐“” (image-is-directed' ๐““ ๐“” f ฮด) โŠ‘โŸจ ๐“” โŸฉ [ ๐““ , ๐“” ]โŸจ f โŸฉ (โˆ ๐““ ฮด)
continuous-โˆ-โŠ’ ๐““ ๐“” (f , c) {I} {ฮฑ} ฮด =
 โˆ-is-lowerbound-of-upperbounds ๐“” ฮต (f (โˆ ๐““ ฮด)) u
  where
   ฮต : is-Directed ๐“” (f โˆ˜ ฮฑ)
   ฮต = image-is-directed' ๐““ ๐“” (f , c) ฮด
   u : (i : I) โ†’ f (ฮฑ i) โŠ‘โŸจ ๐“” โŸฉ f (โˆ ๐““ ฮด)
   u i = sup-is-upperbound (underlying-order ๐“”) (c I ฮฑ ฮด) i

continuous-โˆ-๏ผ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                 (f : DCPO[ ๐““ , ๐“” ]) {I : ๐“ฅ ฬ‡ } {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ}
                 (ฮด : is-Directed ๐““ ฮฑ)
               โ†’ [ ๐““ , ๐“” ]โŸจ f โŸฉ (โˆ ๐““ ฮด) ๏ผ โˆ ๐“” (image-is-directed' ๐““ ๐“” f ฮด)
continuous-โˆ-๏ผ ๐““ ๐“” (f , c) {I} {ฮฑ} ฮด =
 antisymmetry ๐“” (f (โˆ ๐““ ฮด)) (โˆ ๐“” ฮต) a b
  where
   ฮต : is-Directed ๐“” (f โˆ˜ ฮฑ)
   ฮต = image-is-directed' ๐““ ๐“” (f , c) ฮด
   a : f (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ โˆ ๐“” ฮต
   a = continuous-โˆ-โŠ‘ ๐““ ๐“” (f , c) ฮด
   b : โˆ ๐“” ฮต โŠ‘โŸจ ๐“” โŸฉ f (โˆ ๐““ ฮด)
   b = continuous-โˆ-โŠ’ ๐““ ๐“” (f , c) ฮด

\end{code}

Continuity of basic functions (constant functions, identity, composition).

\begin{code}

constant-functions-are-continuous : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                                    {e : โŸจ ๐“” โŸฉ} โ†’ is-continuous ๐““ ๐“” (ฮป d โ†’ e)
constant-functions-are-continuous ๐““ ๐“” {e} I ฮฑ ฮด = u , v
 where
  u : (i : I) โ†’ e โŠ‘โŸจ ๐“” โŸฉ e
  u i = reflexivity ๐“” e
  v : (y : โŸจ ๐“” โŸฉ) โ†’ ((i : I) โ†’ e โŠ‘โŸจ ๐“” โŸฉ y) โ†’ e โŠ‘โŸจ ๐“” โŸฉ y
  v y l  = โˆฅโˆฅ-rec (prop-valuedness ๐“” e y) l (inhabited-if-Directed ๐““ ฮฑ ฮด)

id-is-monotone : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ is-monotone ๐““ ๐““ id
id-is-monotone ๐““ x y l = l

id-is-inflationary : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ is-inflationary ๐““ id
id-is-inflationary = reflexivity

id-is-continuous : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ is-continuous ๐““ ๐““ id
id-is-continuous ๐““ = continuity-criterion ๐““ ๐““ id (id-is-monotone ๐““) ฮณ
 where
  ฮณ : (I : ๐“ฅ ฬ‡ )(ฮฑ : I โ†’ โŸจ ๐““ โŸฉ) (ฮด : is-Directed ๐““ ฮฑ)
    โ†’ โˆ ๐““ ฮด โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ (image-is-directed ๐““ ๐““ (ฮป x y l โ†’ l) ฮด)
  ฮณ I ฮฑ ฮด = ๏ผ-to-โŠ‘ ๐““ (โˆ-independent-of-directedness-witness ๐““
             ฮด (image-is-directed ๐““ ๐““ (ฮป x y l โ†’ l) ฮด))

โˆ˜-is-monotone : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'}) (๐“”' : DCPO {๐“ฆ} {๐“ฆ'})
                  (f : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ) (g : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐“”' โŸฉ)
                โ†’ is-monotone ๐““ ๐“” f
                โ†’ is-monotone ๐“” ๐“”' g
                โ†’ is-monotone ๐““ ๐“”' (g โˆ˜ f)
โˆ˜-is-monotone ๐““ ๐“” ๐“”' f g mf mg x y l = mg (f x) (f y) (mf x y l)

โˆ˜-is-inflationary : (๐““ : DCPO {๐“ค} {๐“ฃ})
                  (f g : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐““ โŸฉ)
                โ†’ is-inflationary ๐““ f
                โ†’ is-inflationary ๐““ g
                โ†’ is-inflationary ๐““ (g โˆ˜ f)
โˆ˜-is-inflationary ๐““ f g if ig x = transitivity ๐““ x (f x) (g (f x)) (if x) (ig (f x))

โˆ˜-is-continuous : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'}) (๐“”' : DCPO {๐“ฆ} {๐“ฆ'})
                  (f : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ) (g : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐“”' โŸฉ)
                โ†’ is-continuous ๐““ ๐“” f
                โ†’ is-continuous ๐“” ๐“”' g
                โ†’ is-continuous ๐““ ๐“”' (g โˆ˜ f)
โˆ˜-is-continuous ๐““ ๐“” ๐“”' f g cf cg = continuity-criterion ๐““ ๐“”' (g โˆ˜ f) m ฯˆ
 where
  mf : is-monotone ๐““ ๐“” f
  mf = monotone-if-continuous ๐““ ๐“” (f , cf)
  mg : is-monotone ๐“” ๐“”' g
  mg = monotone-if-continuous ๐“” ๐“”' (g , cg)
  m : is-monotone ๐““ ๐“”' (g โˆ˜ f)
  m = โˆ˜-is-monotone ๐““ ๐“” ๐“”' f g mf mg
  ฯˆ : (I : ๐“ฅ ฬ‡ )(ฮฑ : I โ†’ โŸจ ๐““ โŸฉ) (ฮด : is-Directed ๐““ ฮฑ)
    โ†’ g (f (โˆ ๐““ ฮด)) โŠ‘โŸจ ๐“”' โŸฉ โˆ ๐“”' (image-is-directed ๐““ ๐“”' m ฮด)
  ฯˆ I ฮฑ ฮด = g (f (โˆ ๐““ ฮด)) โŠ‘โŸจ ๐“”' โŸฉ[ lโ‚ ]
            g (โˆ ๐“” ฮตf)    โŠ‘โŸจ ๐“”' โŸฉ[ lโ‚‚ ]
            โˆ ๐“”' ฮตg       โŠ‘โŸจ ๐“”' โŸฉ[ lโ‚ƒ ]
            โˆ ๐“”' ฮต        โˆŽโŸจ ๐“”' โŸฉ
   where
    ฮต : is-Directed ๐“”' (g โˆ˜ f โˆ˜ ฮฑ)
    ฮต = image-is-directed ๐““ ๐“”' m ฮด
    ฮตf : is-Directed ๐“” (f โˆ˜ ฮฑ)
    ฮตf = image-is-directed' ๐““ ๐“” (f , cf) ฮด
    ฮตg : is-Directed ๐“”' (g โˆ˜ f โˆ˜ ฮฑ)
    ฮตg = image-is-directed' ๐“” ๐“”' (g , cg) ฮตf
    lโ‚ = mg (f (โˆ ๐““ ฮด)) (โˆ ๐“” ฮตf) h
     where
      h : f (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ โˆ ๐“” ฮตf
      h = continuous-โˆ-โŠ‘ ๐““ ๐“” (f , cf) ฮด
    lโ‚‚ = continuous-โˆ-โŠ‘ ๐“” ๐“”' (g , cg) ฮตf
    lโ‚ƒ = ๏ผ-to-โŠ‘ ๐“”' (โˆ-independent-of-directedness-witness ๐“”' ฮตg ฮต)

โˆ˜-is-continuousโ‚ƒ : {๐“ฆโ‚ ๐“ฃโ‚ ๐“ฆโ‚‚ ๐“ฃโ‚‚ ๐“ฆโ‚ƒ ๐“ฃโ‚ƒ ๐“ฆโ‚„ ๐“ฃโ‚„ : Universe}
                   (๐““โ‚ : DCPO {๐“ฆโ‚} {๐“ฃโ‚}) (๐““โ‚‚ : DCPO {๐“ฆโ‚‚} {๐“ฃโ‚‚})
                   (๐““โ‚ƒ : DCPO {๐“ฆโ‚ƒ} {๐“ฃโ‚ƒ}) (๐““โ‚„ : DCPO {๐“ฆโ‚„} {๐“ฃโ‚„})
                   (f : โŸจ ๐““โ‚ โŸฉ โ†’ โŸจ ๐““โ‚‚ โŸฉ) (g : โŸจ ๐““โ‚‚ โŸฉ โ†’ โŸจ ๐““โ‚ƒ โŸฉ)
                   (h : โŸจ ๐““โ‚ƒ โŸฉ โ†’ โŸจ ๐““โ‚„ โŸฉ)
                 โ†’ is-continuous ๐““โ‚ ๐““โ‚‚ f
                 โ†’ is-continuous ๐““โ‚‚ ๐““โ‚ƒ g
                 โ†’ is-continuous ๐““โ‚ƒ ๐““โ‚„ h
                 โ†’ is-continuous ๐““โ‚ ๐““โ‚„ (h โˆ˜ g โˆ˜ f)
โˆ˜-is-continuousโ‚ƒ ๐““โ‚ ๐““โ‚‚ ๐““โ‚ƒ ๐““โ‚„ f g h cf cg ch =
 โˆ˜-is-continuous ๐““โ‚ ๐““โ‚‚ ๐““โ‚„ f (h โˆ˜ g) cf
                 (โˆ˜-is-continuous ๐““โ‚‚ ๐““โ‚ƒ ๐““โ‚„ g h cg ch)

DCPO-โˆ˜ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'}) (๐“”' : DCPO {๐“ฆ} {๐“ฆ'})
       โ†’ DCPO[ ๐““ , ๐“” ] โ†’ DCPO[ ๐“” , ๐“”' ] โ†’ DCPO[ ๐““ , ๐“”' ]
DCPO-โˆ˜ ๐““ ๐“” ๐“”' (f , cf) (g , cg) = (g โˆ˜ f) , (โˆ˜-is-continuous ๐““ ๐“” ๐“”' f g cf cg)

DCPO-โˆ˜โ‚ƒ : {๐“ฆโ‚ ๐“ฃโ‚ ๐“ฆโ‚‚ ๐“ฃโ‚‚ ๐“ฆโ‚ƒ ๐“ฃโ‚ƒ ๐“ฆโ‚„ ๐“ฃโ‚„ : Universe}
          (๐““โ‚ : DCPO {๐“ฆโ‚} {๐“ฃโ‚}) (๐““โ‚‚ : DCPO {๐“ฆโ‚‚} {๐“ฃโ‚‚})
          (๐““โ‚ƒ : DCPO {๐“ฆโ‚ƒ} {๐“ฃโ‚ƒ}) (๐““โ‚„ : DCPO {๐“ฆโ‚„} {๐“ฃโ‚„})
          (f : DCPO[ ๐““โ‚ , ๐““โ‚‚ ]) (g : DCPO[ ๐““โ‚‚ , ๐““โ‚ƒ ]) (h : DCPO[ ๐““โ‚ƒ , ๐““โ‚„ ])
        โ†’ DCPO[ ๐““โ‚ , ๐““โ‚„ ]
DCPO-โˆ˜โ‚ƒ ๐““โ‚ ๐““โ‚‚ ๐““โ‚ƒ ๐““โ‚„ f g h = DCPO-โˆ˜ ๐““โ‚ ๐““โ‚‚ ๐““โ‚„ f (DCPO-โˆ˜ ๐““โ‚‚ ๐““โ‚ƒ ๐““โ‚„ g h)

\end{code}

Defining isomorphisms of (pointed) dcpos.

\begin{code}

_โ‰ƒแตˆแถœแต–แต’_ : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'}) โ†’ ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ โŠ” ๐“ค' โŠ” ๐“ฃ' ฬ‡
๐““ โ‰ƒแตˆแถœแต–แต’ ๐“” = ฮฃ f ๊ž‰ (โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ) , ฮฃ g ๊ž‰ (โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““ โŸฉ) ,
                ((d : โŸจ ๐““ โŸฉ) โ†’ g (f d) ๏ผ d)
              ร— ((e : โŸจ ๐“” โŸฉ) โ†’ f (g e) ๏ผ e)
              ร— is-continuous ๐““ ๐“” f
              ร— is-continuous ๐“” ๐““ g

โ‰ƒแตˆแถœแต–แต’-inv : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
          โ†’ ๐““ โ‰ƒแตˆแถœแต–แต’ ๐“”
          โ†’ ๐“” โ‰ƒแตˆแถœแต–แต’ ๐““
โ‰ƒแตˆแถœแต–แต’-inv ๐““ ๐“” (f , g , s , r , cf , cg) = (g , f , r , s , cg , cf)

is-deflation : (๐““ : DCPO {๐“ค} {๐“ฃ}) โ†’ DCPO[ ๐““ , ๐““ ] โ†’ ๐“ค โŠ” ๐“ฃ ฬ‡
is-deflation ๐““ f = (x : โŸจ ๐““ โŸฉ) โ†’ [ ๐““ , ๐““ ]โŸจ f โŸฉ x โŠ‘โŸจ ๐““ โŸฉ x

is-continuous-retract : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                      โ†’ DCPO[ ๐““ , ๐“” ]
                      โ†’ DCPO[ ๐“” , ๐““ ]
                      โ†’ ๐“ค ฬ‡
is-continuous-retract ๐““ ๐“” (ฯƒ , _) (ฯ , _) = (x : โŸจ ๐““ โŸฉ) โ†’ ฯ (ฯƒ x) ๏ผ x

is-embedding-projection-pair : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                             โ†’ DCPO[ ๐““ , ๐“” ]
                             โ†’ DCPO[ ๐“” , ๐““ ]
                             โ†’ ๐“ค โŠ” ๐“ค' โŠ” ๐“ฃ' ฬ‡
is-embedding-projection-pair ๐““ ๐“” ๐•ค@(s , cs) ๐•ฃ@(r , cr) =
   is-continuous-retract ๐““ ๐“” ๐•ค ๐•ฃ
 ร— is-deflation ๐“” (s โˆ˜ r , โˆ˜-is-continuous ๐“” ๐““ ๐“” r s cr cs)

record _continuous-retract-of_
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        (๐“” : DCPO {๐“ค'} {๐“ฃ'}) : ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ โŠ” ๐“ค' โŠ” ๐“ฃ' ฬ‡ where
  field
   s : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ
   r : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““ โŸฉ
   s-section-of-r : r โˆ˜ s โˆผ id
   s-is-continuous : is-continuous ๐““ ๐“” s
   r-is-continuous : is-continuous ๐“” ๐““ r

  ๐•ค : DCPO[ ๐““ , ๐“” ]
  ๐•ค = s , s-is-continuous

  ๐•ฃ : DCPO[ ๐“” , ๐““ ]
  ๐•ฃ = r , r-is-continuous

โ‰ƒแตˆแถœแต–แต’-to-continuous-retract : (๐““ : DCPO {๐“ค} {๐“ฃ})
                              (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                            โ†’ ๐““ โ‰ƒแตˆแถœแต–แต’ ๐“”
                            โ†’ ๐““ continuous-retract-of ๐“”
โ‰ƒแตˆแถœแต–แต’-to-continuous-retract ๐““ ๐“” (f , g , s , r , cf , cg) =
 record
  { s = f
  ; r = g
  ; s-section-of-r = s
  ; s-is-continuous = cf
  ; r-is-continuous = cg
  }

is-embedding-projection : (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                        โ†’ DCPO[ ๐““ , ๐“” ]
                        โ†’ DCPO[ ๐“” , ๐““ ]
                        โ†’ ๐“ค โŠ” ๐“ค' โŠ” ๐“ฃ' ฬ‡
is-embedding-projection ๐““ ๐“” ฮต ฯ€ =
 is-continuous-retract ๐““ ๐“” ฮต ฯ€ ร— is-deflation ๐“” (DCPO-โˆ˜ ๐“” ๐““ ๐“” ฯ€ ฮต)

record embedding-projection-pair-between
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        (๐“” : DCPO {๐“ค'} {๐“ฃ'}) : ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ โŠ” ๐“ค' โŠ” ๐“ฃ' ฬ‡ where
  field
   e : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” โŸฉ
   p : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““ โŸฉ
   e-section-of-p : p โˆ˜ e โˆผ id
   e-p-deflation : (y : โŸจ ๐“” โŸฉ) โ†’ e (p y) โŠ‘โŸจ ๐“” โŸฉ y
   e-is-continuous : is-continuous ๐““ ๐“” e
   p-is-continuous : is-continuous ๐“” ๐““ p

  ๐•– : DCPO[ ๐““ , ๐“” ]
  ๐•– = e , e-is-continuous

  ๐•ก : DCPO[ ๐“” , ๐““ ]
  ๐•ก = p , p-is-continuous

โ‰ƒแตˆแถœแต–แต’-to-embedding-projection-pair : (๐““ : DCPO {๐“ค} {๐“ฃ})
                                     (๐“” : DCPO {๐“ค'} {๐“ฃ'})
                                   โ†’ ๐““ โ‰ƒแตˆแถœแต–แต’ ๐“”
                                   โ†’ embedding-projection-pair-between ๐““ ๐“”
โ‰ƒแตˆแถœแต–แต’-to-embedding-projection-pair ๐““ ๐“” (f , g , s , r , cf , cg) =
 record
  { e = f
  ; p = g
  ; e-section-of-p = s
  ; e-p-deflation = ฮป y โ†’ ๏ผ-to-โŠ‘ ๐“” (r y)
  ; e-is-continuous = cf
  ; p-is-continuous = cg
  }

\end{code}

Many examples of dcpos conveniently happen to be locally small.

We present and prove the equivalence of three definitions:
- our main one, is-locally-small, which uses a record so that we have convenient
  helper functions;
- a second one, is-locally-small-ฮฃ, which is like the above but uses a ฮฃ-type
  rather than a record;
- a third one, is-locally-small', which arguably looks more like the familiar
  categorical notion of a locally small category.

To prove their equivalence, we prove a general lemma on small-valued binary
relations.

\begin{code}

is-small : (X : ๐“ค ฬ‡ ) โ†’ ๐“ฅ โบ โŠ” ๐“ค ฬ‡
is-small X = X is ๐“ฅ small

small-binary-relation-equivalence : {X : ๐“ค ฬ‡ } {Y : ๐“ฆ ฬ‡ } {R : X โ†’ Y โ†’ ๐“ฃ ฬ‡ }
                                  โ†’ ((x : X) (y : Y) โ†’ is-small (R x y))
                                  โ‰ƒ (ฮฃ Rโ‚› ๊ž‰ (X โ†’ Y โ†’ ๐“ฅ ฬ‡ ) ,
                                      ((x : X) (y : Y) โ†’ Rโ‚› x y โ‰ƒ R x y))
small-binary-relation-equivalence {๐“ค} {๐“ฆ} {๐“ฃ} {X} {Y} {R} =
 ((x : X) (y : Y)    โ†’ is-small (R x y))                            โ‰ƒโŸจ I   โŸฉ
 ((((x , y) : X ร— Y) โ†’ is-small (R x y)))                           โ‰ƒโŸจ II  โŸฉ
 (ฮฃ R' ๊ž‰ (X ร— Y โ†’ ๐“ฅ ฬ‡ ) , (((x , y) : X ร— Y) โ†’ R' (x , y) โ‰ƒ R x y)) โ‰ƒโŸจ III โŸฉ
 (ฮฃ R' ๊ž‰ (X ร— Y โ†’ ๐“ฅ ฬ‡ ) , ((x : X) (y : Y) โ†’ R' (x , y) โ‰ƒ R x y))   โ‰ƒโŸจ IV  โŸฉ
 (ฮฃ Rโ‚› ๊ž‰ (X โ†’ Y โ†’ ๐“ฅ ฬ‡ ) , ((x : X) (y : Y) โ†’ Rโ‚› x y โ‰ƒ R x y))       โ– 
  where
   ฯ† : {๐“ค ๐“ฅ ๐“ฆ : Universe}
       {X : ๐“ค ฬ‡ } {Y : X โ†’ ๐“ฅ ฬ‡ } {Z : (ฮฃ x ๊ž‰ X , Y x) โ†’ ๐“ฆ ฬ‡ }
     โ†’ ฮ  Z โ‰ƒ (ฮ  x ๊ž‰ X , ฮ  y ๊ž‰ Y x , Z (x , y))
   ฯ† = curry-uncurry fe'
   I   = โ‰ƒ-sym ฯ†
   II  = ฮ ฮฃ-distr-โ‰ƒ
   III = ฮฃ-cong (ฮป R โ†’ ฯ†)
   IV  = ฮฃ-change-of-variable (ฮป R' โ†’ (x : X) (y : Y) โ†’ R' x y โ‰ƒ R x y)
          โŒœ ฯ† โŒ (โŒœโŒ-is-equiv ฯ†)

module _
        (๐““ : DCPO {๐“ค} {๐“ฃ})
       where

 record is-locally-small : ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡ where
  field
   _โŠ‘โ‚›_ : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐““ โŸฉ โ†’ ๐“ฅ ฬ‡
   โŠ‘โ‚›-โ‰ƒ-โŠ‘ : {x y : โŸจ ๐““ โŸฉ} โ†’ x โŠ‘โ‚› y โ‰ƒ x โŠ‘โŸจ ๐““ โŸฉ y

  โŠ‘โ‚›-to-โŠ‘ : {x y : โŸจ ๐““ โŸฉ} โ†’ x โŠ‘โ‚› y โ†’ x โŠ‘โŸจ ๐““ โŸฉ y
  โŠ‘โ‚›-to-โŠ‘ = โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒ

  โŠ‘-to-โŠ‘โ‚› : {x y : โŸจ ๐““ โŸฉ} โ†’ x โŠ‘โŸจ ๐““ โŸฉ y โ†’ x โŠ‘โ‚› y
  โŠ‘-to-โŠ‘โ‚› = โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒโปยน

  โŠ‘โ‚›-is-prop-valued : (x y : โŸจ ๐““ โŸฉ) โ†’ is-prop (x โŠ‘โ‚› y)
  โŠ‘โ‚›-is-prop-valued x y = equiv-to-prop โŠ‘โ‚›-โ‰ƒ-โŠ‘ (prop-valuedness ๐““ x y)

  transitivityโ‚› : (x : โŸจ ๐““ โŸฉ) {y z : โŸจ ๐““ โŸฉ}
                โ†’ x โŠ‘โ‚› y โ†’ y โŠ‘โ‚› z โ†’ x โŠ‘โ‚› z
  transitivityโ‚› x {y} {z} u v = โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒโปยน
                                 (transitivity ๐““ x y z
                                               (โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒ u)
                                               (โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒ v))

  syntax transitivityโ‚› x u v = x โŠ‘โ‚›[ u ] v
  infixr 0 transitivityโ‚›

  reflexivityโ‚› : (x : โŸจ ๐““ โŸฉ) โ†’ x โŠ‘โ‚› x
  reflexivityโ‚› x = โŒœ โŠ‘โ‚›-โ‰ƒ-โŠ‘ โŒโปยน (reflexivity ๐““ x)

  syntax reflexivityโ‚› x = x โˆŽโ‚›
  infix 1 reflexivityโ‚›

\end{code}

This ends our helper function for the record and we proceed by giving the
alternative definitions of local smallness and proving their equivalence.

\begin{code}

 is-locally-small-ฮฃ : ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡
 is-locally-small-ฮฃ =
   ฮฃ _โŠ‘โ‚›_ ๊ž‰ (โŸจ ๐““ โŸฉ โ†’ โŸจ ๐““ โŸฉ โ†’ ๐“ฅ ฬ‡ ) , ((x y : โŸจ ๐““ โŸฉ) โ†’ (x โŠ‘โ‚› y) โ‰ƒ (x โŠ‘โŸจ ๐““ โŸฉ y))

 is-locally-small-record-equivalence : is-locally-small โ‰ƒ is-locally-small-ฮฃ
 is-locally-small-record-equivalence = qinveq f (g , (ฮป _ โ†’ refl) , (ฮป _ โ†’ refl))
  where
   f : is-locally-small โ†’ is-locally-small-ฮฃ
   f ls = _โŠ‘โ‚›_ , (ฮป x y โ†’ โŠ‘โ‚›-โ‰ƒ-โŠ‘)
    where
     open is-locally-small ls
   g : is-locally-small-ฮฃ โ†’ is-locally-small
   g ls = record { _โŠ‘โ‚›_ = prโ‚ ls ; โŠ‘โ‚›-โ‰ƒ-โŠ‘ = (ฮป {x} {y} โ†’ prโ‚‚ ls x y) }

 is-locally-small' : ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ ฬ‡
 is-locally-small' = (x y : โŸจ ๐““ โŸฉ) โ†’ is-small (x โŠ‘โŸจ ๐““ โŸฉ y)

 local-smallness-equivalent-definitions : is-locally-small โ‰ƒ is-locally-small'
 local-smallness-equivalent-definitions =
  is-locally-small-record-equivalence โ— โ‰ƒ-sym (small-binary-relation-equivalence)

 being-locally-small'-is-prop : PropExt โ†’ is-prop is-locally-small'
 being-locally-small'-is-prop pe =
  ฮ โ‚‚-is-prop fe (ฮป x y โ†’ prop-being-small-is-prop pe fe'
                          (x โŠ‘โŸจ ๐““ โŸฉ y) (prop-valuedness ๐““ x y))

 being-locally-small-is-prop : PropExt โ†’ is-prop is-locally-small
 being-locally-small-is-prop pe =
  equiv-to-prop local-smallness-equivalent-definitions
                (being-locally-small'-is-prop pe)

\end{code}

Being locally small is preserved by continuous retracts.

\begin{code}

local-smallness-preserved-by-continuous-retract :
   (๐““ : DCPO {๐“ค} {๐“ฃ}) (๐“” : DCPO {๐“ค'} {๐“ฃ'})
 โ†’ ๐““ continuous-retract-of ๐“”
 โ†’ is-locally-small ๐“”
 โ†’ is-locally-small ๐““
local-smallness-preserved-by-continuous-retract ๐““ ๐“” ฯ ls =
 โŒœ local-smallness-equivalent-definitions ๐““ โŒโปยน ฮณ
  where
   open _continuous-retract-of_ ฯ
   open is-locally-small ls
   ฮณ : is-locally-small' ๐““
   ฮณ x y = (s x โŠ‘โ‚› s y , g)
    where
     g : (s x โŠ‘โ‚› s y) โ‰ƒ (x โŠ‘โŸจ ๐““ โŸฉ y)
     g = logically-equivalent-props-are-equivalent
          (equiv-to-prop โŠ‘โ‚›-โ‰ƒ-โŠ‘
            (prop-valuedness ๐“” (s x) (s y)))
          (prop-valuedness ๐““ x y)
          โฆ…โ‡’โฆ† โฆ…โ‡โฆ†
      where
       โฆ…โ‡’โฆ† : (s x โŠ‘โ‚› s y) โ†’ (x โŠ‘โŸจ ๐““ โŸฉ y)
       โฆ…โ‡’โฆ† l = x      โŠ‘โŸจ ๐““ โŸฉ[ โฆ…1โฆ† ]
              r (s x) โŠ‘โŸจ ๐““ โŸฉ[ โฆ…2โฆ† ]
              r (s y) โŠ‘โŸจ ๐““ โŸฉ[ โฆ…3โฆ† ]
              y       โˆŽโŸจ ๐““ โŸฉ
        where
         โฆ…1โฆ† = ๏ผ-to-โŠ’ ๐““ (s-section-of-r x)
         โฆ…2โฆ† = monotone-if-continuous ๐“” ๐““ ๐•ฃ (s x) (s y) (โŠ‘โ‚›-to-โŠ‘ l)
         โฆ…3โฆ† = ๏ผ-to-โŠ‘ ๐““ (s-section-of-r y)
       โฆ…โ‡โฆ† : (x โŠ‘โŸจ ๐““ โŸฉ y) โ†’ (s x โŠ‘โ‚› s y)
       โฆ…โ‡โฆ† l = โŠ‘-to-โŠ‘โ‚› (monotone-if-continuous ๐““ ๐“” ๐•ค x y l)

\end{code}

Moving on from local smallness, we present a few useful lemmas on cofinality and
(joins of) directed families.

\begin{code}

semidirected-if-bicofinal : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I J : ๐“ฆ ฬ‡ }
                            (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ) (ฮฒ : J โ†’ โŸจ ๐““ โŸฉ)
                          โ†’ ((i : I) โ†’ โˆƒ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
                          โ†’ ((j : J) โ†’ โˆƒ i ๊ž‰ I , ฮฒ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
                          โ†’ is-semidirected (underlying-order ๐““) ฮฑ
                          โ†’ is-semidirected (underlying-order ๐““) ฮฒ
semidirected-if-bicofinal ๐““ {I} {J} ฮฑ ฮฒ ฮฑ-cofinal-in-ฮฒ ฮฒ-cofinal-in-ฮฑ ฯƒ jโ‚ jโ‚‚ =
 โˆฅโˆฅ-recโ‚‚ โˆƒ-is-prop f (ฮฒ-cofinal-in-ฮฑ jโ‚) (ฮฒ-cofinal-in-ฮฑ jโ‚‚)
  where
   f : (ฮฃ iโ‚ ๊ž‰ I , ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ iโ‚)
     โ†’ (ฮฃ iโ‚‚ ๊ž‰ I , ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ iโ‚‚)
     โ†’ โˆƒ j ๊ž‰ J , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j) ร— (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
   f (iโ‚ , uโ‚) (iโ‚‚ , uโ‚‚) = โˆฅโˆฅ-rec โˆƒ-is-prop g (ฯƒ iโ‚ iโ‚‚)
    where
     g : (ฮฃ i ๊ž‰ I , (ฮฑ iโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ i) ร— (ฮฑ iโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ i))
       โ†’ (โˆƒ j ๊ž‰ J , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j) ร— (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j))
     g (i , vโ‚ , vโ‚‚) = โˆฅโˆฅ-functor h (ฮฑ-cofinal-in-ฮฒ i)
      where
       h : (ฮฃ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
         โ†’ (ฮฃ j ๊ž‰ J , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j) ร— (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j))
       h (j , w) = (j , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ[ uโ‚ ]
                         ฮฑ iโ‚ โŠ‘โŸจ ๐““ โŸฉ[ vโ‚ ]
                         ฮฑ i  โŠ‘โŸจ ๐““ โŸฉ[ w ]
                         ฮฒ j  โˆŽโŸจ ๐““ โŸฉ)
                      , (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ[ uโ‚‚ ]
                         ฮฑ iโ‚‚ โŠ‘โŸจ ๐““ โŸฉ[ vโ‚‚ ]
                         ฮฑ i  โŠ‘โŸจ ๐““ โŸฉ[ w ]
                         ฮฒ j  โˆŽโŸจ ๐““ โŸฉ))

directed-if-bicofinal : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I J : ๐“ฆ ฬ‡ }
                        {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ} {ฮฒ : J โ†’ โŸจ ๐““ โŸฉ}
                      โ†’ ((i : I) โ†’ โˆƒ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
                      โ†’ ((j : J) โ†’ โˆƒ i ๊ž‰ I , ฮฒ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
                      โ†’ is-Directed ๐““ ฮฑ
                      โ†’ is-Directed ๐““ ฮฒ
directed-if-bicofinal ๐““ {I} {J} {ฮฑ} {ฮฒ} ฮบโ‚ ฮบโ‚‚ ฮด =
 (ฮณ , semidirected-if-bicofinal ๐““ ฮฑ ฮฒ ฮบโ‚ ฮบโ‚‚ (semidirected-if-Directed ๐““ ฮฑ ฮด))
  where
   ฮณ : โˆฅ J โˆฅ
   ฮณ = โˆฅโˆฅ-rec โˆฅโˆฅ-is-prop ฯ• (inhabited-if-Directed ๐““ ฮฑ ฮด)
    where
     ฯ• : I โ†’ โˆฅ J โˆฅ
     ฯ• i = โˆฅโˆฅ-functor prโ‚ (ฮบโ‚ i)

โˆ-โŠ‘-if-cofinal : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I J : ๐“ฅ ฬ‡ }
                 {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ} {ฮฒ : J โ†’ โŸจ ๐““ โŸฉ}
               โ†’ ((i : I) โ†’ โˆƒ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
               โ†’ (ฮด : is-Directed ๐““ ฮฑ)
               โ†’ (ฮต : is-Directed ๐““ ฮฒ)
               โ†’ โˆ ๐““ ฮด โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮต
โˆ-โŠ‘-if-cofinal ๐““ {I} {J} {ฮฑ} {ฮฒ} ฮฑ-cofinal-in-ฮฒ ฮด ฮต =
 โˆ-is-lowerbound-of-upperbounds ๐““ ฮด (โˆ ๐““ ฮต) ฮณ
  where
   ฮณ : (i : I) โ†’ ฮฑ i โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮต
   ฮณ i = โˆฅโˆฅ-rec (prop-valuedness ๐““ (ฮฑ i) (โˆ ๐““ ฮต)) ฯ• (ฮฑ-cofinal-in-ฮฒ i)
    where
     ฯ• : (ฮฃ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
       โ†’ ฮฑ i โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮต
     ฯ• (j , u) = ฮฑ i   โŠ‘โŸจ ๐““ โŸฉ[ u ]
                 ฮฒ j   โŠ‘โŸจ ๐““ โŸฉ[ โˆ-is-upperbound ๐““ ฮต j ]
                 โˆ ๐““ ฮต โˆŽโŸจ ๐““ โŸฉ

โˆ-๏ผ-if-bicofinal : (๐““ : DCPO {๐“ค} {๐“ฃ}) {I J : ๐“ฅ ฬ‡ }
                   {ฮฑ : I โ†’ โŸจ ๐““ โŸฉ} {ฮฒ : J โ†’ โŸจ ๐““ โŸฉ}
                 โ†’ ((i : I) โ†’ โˆƒ j ๊ž‰ J , ฮฑ i โŠ‘โŸจ ๐““ โŸฉ ฮฒ j)
                 โ†’ ((j : J) โ†’ โˆƒ i ๊ž‰ I , ฮฒ j โŠ‘โŸจ ๐““ โŸฉ ฮฑ i)
                 โ†’ (ฮด : is-Directed ๐““ ฮฑ)
                 โ†’ (ฮต : is-Directed ๐““ ฮฒ)
                 โ†’ โˆ ๐““ ฮด ๏ผ โˆ ๐““ ฮต
โˆ-๏ผ-if-bicofinal ๐““ ฮบโ‚ ฮบโ‚‚ ฮด ฮต =
 antisymmetry ๐““ (โˆ ๐““ ฮด) (โˆ ๐““ ฮต) (โˆ-โŠ‘-if-cofinal ๐““ ฮบโ‚ ฮด ฮต)
                                (โˆ-โŠ‘-if-cofinal ๐““ ฮบโ‚‚ ฮต ฮด)

\end{code}

Finally, we sometimes wish to reindex a directed family by another equivalent
type. The resulting family is of course directed again and has the same
supremum, which is what we prove here.

\begin{code}

module _
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        {I : ๐“ฆ ฬ‡ } {J : ๐“ฆ' ฬ‡ }
        (ฯ : I โ‰ƒ J)
        (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ)
       where

 reindexed-family : J โ†’ โŸจ ๐““ โŸฉ
 reindexed-family = ฮฑ โˆ˜ โŒœ ฯ โŒโปยน

 reindexed-family-is-directed : is-Directed ๐““ ฮฑ
                              โ†’ is-Directed ๐““ reindexed-family
 reindexed-family-is-directed ฮด = J-inh , ฮฒ-semidirected
  where
   J-inh : โˆฅ J โˆฅ
   J-inh = โˆฅโˆฅ-functor โŒœ ฯ โŒ (inhabited-if-Directed ๐““ ฮฑ ฮด)
   ฮฒ : J โ†’ โŸจ ๐““ โŸฉ
   ฮฒ = reindexed-family
   ฮฒ-semidirected : is-semidirected (underlying-order ๐““) ฮฒ
   ฮฒ-semidirected jโ‚ jโ‚‚ =
    โˆฅโˆฅ-functor r (semidirected-if-Directed ๐““ ฮฑ ฮด (โŒœ ฯ โŒโปยน jโ‚) (โŒœ ฯ โŒโปยน jโ‚‚))
     where
      r : (ฮฃ i ๊ž‰ I , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ i) ร— (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฑ i))
        โ†’ (ฮฃ j ๊ž‰ J , (ฮฒ jโ‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j) ร— (ฮฒ jโ‚‚ โŠ‘โŸจ ๐““ โŸฉ ฮฒ j))
      r (i , lโ‚ , lโ‚‚) = (โŒœ ฯ โŒ i
                        , (ฮฒ jโ‚                    โŠ‘โŸจ ๐““ โŸฉ[ lโ‚ ]
                           ฮฑ i                     โŠ‘โŸจ ๐““ โŸฉ[ k ]
                           (ฮฑ โˆ˜ โŒœ ฯ โŒโปยน โˆ˜ โŒœ ฯ โŒ) i โˆŽโŸจ ๐““ โŸฉ)
                        , (ฮฒ jโ‚‚                    โŠ‘โŸจ ๐““ โŸฉ[ lโ‚‚ ]
                           ฮฑ i                     โŠ‘โŸจ ๐““ โŸฉ[ k ]
                           (ฮฑ โˆ˜ โŒœ ฯ โŒโปยน โˆ˜ โŒœ ฯ โŒ) i โˆŽโŸจ ๐““ โŸฉ))
       where
        k = ๏ผ-to-โŠ’ ๐““
             (ap ฮฑ (inverses-are-retractions โŒœ ฯ โŒ (โŒœโŒ-is-equiv ฯ) i))

 reindexed-family-sup : (x : โŸจ ๐““ โŸฉ)
                      โ†’ is-sup (underlying-order ๐““) x ฮฑ
                      โ†’ is-sup (underlying-order ๐““) x (reindexed-family)
 reindexed-family-sup x x-is-sup = ub , lb-of-ubs
  where
   ฮฒ : J โ†’ โŸจ ๐““ โŸฉ
   ฮฒ = reindexed-family
   ub : is-upperbound (underlying-order ๐““) x ฮฒ
   ub i = sup-is-upperbound (underlying-order ๐““) x-is-sup (โŒœ ฯ โŒโปยน i)
   lb-of-ubs : is-lowerbound-of-upperbounds (underlying-order ๐““) x ฮฒ
   lb-of-ubs y y-is-ub = sup-is-lowerbound-of-upperbounds (underlying-order ๐““)
                          x-is-sup y lemma
    where
     lemma : is-upperbound (underlying-order ๐““) y ฮฑ
     lemma i = ฮฑ i         โŠ‘โŸจ ๐““ โŸฉ[ โฆ…1โฆ† ]
               ฮฒ (โŒœ ฯ โŒ i) โŠ‘โŸจ ๐““ โŸฉ[ โฆ…2โฆ† ]
               y           โˆŽโŸจ ๐““ โŸฉ
      where
       โฆ…1โฆ† = ๏ผ-to-โŠ’ ๐““
             (ap ฮฑ (inverses-are-retractions โŒœ ฯ โŒ (โŒœโŒ-is-equiv ฯ) i))
       โฆ…2โฆ† = y-is-ub (โŒœ ฯ โŒ i)

module _
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        {I : ๐“ฆ ฬ‡ } {J : ๐“ฆ' ฬ‡ }
        (ฯ : I โ‰ƒ J)
        (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ)
       where

 sup-reindexed-family : (x : โŸจ ๐““ โŸฉ)
                      โ†’ is-sup (underlying-order ๐““) x (reindexed-family ๐““ ฯ ฮฑ)
                      โ†’ is-sup (underlying-order ๐““) x ฮฑ
 sup-reindexed-family x x-is-sup =
  transport (is-sup (underlying-order ๐““) x) (dfunext fe h)
            (reindexed-family-sup ๐““ (โ‰ƒ-sym ฯ) ฮฒ x x-is-sup)
   where
    ฮฒ = reindexed-family ๐““ ฯ ฮฑ
    h : reindexed-family ๐““ (โ‰ƒ-sym ฯ) ฮฒ โˆผ ฮฑ
    h i = (ฮฑ โˆ˜ โŒœ ฯ โŒโปยน โˆ˜ โŒœ โ‰ƒ-sym ฯ โŒโปยน) i ๏ผโŸจ eโ‚ โŸฉ
          (ฮฑ โˆ˜ โŒœ ฯ โŒโปยน โˆ˜ โŒœ ฯ โŒ) i         ๏ผโŸจ eโ‚‚ โŸฉ
          ฮฑ i                             โˆŽ
     where
      eโ‚ = ap (ฮป - โ†’ (ฮฑ โˆ˜ โŒœ ฯ โŒโปยน โˆ˜ -) i)
              (inversion-involutive โŒœ ฯ โŒ (โŒœโŒ-is-equiv ฯ))
      eโ‚‚ = ap ฮฑ (inverses-are-retractions' ฯ i)

\end{code}

Added 23 June 2024.
All dcpos (regardless of the universe level for index families) are ฯ‰-complete.

\begin{code}

dcpos-are-ฯ‰-complete : (๐““ : DCPO {๐“ค} {๐“ฃ})
                     โ†’ is-ฯ‰-complete (underlying-order ๐““)
dcpos-are-ฯ‰-complete ๐““ ฮฑ ฮฑ-is-ฯ‰-chain = s , s-is-sup
 where
  โ„•' : ๐“ฅ ฬ‡
  โ„•' = Lift ๐“ฅ โ„•
  ฯ : โ„• โ‰ƒ Lift ๐“ฅ โ„•
  ฯ = โ‰ƒ-Lift ๐“ฅ โ„•
  ฮด : is-Directed ๐““ (reindexed-family ๐““ (โ‰ƒ-Lift ๐“ฅ โ„•) ฮฑ)
  ฮด = reindexed-family-is-directed ๐““ ฯ ฮฑ (ฯ‰-chains-are-Directed ๐““ ฮฑ ฮฑ-is-ฯ‰-chain)
  s : โŸจ ๐““ โŸฉ
  s = โˆ ๐““ ฮด
  s-is-sup : is-sup (underlying-order ๐““) s ฮฑ
  s-is-sup = sup-reindexed-family ๐““ ฯ ฮฑ s (โˆ-is-sup ๐““ ฮด)

\end{code}

Added 18th Feb 2024 by Martin Escardo. Subdcpo induced by a subset /
property.

\begin{code}

is-closed-under-directed-sups : (๐““ : DCPO {๐“ค} {๐“ฃ})
                              โ†’ (โŸจ ๐““ โŸฉ โ†’ ๐“ฆ ฬ‡)
                              โ†’ ๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ โŠ” ๐“ฆ ฬ‡
is-closed-under-directed-sups {๐“ค} {๐“ฃ} ๐““ P =
    {I : ๐“ฅ ฬ‡ } (ฮฑ : I โ†’ โŸจ ๐““ โŸฉ) (ฮด : is-Directed ๐““ ฮฑ)
  โ†’ ((i : I) โ†’ P (ฮฑ i))
  โ†’ P (โˆ ๐““ ฮด)

open import UF.Sets-Properties

module _
         (๐““ : DCPO {๐“ค} {๐“ฃ})
         (P : โŸจ ๐““ โŸฉ โ†’ ๐“ฆ ฬ‡)
         (P-is-prop-valued : (x : โŸจ ๐““ โŸฉ) โ†’ is-prop (P x))
         (P-is-closed-under-directed-sups : is-closed-under-directed-sups ๐““ P)
       where

 subdcpo : DCPO {๐“ค โŠ” ๐“ฆ} {๐“ฃ}
 subdcpo =
  (ฮฃ x ๊ž‰ โŸจ ๐““ โŸฉ , P x) ,
  (ฮป (x , _) (y , _) โ†’ x โŠ‘โŸจ ๐““ โŸฉ y) ,
  (subsets-of-sets-are-sets โŸจ ๐““ โŸฉ P (sethood ๐““) (P-is-prop-valued _) ,
   (ฮป _ _ โ†’ prop-valuedness ๐““ _ _) ,
   (ฮป _ โ†’ reflexivity ๐““ _) ,
   (ฮป (x , _) (y , _) (z , _) โ†’ transitivity ๐““ x y z) ,
   (ฮป (x , _) (y , _) l m โ†’ to-subtype-๏ผ
                             P-is-prop-valued
                             (antisymmetry ๐““ x y l m))) ,
  (ฮป I ฮฑ ฮด โ†’ (โˆ ๐““ {I} {prโ‚ โˆ˜ ฮฑ} ฮด ,
              P-is-closed-under-directed-sups (prโ‚ โˆ˜ ฮฑ) ฮด (prโ‚‚ โˆ˜ ฮฑ)) ,
             โˆ-is-upperbound ๐““ ฮด ,
             (ฮป (x , _) โ†’ โˆ-is-lowerbound-of-upperbounds ๐““ ฮด x))

 subdcpo-inclusion : โŸจ subdcpo โŸฉ โ†’ โŸจ ๐““ โŸฉ
 subdcpo-inclusion = prโ‚

 subdcpo-satisfies-property : (ฯƒ : โŸจ subdcpo โŸฉ) โ†’ P (subdcpo-inclusion ฯƒ)
 subdcpo-satisfies-property = prโ‚‚

open import UF.SubtypeClassifier

is-closed-under-directed-supsโ‚š : (๐““ : DCPO {๐“ค} {๐“ฃ})
                               โ†’ (โŸจ ๐““ โŸฉ โ†’ ฮฉ ๐“ฆ)
                               โ†’ ฮฉ (๐“ฅ โบ โŠ” ๐“ค โŠ” ๐“ฃ โŠ” ๐“ฆ)
is-closed-under-directed-supsโ‚š {๐“ค} {๐“ฃ} ๐““ P =
 is-closed-under-directed-sups ๐““ (ฮป x โ†’ P x holds) ,
 ฮ -is-prop' fe (ฮป I โ†’ ฮ โ‚ƒ-is-prop fe (ฮป ฮฑ ฮด c โ†’ holds-is-prop (P (โˆ ๐““ ฮด))))

module _
        (๐““ : DCPO {๐“ค} {๐“ฃ})
        (P : โŸจ ๐““ โŸฉ โ†’ ฮฉ ๐“ฆ)
        (P-is-closed-under-directed-supsโ‚š : is-closed-under-directed-supsโ‚š ๐““ P holds)
       where

 subdcpoโ‚š : DCPO {๐“ค โŠ” ๐“ฆ} {๐“ฃ}
 subdcpoโ‚š = subdcpo ๐““
            (ฮป x โ†’ P x holds)
            (ฮป x โ†’ holds-is-prop (P x))
            P-is-closed-under-directed-supsโ‚š

\end{code}