open import Base -- Agda-MLTT library. -- Author: Mario Román. -- Prop. Proposition types. A type is a proposition if we can -- construct a function that provides an equality between any two of -- its elements. We define propositional truncation and some truncated -- logical connectives explicitly hoping to provide clarity on how -- these types can be constructed inside the system. module Prop where -- Definition of Proposition. isProp : Set → Set isProp A = ((x y : A) → x ≡ y) -- The product of two propositions is itself a proposition. prod-isProp : {A B : Set} → isProp A → isProp B → isProp (A × B) prod-isProp pa pb (a , b) (c , d) with (pa a c) | (pb b d) prod-isProp pa pb (a , b) (.a , .b) | refl | refl = refl -- The implication of a family of propositions is itself a proposition. pi-isProp : {A : Set} → {B : A → Set} → ((a : A) → isProp (B a)) → isProp ((a : A) → B a) pi-isProp p f g = funext λ x → p x (f x) (g x) -- The negation of a proposition is a proposition. not-isProp : {A : Set} → isProp (¬ A) not-isProp = pi-isProp (λ a x → λ ()) postulate -- We say that two propositions are equal if they follow from each -- other. This notion of equality is called propositional -- extensionality. propext : {A B : Set} → isProp A → isProp B → (A → B) → (B → A) → A ≡ B module Truncation where -- A type A may have multiple distinct elements, witnessing -- different proofs of the same fact. We can, however truncate a -- type A into a proposition ∥A∥ by postulating that any two of its -- elements must be equal. private -- This is an instance of a higher inductive type, defined with -- equalities between any two members. We implement it using -- private constuctors (this is called Dan Licata's trick in -- literature). data !∥_∥ (A : Set) : Set where !∣_∣ : A → !∥ A ∥ -- Constructor of a truncated type. ∥_∥ : (A : Set) → Set ∥ A ∥ = !∥ A ∥ -- If x is an element of A, then |x| is an element of its truncated -- type. Note, however, that |x|=|y| for any two, potentially -- different x,y:A. ∣_∣ : {X : Set} → X → ∥ X ∥ ∣ x ∣ = !∣ x ∣ -- We postulate that any two elements of the truncated type are -- equal. postulate trunc : {A : Set} → isProp ∥ A ∥ -- Recursion principle for truncated types. This is directly derived -- from the adjunction described in the text. trunc-rec : {A : Set} {P : Set} → isProp P → ( A → P) ----------- → ∥ A ∥ → P trunc-rec _ f !∣ x ∣ = f x -- An easier-to-read variant of the recursion principle. trunc-elim : {A : Set} {P : Set} → ∥ A ∥ → isProp P → (A → P) → P trunc-elim = λ z z₁ z₂ → trunc-rec z₁ z₂ z open Truncation public module Exists where -- The existential quantifier, in a classical sense, arises as a -- propositional truncation of the constructive existential -- quantifier. private -- The existential quantifier is defined mirroring the dependent -- pair type. This is again an instance of a higher inductive -- type. record !Ex (A : Set) (B : A → Set) : Set where constructor _!,,_ field !fst : A !snd : B !fst open !Ex public -- Type constructor. Ex : (A : Set) → (B : A → Set) → Set Ex A B = !Ex A B -- Term constructor. Takes a term a : A and a proof of (B a), and -- produces a proof of ∃ a : A, (B a). _,,_ : {A : Set} {B : A → Set} → (a : A) → (b : B a) → Ex A B a ,, b = a !,, b postulate -- We truncate the term by postulating that it is a proposition. Ex-isProp : {A : Set} {B : A → Set} → isProp (Ex A B) -- Recursion principle for existential quantifiers. Ex-elim : {A : Set} {B : A → Set} {P : Set} → Ex A B → isProp P → (Σ A B → P) → P Ex-elim (a !,, b) _ f = f (a , b) -- Special syntax for quantifiers. syntax Ex A (λ a → e) = ∃ a ∈ A , e open Exists public module Or where -- The existential disjunction, in a classical sense, arises as a -- propositional truncation of the constructive pair of types. It is -- defined following the same rules and truncating the resulting -- type. private data _!∨_ (A B : Set) : Set where !inl : A → A !∨ B !inr : B → A !∨ B -- Type constructor. _∨_ : (A B : Set) → Set A ∨ B = A !∨ B -- Term constructors. rinl : {A B : Set} → A → A ∨ B rinl a = !inl a rinr : {A B : Set} → B → A ∨ B rinr b = !inr b postulate -- We truncate the type by postulating that it must be a -- proposition. ∨-isProp : {A B : Set} → isProp (A ∨ B) -- Recursion principle. ∨-elim : {A B P : Set} → A ∨ B → isProp P → ((A ⊎ B) → P) → P ∨-elim (!inl x) _ f = f (inl x) ∨-elim (!inr x) _ f = f (inr x) open Or public -- Uniqueness of identity proofs, or Axiom K. We choose to allow this -- rule in our theory inside this library in order to ease some -- proofs, but it will be forbidden inside the homotopy-theoretical -- version. uip : {A : Set} → {a b : A} → isProp (a ≡ b) uip {A} {a} {.a} refl refl = refl