\section{Preamble} \begin{code} {-# OPTIONS --safe --without-K --lossy-unification #-} open import MLTT.Spartan open import UF.PropTrunc open import UF.FunExt module Locales.HeytingImplication (pt : propositional-truncations-exist) (fe : Fun-Ext) where open import Locales.Frame pt fe open import Locales.GaloisConnection pt fe open import UF.Logic open import UF.SubtypeClassifier open AllCombinators pt fe open PropositionalTruncation pt open import Locales.AdjointFunctorTheoremForFrames pt fe open Locale is-heyting-implication-of : (X : Locale 𝓤 𝓥 𝓦) → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ × ⟨ 𝒪 X ⟩ → Ω (𝓤 ⊔ 𝓥) is-heyting-implication-of X z (x , y) = Ɐ w ꞉ ⟨ 𝒪 X ⟩ , ((w ∧[ 𝒪 X ] x) ≤[ poset-of (𝒪 X) ] y) ⇔ (w ≤[ poset-of (𝒪 X) ] z) is-heyting-implication-operation : (X : Locale 𝓤 𝓥 𝓦) → (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → Ω (𝓤 ⊔ 𝓥) is-heyting-implication-operation X _==>_ = Ɐ x ꞉ ⟨ 𝒪 X ⟩ , Ɐ y ꞉ ⟨ 𝒪 X ⟩ , is-heyting-implication-of X (x ==> y) (x , y) modus-ponens : (X : Locale 𝓤 𝓥 𝓦) {U V W : ⟨ 𝒪 X ⟩} → is-heyting-implication-of X W (U , V) holds → ((W ∧[ 𝒪 X ] U) ≤[ poset-of (𝒪 X) ] V) holds modus-ponens X {x} {y} {z} p = pr₂ (p z) (≤-is-reflexive (poset-of (𝒪 X)) z) where open PosetReasoning (poset-of (𝒪 X)) module HeytingImplicationConstruction (X : Locale 𝓤 𝓥 𝓥) (𝒷 : has-basis (𝒪 X) holds) where \end{code} \begin{code} private _≤_ = λ U V → U ≤[ poset-of (𝒪 X) ] V L = 𝒪 X Lₚ = poset-of (𝒪 X) open GaloisConnectionBetween open AdjointFunctorTheorem X X 𝒷 ∧-right-preserves-joins : (U : ⟨ 𝒪 X ⟩) → (is-join-preserving (𝒪 X) (𝒪 X) (meet-of (𝒪 X) U)) holds ∧-right-preserves-joins = distributivity (𝒪 X) meet-right-is-monotonic : (U : ⟨ 𝒪 X ⟩) → is-monotonic Lₚ Lₚ (meet-of (𝒪 X) U) holds meet-right-is-monotonic U = scott-continuous-implies-monotone L L (meet-of L U) ν where ν : is-scott-continuous (𝒪 X) (𝒪 X) (meet-of (𝒪 X) U) holds ν = join-preserving-implies-scott-continuous L L (meet-of L U) (∧-right-preserves-joins U) meet-rightₘ : ⟨ L ⟩ → Lₚ ─m→ Lₚ meet-rightₘ U = (λ V → U ∧[ L ] V) , meet-right-is-monotonic U _==>_ : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ _==>_ U = pr₁ (pr₁ (aft-backward (meet-rightₘ U) (∧-right-preserves-joins U))) ==>-is-heyting-implication : is-heyting-implication-operation X _==>_ holds ==>-is-heyting-implication U V W = β , γ where open PosetReasoning (poset-of L) ψ = aft-backward (meet-rightₘ U) (∧-right-preserves-joins U) β : ((W ∧[ L ] U) ≤[ poset-of L ] V ⇒ W ≤[ poset-of L ] (U ==> V)) holds β p = pr₁ (pr₂ ψ W V) (U ∧[ L ] W =⟨ ∧[ L ]-is-commutative U W ⟩ₚ W ∧[ L ] U ≤⟨ p ⟩ V ■) † : ((U ∧[ L ] (U ==> V)) ≤[ poset-of L ] V) holds † = pr₂ (pr₂ ψ (U ==> V) V) (≤-is-reflexive (poset-of L) (U ==> V)) γ : (W ≤[ poset-of L ] (U ==> V) ⇒ (W ∧[ L ] U) ≤[ poset-of L ] V) holds γ p = W ∧[ L ] U ≤⟨ ∧[ L ]-left-monotone p ⟩ (U ==> V) ∧[ L ] U =⟨ ∧[ L ]-is-commutative (U ==> V) U ⟩ₚ U ∧[ L ] (U ==> V) ≤⟨ † ⟩ V ■ heyting-implication₁ : (U V W : ⟨ 𝒪 X ⟩) → ((W ∧[ 𝒪 X ] U) ≤ V ⇒ W ≤ (U ==> V)) holds heyting-implication₁ U V W = pr₁ (==>-is-heyting-implication U V W) heyting-implication₂ : (U V W : ⟨ 𝒪 X ⟩) → (W ≤ (U ==> V) ⇒ ((W ∧[ 𝒪 X ] U) ≤ V)) holds heyting-implication₂ U V W = pr₂ (==>-is-heyting-implication U V W) currying : (U V W : ⟨ 𝒪 X ⟩) → (((U ∧[ 𝒪 X ] V) ==> W) ≤ (U ==> (V ==> W))) holds currying U V W = heyting-implication₁ U (V ==> W) _ (heyting-implication₁ V W _ γ) where open PosetReasoning (poset-of (𝒪 X)) i = ∧[ 𝒪 X ]-is-associative ((U ∧[ 𝒪 X ] V) ==> W) U V ⁻¹ ii = modus-ponens X (==>-is-heyting-implication (U ∧[ 𝒪 X ] V) W) γ : ((((U ∧[ 𝒪 X ] V) ==> W) ∧[ 𝒪 X ] U ∧[ 𝒪 X ] V) ≤ W) holds γ = ((U ∧[ 𝒪 X ] V) ==> W) ∧[ 𝒪 X ] U ∧[ 𝒪 X ] V =⟨ i ⟩ₚ ((U ∧[ 𝒪 X ] V) ==> W) ∧[ 𝒪 X ] (U ∧[ 𝒪 X ] V) ≤⟨ ii ⟩ W ■ mp-right : (U V : ⟨ 𝒪 X ⟩) → (((U ==> V) ∧[ 𝒪 X ] U) ≤[ poset-of (𝒪 X) ] V) holds mp-right U V = modus-ponens X (==>-is-heyting-implication U V) mp-left : (U V : ⟨ 𝒪 X ⟩) → ((U ∧[ 𝒪 X ] (U ==> V)) ≤[ poset-of (𝒪 X) ] V) holds mp-left U V = U ∧[ 𝒪 X ] (U ==> V) =⟨ ∧[ 𝒪 X ]-is-commutative U (U ==> V) ⟩ₚ (U ==> V) ∧[ 𝒪 X ] U ≤⟨ mp-right U V ⟩ V ■ where open PosetReasoning (poset-of (𝒪 X)) heyting-implication-identity : (U : ⟨ 𝒪 X ⟩) → U ==> U = 𝟏[ 𝒪 X ] heyting-implication-identity U = only-𝟏-is-above-𝟏 (𝒪 X) (U ==> U) † where † : (𝟏[ 𝒪 X ] ≤[ poset-of (𝒪 X ) ] (U ==> U)) holds † = heyting-implication₁ U U 𝟏[ 𝒪 X ] (∧[ 𝒪 X ]-lower₂ 𝟏[ 𝒪 X ] U) weakening : (U V : ⟨ 𝒪 X ⟩) → (V ≤[ poset-of (𝒪 X) ] (U ==> V)) holds weakening U V = heyting-implication₁ U V V (∧[ 𝒪 X ]-lower₁ V U) ex-falso-quodlibet : (U : ⟨ 𝒪 X ⟩) → (𝟏[ 𝒪 X ] ≤[ poset-of (𝒪 X) ] (𝟎[ 𝒪 X ] ==> U)) holds ex-falso-quodlibet U = heyting-implication₁ 𝟎[ 𝒪 X ] U 𝟏[ 𝒪 X ] † where open PosetReasoning (poset-of (𝒪 X)) † : ((𝟏[ 𝒪 X ] ∧[ 𝒪 X ] 𝟎[ 𝒪 X ]) ≤[ poset-of (𝒪 X) ] U) holds † = 𝟏[ 𝒪 X ] ∧[ 𝒪 X ] 𝟎[ 𝒪 X ] =⟨ 𝟏-left-unit-of-∧ (𝒪 X) 𝟎[ 𝒪 X ] ⟩ₚ 𝟎[ 𝒪 X ] ≤⟨ 𝟎-is-bottom (𝒪 X) U ⟩ U ■ H₈ : (U V : ⟨ 𝒪 X ⟩) → U = (U ∨[ 𝒪 X ] V) ∧[ 𝒪 X ] (V ==> U) H₈ U V = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡ where open PosetReasoning (poset-of (𝒪 X)) † : (U ≤[ poset-of (𝒪 X) ] ((U ∨[ 𝒪 X ] V) ∧[ 𝒪 X ] V ==> U)) holds † = ∧[ 𝒪 X ]-greatest (U ∨[ 𝒪 X ] V) (V ==> U) U (∨[ 𝒪 X ]-upper₁ U V) (weakening V U) ‡ : (((U ∨[ 𝒪 X ] V) ∧[ 𝒪 X ] (V ==> U)) ≤[ poset-of (𝒪 X) ] U) holds ‡ = (U ∨[ 𝒪 X ] V) ∧[ 𝒪 X ] (V ==> U) =⟨ Ⅰ ⟩ₚ (V ==> U) ∧[ 𝒪 X ] (U ∨[ 𝒪 X ] V) =⟨ Ⅱ ⟩ₚ ((V ==> U) ∧[ 𝒪 X ] U) ∨[ 𝒪 X ] ((V ==> U) ∧[ 𝒪 X ] V) ≤⟨ Ⅲ ⟩ ((V ==> U) ∧[ 𝒪 X ] U) ∨[ 𝒪 X ] U ≤⟨ Ⅳ ⟩ U ∨[ 𝒪 X ] U =⟨ Ⅴ ⟩ₚ U ■ where Ⅰ = ∧[ 𝒪 X ]-is-commutative (U ∨[ 𝒪 X ] V) (V ==> U) Ⅱ = binary-distributivity (𝒪 X) (V ==> U) U V Ⅲ = ∨[ 𝒪 X ]-right-monotone (mp-right V U) Ⅳ = ∨[ 𝒪 X ]-left-monotone (∧[ 𝒪 X ]-lower₂ (V ==> U) U) Ⅴ = ∨[ 𝒪 X ]-is-idempotent U ⁻¹ heyting-implication-law₄ : (U V : ⟨ 𝒪 X ⟩) → (U ==> V) = U ==> (U ∧[ 𝒪 X ] V) heyting-implication-law₄ U V = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡ where open PosetReasoning (poset-of (𝒪 X)) † : (U ==> V ≤[ poset-of (𝒪 X) ] U ==> (U ∧[ 𝒪 X ] V)) holds † = heyting-implication₁ U (U ∧[ 𝒪 X ] V) (U ==> V) †₁ where †₁ : (((U ==> V) ∧[ 𝒪 X ] U) ≤ (U ∧[ 𝒪 X ] V)) holds †₁ = (U ==> V) ∧[ 𝒪 X ] U =⟨ I ⟩ₚ U ∧[ 𝒪 X ] (U ==> V) =⟨ II ⟩ₚ (U ∧[ 𝒪 X ] U) ∧[ 𝒪 X ] (U ==> V) =⟨ III ⟩ₚ U ∧[ 𝒪 X ] (U ∧[ 𝒪 X ] (U ==> V)) ≤⟨ IV ⟩ U ∧[ 𝒪 X ] V ■ where I = ∧[ 𝒪 X ]-is-commutative (U ==> V) U II = ap (λ - → - ∧[ 𝒪 X ] (U ==> V)) (∧[ 𝒪 X ]-is-idempotent U) III = ∧[ 𝒪 X ]-is-associative U U (U ==> V) ⁻¹ IV = ∧[ 𝒪 X ]-right-monotone (mp-left U V) ‡ : (U ==> (U ∧[ 𝒪 X ] V) ≤[ poset-of (𝒪 X) ] (U ==> V)) holds ‡ = heyting-implication₁ U V (U ==> (U ∧[ 𝒪 X ] V)) ‡₁ where I = mp-right U (U ∧[ 𝒪 X ] V) II = ∧[ 𝒪 X ]-lower₂ U V ‡₁ : ((U ==> (U ∧[ 𝒪 X ] V) ∧[ 𝒪 X ] U) ≤ V) holds ‡₁ = (U ==> (U ∧[ 𝒪 X ] V)) ∧[ 𝒪 X ] U ≤⟨ I ⟩ U ∧[ 𝒪 X ] V ≤⟨ II ⟩ V ■ ==>-right-monotone : {U V W : ⟨ 𝒪 X ⟩} → (V ≤[ poset-of (𝒪 X) ] W) holds → ((U ==> V) ≤[ poset-of (𝒪 X ) ] (U ==> W)) holds ==>-right-monotone {U} {V} {W} p = heyting-implication₁ U W (U ==> V) † where open PosetReasoning (poset-of (𝒪 X)) † : (((U ==> V) ∧[ 𝒪 X ] U) ≤[ poset-of (𝒪 X) ] W) holds † = (U ==> V) ∧[ 𝒪 X ] U ≤⟨ mp-right U V ⟩ V ≤⟨ p ⟩ W ■ 𝟏-==>-law : (U : ⟨ 𝒪 X ⟩) → U = 𝟏[ 𝒪 X ] ==> U 𝟏-==>-law U = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡ where open PosetReasoning (poset-of (𝒪 X)) † : (U ≤[ poset-of (𝒪 X) ] 𝟏[ 𝒪 X ] ==> U) holds † = weakening 𝟏[ 𝒪 X ] U ‡ : (𝟏[ 𝒪 X ] ==> U ≤[ poset-of (𝒪 X) ] U) holds ‡ = (𝟏[ 𝒪 X ] ==> U) =⟨ Ⅰ ⟩ₚ (𝟏[ 𝒪 X ] ==> U) ∧[ 𝒪 X ] 𝟏[ 𝒪 X ] ≤⟨ Ⅱ ⟩ U ■ where Ⅰ = 𝟏-right-unit-of-∧ (𝒪 X) (𝟏[ 𝒪 X ] ==> U) ⁻¹ Ⅱ = mp-right 𝟏[ 𝒪 X ] U ==>-left-reverses-joins : (U V W : ⟨ 𝒪 X ⟩) → U ==> W ∧[ 𝒪 X ] (V ==> W) = (U ∨[ 𝒪 X ] V) ==> W ==>-left-reverses-joins U V W = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡ where open PosetReasoning (poset-of (𝒪 X)) lhs₁ = U ==> W lhs₂ = V ==> W lhs₃ = (U ∨[ 𝒪 X ] V) ==> W ※ = (lhs₁ ∧[ 𝒪 X ] lhs₂) ∧[ 𝒪 X ] (U ∨[ 𝒪 X ] V) =⟨ Ⅰ ⟩ₚ ((lhs₁ ∧[ 𝒪 X ] lhs₂) ∧[ 𝒪 X ] U) ∨[ 𝒪 X ] ((lhs₁ ∧[ 𝒪 X ] lhs₂) ∧[ 𝒪 X ] V) ≤⟨ Ⅱ ⟩ (lhs₁ ∧[ 𝒪 X ] U) ∨[ 𝒪 X ] ((lhs₁ ∧[ 𝒪 X ] lhs₂) ∧[ 𝒪 X ] V) ≤⟨ Ⅲ ⟩ (lhs₁ ∧[ 𝒪 X ] U) ∨[ 𝒪 X ] (lhs₂ ∧[ 𝒪 X ] V) ≤⟨ Ⅳ ⟩ W ■ where Ⅰ = binary-distributivity (𝒪 X) (lhs₁ ∧[ 𝒪 X ] lhs₂) U V Ⅱ = ∨[ 𝒪 X ]-left-monotone (∧[ 𝒪 X ]-left-monotone (∧[ 𝒪 X ]-lower₁ lhs₁ lhs₂)) Ⅲ = ∨[ 𝒪 X ]-right-monotone (∧[ 𝒪 X ]-left-monotone (∧[ 𝒪 X ]-lower₂ lhs₁ lhs₂)) Ⅳ = ∨[ 𝒪 X ]-least (mp-right U W) (mp-right V W) † : ((lhs₁ ∧[ 𝒪 X ] lhs₂) ≤[ poset-of (𝒪 X) ] lhs₃) holds † = heyting-implication₁ (U ∨[ 𝒪 X ] V) W ((U ==> W) ∧[ 𝒪 X ] (V ==> W)) ※ ‡ : (lhs₃ ≤[ poset-of (𝒪 X) ] (lhs₁ ∧[ 𝒪 X ] lhs₂)) holds ‡ = ∧[ 𝒪 X ]-greatest lhs₁ lhs₂ lhs₃ ♣ ♠ where ♣ : (lhs₃ ≤[ poset-of (𝒪 X) ] lhs₁) holds ♣ = heyting-implication₁ U W lhs₃ ♢ where Ⅰ = ∧[ 𝒪 X ]-right-monotone (∨[ 𝒪 X ]-upper₁ U V) Ⅱ = mp-right (U ∨[ 𝒪 X ] V) W ♢ = lhs₃ ∧[ 𝒪 X ] U ≤⟨ Ⅰ ⟩ lhs₃ ∧[ 𝒪 X ] (U ∨[ 𝒪 X ] V) ≤⟨ Ⅱ ⟩ W ■ ♠ : (lhs₃ ≤[ poset-of (𝒪 X) ] lhs₂) holds ♠ = heyting-implication₁ V W lhs₃ ♢ where Ⅰ = ∧[ 𝒪 X ]-right-monotone (∨[ 𝒪 X ]-upper₂ U V) Ⅱ = mp-right (U ∨[ 𝒪 X ] V) W ♢ = lhs₃ ∧[ 𝒪 X ] V ≤⟨ Ⅰ ⟩ lhs₃ ∧[ 𝒪 X ] (U ∨[ 𝒪 X ] V) ≤⟨ Ⅱ ⟩ W ■ \end{code}