{-# OPTIONS --safe --without-K #-}
module IS4.Norm.NbE.Model where
open import Data.Product using (Σ ; ∃ ; _×_ ; _,_ ; -,_ ; proj₁ ; proj₂)
open import Relation.Binary
using (Reflexive ; Transitive ; Irrelevant)
open import Relation.Binary.PropositionalEquality
using (_≡_ ; subst ; cong ; cong₂ ; cong-id ; subst-application)
renaming (refl to ≡-refl ; sym to ≡-sym ; trans to ≡-trans ; isEquivalence to ≡-equiv)
open import PUtil
open import IS4.Term as Term hiding (factorWk)
import Semantics.Presheaf.Evaluation.IS4
factor : ∀ (Γ◁Δ : Γ ◁IS4 Δ) (w : Δ ⊆ Δ') → ∃ λ Γ' → Γ ⊆ Γ' × Γ' ◁IS4 Δ'
factor (_ , Γ◁Δ) w = -, Term.factorWk Γ◁Δ w , -, factorExt Γ◁Δ w
factorWk : ∀ (Γ◁Δ : Γ ◁IS4 Δ) (w : Δ ⊆ Δ') → Γ ⊆ _
factorWk r w = factor r w .proj₂ .proj₁
factor◁ : ∀ (Γ◁Δ : Γ ◁IS4 Δ) (w : Δ ⊆ Δ') → _ ◁IS4 Δ'
factor◁ r w = factor r w .proj₂ .proj₂
private
factor-pres-id : ∀ (Γ◁Δ : Γ ◁IS4 Δ) → factor Γ◁Δ idWk ≡ (-, idWk , Γ◁Δ)
factor-pres-id (_ , Γ◁Δ) = Σ×-≡,≡,≡→≡ (lCtxPresId Γ◁Δ , factorWkPresId Γ◁Δ , ◁IS4-irrel _ _)
factor-pres-∙ : ∀ (Γ◁Δ : Γ ◁IS4 Δ) (w : Δ ⊆ Δ') (w' : Δ' ⊆ Δ'') → factor Γ◁Δ (w ∙ w') ≡ (-, factorWk Γ◁Δ w ∙ factorWk (factor◁ Γ◁Δ w) w' , factor◁ (factor◁ Γ◁Δ w) w')
factor-pres-∙ (_ , Γ◁Δ) w w' = Σ×-≡,≡,≡→≡ (lCtxPres∙ Γ◁Δ w w' , factorWkPres∙ Γ◁Δ w w' , ◁IS4-irrel _ _)
factor-pres-refl : ∀ (w : Γ ⊆ Γ') → factor ◁IS4-refl w ≡ (-, w , ◁IS4-refl)
factor-pres-refl w = Σ-≡,≡→≡ (lCtxPresRefl {θ = tt} w , ×-≡,≡→≡ (factorWkPresRefl {θ = tt} w , ◁IS4-irrel _ _))
factor-pres-trans : ∀ (Γ◁Δ : Γ ◁IS4 Δ) (Δ◁Θ : Δ ◁IS4 Θ) (w : Θ ⊆ Θ') → factor (◁IS4-trans Γ◁Δ Δ◁Θ) w ≡ (-, factorWk Γ◁Δ (factorWk Δ◁Θ w) , ◁IS4-trans (factor◁ Γ◁Δ (factorWk Δ◁Θ w)) (factor◁ Δ◁Θ w))
factor-pres-trans (_ , Γ◁Δ) (_ , Δ◁Θ) w = Σ×-≡,≡,≡→≡ (lCtxPresTrans Γ◁Δ Δ◁Θ w , factorWkPresTrans Γ◁Δ Δ◁Θ w , ◁IS4-irrel _ _)
module PresheafEvaluationIS4 = Semantics.Presheaf.Evaluation.IS4
Ctx
_⊆_ _∙_ (λ w w' w'' → ≡-sym (assocWk w w' w'')) idWk rightIdWk leftIdWk
_◁IS4_ ◁IS4-trans ◁IS4-trans-assoc ◁IS4-refl ◁IS4-refl-unit-left ◁IS4-refl-unit-right
factor factor-pres-id factor-pres-∙ factor-pres-refl factor-pres-trans
open PresheafEvaluationIS4 public
hiding (_→̇_ ; unbox')
renaming (module Eval to PresheafEvaluationIS4Eval ; module EvalProperties to PresheafEvaluationIS4EvalProperties)
𝒩ℯ : (a : Ty) → Psh
𝒩ℯ a = record
{ Fam = λ Γ → Ne Γ a
; _≋_ = _≡_
; ≋-equiv = λ _ → ≡-equiv
; wk = wkNe
; wk-pres-≋ = λ w → cong (wkNe w)
; wk-pres-refl = wkNePresId
; wk-pres-trans = λ w w' n → ≡-sym (wkNePres∙ w w' n)
}
open PresheafEvaluationIS4Eval (𝒩ℯ ι) public
hiding (Sub' ; Tm')
open PresheafEvaluationIS4EvalProperties (𝒩ℯ ι) public
𝒩𝒻 : (a : Ty) → Psh
𝒩𝒻 a = record
{ Fam = λ Γ → Nf Γ a
; _≋_ = _≡_
; ≋-equiv = λ _ → ≡-equiv
; wk = wkNf
; wk-pres-≋ = λ w → cong (wkNf w)
; wk-pres-refl = wkNfPresId
; wk-pres-trans = λ w w' n → ≡-sym (wkNfPres∙ w w' n)
}
-- renaming environments, representable presheaf, Yoneda embedding
ℛℯ𝓃 : (Γ : Ctx) → Psh
ℛℯ𝓃 Γ = record
{ Fam = Γ ⊆_
; _≋_ = _≡_
; ≋-equiv = λ _ → ≡-equiv
; wk = λ w w' → w' ∙ w
; wk-pres-≋ = λ w → cong (_∙ w)
; wk-pres-refl = rightIdWk
; wk-pres-trans = λ w w' w'' → ≡-sym (assocWk w'' w w')
}
𝒯𝓂 : (a : Ty) → Psh
𝒯𝓂 a = record
{ Fam = λ Γ → Tm Γ a
; _≋_ = _≡_
; ≋-equiv = λ _ → ≡-equiv
; wk = wkTm
; wk-pres-≋ = λ w → cong (wkTm w)
; wk-pres-refl = wkTmPresId
; wk-pres-trans = λ w w' t → ≡-sym (wkTmPres∙ w w' t)
}
𝒮𝓊𝒷 : (Γ : Ctx) → Psh
𝒮𝓊𝒷 Γ = record
{ Fam = λ Δ → Sub Δ Γ
; _≋_ = _≡_
; ≋-equiv = λ _ → ≡-equiv
; wk = wkSub
; wk-pres-≋ = λ w → cong (wkSub w)
; wk-pres-refl = wkSubPresId
; wk-pres-trans = λ w w' s → ≡-sym (wkSubPres∙ w w' s)
}
-- family of maps between interpretations
_→̇_ : (Ctx → Set) → (Ctx → Set) → Set
_→̇_ A B = {Δ : Ctx} → A Δ → B Δ
-- interpretation of types
Tm' : (Γ : Ctx) → (a : Ty) → Set
Tm' Γ a = evalTy a ₀ Γ
Tm'- : Ty → Ctx → Set
Tm'- a Γ = Tm' Γ a
-- interpretation of contexts ("environments")
Sub' : (Γ : Ctx) → (Δ : Ctx) → Set
Sub' Γ Δ = evalCtx Δ ₀ Γ
Sub'- : Ctx → Ctx → Set
Sub'- Δ Γ = Sub' Γ Δ
variable
ρ ρ' ρ'' : Sub' Γ Δ
-- values in the model can be weakened
wkTy' wkTm' : (a : Ty) → (w : Γ ⊆ Γ') → (x : Tm' Γ a) → Tm' Γ' a
wkTy' a = wk[ evalTy a ]
wkTm' = wkTy'
-- environments in the model can be weakened
wkSub' : (Δ : Ctx) → (w : Γ ⊆ Γ') → (ρ : Sub' Γ Δ) → Sub' Γ' Δ
wkSub' Δ = wk[ evalCtx Δ ]
-- semantic counterpart of `unbox` from `Tm`
unbox' : Tm' ΓL (□ a) → CExt Γ ΓL ΓR → Tm' Γ a
unbox' (elem bx _bx-nat) e = bx idWk (-, e)
unlock' : Sub' Δ (Γ #) → Σ (Ctx × Ctx) λ { (ΔL , ΔR) → Sub' ΔL Γ × CExt Δ ΔL ΔR }
unlock' (elem (ΔL , (ΔR , e), s)) = (ΔL , ΔR) , (s , e)
-- interpretation of variables
substVar' : Var Γ a → Sub'- Γ →̇ Tm'- a
substVar' v = evalVar v .apply
CExt' : CExt Γ ΓL ΓR → Sub'- Γ →̇ Sub'- (ΓL #)
CExt' e = evalAcc e .apply
module _ (e : CExt Γ ΓL ΓR) (s : Sub' Δ Γ) (let elem (ΔL , (ΔR , e') , s') = evalAcc e .apply s) where
-- "Left" context of factoring with a substitution (see factorExtₛ)
lCtxₛ' : Ctx
lCtxₛ' = ΔL
-- "Right" context of factoring with a substitution (see factorExtₛ)
rCtxₛ' : Ctx
rCtxₛ' = ΔR
-- same as factorExtₛ
factorExtₛ' : CExt Δ lCtxₛ' rCtxₛ'
factorExtₛ' = e'
-- same as factorSubₛ
factorSubₛ' : Sub' lCtxₛ' ΓL
factorSubₛ' = s'
-- interpretation of terms
eval : Tm Γ a → (Sub'- Γ →̇ Tm'- a)
eval t s = evalTm t .apply s
-- interpretation of substitutions
evalₛ : Sub Γ Δ → Sub'- Γ →̇ Sub'- Δ
evalₛ s γ = evalSub s .apply γ
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.