module Basics where {- This file acts as a library of all the basic definitions used by other files. -} open import Agda.Primitive ------------------------------------------------------------------------- --equality relation ------------------------------------------------------------------------ data _≡_ {a : Level}{A : Set a}(x : A) : A → Set a where refl : x ≡ x {-# BUILTIN EQUALITY _≡_ #-} {-# BUILTIN REFL refl #-} ----------------------------------------------------------------------- --dependent sum type ---------------------------------------------------------------------- record Σ {a b}(A : Set a)(B : A → Set b) : Set (a ⊔ b) where constructor _,_ field proj₁ : A proj₂ : B proj₁ open Σ public Σ-syntax : ∀ {a b} (A : Set a) → (A → Set b) → Set (a ⊔ b) Σ-syntax = Σ syntax Σ-syntax A (λ x → B) = Σ[ x ∈ A ] B -------------------------------------------------------------------- --product of two types -------------------------------------------------------------------- _×_ : ∀ {a b} (A : Set a) (B : Set b) → Set (a ⊔ b) A × B = Σ[ x ∈ A ] B ------------------------------------------------------------------ --the empty type ------------------------------------------------------------------ data ⊥ : Set where ----------------------------------------------------------------- --the unit type ---------------------------------------------------------------- record ⊤ : Set where constructor One ------------------------------------------------------------------ --boolean type ------------------------------------------------------------------ data 𝔹 : Set where true : 𝔹 false : 𝔹 ----------------------------------------------------------------- --natural number type ----------------------------------------------------------------- data ℕ : Set where zero : ℕ succ : ℕ → ℕ ------------------------------------------------------------- --list type ------------------------------------------------------------- data List (A : Set) : Set where [] : List A _::_ : A → List A → List A ------------------------------------------------------------ --vector type ----------------------------------------------------------- data Vec (A : Set) : ℕ → Set where [] : Vec A zero _::_ : ∀ {n} → (a : A) → (as : Vec A n) → Vec A (succ n) ------------------------------------------------------------------ --disjoint sum ----------------------------------------------------------------- data _⊎_ {ℓ₁ ℓ₂ : Level}(A : Set ℓ₁)(B : Set ℓ₂) : Set (ℓ₁ ⊔ ℓ₂) where inl : (x : A) → A ⊎ B inr : (y : B) → A ⊎ B ---------------------------------------------------------------- --decidable equality --------------------------------------------------------------- data Dec {ℓ : Level} (X : Set ℓ) : Set ℓ where yes : X → Dec X no : (X → ⊥) → Dec X ---------------------------------------------------------------------------------------------- --RELATIONS ---------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- --Definition ------------------------------------------------------------------------------------------- Rel : (A : Set) → Set₁ Rel A = A → A → Set ------------------------------------------------------------------------------------------ --Reflexive, Symmetric and Transitive ------------------------------------------------------------------------------------------ Reflexive : (A : Set) → Rel A → Set Reflexive A _≈_ = ∀ {i} → i ≈ i Symmetric : (A : Set) → Rel A → Set Symmetric A _≈_ = ∀ {i j} → i ≈ j → j ≈ i Transitive : (A : Set) → Rel A → Set Transitive A _≈_ = ∀ {i j k} → i ≈ j → j ≈ k → i ≈ k record isEquivalence (A : Set)(_≈_ : Rel A) : Set where field Reflex : Reflexive A _≈_ Symm : Symmetric A _≈_ Trans : Transitive A _≈_ open isEquivalence public ------------------------------------------------------------------------------------------- --_≡_ is an equivalence relation ------------------------------------------------------------------------------------------- reflex : {A : Set} → (a : A) → a ≡ a reflex a = refl sym : {ℓ : Level}{A : Set ℓ} → {a b : A} → a ≡ b → b ≡ a sym refl = refl _≡<_>_ : {ℓ : Level} {A : Set ℓ} → (a : A) → { b c : A} → a ≡ b → b ≡ c → a ≡ c a ≡< refl > refl = refl aEquiv≡ : (A : Set) → isEquivalence A _≡_ aEquiv≡ A = record { Reflex = λ {p} → refl ; Symm = λ {p q} → (λ p≡q → sym p≡q) ; Trans = λ {p q r} → (λ p≡q → (λ q≡r → (p ≡< p≡q > q≡r))) } record Setoid : Set₁ where constructor ST field Carrier : Set ≈ₛ : Rel Carrier Eqv : isEquivalence Carrier ≈ₛ open Setoid public ---------------------------------------------------------------------------------------------- --Preserving relations --------------------------------------------------------------------------------------------- _Preserves_⟶_ : {A B : Set} → (f : A → B) → (_≈_ : Rel A) → (_≈_ : Rel B) → Set f Preserves _≈ₚ_ ⟶ _≈ᵣ_ = ∀ {a₁ a₂} → a₁ ≈ₚ a₂ → (f a₁) ≈ᵣ (f a₂) _Preserves₂_⟶_⟶_ :{A B C : Set} → (f : A → B → C) → (_≈_ : Rel A) → (_≈_ : Rel B) → (_≈_ : Rel C) → Set _++_ Preserves₂ _≈ₚ_ ⟶ _≈ᵣ_ ⟶ _≈ₛ_ = ∀ {a₁ a₂ b₁ b₂} → a₁ ≈ₚ a₂ → b₁ ≈ᵣ b₂ → (_≈ₛ_) ( a₁ ++ b₁) ( a₂ ++ b₂) ------------------------------------------------------------------------------------------------ --Layout for equational reasoning for any equivalence relation ------------------------------------------------------------------------------------------------ _▪ : {ℓ : Level}{A : Set ℓ} → (x : A) → x ≡ x x ▪ = refl _≣<_and_by_as_on_>_ : {A : Set} → (a b c : A) → (_≈_ : Rel A) → (eq≈ : isEquivalence A _≈_) → a ≈ b → b ≈ c → a ≈ c a ≣< b and c by _≈_ as eq≈ on a≈b > b≈c = (Trans eq≈) a≈b b≈c _by_as_▴ : {A : Set} → (x : A) → (_≈_ : Rel A) → (eq≈ : isEquivalence A _≈_) → x ≈ x x by _≈_ as eq≈ ▴ = (Reflex eq≈) {x} ------------------------------------------------------------------------------------------ --equal things are related under any equivalence relation ------------------------------------------------------------------------------------------ ≈≡ : {A : Set}{_≈_ : Rel A} → (eq : isEquivalence A _≈_) → {a₁ a₂ : A} → a₁ ≡ a₂ → a₁ ≈ a₂ ≈≡ {A}{_≈_} eq {a₁} {.a₁} refl = (Reflex eq) {a₁} ---------------------------------------------------------------------------------------------------------------------------------- --FUNCTIONS ---------------------------------------------------------------------------------------------------------------------------------- Op₁ : (A : Set) → Set Op₁ A = A → A Op₂ : (A : Set) → Set Op₂ A = A → A → A _∘_ : {A B C : Set} → (g : B → C) → (f : A → B) → (A → C) g ∘ f = λ x → g (f x) cong : {ℓ₁ ℓ₂ : Level}{A : Set ℓ₁}{B : Set ℓ₂} → {a b : A} → (f : A → B) → a ≡ b → f a ≡ f b cong f refl = refl congf : {ℓ : Level}{A B : Set ℓ} {f g : A → B} → f ≡ g → (x : A) → f x ≡ g x congf refl x = refl cong₂ : {A B C : Set}{a₁ a₂ : A}{b₁ b₂ : B}(f : A → B → C) → a₁ ≡ a₂ → b₁ ≡ b₂ → f a₁ b₁ ≡ f a₂ b₂ cong₂ f refl refl = refl ------------------------------------------------------------------------------------------------------------------------------ --Group and Group Action axioms ------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------ --associativity ------------------------------------------------------------------------------------------------------------ assoc : {A : Set}{_∙_ : Op₂ A}{_≈_ : Rel A} → Set assoc {A} {_∙_}{_≈_} = ∀ x y z → (x ∙ (y ∙ z)) ≈ ((x ∙ y)∙ z) ---------------------------------------------------------------------------------------------------------- --identity ---------------------------------------------------------------------------------------------------------- idax : {A : Set}{_∙_ : Op₂ A}{_⁻¹ : Op₁ A}{_≈_ : Rel A} → A → Set idax {A}{_∙_}{_⁻¹}{_≈_} e = ∀ x → (((( x ⁻¹ ) ∙ x) ≈ e ) × ((x ∙ (x ⁻¹)) ≈ e)) --------------------------------------------------------------------------------------------------------- --action associative --------------------------------------------------------------------------------------------------------- p₁p₂Act : {P S : Set}{_∙_ : Op₂ P}{_≈_ : Rel S}{Act : P → S → S} → Set p₁p₂Act {P}{S}{_∙_}{_≈_}{Act} = ∀ (p₁ p₂ : P) → ( ∀ {s : S} → Act p₁ (Act p₂ s) ≈ Act (p₂ ∙ p₁) s) --------------------------------------------------------------------------------------------------------- --action identity --------------------------------------------------------------------------------------------------------- ιAct : {P S : Set}{_≈_ : Rel S}{Act : P → S → S} → (ι : P) → Set ιAct {P}{S}{_≈_}{Act} ι = ∀ {s : S} → Act ι s ≈ s ------------------------------------------------------------------------------------------------------------------------------ --List operations ------------------------------------------------------------------------------------------------------------------------------ [_] : {A : Set} → A → List A [ x ] = x :: [] _++_ : {A : Set} → List A → List A → List A [] ++ list₂ = list₂ (an_elem :: the_rest) ++ list₂ = an_elem :: (the_rest ++ list₂) --------------------------------------------------------------------------------------------------------------------------- --Miscellaneous --------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------- --≠ -------------------------------------------------------------------- _≠_ : {A : Set}(x x' : A) → Set x ≠ x' = (x ≡ x' → ⊥) ---------------------------------------------------------------------------------------------------------------------------