--- title: Logic author: Martín Escardó and Ayberk Tosun date-started: 2021-03-10 --- Based in part by the `Cubical.Functions.Logic` module UF.of `agda/cubical`. \begin{code} {-# OPTIONS --safe --without-K #-} module UF.Logic where open import MLTT.Spartan open import UF.Equiv open import UF.FunExt open import UF.PropTrunc open import UF.Subsingletons open import UF.Subsingletons-FunExt open import UF.SubtypeClassifier open import UF.SubtypeClassifier-Properties open import UF.Sets \end{code} \section{Conjunction} \begin{code} module Conjunction where _∧_ : Ω 𝓤 → Ω 𝓥 → Ω (𝓤 ⊔ 𝓥) P ∧ Q = (P holds × Q holds) , γ where γ = ×-is-prop (holds-is-prop P) (holds-is-prop Q) infixr 4 _∧_ \end{code} Added by Martin Escardo 1st Nov 2023. \begin{code} ∧-Intro : (p : Ω 𝓤) (q : Ω 𝓥) → p holds → q holds → (p ∧ q) holds ∧-Intro p q a b = (a , b) ∧-Elim-L : (p : Ω 𝓤) (q : Ω 𝓥) → (p ∧ q) holds → p holds ∧-Elim-L p q = pr₁ ∧-Elim-R : (p : Ω 𝓤) (q : Ω 𝓥) → (p ∧ q) holds → q holds ∧-Elim-R p q = pr₂ module _ (pe : propext 𝓤) (fe : funext 𝓤 𝓤) where ∧-intro : (p q : Ω 𝓤) → p = ⊤ → q = ⊤ → p ∧ q = ⊤ ∧-intro p q a b = holds-gives-equal-⊤ pe fe (p ∧ q) (∧-Intro p q (equal-⊤-gives-holds p a) (equal-⊤-gives-holds q b)) ∧-elim-L : (p q : Ω 𝓤) → p ∧ q = ⊤ → p = ⊤ ∧-elim-L p q c = holds-gives-equal-⊤ pe fe p (∧-Elim-L p q (equal-⊤-gives-holds (p ∧ q) c)) ∧-elim-R : (p q : Ω 𝓤) → p ∧ q = ⊤ → q = ⊤ ∧-elim-R p q c = holds-gives-equal-⊤ pe fe q (∧-Elim-R p q (equal-⊤-gives-holds (p ∧ q) c)) \end{code} End of addition. \section{Universal quantification} \begin{code} module Universal (fe : Fun-Ext) where ∀[꞉]-syntax : (I : 𝓤 ̇ ) → (I → Ω 𝓥) → Ω (𝓤 ⊔ 𝓥) ∀[꞉]-syntax I P = ((i : I) → P i holds) , γ where γ : is-prop ((i : I) → P i holds) γ = Π-is-prop fe (holds-is-prop ∘ P) ∀[]-syntax : {I : 𝓤 ̇ } → (I → Ω 𝓥) → Ω (𝓤 ⊔ 𝓥) ∀[]-syntax {I = I} P = ∀[꞉]-syntax I P infixr -1 ∀[꞉]-syntax infixr -1 ∀[]-syntax syntax ∀[꞉]-syntax I (λ i → e) = Ɐ i ꞉ I , e syntax ∀[]-syntax (λ i → e) = Ɐ i , e ∀₂[꞉]-syntax : (I : 𝓤 ̇ )→ (I → I → Ω 𝓥) → Ω (𝓤 ⊔ 𝓥) ∀₂[꞉]-syntax I P = ((i j : I) → P i j holds) , γ where γ : is-prop ((i j : I) → P i j holds) γ = Π₂-is-prop fe λ i j → holds-is-prop (P i j) infixr -1 ∀₂[꞉]-syntax syntax ∀₂[꞉]-syntax I (λ i j → e) = Ɐ i j ꞉ I , e ∀₃[꞉]-syntax : (I : 𝓤 ̇ )→ (I → I → I → Ω 𝓥) → Ω (𝓤 ⊔ 𝓥) ∀₃[꞉]-syntax I P = Ɐ i ꞉ I , Ɐ j ꞉ I , Ɐ k ꞉ I , P i j k infixr -1 ∀₃[꞉]-syntax syntax ∀₃[꞉]-syntax I (λ i j k → e) = Ɐ i j k ꞉ I , e \end{code} \section{Implication} \begin{code} module Implication (fe : Fun-Ext) where open Universal fe infixr 3 _⇒_ _⇒_ : Ω 𝓤 → Ω 𝓥 → Ω (𝓤 ⊔ 𝓥) P ⇒ Q = (P holds → Q holds) , γ where γ : is-prop (P holds → Q holds) γ = Π-is-prop fe λ _ → holds-is-prop Q open Conjunction _⇔_ : Ω 𝓤 → Ω 𝓥 → Ω (𝓤 ⊔ 𝓥) P ⇔ Q = (P ⇒ Q) ∧ (Q ⇒ P) infixr 3 _⇔_ biimplication-forward : (P : Ω 𝓤) (Q : Ω 𝓥) → (P ⇔ Q) holds → (P ⇒ Q) holds biimplication-forward P Q (φ , _) = φ biimplication-backward : (P : Ω 𝓤) (Q : Ω 𝓥) → (P ⇔ Q) holds → (Q ⇒ P) holds biimplication-backward P Q (_ , ψ) = ψ infix 3 ¬ₚ_ ¬ₚ_ : Ω 𝓤 → Ω 𝓤 ¬ₚ_ {𝓤} P = _⇒_ P (𝟘 {𝓤} , 𝟘-is-prop) \end{code} Added by Martin Escardo 1st Nov 2023. \begin{code} ⇔-gives-⇒ = biimplication-forward ⇔-gives-⇐ = biimplication-backward module _ (pe : propext 𝓤) where ⊤-⇔-neutral : (p : Ω 𝓤) → (p ⇔ ⊤) = p ⊤-⇔-neutral p = Ω-extensionality pe fe (λ (h : (p ⇔ ⊤ {𝓤}) holds) → ⇔-gives-⇐ p ⊤ h ⊤-holds) (λ (h : p holds) → (λ _ → ⊤-holds) , (λ _ → h)) ⇔-swap : (p : Ω 𝓤) (q : Ω 𝓥) → (p ⇔ q) holds → (q ⇔ p) holds ⇔-swap p q (h , k) = (k , h) ⇔-swap' : (p q : Ω 𝓤) → (p ⇔ q) = ⊤ → (q ⇔ p) = ⊤ ⇔-swap' p q e = holds-gives-equal-⊤ pe fe (q ⇔ p) (⇔-swap p q (equal-⊤-gives-holds (p ⇔ q) e)) ⇔-sym : (p q : Ω 𝓤) → (p ⇔ q) = (q ⇔ p) ⇔-sym p q = Ω-ext pe fe (⇔-swap' p q) (⇔-swap' q p) ⊤-⇔-neutral' : (p : Ω 𝓤) → (⊤ ⇔ p) = p ⊤-⇔-neutral' p = (⊤ ⇔ p =⟨ ⇔-sym ⊤ p ⟩ p ⇔ ⊤ =⟨ ⊤-⇔-neutral p ⟩ p ∎) ⇔-refl : (p : Ω 𝓤) → (p ⇔ p) = ⊤ ⇔-refl p = holds-gives-equal-⊤ pe fe (p ⇔ p) (id , id) =-gives-⇔ : (p q : Ω 𝓤) → p = q → (p ⇔ q) = ⊤ =-gives-⇔ p p refl = ⇔-refl p ⇔-gives-= : (p q : Ω 𝓤) → (p ⇔ q) = ⊤ → p = q ⇔-gives-= p q e = Ω-extensionality pe fe f g where f : p holds → q holds f = ⇔-gives-⇒ p q (equal-⊤-gives-holds (p ⇔ q) e) g : q holds → p holds g = ⇔-gives-⇐ p q (equal-⊤-gives-holds (p ⇔ q) e) ⇔-equiv-to-= : (p q : Ω 𝓤) → ((p ⇔ q) = ⊤) ≃ (p = q) ⇔-equiv-to-= p q = qinveq (⇔-gives-= p q) (=-gives-⇔ p q , (λ _ → Ω-is-set fe pe _ _) , (λ _ → Ω-is-set fe pe _ _)) \end{code} End of addition. \section{Disjunction} \begin{code} module Disjunction (pt : propositional-truncations-exist) where open propositional-truncations-exist pt _∨_ : Ω 𝓤 → Ω 𝓥 → Ω (𝓤 ⊔ 𝓥) P ∨ Q = ∥ P holds + Q holds ∥ , ∥∥-is-prop infix 3 _∨_ \end{code} Added by Ayberk Tosun 2024-05-28. \begin{code} ∨-elim : (P : Ω 𝓤) (Q : Ω 𝓥) (R : Ω 𝓦) → (P holds → R holds) → (Q holds → R holds) → ((P ∨ Q) holds → R holds) ∨-elim P Q R φ ψ = ∥∥-rec (holds-is-prop R) † where † : P holds + Q holds → R holds † (inl p) = φ p † (inr q) = ψ q \end{code} \section{Truncation} \begin{code} module Truncation (pt : propositional-truncations-exist) where open PropositionalTruncation pt ∥_∥Ω : 𝓤 ̇ → Ω 𝓤 ∥ A ∥Ω = ∥ A ∥ , ∥∥-is-prop ∥∥Ω-rec : {X : 𝓤 ̇} {P : Ω 𝓥} → (X → P holds) → ∥ X ∥ → P holds ∥∥Ω-rec {𝓤} {𝓥} {X} {P} = ∥∥-rec (holds-is-prop P) \end{code} \section{Existential quantification} \begin{code} module Existential (pt : propositional-truncations-exist) where open Truncation pt ∃[꞉]-syntax : (I : 𝓤 ̇ )→ (I → 𝓥 ̇ )→ Ω (𝓤 ⊔ 𝓥) ∃[꞉]-syntax I A = ∥ Σ i ꞉ I , A i ∥Ω ∃[]-syntax : {I : 𝓤 ̇ } → (I → 𝓥 ̇ )→ Ω (𝓤 ⊔ 𝓥) ∃[]-syntax {I = I} P = ∃[꞉]-syntax I P ∃ₚ[꞉]-syntax : (I : 𝓤 ̇ )→ (I → Ω 𝓥)→ Ω (𝓤 ⊔ 𝓥) ∃ₚ[꞉]-syntax I A = Ǝ i ꞉ I , A i holds infixr -1 ∃[꞉]-syntax infixr -1 ∃[]-syntax syntax ∃[꞉]-syntax I (λ i → e) = Ǝ i ꞉ I , e syntax ∃[]-syntax (λ i → e) = Ǝ i , e syntax ∃ₚ[꞉]-syntax I (λ i → e) = Ǝₚ i ꞉ I , e \end{code} \section{Negation of equality} \begin{code} module Negation-of-equality (fe : Fun-Ext) where _≢_ : {X : 𝓤 ̇ } → X → X → Ω 𝓤 x ≢ y = (x ≠ y) , Π-is-prop fe (λ _ → 𝟘-is-prop) \end{code} \section{Equality} The following was added by Ayberk Tosun on 2024-05-16. \begin{code} module Equality {X : 𝓤 ̇} (s : is-set X) where _=ₚ_ : X → X → Ω 𝓤 _=ₚ_ x y = (x = y) , s infix 0 _=ₚ_ \end{code} End of addition. \section{A module for importing all combinators} \begin{code} module AllCombinators (pt : propositional-truncations-exist) (fe : Fun-Ext) where open Conjunction public open Universal fe public open Implication fe public open Disjunction pt public open Existential pt public open Truncation pt public open Negation-of-equality fe public \end{code}