Ayberk Tosun, 28 February 2022.

\begin{code}

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

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

module Locales.GaloisConnection
         (pt : propositional-truncations-exist)
         (fe : Fun-Ext)
         where

open import Locales.Frame pt fe
open import UF.Logic
open import UF.SubtypeClassifier
open import UF.Subsingletons

open AllCombinators pt fe

\end{code}

\begin{code}

module GaloisConnectionBetween (P : Poset 𝓤 𝓥) (Q : Poset 𝓤' 𝓥') where

\end{code}

Definition of a pair of opposing monotonic maps forming an adjoint pair:

\begin{code}

 _⊣_ : (P ─m→ Q)  (Q ─m→ P)  Ω (𝓤  𝓥  𝓤'  𝓥')
 (f , _)  (g , _) =  x   P ∣ₚ ,  y   Q ∣ₚ ,
                      (f x ≤[ Q ] y  x ≤[ P ] g y)  (x ≤[ P ] g y  f x ≤[ Q ] y)

 has-right-adjoint : (P ─m→ Q)  𝓤  𝓥  𝓤'  𝓥' ̇
 has-right-adjoint f = Σ g  Q ─m→ P , (f  g) holds

 has-left-adjoint : (Q ─m→ P)  𝓤  𝓥  𝓤'  𝓥' ̇
 has-left-adjoint g = Σ f  P ─m→ Q , (f  g) holds

\end{code}

\begin{code}

 unit : (f : P ─m→ Q) (g : Q ─m→ P)
       (f  g) holds
       (x :  P ∣ₚ)
       (x ≤[ P ] (g .pr₁  f .pr₁) x) holds
 unit (f , _) g p x = pr₁ (p x (f x)) (≤-is-reflexive Q (f x))

 counit : (f⁺ : P ─m→ Q) (f₊ : Q ─m→ P)
         (f⁺  f₊) holds  (y :  Q ∣ₚ)  ((f⁺ .pr₁  f₊ .pr₁) y ≤[ Q ] y) holds
 counit (f , _) (g , _) η y = pr₂ (η (g y) y) (≤-is-reflexive P (g y))

\end{code}

\begin{code}

 has-right-adjoint-is-prop : (f : P ─m→ Q)
                            is-prop (Σ g  Q ─m→ P , ((f  g) holds))
 has-right-adjoint-is-prop 𝒻 (ℊ₁@(g₁ , _) , p₁) (ℊ₂@(g₂ , _) , p₂) =
  to-subtype-= υ (to-subtype-= ϕ (dfunext fe γ))
   where
    υ : (g : Q ─m→ P)  is-prop ((𝒻  g) holds)
    υ  = holds-is-prop (𝒻  )

    ϕ : ( :  Q ∣ₚ   P ∣ₚ)  is-prop (is-monotonic Q P  holds)
    ϕ = holds-is-prop  is-monotonic Q P

    γ : g₁  g₂
    γ y = ≤-is-antisymmetric P α β
     where
      α : (g₁ y ≤[ P ] g₂ y) holds
      α = pr₁ (p₂ (g₁ y) y) (counit 𝒻 ℊ₁ p₁ y)

      β : ((g₂ y) ≤[ P ] (g₁ y)) holds
      β = pr₁ (p₁ (g₂ y) y) (counit 𝒻 ℊ₂ p₂ y)

 has-left-adjoint-is-prop : (g : Q ─m→ P)
                           is-prop (Σ f  P ─m→ Q , (f  g) holds)
 has-left-adjoint-is-prop  (𝒻₁@(f₁ , _) , p₁) (𝒻₂@(f₂ , _) , p₂) =
  to-subtype-= υ (to-subtype-= ϕ (dfunext fe γ))
   where
    υ : (𝒻 : P ─m→ Q)  is-prop ((𝒻  ) holds)
    υ 𝒻 = holds-is-prop (𝒻  )

    ϕ : (f :  P ∣ₚ   Q ∣ₚ)  is-prop (is-monotonic P Q f holds)
    ϕ = holds-is-prop  is-monotonic P Q

    γ : f₁  f₂
    γ x = ≤-is-antisymmetric Q α β
     where
      α : (f₁ x ≤[ Q ] f₂ x) holds
      α = pr₂ (p₁ x (f₂ x)) (unit 𝒻₂  p₂ x)

      β : (f₂ x ≤[ Q ] f₁ x) holds
      β = pr₂ (p₂ x (f₁ x)) (unit 𝒻₁  p₁ x)

\end{code}

\begin{code}

 right-adjoints-are-unique : (f : P ─m→ Q) (g₁ g₂ : Q ─m→ P)
                            (f  g₁) holds  (f  g₂) holds  g₁  g₂
 right-adjoints-are-unique f g₁ g₂ p₁ p₂ =
  pr₁ (from-Σ-= (has-right-adjoint-is-prop f (g₁ , p₁) (g₂ , p₂)))

 left-adjoints-are-unique : (f₁ f₂ : P ─m→ Q) (g : Q ─m→ P)
                           (f₁  g) holds  (f₂  g) holds  f₁  f₂
 left-adjoints-are-unique f₁ f₂ g p₁ p₂ =
  pr₁ (from-Σ-= (has-left-adjoint-is-prop g (f₁ , p₁) (f₂ , p₂)))

\end{code}