{-# OPTIONS --safe --without-K #-} open import Data.Product using (∃; _×_; _,_; -,_) renaming (proj₁ to fst; proj₂ to snd) open import Data.Product using () renaming (∃ to Σ; _×_ to _∧_) open import Relation.Binary using (Reflexive; Symmetric; Transitive; IsEquivalence; Setoid) open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans; subst; cong) module Semantics.Presheaf.Necessity (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) (_R_ : (Γ Δ : C) → Set) (factor : ∀ {Γ Δ Δ' : C} → (r : Γ R Δ) → (w : Δ ⊆ Δ') → ∃ λ Γ' → Γ ⊆ Γ' ∧ Γ' R Δ') (let lCtx : {Γ Δ Δ' : C} → (r : Γ R Δ) → (w : Δ ⊆ Δ') → C ; lCtx = λ r w → factor r w .fst) (let factorWk : ∀ {Γ Δ Δ' : C} (r : Γ R Δ) (w : Δ ⊆ Δ') → Γ ⊆ _ ; factorWk = λ r w → factor r w .snd .fst) (let factorR : ∀ {Γ Δ Δ' : C} (r : Γ R Δ) (w : Δ ⊆ Δ') → _ R Δ' ; factorR = λ r w → factor r w .snd .snd) (factor-pres-refl : ∀ {Γ Δ : C} (r : Γ R Δ) → factor r ⊆-refl ≡ (-, ⊆-refl , r)) (factor-pres-trans : ∀ {Γ Δ Δ' Δ''} (r : Γ R Δ) (w : Δ ⊆ Δ') (w' : Δ' ⊆ Δ'') → factor r (⊆-trans w w') ≡ (-, ⊆-trans (factorWk r w) (factorWk (factorR r w) w') , factorR (factorR r w) w')) where import Relation.Binary.Reasoning.Setoid as EqReasoning open import Semantics.Presheaf.Base C _⊆_ ⊆-refl ⊆-trans private variable Γ Γ' Γ'' : C Δ Δ' Δ'' : C Θ Θ' Θ'' : C w w' w'' : Γ ⊆ Δ 𝒫 𝒫' : Psh 𝒬 𝒬' : Psh ℛ ℛ' ℛ'' : Psh s s' : 𝒫 →̇ 𝒬 t t' : 𝒫 →̇ 𝒬 u u' : 𝒫 →̇ 𝒬 record ✦'-Fam (𝒫 : Psh) (Γ : C) : Set where constructor elem field elem : Σ λ Δ → Δ R Γ × 𝒫 ₀ Δ record _✦'-≋_ {𝒫 : Psh} {Γ : C} (x x' : ✦'-Fam 𝒫 Γ) : Set where constructor proof field proof : let elem (Δ , r , p) = x; elem (Δ' , r' , p') = x' in ∃ λ Δ≡Δ' → subst (_R _) Δ≡Δ' r ≡ r' ∧ subst (𝒫 ₀_) Δ≡Δ' p ≋[ 𝒫 ] p' ✦'_ : (𝒫 : Psh) → Psh -- type \blacklozenge ✦' 𝒫 = record { Fam = ✦'-Fam 𝒫 ; _≋_ = _✦'-≋_ ; ≋-equiv = ≋-equiv ; wk = wk ; wk-pres-≋ = wk-pres-≋ ; wk-pres-refl = wk-pres-refl ; wk-pres-trans = wk-pres-trans } where abstract ≋-equiv : (Γ : C) → IsEquivalence (_✦'-≋_ {𝒫} {Γ}) ≋-equiv = λ Γ → record { refl = proof (refl , refl , ≋[ 𝒫 ]-refl) ; sym = λ { (proof (refl , r≡r' , p≋p')) → proof (refl , sym r≡r' , ≋[ 𝒫 ]-sym p≋p') } ; trans = λ { (proof (refl , r≡r' , p≋p')) (proof (refl , r'≡r'' , p'≋p'')) → proof (refl , trans r≡r' r'≡r'' , ≋[ 𝒫 ]-trans p≋p' p'≋p'') } } wk : (w : Γ ⊆ Γ') → (x : ✦'-Fam 𝒫 Γ) → ✦'-Fam 𝒫 Γ' wk w (elem (Δ , r , p)) = let (Δ' , w' , r') = factor r w in elem (Δ' , r' , wk[ 𝒫 ] w' p) abstract wk-pres-≋ : ∀ (w : Γ ⊆ Γ') {x x' : ✦'-Fam 𝒫 Γ} (x≋x' : x ✦'-≋ x') → wk w x ✦'-≋ wk w x' wk-pres-≋ w (proof (refl , refl , p≋p')) = proof (refl , refl , wk[ 𝒫 ]-pres-≋ _ p≋p') wk-pres-refl : ∀ (x : ✦'-Fam 𝒫 Γ) → wk ⊆-refl x ✦'-≋ x wk-pres-refl {_Γ} x@(elem (_ , r , p)) = subst (λ (Δ' , w' , r') → elem (Δ' , r' , wk[ 𝒫 ] w' p) ✦'-≋ x) (sym (factor-pres-refl r)) (proof (refl , refl , wk[ 𝒫 ]-pres-refl p)) wk-pres-trans : ∀ (w : Γ ⊆ Γ') (w' : Γ' ⊆ Γ'') (x : ✦'-Fam 𝒫 Γ) → wk (⊆-trans w w') x ✦'-≋ wk w' (wk w x) wk-pres-trans {_Γ} {_Γ'} {_Γ''} w w' x@(elem (_ , r , p)) = subst (λ (Δ'' , w'' , r'') → elem (Δ'' , r'' , wk[ 𝒫 ] w'' p) ✦'-≋ wk w' (wk w x)) (sym (factor-pres-trans r w w')) (proof (refl , refl , (wk[ 𝒫 ]-pres-trans (factorWk r w) (factorWk (factorR r w) w') p))) ✦'-map_ : (t : 𝒫 →̇ 𝒬) → ✦' 𝒫 →̇ ✦' 𝒬 ✦'-map_ {_} {𝒬} t = record { fun = λ (elem (Δ , r , p)) → elem (Δ , r , t .apply p) ; pres-≋ = λ { (proof (refl , r≡r' , p≋p')) → proof (refl , r≡r' , t .apply-≋ p≋p') } ; natural = λ w (elem (Δ , r , p)) → proof (refl , refl , t .natural _ p) } abstract ✦'-map-pres-≈̇ : t ≈̇ t' → ✦'-map t ≈̇ ✦'-map t' ✦'-map-pres-≈̇ t≈̇t' = record { proof = λ (elem (_ , _ , p)) → proof (refl , refl , t≈̇t' .apply-≋ p) } ✦'-map-pres-id' : ✦'-map id'[ 𝒫 ] ≈̇ id' ✦'-map-pres-id' {𝒫} = record { proof = λ p → proof (refl , refl , ≋[ 𝒫 ]-refl) } ✦'-map-pres-∘ : ∀ (t' : 𝒬 →̇ ℛ) (t : 𝒫 →̇ 𝒬) → ✦'-map (t' ∘ t) ≈̇ ✦'-map t' ∘ ✦'-map t ✦'-map-pres-∘ {ℛ = ℛ} _ _ = record { proof = λ p → proof (refl , refl , ≋[ ℛ ]-refl) } module IS4 (R-trans : ∀ {Γ Δ Θ : C} (r : Γ R Δ) (r' : Δ R Θ) → Γ R Θ) (R-trans-assoc : ∀ {Γ Δ Θ Ξ : C} (r : Γ R Δ) (r' : Δ R Θ) (r'' : Θ R Ξ) → R-trans r (R-trans r' r'') ≡ R-trans (R-trans r r') r'') (R-refl : ∀ {Γ : C} → Γ R Γ) (R-refl-unit-left : ∀ {Γ Δ : C} (r : Γ R Δ) → R-trans r R-refl ≡ r) (R-refl-unit-right : ∀ {Γ Δ : C} (r : Γ R Δ) → R-trans R-refl r ≡ r) (let lCtx : ∀ {Γ Δ Δ' : C} (r : Γ R Δ) (w : Δ ⊆ Δ') → C ; lCtx = λ r w → factor r w .fst) (let factorWk : ∀ {Γ Δ Δ' : C} (r : Γ R Δ) (w : Δ ⊆ Δ') → Γ ⊆ _ ; factorWk = λ r w → factor r w .snd .fst) (let factorR : ∀ {Γ Δ Δ' : C} (r : Γ R Δ) (w : Δ ⊆ Δ') → _ R Δ' ; factorR = λ r w → factor r w .snd .snd) (factor-pres-refl : ∀ {Γ Γ' : C} (w : Γ ⊆ Γ') → factor R-refl w ≡ (Γ' , w , R-refl)) (factor-pres-trans : ∀ {Γ Δ Θ Θ' : C} (r : Γ R Δ) (r' : Δ R Θ) (w : Θ ⊆ Θ') → factor (R-trans r r') w ≡ (lCtx r (factorWk r' w) , factorWk r _ , R-trans (factorR r _) (factorR r' w))) where η'[_] : (𝒫 : Psh) → 𝒫 →̇ ✦' 𝒫 η'[_] 𝒫 = record { fun = λ {Γ} p → elem (Γ , R-refl , p) ; pres-≋ = λ p≋p' → proof (refl , refl , p≋p') ; natural = λ w p → let open EqReasoning ≋[ ✦' 𝒫 ]-setoid in begin elem (-, factorR R-refl w , wk[ 𝒫 ] (factorWk R-refl w) p) ≡⟨ cong (λ { (_ , w , r) → elem (-, r , wk[ 𝒫 ] w p) }) (factor-pres-refl w) ⟩ elem (-, R-refl , wk[ 𝒫 ] w p) ∎ } abstract η'-nat : ∀ (φ : 𝒫 →̇ 𝒬) → ✦'-map φ ∘ η'[ 𝒫 ] ≈̇ η'[ 𝒬 ] ∘ φ η'-nat {_} {𝒬} φ = record { proof = λ p → proof (refl , refl , ≋[ 𝒬 ]-refl) } μ'[_] : (𝒫 : Psh) → ✦' ✦' 𝒫 →̇ ✦' 𝒫 μ'[_] 𝒫 = record { fun = λ (elem (Δ , r' , elem (Γ , r , p))) → elem (Γ , R-trans r r' , p) ; pres-≋ = λ { (proof (refl , refl , proof (refl , refl , p≋p'))) → proof (refl , refl , p≋p') } ; natural = λ w (elem (Δ , r' , elem (Γ , r , p))) → let open EqReasoning ≋[ ✦' 𝒫 ]-setoid in begin elem (-, factorR (R-trans r r') w , wk[ 𝒫 ] (factorWk (R-trans r r') w) p) ≡⟨ cong (λ { (_ , w , r) → elem (-, r , wk[ 𝒫 ] w p) }) (factor-pres-trans r r' w) ⟩ elem (-, R-trans (factorR r (factorWk r' w)) (factorR r' w) , wk[ 𝒫 ] (factorWk r (factorWk r' w)) p) ∎ } abstract μ'-nat : ∀ (φ : 𝒫 →̇ 𝒬) → ✦'-map φ ∘ μ'[ 𝒫 ] ≈̇ μ'[ 𝒬 ] ∘ ✦'-map ✦'-map φ μ'-nat {_} {𝒬} φ = record { proof = λ p → proof (refl , refl , ≋[ 𝒬 ]-refl) } η'-unit-left[_] : ∀ (𝒫 : Psh) → μ'[ 𝒫 ] ∘ η'[ ✦' 𝒫 ] ≈̇ id'[ ✦' 𝒫 ] η'-unit-left[_] 𝒫 = record { proof = λ (elem (_ , r , p)) → proof (refl , R-refl-unit-left r , ≋[ 𝒫 ]-refl) } η'-unit-right[_] : ∀ (𝒫 : Psh) → μ'[ 𝒫 ] ∘ ✦'-map η'[ 𝒫 ] ≈̇ id'[ ✦' 𝒫 ] η'-unit-right[_] 𝒫 = record { proof = λ (elem (_ , r , p)) → proof (refl , R-refl-unit-right r , ≋[ 𝒫 ]-refl) } μ'-assoc[_] : ∀ (𝒫 : Psh) → μ'[ 𝒫 ] ∘ μ'[ ✦' 𝒫 ] ≈̇ μ'[ 𝒫 ] ∘ ✦'-map μ'[ 𝒫 ] μ'-assoc[_] 𝒫 = record { proof = λ (elem (_ , r'' , elem (_ , r' , elem (_ , r , p)))) → proof (refl , R-trans-assoc r r' r'' , ≋[ 𝒫 ]-refl) } η' = λ {𝒫} → η'[ 𝒫 ] μ' = λ {𝒫} → μ'[ 𝒫 ] η'-unit-left = λ {𝒫} → η'-unit-left[ 𝒫 ] η'-unit-right = λ {𝒫} → η'-unit-right[ 𝒫 ] μ'-assoc = λ {𝒫} → μ'-assoc[ 𝒫 ] module _ (𝒫 : Psh) where -- Fam : (Γ : C) → Set where -- Fam = λ Γ → {Δ : C} → (r : Γ R Δ) → 𝒫 ₀ Δ record □'-Fam (Γ : C) : Set where constructor elem field fun : {Γ' Δ : C} → (w : Γ ⊆ Γ') → (r : Γ' R Δ) → 𝒫 ₀ Δ natural : ∀ {Γ' Δ Δ' : C} (w : Γ ⊆ Γ') (r : Γ' R Δ) (w' : Δ ⊆ Δ') → fun (⊆-trans w (factorWk r w')) (factorR r w') ≋[ 𝒫 ] wk[ 𝒫 ] w' (fun w r) open □'-Fam using (natural) renaming (fun to apply) public module _ {𝒫 : Psh} where -- _≋_ : {Γ : C} → (x x' : □'-Fam Γ) → Set -- _≋_ {Γ} = λ x y → ∀ {Δ : C} {r r' : Γ R Δ} (r≡r' : r ≡ r') → x r ≋[ 𝒫 ] y r' record _□'-≋_ {Γ : C} (x x' : □'-Fam 𝒫 Γ) : Set where constructor proof field pw : ∀ {Γ' Δ : C} (w : Γ ⊆ Γ') (r : Γ' R Δ) → x .apply w r ≋[ 𝒫 ] x' .apply w r open _□'-≋_ using (pw) public module _ (𝒫 : Psh) where □'_ : Psh -- type \Box □'_ = record { Fam = □'-Fam 𝒫 ; _≋_ = _□'-≋_ ; ≋-equiv = ≋-equiv ; wk = wk ; wk-pres-≋ = wk-pres-≋ ; wk-pres-refl = wk-pres-refl ; wk-pres-trans = wk-pres-trans } where abstract ≋-equiv : (Γ : C) → IsEquivalence (_□'-≋_ {𝒫} {Γ}) ≋-equiv = λ Γ → record { refl = record { pw = λ _w _r → ≋[ 𝒫 ]-refl } ; sym = λ x≋x' → record { pw = λ w r → ≋[ 𝒫 ]-sym (x≋x' .pw w r) } ; trans = λ x≋x' x'≋x'' → record { pw = λ w r → ≋[ 𝒫 ]-trans (x≋x' .pw w r) (x'≋x'' .pw w r) } } wk : (w : Γ ⊆ Γ') → (x : □'-Fam 𝒫 Γ) → □'-Fam 𝒫 Γ' wk w x = record { fun = λ w' r → x .apply (⊆-trans w w') r ; natural = λ w' r w'' → let open EqReasoning ≋[ 𝒫 ]-setoid in begin x .apply (⊆-trans w (⊆-trans w' (factorWk r w''))) (factorR r w'') ≡⟨ cong (λ hole → x .apply hole (factorR r w'')) (⊆-trans-assoc w w' (factorWk r w'')) ⟩ x .apply (⊆-trans (⊆-trans w w') (factorWk r w'')) (factorR r w'') ≈⟨ x .natural (⊆-trans w w') r w'' ⟩ wk[ 𝒫 ] w'' (x .apply (⊆-trans w w') r) ∎ } abstract wk-pres-≋ : ∀ (w : Γ ⊆ Γ') {x x' : □'-Fam 𝒫 Γ} (x≋x' : x □'-≋ x') → wk w x □'-≋ wk w x' wk-pres-≋ w x≋x' = record { pw = λ w' r → x≋x' .pw (⊆-trans w w') r } wk-pres-refl : ∀ (x : □'-Fam 𝒫 Γ) → wk ⊆-refl x □'-≋ x wk-pres-refl {_Γ} x = record { pw = λ {_Γ'} w r → ≋[ 𝒫 ]-reflexive (cong (λ hole → x .apply hole r) (⊆-refl-unit-right w)) } wk-pres-trans : ∀ (w : Γ ⊆ Γ') (w' : Γ' ⊆ Γ'') (x : □'-Fam 𝒫 Γ) → wk (⊆-trans w w') x □'-≋ wk w' (wk w x) wk-pres-trans {_Γ} {_Γ'} {_Γ''} w w' x = record { pw = λ {_Γ'''} w'' r → ≋[ 𝒫 ]-reflexive˘ (cong (λ hole → x .apply hole r) (⊆-trans-assoc w w' w'')) } □'-map_ : (t : 𝒫 →̇ 𝒬) → □' 𝒫 →̇ □' 𝒬 □'-map_ {𝒫} {𝒬} t = record { fun = λ x → record { fun = λ w r → t .apply (x .apply w r) ; natural = λ w r w' → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply (x .apply (⊆-trans w (factorWk r w')) (factorR r w')) ≈⟨ t .apply-≋ (x .natural w r w') ⟩ t .apply (wk[ 𝒫 ] w' (x .apply w r)) ≈˘⟨ t .natural w' (x .apply w r) ⟩ wk[ 𝒬 ] w' (t .apply (x .apply w r)) ∎ } ; pres-≋ = λ x≋x' → record { pw = λ w r → t .apply-≋ (x≋x' .pw w r) } ; natural = λ _w _x → record { pw = λ _w' _r → ≋[ 𝒬 ]-refl } } module _ {𝒫 𝒬 : Psh} where box' : (t : ✦' 𝒫 →̇ 𝒬) → 𝒫 →̇ □' 𝒬 box' t = record { fun = λ p → record { fun = λ w r → t .apply (elem (_ , r , wk[ 𝒫 ] w p)) ; natural = λ w r w' → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply (elem (_ , factorR r w' , wk[ 𝒫 ] (⊆-trans w (factorWk r w')) p)) ≈⟨ t .apply-≋ (proof (refl , refl , wk[ 𝒫 ]-pres-trans w (factorWk r w') p)) ⟩ t .apply (elem (_ , factorR r w' , wk[ 𝒫 ] (factorWk r w') (wk[ 𝒫 ] w p))) ≡⟨⟩ t .apply (wk[ ✦' 𝒫 ] w' (elem (_ , r , wk[ 𝒫 ] w p))) ≈˘⟨ t .natural w' (elem (_ , r , wk[ 𝒫 ] w p)) ⟩ wk[ 𝒬 ] w' (t .apply (elem (_ , r , wk[ 𝒫 ] w p))) ∎ } ; pres-≋ = λ p≋p' → record { pw = λ w r → t .apply-≋ (proof (refl , refl , wk[ 𝒫 ]-pres-≋ w p≋p')) } ; natural = λ w p → record { pw = λ w' r → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply (elem (_ , r , wk[ 𝒫 ] (⊆-trans w w') p)) ≈⟨ t .apply-≋ (proof (refl , refl , wk[ 𝒫 ]-pres-trans w w' p)) ⟩ t .apply (elem (_ , r , wk[ 𝒫 ] w' (wk[ 𝒫 ] w p))) ∎ } } abstract box'-pres-≈̇ : t ≈̇ t' → box' t ≈̇ box' t' box'-pres-≈̇ t≈̇t' = record { proof = λ p → record { pw = λ w r → t≈̇t' .apply-≋ (elem (_ , _ , wk[ 𝒫 ] w p)) } } λ' : (t : 𝒫 →̇ □' 𝒬) → ✦' 𝒫 →̇ 𝒬 λ' {𝒫} {𝒬} t = record { fun = λ (elem (_ , r , p)) → t .apply p .apply ⊆-refl r ; pres-≋ = λ { (proof (refl , refl , p≋p')) → t .apply-≋ p≋p' .pw ⊆-refl _ } ; natural = λ w (elem (_ , r , p)) → let open EqReasoning ≋[ 𝒬 ]-setoid in begin wk[ 𝒬 ] w (t .apply p .apply ⊆-refl r) ≈˘⟨ t .apply p .natural ⊆-refl r w ⟩ t .apply p .apply (⊆-trans ⊆-refl (factorWk r w)) (factorR r w) ≡⟨ cong (λ hole → t .apply p .apply hole (factorR r w)) (⊆-refl-unit-right (factorWk r w)) ⟩ t .apply p .apply (factorWk r w) (factorR r w) ≡˘⟨ cong (λ hole → t .apply p .apply hole (factorR r w)) (⊆-refl-unit-left (factorWk r w)) ⟩ t .apply p .apply (⊆-trans (factorWk r w) ⊆-refl) (factorR r w) ≡⟨⟩ wk[ □' 𝒬 ] (factorWk r w) (t .apply p) .apply ⊆-refl (factorR r w) ≈⟨ t .natural (factorWk r w) p .pw ⊆-refl (factorR r w) ⟩ t .apply (wk[ 𝒫 ] (factorWk r w) p) .apply ⊆-refl (factorR r w) ∎ } abstract λ'-pres-≈̇ : t ≈̇ t' → λ' t ≈̇ λ' t' λ'-pres-≈̇ t≈̇t' = record { proof = λ (elem (_ , r , p)) → t≈̇t' .apply-≋ p .pw ⊆-refl r } unbox' : (t : 𝒫 →̇ □' 𝒬) → (s : ℛ →̇ ✦' 𝒫) → ℛ →̇ 𝒬 unbox' t s = λ' t ∘ s abstract unbox'-pres-≈̇ : t ≈̇ t' → s ≈̇ s' → unbox' t s ≈̇ unbox' t' s' unbox'-pres-≈̇ t≈̇t' s≈̇s' = ∘-pres-≈̇ (λ'-pres-≈̇ t≈̇t') s≈̇s' unbox'-pres-≈̇-left : ∀ {t t' : 𝒫 →̇ □' 𝒬} (t≈̇t' : t ≈̇ t') (s : ℛ →̇ ✦' 𝒫) → unbox' t s ≈̇ unbox' t' s unbox'-pres-≈̇-left t≈̇t' s = unbox'-pres-≈̇ t≈̇t' (≈̇-refl {x = s}) unbox'-pres-≈̇-right : s ≈̇ s' → unbox' t s ≈̇ unbox' t s' unbox'-pres-≈̇-right {t = t} s≈̇s' = unbox'-pres-≈̇ (≈̇-refl {x = t}) s≈̇s' □'-beta : ∀ (t : ✦' 𝒫 →̇ 𝒬) → λ' (box' t) ≈̇ t □'-beta {𝒫} {𝒬} t = record { proof = λ (elem (_ , r , p)) → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply (elem (_ , r , wk[ 𝒫 ] ⊆-refl p)) ≈⟨ t .apply-≋ (proof (refl , refl , wk[ 𝒫 ]-pres-refl p)) ⟩ t .apply (elem (_ , r , p)) ∎ } □'-eta : ∀ (t : 𝒫 →̇ □' 𝒬) → t ≈̇ box' (λ' t) □'-eta {𝒫} {𝒬} t = record { proof = λ p → record { pw = λ w r → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply p .apply w r ≡˘⟨ cong (λ hole → t .apply p .apply hole r) (⊆-refl-unit-left w) ⟩ t .apply p .apply (⊆-trans w ⊆-refl) r ≡⟨⟩ wk[ □' 𝒬 ] w (t .apply p) .apply ⊆-refl r ≈⟨ t .natural w p .pw ⊆-refl r ⟩ t .apply (wk[ 𝒫 ] w p) .apply ⊆-refl r ∎ } } box'-nat-dom : ∀ (t : ✦' 𝒫 →̇ 𝒬) (t' : 𝒫' →̇ 𝒫) → box' (t ∘ ✦'-map t') ≈̇ box' t ∘ t' box'-nat-dom {𝒫} {𝒬} {𝒫'} t t' = record { proof = λ p' → record { pw = λ w r → let open EqReasoning ≋[ 𝒬 ]-setoid in begin t .apply (elem (_ , r , t' .apply (wk[ 𝒫' ] w p'))) ≈˘⟨ t .apply-≋ (proof (refl , refl , t' .natural w p')) ⟩ t .apply (elem (_ , r , wk[ 𝒫 ] w (t' .apply p'))) ∎ } } box'-nat-cod : ∀ (t' : 𝒬 →̇ 𝒬') (t : ✦' 𝒫 →̇ 𝒬) → box' (t' ∘ t) ≈̇ □'-map t' ∘ box' t box'-nat-cod {𝒬' = 𝒬'} _t' _t = record { proof = λ _p → record { pw = λ _w _r → ≋[ 𝒬' ]-refl } } λ'-nat-dom : ∀ (t : 𝒫 →̇ □' 𝒬) (t' : 𝒫' →̇ 𝒫) → λ' (t ∘ t') ≈̇ λ' t ∘ ✦'-map t' λ'-nat-dom {𝒬 = 𝒬} _t _t' = record { proof = λ (elem (_Δ , _r , _p')) → ≋[ 𝒬 ]-refl } λ'-nat-cod : ∀ (t' : 𝒬 →̇ 𝒬') (t : 𝒫 →̇ □' 𝒬) → λ' (□'-map t' ∘ t) ≈̇ t' ∘ λ' t λ'-nat-cod {𝒬' = 𝒬'} _t' _t = record { proof = λ (elem (_Δ , _r , _p)) → ≋[ 𝒬' ]-refl } unbox'-nat-dom : ∀ (t : 𝒫 →̇ □' 𝒬) (t' : 𝒫' →̇ 𝒫) (s : ℛ →̇ ✦' 𝒫') → unbox' (t ∘ t') s ≈̇ unbox' t (✦'-map t' ∘ s) unbox'-nat-dom {𝒫} {𝒬} {𝒫'} {ℛ} t t' s = let open EqReasoning (→̇-setoid ℛ 𝒬) in begin unbox' (t ∘ t') s ≡⟨⟩ λ' (t ∘ t') ∘ s ≈⟨ ∘-pres-≈̇-left (λ'-nat-dom t t') s ⟩ (λ' t ∘ ✦'-map t') ∘ s ≈⟨ ∘-assoc (λ' t) (✦'-map t') s ⟩ λ' t ∘ ✦'-map t' ∘ s ∎ unbox'-nat-cod : ∀ (t' : 𝒬 →̇ 𝒬') (t : 𝒫 →̇ □' 𝒬) (s : ℛ →̇ ✦' 𝒫) → unbox' (□'-map t' ∘ t) s ≈̇ t' ∘ unbox' t s unbox'-nat-cod {𝒬} {𝒬'} {𝒫} {ℛ} t' t s = let open EqReasoning (→̇-setoid ℛ 𝒬') in begin unbox' (□'-map t' ∘ t) s ≡⟨⟩ λ' (□'-map t' ∘ t) ∘ s ≈⟨ ∘-pres-≈̇-left (λ'-nat-cod t' t) s ⟩ (t' ∘ λ' t) ∘ s ≈⟨ ∘-assoc t' (λ' t) s ⟩ t' ∘ unbox' t s ∎
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.