Brendan Hart 2019-2020

Addition by Tom de Jong in July 2024.

\begin{code}

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

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

module DomainTheory.Basics.Products
        (pt : propositional-truncations-exist)
        (fe : โˆ€ {๐“ค ๐“ฅ} โ†’ funext ๐“ค ๐“ฅ)
       where

open PropositionalTruncation pt

open import OrderedTypes.Poset fe
open import UF.Base
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Sets

open PosetAxioms

\end{code}

First, let's define the product of two DCPOs.

\begin{code}

module DcpoProductsGeneral
        (๐“ฅ : Universe)
       where

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

 module _ {D : ๐“ค ฬ‡} {E : ๐“ค' ฬ‡} where

   _โŠ‘-ร—_ : (D โ†’ D โ†’ ๐“ฃ ฬ‡)
         โ†’ (E โ†’ E โ†’ ๐“ฃ' ฬ‡)
         โ†’ (D ร— E โ†’ D ร— E โ†’ ๐“ฃ โŠ” ๐“ฃ' ฬ‡)
   _โŠ‘-ร—_ _โŠ‘โ‚_ _โŠ‘โ‚‚_ (a , b) (c , d) = (a โŠ‘โ‚ c) ร— (b โŠ‘โ‚‚ d)

   prโ‚โˆ˜ฮฑ-is-directed : {I : ๐“ฅ ฬ‡}
                     โ†’ {ฮฑ : I โ†’ D ร— E}
                     โ†’ (_โŠ‘โ‚_ : D โ†’ D โ†’ ๐“ฃ ฬ‡)
                     โ†’ (_โŠ‘โ‚‚_ : E โ†’ E โ†’ ๐“ฃ' ฬ‡)
                     โ†’ is-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ
                     โ†’ is-directed _โŠ‘โ‚_ (prโ‚ โˆ˜ ฮฑ)
   prโ‚โˆ˜ฮฑ-is-directed {_} {_} {I} {ฮฑ} _โŠ‘โ‚_ _โŠ‘โ‚‚_ ฮด =
    inhabited-if-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ ฮด , o
     where
      o : (i j : I)
        โ†’ โˆƒ k ๊ž‰ I , ((prโ‚ โˆ˜ ฮฑ) i โŠ‘โ‚ (prโ‚ โˆ˜ ฮฑ) k ร—
                     (prโ‚ โˆ˜ ฮฑ) j โŠ‘โ‚ (prโ‚ โˆ˜ ฮฑ) k)
      o i j = โˆฅโˆฅ-functor
               (ฮป (a , (b , _) , c , _) โ†’ a , b , c)
               (semidirected-if-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ ฮด i j)

   prโ‚‚โˆ˜ฮฑ-is-directed : {I : ๐“ฅ ฬ‡}
                     โ†’ {ฮฑ : I โ†’ D ร— E}
                     โ†’ (_โŠ‘โ‚_ : D โ†’ D โ†’ ๐“ฃ ฬ‡)
                     โ†’ (_โŠ‘โ‚‚_ : E โ†’ E โ†’ ๐“ฃ' ฬ‡)
                     โ†’ is-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ
                     โ†’ is-directed _โŠ‘โ‚‚_ (prโ‚‚ โˆ˜ ฮฑ)
   prโ‚‚โˆ˜ฮฑ-is-directed {_} {_} {I} {ฮฑ} _โŠ‘โ‚_ _โŠ‘โ‚‚_ ฮด =
    inhabited-if-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ ฮด , o
     where
      o : (i j : I)
        โ†’ โˆƒ k ๊ž‰ I , ((prโ‚‚ โˆ˜ ฮฑ) i โŠ‘โ‚‚ (prโ‚‚ โˆ˜ ฮฑ) k ร—
                     (prโ‚‚ โˆ˜ ฮฑ) j โŠ‘โ‚‚ (prโ‚‚ โˆ˜ ฮฑ) k)
      o i j = โˆฅโˆฅ-functor
               (ฮป (a , (_  , b) , _ , c) โ†’ a , b , c)
               (semidirected-if-directed (_โŠ‘โ‚_ โŠ‘-ร— _โŠ‘โ‚‚_) ฮฑ ฮด i j)

 infixr 30 _ร—แตˆแถœแต–แต’_

 _ร—แตˆแถœแต–แต’_ : DCPO {๐“ค} {๐“ฃ} โ†’ DCPO {๐“ค'} {๐“ฃ'} โ†’ DCPO {๐“ค โŠ” ๐“ค'} {๐“ฃ โŠ” ๐“ฃ'}
 ๐““ ร—แตˆแถœแต–แต’ ๐“” = (โŸจ ๐““ โŸฉ ร— โŸจ ๐“” โŸฉ) ,
             (underlying-order ๐““) โŠ‘-ร— (underlying-order ๐“”) ,
             axioms
  where
   axioms : dcpo-axioms (underlying-order ๐““ โŠ‘-ร— underlying-order ๐“”)
   axioms = (ร—-is-set (sethood ๐““) (sethood ๐“”) , prop , r , t , a) , c
    where
     _โŠ‘๐““_ = underlying-order ๐““
     _โŠ‘๐“”_ = underlying-order ๐“”
     _โŠ‘_  = _โŠ‘๐““_ โŠ‘-ร— _โŠ‘๐“”_

     prop : is-prop-valued _โŠ‘_
     prop (xโ‚ , xโ‚‚) (yโ‚ , yโ‚‚) (aโ‚ , aโ‚‚) (bโ‚ , bโ‚‚) =
      to-ร—-๏ผ
       (prop-valuedness ๐““ xโ‚ yโ‚ aโ‚ bโ‚)
       (prop-valuedness ๐“” xโ‚‚ yโ‚‚ aโ‚‚ bโ‚‚)

     r : is-reflexive _โŠ‘_
     r a = reflexivity ๐““ (prโ‚ a) ,
           reflexivity ๐“” (prโ‚‚ a)

     t : is-transitive _โŠ‘_
     t (xโ‚ , xโ‚‚) (yโ‚ , yโ‚‚) (zโ‚ , zโ‚‚) (uโ‚ , uโ‚‚) (vโ‚ , vโ‚‚) = wโ‚ , wโ‚‚
      where
       wโ‚ = xโ‚ โŠ‘โŸจ ๐““ โŸฉ[ uโ‚ ]
            yโ‚ โŠ‘โŸจ ๐““ โŸฉ[ vโ‚ ]
            zโ‚ โˆŽโŸจ ๐““ โŸฉ

       wโ‚‚ = xโ‚‚ โŠ‘โŸจ ๐“” โŸฉ[ uโ‚‚ ]
            yโ‚‚ โŠ‘โŸจ ๐“” โŸฉ[ vโ‚‚ ]
            zโ‚‚ โˆŽโŸจ ๐“” โŸฉ

     a : is-antisymmetric _โŠ‘_
     a (a , b) (c , d) (a-โŠ‘-c , b-โŠ‘-d) (c-โŠ‘-a , d-โŠ‘-b) =
      to-ร—-๏ผ
       (antisymmetry ๐““ a c a-โŠ‘-c c-โŠ‘-a)
       (antisymmetry ๐“” b d b-โŠ‘-d d-โŠ‘-b)

     c : is-directed-complete _โŠ‘_
     c I ฮฑ ฮด = (โˆ ๐““ prโ‚โˆ˜ฮฑ-is-dir , โˆ ๐“” prโ‚‚โˆ˜ฮฑ-is-dir) , s
      where
       prโ‚โˆ˜ฮฑ-is-dir : is-Directed ๐““ (prโ‚ โˆ˜ ฮฑ)
       prโ‚โˆ˜ฮฑ-is-dir = prโ‚โˆ˜ฮฑ-is-directed _โŠ‘๐““_ _โŠ‘๐“”_ ฮด

       prโ‚‚โˆ˜ฮฑ-is-dir : is-Directed ๐“” (prโ‚‚ โˆ˜ ฮฑ)
       prโ‚‚โˆ˜ฮฑ-is-dir = prโ‚‚โˆ˜ฮฑ-is-directed _โŠ‘๐““_ _โŠ‘๐“”_ ฮด

       s : is-sup _โŠ‘_ (โˆ ๐““ prโ‚โˆ˜ฮฑ-is-dir , โˆ ๐“” prโ‚‚โˆ˜ฮฑ-is-dir) ฮฑ
       s = is-upper , is-least-upper
        where
         is-upper : is-upperbound _โŠ‘_ (โˆ ๐““ prโ‚โˆ˜ฮฑ-is-dir , โˆ ๐“” prโ‚‚โˆ˜ฮฑ-is-dir) ฮฑ
         is-upper i = (โˆ-is-upperbound ๐““ prโ‚โˆ˜ฮฑ-is-dir i ,
                       โˆ-is-upperbound ๐“” prโ‚‚โˆ˜ฮฑ-is-dir i)

         is-least-upper : (t : โŸจ ๐““ โŸฉ ร— โŸจ ๐“” โŸฉ)
                        โ†’ is-upperbound _โŠ‘_ t ฮฑ
                        โ†’ _โŠ‘_ (โˆ ๐““ prโ‚โˆ˜ฮฑ-is-dir , โˆ ๐“” prโ‚‚โˆ˜ฮฑ-is-dir) t
         is-least-upper t@(x , y) u = lub-of-x , lub-of-y
           where
            x-is-upperbound : is-upperbound _โŠ‘๐““_ x (prโ‚ โˆ˜ ฮฑ)
            x-is-upperbound i = prโ‚ (u i)

            y-is-upperbound : is-upperbound _โŠ‘๐“”_ y (prโ‚‚ โˆ˜ ฮฑ)
            y-is-upperbound i = prโ‚‚ (u i)

            lub-of-x = โˆ-is-lowerbound-of-upperbounds ๐““
                        prโ‚โˆ˜ฮฑ-is-dir
                        x
                        x-is-upperbound

            lub-of-y = โˆ-is-lowerbound-of-upperbounds
                        ๐“”
                        prโ‚‚โˆ˜ฮฑ-is-dir
                        y
                        y-is-upperbound
\end{code}

Some useful proofs on products.

\begin{code}

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

   constant-function-is-directed : { I : ๐“ฅ ฬ‡} (h : โˆฅ I โˆฅ) (d : โŸจ ๐““ โŸฉ)
                                 โ†’ is-Directed ๐““ (ฮป (i : I) โ†’ d)
   constant-function-is-directed h d =
    h , ฮป i j โ†’ โˆฃ i , (reflexivity ๐““ d , reflexivity ๐““ d) โˆฃ

   constant-is-โˆ-of-constant-function : {I : ๐“ฅ ฬ‡}
                                        {d : โŸจ ๐““ โŸฉ}
                                        (ฮด : is-Directed ๐““ (ฮป (i : I) โ†’ d))
                                      โ†’ d ๏ผ โˆ ๐““ ฮด
   constant-is-โˆ-of-constant-function {I} {d} ฮด = antisymmetry ๐““ d (โˆ ๐““ ฮด) lโ‚ lโ‚‚
    where
     lโ‚ : d โŠ‘โŸจ ๐““ โŸฉ โˆ ๐““ ฮด
     lโ‚ = โˆฅโˆฅ-rec
           (prop-valuedness ๐““ d (โˆ ๐““ ฮด))
           (ฮป (i : I) โ†’ โˆ-is-upperbound ๐““ ฮด i) (prโ‚ ฮด)

     lโ‚‚ : โˆ ๐““ ฮด โŠ‘โŸจ ๐““ โŸฉ d
     lโ‚‚ = โˆ-is-lowerbound-of-upperbounds ๐““
           ฮด
           d
           (ฮป i โ†’ reflexivity ๐““ d)

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

   prโ‚โˆ˜ฮฑ-is-Directed : {I : ๐“ฅ ฬ‡}
                       {ฮฑ : I โ†’ โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ}
                     โ†’ is-Directed (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮฑ
                     โ†’ is-Directed ๐““ (prโ‚ โˆ˜ ฮฑ)
   prโ‚โˆ˜ฮฑ-is-Directed {I} {ฮฑ} ฮด =
    prโ‚โˆ˜ฮฑ-is-directed (underlying-order ๐““) (underlying-order ๐“”) ฮด

   prโ‚‚โˆ˜ฮฑ-is-Directed : {I : ๐“ฅ ฬ‡}
                       {ฮฑ : I โ†’ โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ}
                     โ†’ is-Directed (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮฑ
                     โ†’ is-Directed ๐“” (prโ‚‚ โˆ˜ ฮฑ)
   prโ‚‚โˆ˜ฮฑ-is-Directed = prโ‚‚โˆ˜ฮฑ-is-directed (underlying-order ๐““) (underlying-order ๐“”)

   โŸจprโ‚,prโ‚‚โŸฉ-is-directed : {I : ๐“ฅ ฬ‡}
                         โ†’ {ฮฑโ‚ : I โ†’ โŸจ ๐““ โŸฉ}
                         โ†’ {ฮฑโ‚‚ : I โ†’ โŸจ ๐“” โŸฉ}
                         โ†’ is-Directed ๐““ ฮฑโ‚
                         โ†’ is-Directed ๐“” ฮฑโ‚‚
                         โ†’ is-Directed (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                            (ฮป ((iโ‚ , iโ‚‚) : I ร— I) โ†’ (ฮฑโ‚ iโ‚ , ฮฑโ‚‚ iโ‚‚))

   โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚@(hโ‚ , sโ‚) ฮดโ‚‚@(hโ‚‚ , sโ‚‚) =
    (binary-choice hโ‚ hโ‚‚) ,
     ฮป (iโ‚ , iโ‚‚) (jโ‚ , jโ‚‚)
       โ†’ โˆฅโˆฅ-functor
          (ฮป ((aโ‚ , bโ‚ , cโ‚) , (aโ‚‚ , bโ‚‚ , cโ‚‚)) โ†’ (aโ‚ , aโ‚‚) , (bโ‚ , bโ‚‚) , (cโ‚ , cโ‚‚))
          (binary-choice (sโ‚ iโ‚ jโ‚) (sโ‚‚ iโ‚‚ jโ‚‚))

   โˆโŸจ,โŸฉ๏ผโŸจโˆ,โˆโŸฉ : {I : ๐“ฅ ฬ‡} {ฮฑ : I โ†’ โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ}
               โ†’ (ฮด : is-Directed (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮฑ)
               โ†’ โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด
               ๏ผ (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
   โˆโŸจ,โŸฉ๏ผโŸจโˆ,โˆโŸฉ {I} {ฮฑ} ฮด =
    antisymmetry (๐““ ร—แตˆแถœแต–แต’ ๐“”)
     (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)
     (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
     โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ
     โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ
     where
       โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ : โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด
                     โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ
                    (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
       โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ = โˆ-is-lowerbound-of-upperbounds (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                      ฮด
                      (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
                      โˆ,โˆ-is-upperbound
         where
          โˆ,โˆ-is-upperbound : (i : I)
                            โ†’ (ฮฑ i)
                            โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) ,
                                            โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
          โˆ,โˆ-is-upperbound i = (โˆ-is-upperbound ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) i) ,
                                (โˆ-is-upperbound ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด) i)

       โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ : (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด))
                  โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)
       โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ = โŠ‘โ‚ , โŠ‘โ‚‚
         where
          โŠ‘โ‚ : (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด)) โŠ‘โŸจ ๐““ โŸฉ (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด))
          โŠ‘โ‚ = โˆ-is-lowerbound-of-upperbounds ๐““
                (prโ‚โˆ˜ฮฑ-is-Directed ฮด)
                (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด))
                prโ‚-โˆโŸจ,โŸฉ-is-upperbound
           where
            prโ‚-โˆโŸจ,โŸฉ-is-upperbound : (i : I)
                                   โ†’ ((prโ‚ โˆ˜ ฮฑ) i) โŠ‘โŸจ ๐““ โŸฉ (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด))
            prโ‚-โˆโŸจ,โŸฉ-is-upperbound i = prโ‚ (โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด i)

          โŠ‘โ‚‚ : โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด) โŠ‘โŸจ ๐“” โŸฉ prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)
          โŠ‘โ‚‚ = โˆ-is-lowerbound-of-upperbounds ๐“”
                (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด)
                (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด))
                prโ‚‚-โˆโŸจ,โŸฉ-is-upperbound
           where
            prโ‚‚-โˆโŸจ,โŸฉ-is-upperbound : (i : I)
                                   โ†’ ((prโ‚‚ โˆ˜ ฮฑ) i) โŠ‘โŸจ ๐“” โŸฉ (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด))
            prโ‚‚-โˆโŸจ,โŸฉ-is-upperbound i = prโ‚‚ (โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด i)

   โŸจโˆ,โˆโŸฉ๏ผโˆโŸจ,โŸฉ : {I : ๐“ฅ ฬ‡}
               โ†’ {ฮฑโ‚ : I โ†’ โŸจ ๐““ โŸฉ}
               โ†’ {ฮฑโ‚‚ : I โ†’ โŸจ ๐“” โŸฉ}
               โ†’ (ฮดโ‚ : is-Directed ๐““ ฮฑโ‚)
               โ†’ (ฮดโ‚‚ : is-Directed ๐“” ฮฑโ‚‚)
               โ†’ (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚) ๏ผ โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
   โŸจโˆ,โˆโŸฉ๏ผโˆโŸจ,โŸฉ {I} {ฮฑโ‚} {ฮฑโ‚‚} ฮดโ‚ ฮดโ‚‚ = antisymmetry (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                                      (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚)
                                      (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                                      (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚))
                                      โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ
     where
       โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ : (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚)
                  โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
       โŸจโˆ,โˆโŸฉโŠ‘โˆโŸจ,โŸฉ = โŠ‘โ‚ , โŠ‘โ‚‚
         where
          โŠ‘โ‚ : โˆ ๐““ ฮดโ‚ โŠ‘โŸจ ๐““ โŸฉ prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚))
          โŠ‘โ‚ = โˆ-is-lowerbound-of-upperbounds ๐““
                ฮดโ‚
                (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)))
                p
           where
            p : (i : I)
              โ†’ (ฮฑโ‚ i) โŠ‘โŸจ ๐““ โŸฉ (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)))
            p i = prโ‚ (โˆ-is-upperbound ((๐““ ร—แตˆแถœแต–แต’ ๐“”))
                        (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
                        (i , i))

          โŠ‘โ‚‚ : โˆ ๐“” ฮดโ‚‚ โŠ‘โŸจ ๐“” โŸฉ prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚))
          โŠ‘โ‚‚ = โˆ-is-lowerbound-of-upperbounds ๐“”
                ฮดโ‚‚
                (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)))
                p
           where
            p : (i : I)
              โ†’ (ฮฑโ‚‚ i) โŠ‘โŸจ ๐“” โŸฉ (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)))
            p i = prโ‚‚ (โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                        (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
                        (i , i))


       โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ : โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
                  โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚)
       โˆโŸจ,โŸฉโŠ‘โŸจโˆ,โˆโŸฉ = โˆ-is-lowerbound-of-upperbounds (๐““ ร—แตˆแถœแต–แต’ ๐“”)
                      (โŸจprโ‚,prโ‚‚โŸฉ-is-directed ฮดโ‚ ฮดโ‚‚)
                      (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚)
                      upperbound
         where
          upperbound : (i : I ร— I)
                     โ†’ (ฮฑโ‚ (prโ‚ i) , ฮฑโ‚‚ (prโ‚‚ i)) โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” โŸฉ (โˆ ๐““ ฮดโ‚ , โˆ ๐“” ฮดโ‚‚)
          upperbound i = โˆ-is-upperbound ๐““ ฮดโ‚ (prโ‚ i) ,
                         โˆ-is-upperbound ๐“” ฮดโ‚‚ (prโ‚‚ i)

   prโ‚-is-continuous : DCPO[ ๐““ ร—แตˆแถœแต–แต’ ๐“” , ๐““ ]
   prโ‚-is-continuous = prโ‚ , c
    where
     c : is-continuous (๐““ ร—แตˆแถœแต–แต’ ๐“”) ๐““ prโ‚
     c I ฮฑ ฮด = u , v
      where
       u : is-upperbound (underlying-order ๐““) (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)) (prโ‚ โˆ˜ ฮฑ)
       u i = prโ‚ (โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด i)

       v : (x : โŸจ ๐““ โŸฉ)
         โ†’ ((i : I) โ†’ (prโ‚ (ฮฑ i)) โŠ‘โŸจ ๐““ โŸฉ x)
         โ†’ (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)) โŠ‘โŸจ ๐““ โŸฉ x
       v x p = transport (ฮป - โ†’ prโ‚ - โŠ‘โŸจ ๐““ โŸฉ x) (โˆโŸจ,โŸฉ๏ผโŸจโˆ,โˆโŸฉ ฮด) d
        where
         d : prโ‚ (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด)) โŠ‘โŸจ ๐““ โŸฉ x
         d = โˆ-is-lowerbound-of-upperbounds ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) x p

   prโ‚‚-is-continuous : DCPO[ ๐““ ร—แตˆแถœแต–แต’ ๐“” , ๐“” ]
   prโ‚‚-is-continuous = prโ‚‚ , c
    where
     c : is-continuous (๐““ ร—แตˆแถœแต–แต’ ๐“”) ๐“” prโ‚‚
     c I ฮฑ ฮด = u , v
      where
       u : is-upperbound (underlying-order ๐“”) (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)) (prโ‚‚ โˆ˜ ฮฑ)
       u i = prโ‚‚ (โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด i)

       v : (y : โŸจ ๐“” โŸฉ)
         โ†’ ((i : I) โ†’ (prโ‚‚ (ฮฑ i)) โŠ‘โŸจ ๐“” โŸฉ y)
         โ†’ (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ฮด)) โŠ‘โŸจ ๐“” โŸฉ y
       v y p = transport (ฮป - โ†’ prโ‚‚ - โŠ‘โŸจ ๐“” โŸฉ y) (โˆโŸจ,โŸฉ๏ผโŸจโˆ,โˆโŸฉ ฮด) e
        where
         e : prโ‚‚ (โˆ ๐““ (prโ‚โˆ˜ฮฑ-is-Directed ฮด) , โˆ ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด)) โŠ‘โŸจ ๐“” โŸฉ y
         e = โˆ-is-lowerbound-of-upperbounds ๐“” (prโ‚‚โˆ˜ฮฑ-is-Directed ฮด) y p

 infixr 30 _ร—แตˆแถœแต–แต’โŠฅ_

 _ร—แตˆแถœแต–แต’โŠฅ_ : DCPOโŠฅ {๐“ค} {๐“ฃ}
          โ†’ DCPOโŠฅ {๐“ค'} {๐“ฃ'}
          โ†’ DCPOโŠฅ {๐“ค โŠ” ๐“ค'} {๐“ฃ โŠ” ๐“ฃ'}
 ๐““ ร—แตˆแถœแต–แต’โŠฅ ๐“” = ((๐““ โป) ร—แตˆแถœแต–แต’ (๐“” โป)) , least , p
  where
   least : โŸจ (๐““ โป) ร—แตˆแถœแต–แต’ (๐“” โป) โŸฉ
   least = โŠฅ ๐““ , โŠฅ ๐“”

   p : is-least (underlying-order ((๐““ โป) ร—แตˆแถœแต–แต’ (๐“” โป))) least
   p x = (โŠฅ-is-least ๐““ (prโ‚ x)) , (โŠฅ-is-least ๐“” (prโ‚‚ x))

 module _ (๐““ : DCPO {๐“ค} {๐“ค'})
          (๐“” : DCPO {๐“ฃ} {๐“ฃ'})
          (๐“• : DCPO {๐“ฆ} {๐“ฆ'})
        where

   ร—แตˆแถœแต–แต’-assocโ‚ : DCPO[ ๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“• , (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• ]
   ร—แตˆแถœแต–แต’-assocโ‚ = f , c
    where
     f : โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ โ†’ โŸจ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• โŸฉ
     f (d , e , f) = (d , e) , f

     f-is-monotone : is-monotone (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ((๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“•) f
     f-is-monotone x y p = ((prโ‚ p) , (prโ‚ (prโ‚‚ p))) , (prโ‚‚ (prโ‚‚ p))

     c : is-continuous (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ((๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“•) f
     c I ฮฑ ฮด = u , v
      where
       assoc-โˆ : โŸจ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• โŸฉ
       assoc-โˆ = (prโ‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด) ,
                  (prโ‚ (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด)))) ,
                 prโ‚‚ (prโ‚‚ (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด))

       u : is-upperbound
            (underlying-order ((๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“•))
            assoc-โˆ
            (ฮป i โ†’ ((prโ‚ (ฮฑ i)) , (prโ‚ (prโ‚‚ (ฮฑ i)))) , (prโ‚‚ (prโ‚‚ (ฮฑ i))))
       u i = (prโ‚ p , prโ‚ (prโ‚‚ p)) , prโ‚‚ (prโ‚‚ p)
        where
         p = โˆ-is-upperbound (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด i

       v : (w : โŸจ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• โŸฉ)
         โ†’ ((i : I) โ†’ f (ฮฑ i) โŠ‘โŸจ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• โŸฉ w)
         โ†’ f (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด) โŠ‘โŸจ (๐““ ร—แตˆแถœแต–แต’ ๐“”) ร—แตˆแถœแต–แต’ ๐“• โŸฉ w
       v w@((x , y) , z) p = f-is-monotone (โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด) w' l
         where
          w' = x , (y , z)

          w'-is-upperbound : is-upperbound
                              (underlying-order (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•))
                              w'
                              ฮฑ
          w'-is-upperbound i = (prโ‚ (prโ‚ (p i))) , (prโ‚‚ (prโ‚ (p i))) , (prโ‚‚ (p i))

          l : โˆ (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•) ฮด โŠ‘โŸจ ๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ w'
          l = โˆ-is-lowerbound-of-upperbounds (๐““ ร—แตˆแถœแต–แต’ ๐“” ร—แตˆแถœแต–แต’ ๐“•)
               ฮด
               w'
               w'-is-upperbound

   to-ร—-DCPO : DCPO[ ๐““ , ๐“” ] โ†’  DCPO[ ๐““ , ๐“• ] โ†’ DCPO[ ๐““ , ๐“” ร—แตˆแถœแต–แต’ ๐“• ]
   to-ร—-DCPO ๐•—@(f , fc) ๐•˜@(g , gc) = h , hc
    where
     h : โŸจ ๐““ โŸฉ โ†’ โŸจ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ
     h d = f d , g d

     h-is-monotone : is-monotone ๐““ (๐“” ร—แตˆแถœแต–แต’ ๐“•) h
     h-is-monotone x y p = monotone-if-continuous ๐““ ๐“” ๐•— x y p ,
                           monotone-if-continuous ๐““ ๐“• ๐•˜ x y p

     hc : is-continuous ๐““ (๐“” ร—แตˆแถœแต–แต’ ๐“•) h
     hc I ฮฑ ฮด = u , v
      where
       u : is-upperbound (underlying-order (๐“” ร—แตˆแถœแต–แต’ ๐“•)) (h (โˆ ๐““ ฮด)) (h โˆ˜ ฮฑ)
       u i = h-is-monotone (ฮฑ i) (โˆ ๐““ ฮด) (โˆ-is-upperbound ๐““ ฮด i)

       v : (t : โŸจ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ)
         โ†’ ((i : I) โ†’ (h (ฮฑ i)) โŠ‘โŸจ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ t)
         โ†’ (h (โˆ ๐““ ฮด)) โŠ‘โŸจ ๐“” ร—แตˆแถœแต–แต’ ๐“• โŸฉ t
       v t@(y , z) p = lf , lg
        where
         lf : f (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“” โŸฉ y
         lf = transport (ฮป - โ†’ - โŠ‘โŸจ ๐“” โŸฉ y) (q โปยน) l
          where
           ฮต : is-Directed ๐“” (f โˆ˜ ฮฑ)
           ฮต = image-is-directed ๐““ ๐“” (monotone-if-continuous ๐““ ๐“” ๐•—) ฮด

           q : f (โˆ ๐““ ฮด) ๏ผ โˆ ๐“” ฮต
           q = continuous-โˆ-๏ผ ๐““ ๐“” ๐•— ฮด

           l : โˆ ๐“” ฮต โŠ‘โŸจ ๐“” โŸฉ y
           l = โˆ-is-lowerbound-of-upperbounds ๐“” ฮต y (ฮป i โ†’ prโ‚ (p i))

         lg : g (โˆ ๐““ ฮด) โŠ‘โŸจ ๐“• โŸฉ z
         lg = transport (ฮป - โ†’ - โŠ‘โŸจ ๐“• โŸฉ z) (q โปยน) l
          where
           ฯ• : is-Directed ๐“• (g โˆ˜ ฮฑ)
           ฯ• = image-is-directed ๐““ ๐“• (monotone-if-continuous ๐““ ๐“• ๐•˜) ฮด

           q : g (โˆ ๐““ ฮด) ๏ผ โˆ ๐“• ฯ•
           q = continuous-โˆ-๏ผ ๐““ ๐“• ๐•˜ ฮด

           l : โˆ ๐“• ฯ• โŠ‘โŸจ ๐“• โŸฉ z
           l = โˆ-is-lowerbound-of-upperbounds ๐“• ฯ• z (ฮป i โ†’ prโ‚‚ (p i))

 module _ (๐““ : DCPOโŠฅ {๐“ค} {๐“ค'})
          (๐“” : DCPOโŠฅ {๐“ฃ} {๐“ฃ'})
          (๐“• : DCPOโŠฅ {๐“ฆ} {๐“ฆ'})
       where

   ร—แตˆแถœแต–แต’โŠฅ-assocโ‚ : DCPOโŠฅ[ ๐““ ร—แตˆแถœแต–แต’โŠฅ ๐“” ร—แตˆแถœแต–แต’โŠฅ ๐“• , (๐““ ร—แตˆแถœแต–แต’โŠฅ ๐“”) ร—แตˆแถœแต–แต’โŠฅ ๐“• ]
   ร—แตˆแถœแต–แต’โŠฅ-assocโ‚ = ร—แตˆแถœแต–แต’-assocโ‚ (๐““ โป) (๐“” โป) (๐“• โป)

   to-ร—-DCPOโŠฅ : DCPOโŠฅ[ ๐““ , ๐“” ] โ†’ DCPOโŠฅ[ ๐““ , ๐“• ] โ†’ DCPOโŠฅ[ ๐““ , ๐“” ร—แตˆแถœแต–แต’โŠฅ ๐“• ]
   to-ร—-DCPOโŠฅ f g = to-ร—-DCPO (๐““ โป) (๐“” โป) (๐“• โป) f g

\end{code}

Added 3 July 2024 by Tom de Jong.

\begin{code}

 ร—แตˆแถœแต–แต’-is-product : (๐““โ‚ : DCPO {๐“ค} {๐“ฃ}) (๐““โ‚‚ : DCPO {๐“ค'} {๐“ฃ'})
                    (๐“” : DCPO {๐“ฆ} {๐“ฆ'})
                    (f : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““โ‚ โŸฉ) (g : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““โ‚‚ โŸฉ)
                  โ†’ is-continuous ๐“” ๐““โ‚ f
                  โ†’ is-continuous ๐“” ๐““โ‚‚ g
                  โ†’ โˆƒ! k ๊ž‰ (โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚ โŸฉ) ,
                           is-continuous ๐“” (๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚) k
                         ร— prโ‚ โˆ˜ k โˆผ f
                         ร— prโ‚‚ โˆ˜ k โˆผ g
 ร—แตˆแถœแต–แต’-is-product ๐““โ‚ ๐““โ‚‚ ๐“” f g cf cg =
  (k , k-is-continuous , โˆผ-refl , โˆผ-refl) , k-is-unique
   where
    k-bundled : DCPO[ ๐“” , ๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚ ]
    k-bundled = to-ร—-DCPO ๐“” ๐““โ‚ ๐““โ‚‚ (f , cf) (g , cg)
    k : โŸจ ๐“” โŸฉ โ†’ โŸจ ๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚ โŸฉ
    k = prโ‚ k-bundled
    k-is-continuous : is-continuous ๐“” (๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚) k
    k-is-continuous = prโ‚‚ k-bundled
    k-is-unique : is-central _ (k , k-is-continuous ,
                                (ฮป x โ†’ refl) , (ฮป x โ†’ refl))
    k-is-unique (h , h-cont , h-eqf , h-eqg) =
     to-subtype-๏ผ (ฮป j โ†’ ร—-is-prop
                           (being-continuous-is-prop ๐“” (๐““โ‚ ร—แตˆแถœแต–แต’ ๐““โ‚‚) j)
                           (ร—-is-prop (ฮ -is-prop fe (ฮป e โ†’ sethood ๐““โ‚))
                                      (ฮ -is-prop fe (ฮป e โ†’ sethood ๐““โ‚‚))))
                   (dfunext fe (ฮป e โ†’ k e       ๏ผโŸจ refl โŸฉ
                                      f e , g e ๏ผโŸจ (eq e ) โปยน โŸฉ
                                      h e       โˆŽ))
      where
       eq : (e : โŸจ ๐“” โŸฉ) โ†’ h e ๏ผ f e , g e
       eq e = apโ‚‚ _,_ (h-eqf e) (h-eqg e)

\end{code}