Ayberk Tosun, 12 September 2023

Split out from the now-deprecated `CompactRegular` module.

\begin{code}

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

open import MLTT.Spartan hiding (𝟚)
open import UF.PropTrunc
open import UF.FunExt
open import UF.Size

module Locales.WellInside (pt : propositional-truncations-exist)
                          (fe : Fun-Ext)
                          (sr : Set-Replacement pt)                where

\end{code}

Importation of foundational UF stuff.

\begin{code}

open import UF.SubtypeClassifier
open import UF.Logic

open import Locales.Frame       pt fe

open AllCombinators pt fe
open PropositionalTruncation pt

\end{code}

\begin{code}

well-insideβ‚€ : (F : Frame 𝓀 π“₯ 𝓦) β†’ ⟨ F ⟩ β†’ ⟨ F ⟩ β†’ 𝓀  Μ‡
well-insideβ‚€ F U V =
 Ξ£ W κž‰ ⟨ F ⟩ , (U ∧[ F ] W = 𝟎[ F ]) Γ— (V ∨[ F ] W = 𝟏[ F ])

infix 4 well-insideβ‚€

syntax well-insideβ‚€ F U V = U β‹œβ‚€[ F ] V

\end{code}

Because well inside is not propositional, we have to truncate it to get a
relation.

\begin{code}

well-inside : (F : Frame 𝓀 π“₯ 𝓦) β†’ ⟨ F ⟩ β†’ ⟨ F ⟩ β†’ Ξ© 𝓀
well-inside F U V = βˆ₯ U β‹œβ‚€[ F ] V βˆ₯Ξ©

infix 4 well-inside

syntax well-inside F U V = U β‹œ[ F ] V

\end{code}

Proposition. Let `U, V : π’ͺ(X)`. If `U β‹œ V` then `U ≀ V`.

\begin{code}

well-inside-implies-below : (F : Frame 𝓀 π“₯ 𝓦)
                          β†’ (U V : ⟨ F ⟩)
                          β†’ (U β‹œ[ F ] V β‡’ (U ≀[ poset-of F ] V)) holds
well-inside-implies-below F U V = βˆ₯βˆ₯-rec (holds-is-prop (U ≀[ poset-of F ] V)) Ξ³
 where
  _βŠ“_ = Ξ» U V β†’ U ∧[ F ] V

  Ξ³ : U β‹œβ‚€[ F ] V β†’ (U ≀[ poset-of F ] V) holds
  Ξ³ (W , c₁ , cβ‚‚) = connecting-lemmaβ‚‚ F Ξ΄
   where
    δ : U = U ∧[ F ] V
    δ = U                        =⟨ 𝟏-right-unit-of-∧ F U ⁻¹              ⟩
        U βŠ“ 𝟏[ F ]               =⟨ ap (U βŠ“_) (cβ‚‚ ⁻¹)                     ⟩
        U βŠ“ (V ∨[ F ] W)         =⟨ binary-distributivity F U V W         ⟩
        (U βŠ“ V) ∨[ F ] (U βŠ“ W)   =⟨ ap (Ξ» - β†’ binary-join F (U βŠ“ V) -) c₁ ⟩
        (U βŠ“ V) ∨[ F ] 𝟎[ F ]    =⟨ 𝟎-left-unit-of-∨ F (U βŠ“ V)            ⟩
        U βŠ“ V                    ∎

\end{code}

The set `↑↑(U) ≑ { V ∣ U β‹œ V}` is upwards-closed.

\begin{code}

↑↑-is-upwards-closed : (F : Frame 𝓀 π“₯ 𝓦)
                     β†’ {U V W : ⟨ F ⟩}
                     β†’ (U β‹œ[ F ] V) holds
                     β†’ (V ≀[ poset-of F ] W) holds
                     β†’ (U β‹œ[ F ] W) holds
↑↑-is-upwards-closed F {U} {V} {W} p q =
 βˆ₯βˆ₯-rec (holds-is-prop (U β‹œ[ F ] W)) Ξ³ p
  where
   open PosetReasoning (poset-of F)

   Ξ³ : U β‹œβ‚€[ F ] V β†’ (U β‹œ[ F ] W) holds
   Ξ³ (T , c₁ , cβ‚‚) = ∣ T , c₁ , dβ‚‚ ∣
    where
     Ξ² : (𝟏[ F ] ≀[ poset-of F ] (W ∨[ F ] T)) holds
     Ξ² = 𝟏[ F ]      =⟨ cβ‚‚ ⁻¹                  βŸ©β‚š
         V ∨[ F ] T  β‰€βŸ¨ ∨[ F ]-left-monotone q ⟩
         W ∨[ F ] T  β– 

     dβ‚‚ : W ∨[ F ] T = 𝟏[ F ]
     dβ‚‚ = only-𝟏-is-above-𝟏 F (W ∨[ F ] T) Ξ²

\end{code}

The set `↓↓(U) ≑ { V | V β‹œ U}` is downwards-closed.

\begin{code}

↓↓-is-downwards-closed : (F : Frame 𝓀 π“₯ 𝓦)
                       β†’ {U V W : ⟨ F ⟩}
                       β†’ (V β‹œ[ F ] W) holds
                       β†’ (U ≀[ poset-of F ] V) holds
                       β†’ (U β‹œ[ F ] W) holds
↓↓-is-downwards-closed F {U} {V} {W} p q = βˆ₯βˆ₯-rec βˆ₯βˆ₯-is-prop Ξ³ p
 where
  open PosetReasoning (poset-of F)

  Ξ³ : V β‹œβ‚€[ F ] W β†’ (U β‹œ[ F ] W) holds
  Ξ³ (T , c₁ , cβ‚‚) = ∣ T , (only-𝟎-is-below-𝟎 F (U ∧[ F ] T) Ξ² , cβ‚‚) ∣
   where
    Ξ² : ((U ∧[ F ] T) ≀[ poset-of F ] 𝟎[ F ]) holds
    Ξ² = U ∧[ F ] T  β‰€βŸ¨ ∧[ F ]-left-monotone q ⟩
        V ∧[ F ] T  =⟨ c₁                    βŸ©β‚š
        𝟎[ F ]      β– 

\end{code}