{-# OPTIONS --safe --without-K #-} open import Relation.Binary.PropositionalEquality using (_≡_; subst; cong; cong₂) renaming (refl to ≡-refl; sym to ≡-sym; trans to ≡-trans) module Semantics.Presheaf.CartesianClosure (C : Set) (_⊆_ : (Γ Γ' : C) → Set) (⊆-trans : ∀ {Γ Γ' Γ'' : C} → (w : Γ ⊆ Γ') → (w' : Γ' ⊆ Γ'') → Γ ⊆ Γ'') (⊆-trans-assoc : ∀ {Γ Γ' Γ'' Γ''' : C} (w : Γ ⊆ Γ') (w' : Γ' ⊆ Γ'') (w'' : Γ'' ⊆ Γ''') → ⊆-trans w (⊆-trans w' w'') ≡ ⊆-trans (⊆-trans w w') w'') (⊆-refl : ∀ {Γ : C} → Γ ⊆ Γ) (⊆-refl-unit-left : ∀ {Γ Γ' : C} (w : Γ ⊆ Γ') → ⊆-trans w ⊆-refl ≡ w) (⊆-refl-unit-right : ∀ {Γ Γ' : C} (w : Γ ⊆ Γ') → ⊆-trans ⊆-refl w ≡ w) where open import Data.Unit using (⊤; tt) open import Data.Unit.Properties using () renaming (⊤-irrelevant to ⊤-eta) open import Data.Product using (Σ; _×_; _,_) renaming (proj₁ to fst; proj₂ to snd) open import Data.Product using () renaming (_×_ to _∧_) open import Function using (id) open import Relation.Binary using (IsEquivalence) open import Relation.Binary.PropositionalEquality.Properties using () renaming (isEquivalence to ≡-equiv) import Relation.Binary.Reasoning.Setoid as EqReasoning open import Semantics.Presheaf.Base C _⊆_ ⊆-refl ⊆-trans private variable Γ Δ Θ : C w w' w'' : Γ ⊆ Δ 𝒫 𝒫' : Psh 𝒬 𝒬' : Psh ℛ ℛ' : Psh s s' : 𝒫 →̇ 𝒬 t t' : 𝒫 →̇ 𝒬 u u' : 𝒫 →̇ 𝒬 Unit' : Psh Unit' = record { Fam = λ _Γ → ⊤ ; _≋_ = _≡_ ; ≋-equiv = λ _Γ → ≡-equiv ; wk = λ _w → id ; wk-pres-≋ = λ _w → cong id ; wk-pres-refl = λ _x → ≡-refl ; wk-pres-trans = λ _x _w _w' → ≡-refl } []' = Unit' unit' : ℛ →̇ Unit' unit' = record { fun = λ _r → tt ; pres-≋ = λ {Γ} _p≋p' → ≋[ Unit' ]-refl {Γ} ; natural = λ {_Γ} {Δ} _w _r → ≋[ Unit' ]-refl {Δ} } unit'[_] = λ ℛ → unit' {ℛ} Unit'-eta : t ≈̇ unit' Unit'-eta {ℛ} {t} = record { proof = λ r → ⊤-eta (t .apply r) (unit'[ ℛ ] .apply r) } []'-eta = Unit'-eta module _ (𝒫 𝒬 : Psh) where open Psh 𝒫 using () renaming (Fam to P) open Psh 𝒬 using () renaming (Fam to Q) record Fam (Γ : C) : Set where constructor elem field elem : P Γ × Q Γ record _≋_ {Γ : C} (x y : Fam Γ) : Set where constructor proof field proof : let elem (p , q) = x; elem (p' , q') = y in p ≋[ 𝒫 ] p' ∧ q ≋[ 𝒬 ] q' private ≋-equiv : ∀ (Γ : C) → IsEquivalence (_≋_ {Γ}) ≋-equiv _Γ = record { refl = proof (≋[ 𝒫 ]-refl , ≋[ 𝒬 ]-refl) ; sym = λ (proof (p≋p' , q≋q')) → proof (≋[ 𝒫 ]-sym p≋p' , ≋[ 𝒬 ]-sym q≋q') ; trans = λ (proof (p≋p' , q≋q')) (proof (p'≋p'' , q'≋q'')) → proof (≋[ 𝒫 ]-trans p≋p' p'≋p'' , ≋[ 𝒬 ]-trans q≋q' q'≋q'') } _×'_ : Psh _×'_ = record { Fam = Fam ; _≋_ = _≋_ ; ≋-equiv = ≋-equiv ; wk = λ w (elem (p , q)) → elem (wk[ 𝒫 ] w p , wk[ 𝒬 ] w q) ; wk-pres-≋ = λ w (proof (p≋p' , q≋q')) → proof (wk[ 𝒫 ]-pres-≋ w p≋p' , wk[ 𝒬 ]-pres-≋ w q≋q') ; wk-pres-refl = λ (elem (p , q)) → proof (wk[ 𝒫 ]-pres-refl p , wk[ 𝒬 ]-pres-refl q) ; wk-pres-trans = λ w w' (elem (p , q)) → proof (wk[ 𝒫 ]-pres-trans w w' p , wk[ 𝒬 ]-pres-trans w w' q) } module _ {𝒫 𝒬 : Psh} where π₁' : 𝒫 ×' 𝒬 →̇ 𝒫 π₁' = record { fun = λ x → let elem (p , _q) = x in p ; pres-≋ = λ x≋y → let proof (p≋p' , _q≋q') = x≋y in p≋p' ; natural = λ _w x → let elem (_p , _q) = x in ≋[ 𝒫 ]-refl } π₂' : 𝒫 ×' 𝒬 →̇ 𝒬 π₂' = record { fun = λ x → let elem (_p , q) = x in q ; pres-≋ = λ x≋y → let proof (_p≋p' , q≋q') = x≋y in q≋q' ; natural = λ _w x → let elem (_p , _q) = x in ≋[ 𝒬 ]-refl } fst' : (t : ℛ →̇ 𝒫 ×' 𝒬) → ℛ →̇ 𝒫 fst' = π₁' ∘_ snd' : (t : ℛ →̇ 𝒫 ×' 𝒬) → ℛ →̇ 𝒬 snd' = π₂' ∘_ pr' : (t : ℛ →̇ 𝒫) → (u : ℛ →̇ 𝒬) → ℛ →̇ 𝒫 ×' 𝒬 pr' t u = record { fun = λ r → elem (t .apply r , u .apply r) ; pres-≋ = λ r≋r' → proof (t .apply-≋ r≋r' , u .apply-≋ r≋r') ; natural = λ w r → proof (t .natural w r , u .natural w r) } ⟨_,_⟩' = pr' abstract pr'-pres-≈̇ : t ≈̇ t' → u ≈̇ u' → pr' t u ≈̇ pr' t' u' pr'-pres-≈̇ t≈̇t' u≈̇u' = record { proof = λ r → proof (t≈̇t' .apply-≋ r , u≈̇u' .apply-≋ r) } ⟨,⟩'-pres-≈̇ : t ≈̇ t' → u ≈̇ u' → ⟨ t , u ⟩' ≈̇ ⟨ t' , u' ⟩' ⟨,⟩'-pres-≈̇ = pr'-pres-≈̇ pr'-pres-≈̇-left : t ≈̇ t' → pr' t u ≈̇ pr' t' u pr'-pres-≈̇-left {u = u} t≈̇t' = pr'-pres-≈̇ t≈̇t' (≈̇-refl {x = u}) pr'-pres-≈̇-right : u ≈̇ u' → pr' t u ≈̇ pr' t u' pr'-pres-≈̇-right {t = t} u≈̇u' = pr'-pres-≈̇ (≈̇-refl {x = t}) u≈̇u' pr'-nat : ∀ (t : ℛ →̇ 𝒫) (u : ℛ →̇ 𝒬) (s : ℛ' →̇ ℛ) → pr' t u ∘ s ≈̇ pr' (t ∘ s) (u ∘ s) pr'-nat _t _u _s = ≈̇-refl ⟨,⟩'-nat : ∀ (t : ℛ →̇ 𝒫) (u : ℛ →̇ 𝒬) (s : ℛ' →̇ ℛ) → ⟨ t , u ⟩' ∘ s ≈̇ ⟨ t ∘ s , u ∘ s ⟩' ⟨,⟩'-nat _t _u _s = ≈̇-refl ×'-beta-left : ∀ {t : ℛ →̇ 𝒫} (u : ℛ →̇ 𝒬) → fst' (pr' t u) ≈̇ t ×'-beta-left {_t} _u = record { proof = λ _r → ≋[ 𝒫 ]-refl } ×'-beta-right : ∀ (t : ℛ →̇ 𝒫) {u : ℛ →̇ 𝒬} → snd' (pr' t u) ≈̇ u ×'-beta-right t {_u} = record { proof = λ _r → ≋[ 𝒬 ]-refl } ×'-eta : t ≈̇ pr' (fst' t) (snd' t) ×'-eta = record { proof = λ _r → ≋[ 𝒫 ×' 𝒬 ]-refl } π₁'[_] = λ {𝒫} 𝒬 → π₁' {𝒫} {𝒬} π₁'[_][_] = λ 𝒫 𝒬 → π₁' {𝒫} {𝒬} π₂'[_] = λ 𝒫 {𝒬} → π₂' {𝒫} {𝒬} π₂'[_][_] = λ 𝒫 𝒬 → π₂' {𝒫} {𝒬} _×'-map_ : (t : 𝒫 →̇ 𝒫') → (u : 𝒬 →̇ 𝒬') → 𝒫 ×' 𝒬 →̇ 𝒫' ×' 𝒬' _×'-map_ {𝒫 = 𝒫} {𝒬 = 𝒬} t u = pr' (t ∘ π₁'[ 𝒬 ]) (u ∘ π₂'[ 𝒫 ]) abstract ×'-map-pres-≈̇ : t ≈̇ t' → u ≈̇ u' → t ×'-map u ≈̇ t' ×'-map u' ×'-map-pres-≈̇ t≈̇t' u≈̇u' = record { proof = λ x → let elem (p , q) = x in proof (t≈̇t' .apply-≋ p , u≈̇u' .apply-≋ q) } ×'-map-pres-≈̇-left : ∀ (_ : t ≈̇ t') (u : 𝒬 →̇ 𝒬') → t ×'-map u ≈̇ t' ×'-map u ×'-map-pres-≈̇-left t≈̇t' u = ×'-map-pres-≈̇ t≈̇t' (≈̇-refl {x = u}) ×'-map-pres-≈̇-right : ∀ (t : 𝒫 →̇ 𝒫') (_ : u ≈̇ u') → t ×'-map u ≈̇ t ×'-map u' ×'-map-pres-≈̇-right t u≈̇u' = ×'-map-pres-≈̇ (≈̇-refl {x = t}) u≈̇u' ×'-map-pres-id : ∀ {𝒫 𝒬 : Psh} → id'[ 𝒫 ] ×'-map id'[ 𝒬 ] ≈̇ id'[ 𝒫 ×' 𝒬 ] ×'-map-pres-id {𝒫} {𝒬} = record { proof = λ _x → ≋[ 𝒫 ×' 𝒬 ]-refl } module _ (𝒫 𝒬 : Psh) where open Psh 𝒫 using () renaming (Fam to P) open Psh 𝒬 using () renaming (Fam to Q) record ⇒'-Fam (Γ : C) : Set where constructor elem field fun : {Γ' : C} → (w : Γ ⊆ Γ') → P Γ' → Q Γ' pres-≋ : ∀ {Γ' : C} → (w : Γ ⊆ Γ') {p p' : P Γ'} → (p≋p' : p ≋[ 𝒫 ] p') → fun w p ≋[ 𝒬 ] fun w p' natural : ∀ {Γ' Γ'' : C} (w : Γ ⊆ Γ') (w' : Γ' ⊆ Γ'') (p : P Γ') → wk[ 𝒬 ] w' (fun w p) ≋[ 𝒬 ] fun (⊆-trans w w') (wk[ 𝒫 ] w' p) open ⇒'-Fam using (natural) renaming (fun to apply; pres-≋ to apply-≋) public record _⇒'-≋_ {Γ : C} (f g : ⇒'-Fam Γ) : Set where constructor proof field pw : ∀ {Δ : C} (w : Γ ⊆ Δ) (p : P Δ) → f .apply w p ≋[ 𝒬 ] g .apply w p open _⇒'-≋_ using (pw) public private ⇒'-≋-equiv : ∀ (_Γ : C) → IsEquivalence (_⇒'-≋_ {_Γ}) ⇒'-≋-equiv _Γ = record { refl = proof (λ _w _p → ≋[ 𝒬 ]-refl) ; sym = λ {f} {g} f≋g → proof (λ w p → ≋[ 𝒬 ]-sym (f≋g .pw w p)) ; trans = λ {f} {g} {h} f≋g g≋h → proof (λ w p → ≋[ 𝒬 ]-trans (f≋g .pw w p) (g≋h .pw w p)) } _⇒'_ : Psh _⇒'_ = record { Fam = ⇒'-Fam ; _≋_ = _⇒'-≋_ ; wk = λ w f → elem (λ w' p → f .apply (⊆-trans w w') p) (λ w' p≋p' → f .apply-≋ (⊆-trans w w') p≋p') (λ w' w'' p → subst (λ hole → wk[ 𝒬 ] w'' (f .apply (⊆-trans w w') p) ≋[ 𝒬 ] f .apply hole (wk[ 𝒫 ] w'' p)) (≡-sym (⊆-trans-assoc w w' w'')) (f .natural (⊆-trans w w') w'' p)) ; ≋-equiv = ⇒'-≋-equiv ; wk-pres-≋ = λ w f≋g → proof (λ w' → f≋g .pw (⊆-trans w w')) ; wk-pres-refl = λ f → proof (λ w p → ≋[ 𝒬 ]-reflexive (cong (λ hole → f .apply hole p) (⊆-refl-unit-right w))) ; wk-pres-trans = λ w w' f → proof (λ w'' p → ≋[ 𝒬 ]-reflexive˘ (cong (λ hole → f .apply hole p) (⊆-trans-assoc w w' w''))) } module _ {𝒫 𝒬 : Psh} where private ⇒'-≋-apply-sq : ∀ {f g : 𝒫 ⇒' 𝒬 ₀ Γ} (_f≋g : f ≋[ 𝒫 ⇒' 𝒬 ] g) (w : Γ ⊆ Δ) {p p' : 𝒫 ₀ Δ} → (_p≋p' : p ≋[ 𝒫 ] p') → f .apply w p ≋[ 𝒬 ] g .apply w p' ⇒'-≋-apply-sq {_Γ} {_Δ} {f} {g} f≋g w {p} {p'} p≋p' = let open EqReasoning ≋[ 𝒬 ]-setoid in begin f .apply w p ≈⟨ f .apply-≋ w p≋p' ⟩ f .apply w p' ≈⟨ f≋g .pw w p' ⟩ g .apply w p' ∎ app' : (t : ℛ →̇ 𝒫 ⇒' 𝒬) → (u : ℛ →̇ 𝒫) → ℛ →̇ 𝒬 app' {ℛ} t u = record { fun = λ r → t .apply r .apply ⊆-refl (u .apply r) ; pres-≋ = λ r≋r' → ⇒'-≋-apply-sq (t .apply-≋ r≋r') ⊆-refl (u .apply-≋ r≋r') ; natural = λ w r → let open EqReasoning ≋[ 𝒬 ]-setoid in begin wk[ 𝒬 ] w (t .apply r .apply ⊆-refl (u .apply r)) ≈⟨ t .apply r .natural ⊆-refl w (u .apply r) ⟩ t .apply r .apply (⊆-trans ⊆-refl w) (wk[ 𝒫 ] w (u .apply r)) ≈⟨ t .apply r .apply-≋ (⊆-trans ⊆-refl w) (u .natural w r) ⟩ t .apply r .apply (⊆-trans ⊆-refl w) (u .apply (wk[ ℛ ] w r)) ≡⟨ cong (λ hole → t .apply r .apply hole (u .apply (wk[ ℛ ] w r))) (⊆-refl-unit-right w) ⟩ t .apply r .apply w (u .apply (wk[ ℛ ] w r)) ≡˘⟨ cong (λ hole → t .apply r .apply hole (u .apply (wk[ ℛ ] w r))) (⊆-refl-unit-left w) ⟩ t .apply r .apply (⊆-trans w ⊆-refl) (u .apply (wk[ ℛ ] w r)) ≡⟨⟩ wk[ 𝒫 ⇒' 𝒬 ] w (t .apply r) .apply ⊆-refl (u .apply (wk[ ℛ ] w r)) ≈⟨ t .natural w r .pw ⊆-refl (u .apply (wk[ ℛ ] w r)) ⟩ t .apply (wk[ ℛ ] w r) .apply ⊆-refl (u .apply (wk[ ℛ ] w r)) ∎ } abstract app'-pres-≈̇ : t ≈̇ t' → u ≈̇ u' → app' t u ≈̇ app' t' u' app'-pres-≈̇ t≈̇t' u≈̇u' = record { proof = λ r → ⇒'-≋-apply-sq (t≈̇t' .apply-≋ r) ⊆-refl (u≈̇u' .apply-≋ r) } app'-pres-≈̇-left : ∀ (_ : t ≈̇ t') (u : ℛ →̇ 𝒫) → app' t u ≈̇ app' t' u app'-pres-≈̇-left t≈̇t' u = app'-pres-≈̇ t≈̇t' (≈̇-refl {x = u}) app'-pres-≈̇-right : ∀ (t : ℛ →̇ 𝒫 ⇒' 𝒬) (_ : u ≈̇ u') → app' t u ≈̇ app' t u' app'-pres-≈̇-right t u≈̇u' = app'-pres-≈̇ (≈̇-refl {x = t}) u≈̇u' app'-nat : ∀ (t : ℛ →̇ 𝒫 ⇒' 𝒬) (u : ℛ →̇ 𝒫) (s : ℛ' →̇ ℛ) → app' t u ∘ s ≈̇ app' (t ∘ s) (u ∘ s) app'-nat _t _u _s = record { proof = λ _r' → ≋[ 𝒬 ]-refl } lam' : (t : ℛ ×' 𝒫 →̇ 𝒬) → ℛ →̇ 𝒫 ⇒' 𝒬 lam' {ℛ} {𝒫} {𝒬} t = record { fun = λ r → record { fun = λ w p → t .apply (elem (wk[ ℛ ] w r , p)) ; pres-≋ = λ w p≋p' → t .apply-≋ (proof (≋[ ℛ ]-refl , p≋p')) ; natural = λ w w' p → let open EqReasoning ≋[ 𝒬 ]-setoid in begin wk[ 𝒬 ] w' (t .apply (elem (wk[ ℛ ] w r , p))) ≈⟨ t .natural w' (elem (wk[ ℛ ] w r , p)) ⟩ t .apply (elem (wk[ ℛ ] w' (wk[ ℛ ] w r) , wk[ 𝒫 ] w' p)) ≈˘⟨ t .apply-≋ (proof (wk[ ℛ ]-pres-trans w w' r , ≋[ 𝒫 ]-refl)) ⟩ t .apply (elem (wk[ ℛ ] (⊆-trans w w') r , wk[ 𝒫 ] w' p)) ∎ } ; pres-≋ = λ r≋r' → proof λ w p → t .apply-≋ (proof (wk[ ℛ ]-pres-≋ w r≋r' , ≋[ 𝒫 ]-refl)) ; natural = λ w r → proof λ w' p → t .apply-≋ (proof ((wk[ ℛ ]-pres-trans w w' r) , ≋[ 𝒫 ]-refl)) } abstract lam'-pres-≈̇ : t ≈̇ t' → lam' t ≈̇ lam' t' lam'-pres-≈̇ {_𝒬} {ℛ} {𝒫} t≈̇t' = record { proof = λ r → proof (λ w p → t≈̇t' .apply-≋ (elem (wk[ ℛ ] w r , p))) } lam'-nat : ∀ (t : ℛ ×' 𝒫 →̇ 𝒬) (s : ℛ' →̇ ℛ) → lam' t ∘ s ≈̇ lam' (t ∘ s ×'-map id'[ 𝒫 ]) lam'-nat {_ℛ} {𝒫} {_𝒬} {_ℛ'} t s = record { proof = λ r' → proof (λ w p → t .apply-≋ (proof ((s .natural w r') , ≋[ 𝒫 ]-refl))) } ⇒'-beta : ∀ (t : ℛ ×' 𝒫 →̇ 𝒬) (u : ℛ →̇ 𝒫) → app' (lam' t) u ≈̇ t [ pr' id' u ]' ⇒'-beta {ℛ} {𝒫} t u = record { proof = λ r → t .apply-≋ (proof (wk[ ℛ ]-pres-refl r , ≋[ 𝒫 ]-refl)) } ⇒'-eta : ∀ (t : ℛ →̇ 𝒫 ⇒' 𝒬) → t ≈̇ lam' {𝒬 = 𝒬} (app' (t [ π₁'[ 𝒫 ] ]') π₂'[ ℛ ]) ⇒'-eta {ℛ} {𝒫} {𝒬} t = record { proof = λ r → proof (λ w p → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply r .apply w p ≡˘⟨ cong (λ hole → t .apply r .apply hole p) (⊆-refl-unit-left w) ⟩ t .apply r .apply (⊆-trans w ⊆-refl) p ≡⟨⟩ wk[ 𝒫 ⇒' 𝒬 ] w (t .apply r) .apply ⊆-refl p ≈⟨ t .natural w r .pw ⊆-refl p ⟩ t .apply (wk[ ℛ ] w r) .apply ⊆-refl p ∎ ) }
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.