{-# OPTIONS --without-K #-} module Model.Type where open import Model.Exponential public open import Model.Nat public open import Model.Product public open import Model.Terminal public open import Model.Type.Core public open import Model.Stream public open import Model.Quantification public open import Model.Size as MS using ( ≤-IsProp ; ⟦_⟧Δ ; ⟦_⟧n ; ⟦_⟧σ ) open import Source.Size.Substitution.Theory open import Source.Size.Substitution.Universe as SS using (Sub⊢ᵤ ; ⟨_⟩) open import Util.Prelude hiding (id ; _∘_ ; _×_ ; ⊤) import Source.Size as SS import Source.Type as ST open MS._≤_ ⟦_⟧T : ∀ {Δ} (T : ST.Type Δ) → ⟦Type⟧ ⟦ Δ ⟧Δ ⟦ ST.Nat n ⟧T = subT ⟦ n ⟧n Nat ⟦ ST.Stream n ⟧T = subT ⟦ n ⟧n Stream ⟦ T ST.⇒ U ⟧T = ⟦ T ⟧T ↝ ⟦ U ⟧T ⟦ ST.Π n , T ⟧T = ⟦∀⟧ n ⟦ T ⟧T ⟦_⟧Γ : ∀ {Δ} (Γ : ST.Ctx Δ) → ⟦Type⟧ ⟦ Δ ⟧Δ ⟦ ST.[] ⟧Γ = ⊤ ⟦ Γ ST.∙ T ⟧Γ = ⟦ Γ ⟧Γ × ⟦ T ⟧T ⇒-resp-≈⟦Type⟧ : ∀ {Γ} {T T′ U U′ : ⟦Type⟧ Γ} → T ≈⟦Type⟧ T′ → U ≈⟦Type⟧ U′ → T ⇒ U → T′ ⇒ U′ ⇒-resp-≈⟦Type⟧ T≈T′ U≈U′ f = U≈U′ .forth ∘ f ∘ T≈T′ .back ⟦subT⟧ : ∀ {Δ Ω σ} (⊢σ : σ ∶ Δ ⇒ᵤ Ω) T → ⟦ T [ σ ]ᵤ ⟧T ≈⟦Type⟧ subT ⟦ ⊢σ ⟧σ ⟦ T ⟧T ⟦subT⟧ ⊢σ (ST.Nat n) = record { forth = record { fobj = castℕ≤ (reflexive (MS.⟦sub⟧ ⊢σ n)) ; feq = λ γ≈γ′ m≡m → m≡m } ; back = record { fobj = castℕ≤ (reflexive (sym (MS.⟦sub⟧ ⊢σ n))) ; feq = λ γ≈γ′ m≡m → m≡m } ; back-forth = ≈⁺ λ γ x → ℕ≤-≡⁺ _ _ refl ; forth-back = ≈⁺ λ γ x → ℕ≤-≡⁺ _ _ refl } ⟦subT⟧ ⊢σ (ST.Stream n) = record { forth = record { fobj = castColist (reflexive (sym (MS.⟦sub⟧ ⊢σ n))) ; feq = λ γ≈γ′ xs≈ys a a₁ a₂ → xs≈ys _ _ _ } ; back = record { fobj = castColist (reflexive (MS.⟦sub⟧ ⊢σ n)) ; feq = λ γ≈γ′ xs≈ys a a₁ a₂ → xs≈ys _ _ _ } ; back-forth = ≈⁺ λ γ xs → Colist-≡⁺ λ m m≤n → cong (xs m) (≤-IsProp _ _) ; forth-back = ≈⁺ λ γ xs → Colist-≡⁺ λ m m≤n → cong (xs m) (≤-IsProp _ _) } ⟦subT⟧ {Δ} {Ω} {σ} ⊢σ (T ST.⇒ U) = ≈⟦Type⟧-trans (↝-resp-≈⟦Type⟧ _ _ _ _ (⟦subT⟧ ⊢σ T) (⟦subT⟧ ⊢σ U)) (subT-↝ ⟦ ⊢σ ⟧σ ⟦ T ⟧T ⟦ U ⟧T) ⟦subT⟧ {Δ} {Ω} {σ} ⊢σ (ST.Π n , T) = ≈⟦Type⟧-trans (⟦∀⟧-resp-≈⟦Type⟧ (n [ σ ]ᵤ) (⟦subT⟧ (SS.Lift ⊢σ refl) T)) (subT-⟦∀⟧ ⊢σ ⟦ T ⟧T) ⟦subΓ⟧ : ∀ {Δ Ω σ} (⊢σ : σ ∶ Δ ⇒ᵤ Ω) Γ → ⟦ Γ [ σ ]ᵤ ⟧Γ ≈⟦Type⟧ subT ⟦ ⊢σ ⟧σ ⟦ Γ ⟧Γ ⟦subΓ⟧ σ ST.[] = record { forth = record { fobj = λ x → x ; feq = λ γ≈γ′ x → x } ; back = record { fobj = λ x → x ; feq = λ γ≈γ′ x → x } ; back-forth = ≈⁺ λ γ x → refl ; forth-back = ≈⁺ λ γ x → refl } ⟦subΓ⟧ σ (Γ ST.∙ T) = ×-resp-≈⟦Type⟧ (⟦subΓ⟧ σ Γ) (⟦subT⟧ σ T) subₛ : ∀ {Δ Ω σ Γ T} → (⊢σ : σ ∶ Δ ⇒ᵤ Ω) → ⟦ Γ ⟧Γ ⇒ ⟦ T ⟧T → ⟦ Γ [ σ ]ᵤ ⟧Γ ⇒ ⟦ T [ σ ]ᵤ ⟧T subₛ {Γ = Γ} {T} ⊢σ f = ⟦subT⟧ ⊢σ T .back ∘ subt ⟦ ⊢σ ⟧σ f ∘ ⟦subΓ⟧ ⊢σ Γ .forth ≡→≈⟦Type⟧Γ : ∀ {Δ} {Γ Ψ : ST.Ctx Δ} → Γ ≡ Ψ → ⟦ Γ ⟧Γ ≈⟦Type⟧ ⟦ Ψ ⟧Γ ≡→≈⟦Type⟧Γ p = ≡→≈⟦Type⟧ (cong ⟦_⟧Γ p) ≡→≈⟦Type⟧T : ∀ {Δ} {T U : ST.Type Δ} → T ≡ U → ⟦ T ⟧T ≈⟦Type⟧ ⟦ U ⟧T ≡→≈⟦Type⟧T p = ≡→≈⟦Type⟧ (cong ⟦_⟧T p)