{-# OPTIONS --safe --without-K #-} module Semantics.Presheaf.Base (C : Set) (_⊆_ : (Γ Γ' : C) → Set) (⊆-refl : ∀ {Γ : C} → Γ ⊆ Γ) (⊆-trans : ∀ {Γ Γ' Γ'' : C} → (_w : Γ ⊆ Γ') → (_w' : Γ' ⊆ Γ'') → Γ ⊆ Γ'') where open import Level using (0ℓ) open import Relation.Binary using (Reflexive; Symmetric; Transitive; IsEquivalence; Setoid) import Relation.Binary.Reasoning.Setoid as EqReasoning open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans; subst; cong) infixr 19 _∘_ infix 18 _→̇_ _≈̇_ private variable Γ Γ' Γ'' : C Δ Δ' Δ'' : C Θ Θ' Θ'' : C w w' w'' : Γ ⊆ Δ record Psh : Set₁ where no-eta-equality field -- setoids Fam : (Γ : C) → Set _≋_ : (x y : Fam Γ) → Set -- type \~~~ ≋-equiv : ∀ (Γ : C) → IsEquivalence {A = Fam Γ} _≋_ -- setoid morphisms wk : (w : Γ ⊆ Δ) → (x : Fam Γ) → Fam Δ wk-pres-≋ : ∀ (w : Γ ⊆ Δ) {x y : Fam Γ} (x≋y : x ≋ y) → wk w x ≋ wk w y -- functoriality wk-pres-refl : ∀ (x : Fam Γ) → wk ⊆-refl x ≋ x wk-pres-trans : ∀ (w : Γ ⊆ Γ') (w' : Γ' ⊆ Γ'') (x : Fam Γ) → wk (⊆-trans w w') x ≋ wk w' (wk w x) infix 19 Fam Fam-setoid : {Γ : C} → Setoid _ _ Fam-setoid {Γ} = record { Carrier = Fam Γ ; _≈_ = _≋_ ; isEquivalence = ≋-equiv Γ } wk-pres-≡-≋ : ∀ {w w' : Γ ⊆ Δ} (w≡w' : w ≡ w') {x y : Fam Γ} (x≋y : x ≋ y) → wk w x ≋ wk w' y wk-pres-≡-≋ {w = w} {.w} refl = wk-pres-≋ w module _ {Γ : C} where open IsEquivalence (≋-equiv Γ) public using () renaming ( refl to ≋-refl ; sym to ≋-sym ; trans to ≋-trans ; reflexive to ≋-reflexive ) ≋-reflexive˘ : ∀ {x y : Fam Γ} → y ≡ x → x ≋ y ≋-reflexive˘ refl = ≋-refl -- open Psh {{...}} using (_≋_; ≋-refl; ≋-sym; ≋-trans; wk) public -- ≋-refl = λ {𝒫} {Γ} {p} → 𝒫 .Psh.≋-refl {Γ} {p} -- ≋-sym = λ {𝒫} {Γ} {p} {q} → 𝒫 .Psh.≋-sym {Γ} {p} {q} -- ≋-trans = λ {𝒫} {Γ} {p} {q} {r} → 𝒫 .Psh.≋-trans {Γ} {p} {q} {r} open Psh public using () renaming ( Fam to _₀_ ; Fam-setoid to ≋[_]-setoid ; ≋-refl to ≋[_]-refl ; ≋-sym to ≋[_]-sym ; ≋-trans to ≋[_]-trans ; ≋-reflexive to ≋[_]-reflexive ; ≋-reflexive˘ to ≋[_]-reflexive˘ ; wk to wk[_] ; wk-pres-≋ to wk[_]-pres-≋ ; wk-pres-refl to wk[_]-pres-refl ; wk-pres-trans to wk[_]-pres-trans ) private variable 𝒫 𝒫' : Psh -- type \McP 𝒬 𝒬' : Psh -- type \McQ ℛ ℛ' : Psh -- type \McR 𝒮 𝒮' : Psh -- type \McS ≋[]-syntax : (𝒫 : Psh) → (x y : 𝒫 ₀ Γ) → Set ≋[]-syntax 𝒫 = 𝒫 .Psh._≋_ syntax ≋[]-syntax 𝒫 x y = x ≋[ 𝒫 ] y record _→̇_ (𝒫 𝒬 : Psh) : Set where -- type \-> \^. no-eta-equality field fun : (p : 𝒫 ₀ Γ) → 𝒬 ₀ Γ pres-≋ : ∀ {p p' : 𝒫 ₀ Γ} (p≋p' : p ≋[ 𝒫 ] p') → fun p ≋[ 𝒬 ] fun p' natural : ∀ (w : Γ ⊆ Δ) (p : 𝒫 ₀ Γ) → wk[ 𝒬 ] w (fun p) ≋[ 𝒬 ] fun (wk[ 𝒫 ] w p) open _→̇_ using (natural) renaming (fun to apply; pres-≋ to apply-≋) public record _≈̇_ (φ ψ : 𝒫 →̇ 𝒬) : Set where -- type \~~ \^. no-eta-equality field proof : ∀ (p : 𝒫 ₀ Γ) → φ .apply p ≋[ 𝒬 ] ψ .apply p apply-sq : ∀ {p p' : 𝒫 ₀ Γ} → p ≋[ 𝒫 ] p' → φ .apply p ≋[ 𝒬 ] ψ .apply p' apply-sq {p = p} {p'} p≋p' = let open EqReasoning ≋[ 𝒬 ]-setoid in begin φ .apply p ≈⟨ φ .apply-≋ p≋p' ⟩ φ .apply p' ≈⟨ proof p' ⟩ ψ .apply p' ∎ open _≈̇_ using (apply-sq) renaming (proof to apply-≋) public private variable φ φ' : 𝒫 →̇ 𝒬 ψ ψ' : 𝒫 →̇ 𝒬 ω ω' : 𝒫 →̇ 𝒬 module _ {𝒫 𝒬 : Psh} where abstract ≈̇-refl : Reflexive {A = 𝒫 →̇ 𝒬} _≈̇_ ≈̇-refl = record { proof = λ {_} _ → ≋[ 𝒬 ]-refl } ≈̇-sym : Symmetric {A = 𝒫 →̇ 𝒬} _≈̇_ ≈̇-sym φ≋φ' = record { proof = λ {_} p → ≋[ 𝒬 ]-sym (φ≋φ' ._≈̇_.proof p) } ≈̇-trans : Transitive {A = 𝒫 →̇ 𝒬} _≈̇_ ≈̇-trans φ≋ψ ψ≋ω = record { proof = λ {_} p → ≋[ 𝒬 ]-trans (φ≋ψ ._≈̇_.proof p) (ψ≋ω ._≈̇_.proof p) } ≈̇-equiv : IsEquivalence {A = 𝒫 →̇ 𝒬} _≈̇_ ≈̇-equiv = record { refl = ≈̇-refl ; sym = ≈̇-sym ; trans = ≈̇-trans } module _ (𝒫 𝒬 : Psh) where →̇-setoid : Setoid 0ℓ 0ℓ →̇-setoid = record { Carrier = 𝒫 →̇ 𝒬 ; _≈_ = _≈̇_ ; isEquivalence = ≈̇-equiv } _∘_ : (ψ : 𝒬 →̇ ℛ) → (φ : 𝒫 →̇ 𝒬) → 𝒫 →̇ ℛ _∘_ {𝒬} {ℛ} {𝒫} ψ φ = record { fun = λ p → ψ .apply (φ .apply p) ; pres-≋ = λ p≋p' → ψ .apply-≋ (φ .apply-≋ p≋p') ; natural = λ w p → let open EqReasoning ≋[ ℛ ]-setoid in begin wk[ ℛ ] w (ψ .apply (φ .apply p)) ≈⟨ ψ .natural _ _ ⟩ ψ .apply (wk[ 𝒬 ] w (φ .apply p)) ≈⟨ ψ .apply-≋ (φ .natural _ _) ⟩ ψ .apply (φ .apply (wk[ 𝒫 ] w p)) ∎ } _[_]' = _∘_ abstract ∘-pres-≈̇ : ψ ≈̇ ψ' → φ ≈̇ φ' → ψ ∘ φ ≈̇ ψ' ∘ φ' ∘-pres-≈̇ ψ≈̇ψ' φ≈̇φ' = record { proof = λ p → apply-sq ψ≈̇ψ' (φ≈̇φ' .apply-≋ p) } ∘-pres-≈̇-left : ∀ (_ : ψ ≈̇ ψ') (φ : 𝒫 →̇ 𝒬) → ψ ∘ φ ≈̇ ψ' ∘ φ ∘-pres-≈̇-left ψ≈̇ψ' φ = ∘-pres-≈̇ ψ≈̇ψ' (≈̇-refl {x = φ}) ∘-pres-≈̇-right : ∀ (ψ : 𝒬 →̇ ℛ) (_ : φ ≈̇ φ') → ψ ∘ φ ≈̇ ψ ∘ φ' ∘-pres-≈̇-right ψ φ≈̇φ' = ∘-pres-≈̇ (≈̇-refl {x = ψ}) φ≈̇φ' ∘-assoc : ∀ (ω : ℛ →̇ 𝒮) (ψ : 𝒬 →̇ ℛ) (φ : 𝒫 →̇ 𝒬) → (ω ∘ ψ) ∘ φ ≈̇ ω ∘ ψ ∘ φ ∘-assoc {_} {ℛ} ω ψ φ = record { proof = λ p → ≋[ ℛ ]-refl } id'[_] : (𝒫 : Psh) → 𝒫 →̇ 𝒫 id'[_] 𝒫 = record { fun = λ p → p ; pres-≋ = λ p≋p' → p≋p' ; natural = λ _ _ → ≋[ 𝒫 ]-refl } id' = λ {𝒫} → id'[ 𝒫 ] abstract id'-unit-left : ∀ {𝒫 : Psh} (𝒬 : Psh) (φ : 𝒫 →̇ 𝒬) → id'[ 𝒬 ] ∘ φ ≈̇ φ id'-unit-left 𝒬 _ = record { proof = λ p → ≋[ 𝒬 ]-refl } id'-unit-right : ∀ (𝒫 : Psh) {𝒬 : Psh} (φ : 𝒫 →̇ 𝒬) → φ ∘ id'[ 𝒫 ] ≈̇ φ id'-unit-right _ {𝒬} _ = record { proof = λ p → ≋[ 𝒬 ]-refl }
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.