Martin Escardo, May 2020

We now consider frames. A frame is a poset with all joins
and finite meets such that binary meets distribute over countable
joins.

TODO. Currently the order is derived from the binary meet. However,
for size reasons, it would be good to add the other as a separate
relation coinciding with the binary meet order.

\begin{code}

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

open import MLTT.Spartan
open import UF.FunExt
open import UF.Subsingletons

module OrderedTypes.Frame (fe : Fun-Ext) where

open import UF.Equiv hiding (_≅_)
open import UF.SIP
open import UF.SIP-Examples
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier hiding (Ω₀)
open import UF.SubtypeClassifier-Properties
open import UF.Univalence

module _ (𝓤 𝓥 : Universe) where

 frame-structure : 𝓤 ̇ → 𝓤 ⊔ (𝓥 ⁺) ̇
 frame-structure X = X × (X → X → X) × ({N : 𝓥 ̇ } → ((N → X) → X))

 frame-axioms : (X : 𝓤 ̇ ) → frame-structure X → 𝓤 ⊔ (𝓥 ⁺) ̇
 frame-axioms X (⊤ , _∧_ , ⋁) = I × II × III × IV × V × VI × VII × VIII
  where
   _≤_ : X → X → 𝓤 ̇
   x ≤ y = x ∧ y ＝ x

   I    = is-set X
   II   = (x : X) → x ∧ x ＝ x
   III  = (x y : X) → x ∧ y ＝ y ∧ x
   IV   = (x y z : X) → x ∧ (y ∧ z) ＝ (x ∧ y) ∧ z
   V    = (x : X) → x ∧ ⊤ ＝ x
   VI   = (x : X) {N : 𝓥 ̇ } (y : N → X) → x ∧ (⋁ y) ＝ ⋁ (n ↦ (x ∧ y n))
   VII  = {N : 𝓥 ̇ } (x : N → X) (n : N) → x n ≤ ⋁ x
   VIII = {N : 𝓥 ̇ } (x : N → X) (u : X) → ((n : N) → x n ≤ u) → ⋁ x ≤ u
 \end{code}

 Axioms I-IV say that (X , ⊤ , ∧) is a bounded semilattice, axiom VII
 says that ⋁ gives least upper bounds w.r.t. the induced partial order,
 and axiom VI says that binary meets distribute over countable joins.

 \begin{code}

 frame-axioms-is-prop : (X : 𝓤 ̇ ) (s : frame-structure X)
                      → is-prop (frame-axioms X s)
 frame-axioms-is-prop X (⊤ , _∧_ , ⋁) = prop-criterion δ
  where
   δ : frame-axioms X (⊤ , _∧_ , ⋁) → is-prop (frame-axioms X (⊤ , _∧_ , ⋁))
   δ (i , ii-vii) =
     ×₈-is-prop
       (being-set-is-prop fe)
       (Π-is-prop fe (λ x →           i {x ∧ x} {x}))
       (Π₂-is-prop fe (λ x y →        i {x ∧ y} {y ∧ x}))
       (Π₃-is-prop fe (λ x y z →      i {x ∧ (y ∧ z)} {(x ∧ y) ∧ z}))
       (Π-is-prop fe (λ x →           i {x ∧ ⊤} {x}))
       (Π-is-prop fe (λ x →
        Π-is-prop' fe (λ N →
        Π-is-prop fe (λ y →           i {x ∧ ⋁ y} {⋁ (λ n → x ∧ y n)}))))
       (Π-is-prop' fe (λ n
         →  Π₂-is-prop  fe (λ 𝕪 n →   i {𝕪 n ∧ ⋁ 𝕪} {𝕪 n})))
       (Π-is-prop' fe (λ n
         →  Π₃-is-prop  fe (λ 𝕪 u _ → i {⋁ 𝕪 ∧ u} {⋁ 𝕪})))

 Frame : (𝓤 ⊔ 𝓥)⁺ ̇
 Frame = Σ A ꞉ 𝓤 ̇ , Σ s ꞉ frame-structure A , frame-axioms A s

 _≅[Frame]_ : Frame → Frame → 𝓤 ⊔ (𝓥 ⁺) ̇
 (A , (⊤ , _∧_ , ⋁) , _) ≅[Frame] (A' , (⊤' , _∧'_ , ⋁') , _) =

                         Σ f ꞉ (A → A')
                             , is-equiv f
                             × (f ⊤ ＝ ⊤')
                             × ((λ a b → f (a ∧ b)) ＝ (λ a b → f a ∧' f b))
                             × ((λ {N} (𝕒 : N → A) → f (⋁ 𝕒)) ＝ (λ {N} 𝕒 → ⋁' (n ↦ f (𝕒 n))))

 characterization-of-Frame-＝ : is-univalent 𝓤
                             → (A B : Frame)
                             → (A ＝ B) ≃ (A ≅[Frame] B)
 characterization-of-Frame-＝ ua =
   sip.characterization-of-＝ ua
    (sip-with-axioms.add-axioms
       frame-axioms
       frame-axioms-is-prop
      (sip-join.join
        pointed-type.sns-data
      (sip-join.join
        ∞-magma.sns-data
        ∞-hugemagma.sns-data)))

\end{code}

Example.

\begin{code}

open import UF.PropTrunc

module _ (pe : Prop-Ext)
         (pt  : propositional-truncations-exist)
       where

 open PropositionalTruncation pt

 _∧Ω_ : Ω 𝓤 → Ω 𝓤 → Ω 𝓤
 (P , i) ∧Ω (Q , j) = (P × Q) , ×-is-prop i j

 _≤Ω_ : Ω 𝓤 → Ω 𝓤 → 𝓤 ⁺ ̇
 𝕡 ≤Ω 𝕢 = 𝕡 ∧Ω 𝕢 ＝ 𝕡

 from-≤Ω : {𝕡 𝕢 : Ω 𝓤} → 𝕡 ≤Ω 𝕢 → (𝕡 holds → 𝕢 holds)
 from-≤Ω {𝓤} {P , i} {Q , j} l p = γ
  where
   r : P × Q ＝ P
   r = ap _holds l

   g : P → P × Q
   g = idtofun P (P × Q) (r ⁻¹)

   γ : Q
   γ = pr₂ (g p)

 to-≤Ω : {𝕡 𝕢 : Ω 𝓤} → (𝕡 holds → 𝕢 holds) → 𝕡 ≤Ω 𝕢
 to-≤Ω {𝓤} {P , i} {Q , j} f = γ
  where
   r : P × Q ＝ P
   r = pe (×-is-prop i j) i pr₁ (λ p → (p , f p))

   γ : ((P × Q) , _) ＝ (P , _)
   γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r

 ⋁Ω : {N : 𝓤 ̇ } → (N → Ω 𝓥) → Ω (𝓤 ⊔ 𝓥)
 ⋁Ω {𝓤} {𝓥} {N} 𝕡 = (∃ n ꞉ N , (𝕡 n holds)) , ∃-is-prop

 Ω-qua-frame : ∀ 𝓤 𝓥 → Frame ((𝓤 ⊔ 𝓥)⁺) 𝓤
 Ω-qua-frame 𝓤 𝓥 = Ω₀ ,
                   (⊤ , _∧Ω_ , ⋁Ω) ,
                   Ω-is-set fe pe ,
                   ∧-is-idempotent ,
                   ∧-is-commutative ,
                   ∧-is-associative ,
                   ⊤-is-maximum ,
                   ∧-⋁-distributivity ,
                   ⋁-is-ub ,
                   ⋁-is-lb-of-ubs
  where
   Ω₀ = Ω (𝓤 ⊔ 𝓥)


   ∧-is-idempotent : (𝕡 : Ω₀) → 𝕡 ∧Ω 𝕡 ＝ 𝕡
   ∧-is-idempotent (P , i) = γ
    where
     r : P × P ＝ P
     r = pe (×-is-prop i i) i pr₁ (λ p → (p , p))

     γ : ((P × P) , _) ＝ (P , _)
     γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r


   ∧-is-commutative : (𝕡 𝕢 : Ω₀) → 𝕡 ∧Ω 𝕢 ＝ 𝕢 ∧Ω 𝕡
   ∧-is-commutative (P , i) (Q , j) = γ
    where
     r : P × Q ＝ Q × P
     r = pe (×-is-prop i j)
            (×-is-prop j i)
            (λ (p , q) → (q , p))
            (λ (q , p) → (p , q))

     γ : ((P × Q) , _) ＝ ((Q × P) , _)
     γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r

   ∧-is-associative : (𝕡 𝕢 𝕣 : Ω₀) → 𝕡 ∧Ω (𝕢 ∧Ω 𝕣) ＝ (𝕡 ∧Ω 𝕢) ∧Ω 𝕣
   ∧-is-associative (P , i) (Q , j) (R , k) = γ
    where
     r : P × (Q × R) ＝ (P × Q) × R
     r = pe (×-is-prop i (×-is-prop j k))
            (×-is-prop (×-is-prop i j) k)
            (λ (p , (q , r)) → ((p , q) , r))
            (λ ((p , q) , r) → (p , (q , r)))

     γ : ((P × (Q × R)) , _) ＝ (((P × Q) × R) , _)
     γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r

   ⊤-is-maximum : (𝕡 : Ω₀) → 𝕡 ≤Ω ⊤
   ⊤-is-maximum (P , i) = γ
    where
     r : P × 𝟙 ＝ P
     r = pe (×-is-prop i 𝟙-is-prop)
            i
            (λ (p , _) → p)
            (λ p → (p , ⋆))

     γ : ((P × 𝟙) , _) ＝ (P , _)
     γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r

   ∧-⋁-distributivity : (𝕡 : Ω₀) {N : 𝓤 ̇ } (𝕢 : N → Ω₀) → 𝕡 ∧Ω (⋁Ω 𝕢) ＝ ⋁Ω (n ↦ 𝕡 ∧Ω 𝕢 n)
   ∧-⋁-distributivity (P , i) {N} 𝕢 = γ
    where
     Q : N → 𝓤 ⊔ 𝓥 ̇
     Q n = 𝕢 n holds

     j : (n : N) → is-prop (Q n)
     j n = holds-is-prop (𝕢 n)

     α  : P × ∃ Q → ∃ n ꞉ N , P × Q n
     α (p , e) = ∥∥-rec ∃-is-prop (λ (n , q) → ∣ n , p , q ∣) e

     β : (∃ n ꞉ N , P × Q n) → P × ∃ Q
     β e = ∥∥-rec i (λ (n , p , q) → p) e ,
           ∥∥-rec ∃-is-prop (λ (n , p , q) → ∣ n , q ∣) e

     r : P × (∃ n ꞉ N , Q n) ＝ (∃ n ꞉ N , P × Q n)
     r = pe (×-is-prop i ∃-is-prop) ∃-is-prop α β


     γ : ((P × (∃ n ꞉ N , Q n)) , _) ＝ ((∃ n ꞉ N , P × Q n) , _)
     γ = to-subtype-＝ (λ _ → being-prop-is-prop fe) r


   ⋁-is-ub : {N : 𝓤 ̇ } (𝕡 : N → Ω₀) → (n : N) → 𝕡 n ≤Ω ⋁Ω 𝕡
   ⋁-is-ub 𝕡 n = to-≤Ω {_} {𝕡 n} {⋁Ω 𝕡} (λ p → ∣ n , p ∣)

   ⋁-is-lb-of-ubs : {N : 𝓤 ̇ } (𝕡 : N → Ω₀) (𝕦 : Ω₀)
                  → ((n : N) → 𝕡 n ≤Ω 𝕦)
                  → ⋁Ω 𝕡 ≤Ω 𝕦
   ⋁-is-lb-of-ubs {N} 𝕡 𝕦 φ = to-≤Ω {_} {⋁Ω 𝕡} {𝕦} γ
    where
     δ : (Σ n ꞉ N , 𝕡 n holds) → 𝕦 holds
     δ (n , p) = from-≤Ω {_} {𝕡 n} {𝕦} (φ n) p

     γ : (∃ n ꞉ N , 𝕡 n holds) → 𝕦 holds
     γ = ∥∥-rec (holds-is-prop 𝕦) δ


\end{code}
