{-# OPTIONS --without-K --safe #-} module Source.Type where open import Source.Size as S using ( Size ; Δ ; Δ′ ; Δ″ ; Ω ; Ω′ ; Ω″ ; n ; m ; o ; p ; b ) open import Source.Size.Substitution.Canonical as SC using ( Sub⊢ ) open import Source.Size.Substitution.Theory open import Source.Size.Substitution.Universe as SU using ( σ ; τ ; ι ; ⟨_⟩ ) open import Util.Prelude open S.Ctx infixr 3 Π_,_ infixr 4 _⇒_ infixl 4 _∙_ data Type (Δ : S.Ctx) : Set where Nat : (n : Size Δ) → Type Δ Stream : (n : Size Δ) → Type Δ _⇒_ : (T U : Type Δ) → Type Δ Π_,_ : (n : Size Δ) (T : Type (Δ ∙ n)) → Type Δ variable T U V W T′ U′ V′ W′ : Type Δ Π-≡⁺ : ∀ {n m} {T : Type (Δ ∙ n)} {U : Type (Δ ∙ m)} → (n≡m : n ≡ m) → subst (λ n → Type (Δ ∙ n)) n≡m T ≡ U → (Π n , T) ≡ (Π m , U) Π-≡⁺ refl refl = refl data Ctx (Δ : S.Ctx) : Set where [] : Ctx Δ _∙_ : (Γ : Ctx Δ) (T : Type Δ) → Ctx Δ variable Γ Γ′ Γ″ Ψ Ψ′ Ψ″ : Ctx Δ sub : SC.Sub Δ Ω → Type Ω → Type Δ sub σ (Nat n) = Nat (SC.sub σ n) sub σ (Stream n) = Stream (SC.sub σ n) sub σ (T ⇒ U) = sub σ T ⇒ sub σ U sub σ (Π n , T) = Π SC.sub σ n , sub (SC.Lift σ) T abstract sub->> : ∀ {Δ Δ′ Δ″} (σ : SC.Sub Δ Δ′) (τ : SC.Sub Δ′ Δ″) T → sub (σ SC.>> τ) T ≡ sub σ (sub τ T) sub->> σ τ (Nat n) = cong Nat (SC.sub->> n refl) sub->> σ τ (Stream n) = cong Stream (SC.sub->> n refl) sub->> σ τ (T ⇒ U) = cong₂ _⇒_ (sub->> σ τ T) (sub->> σ τ U) sub->> σ τ (Π n , T) rewrite SC.sub->> {σ = σ} {τ} n refl = cong (λ T → Π SC.sub σ (SC.sub τ n) , T) (trans (cong (λ σ → sub σ T) (sym SC.Lift>>Lift)) (sub->> (SC.Lift σ) (SC.Lift τ) T)) sub-Id : (T : Type Δ) → sub SC.Id T ≡ T sub-Id (Nat n) = cong Nat (SC.sub-Id n refl) sub-Id (Stream n) = cong Stream (SC.sub-Id n refl) sub-Id (T ⇒ U) = cong₂ _⇒_ (sub-Id T) (sub-Id U) sub-Id (Π n , T) rewrite SC.sub-Id n refl = cong (λ T → Π n , T) (sub-Id T) instance SubTheory-Type : SubTheory Type SubTheory-Type = record { _[_] = λ T σ → sub σ T ; [Id] = sub-Id ; [>>] = sub->> } subΓ : SC.Sub Δ Ω → Ctx Ω → Ctx Δ subΓ σ [] = [] subΓ σ (Γ ∙ T) = subΓ σ Γ ∙ sub σ T abstract subΓ->> : ∀ (σ : SC.Sub Δ Δ′) (τ : SC.Sub Δ′ Δ″) Γ → subΓ (σ SC.>> τ) Γ ≡ subΓ σ (subΓ τ Γ) subΓ->> σ τ [] = refl subΓ->> σ τ (Γ ∙ T) = cong₂ _∙_ (subΓ->> σ τ Γ) (sub->> σ τ T) subΓ-Id : (Γ : Ctx Δ) → subΓ SC.Id Γ ≡ Γ subΓ-Id [] = refl subΓ-Id (Γ ∙ T) = cong₂ _∙_ (subΓ-Id Γ) (sub-Id T) instance SubTheory-Ctx : SubTheory Ctx SubTheory-Ctx = record { _[_] = λ Γ σ → subΓ σ Γ ; [Id] = subΓ-Id ; [>>] = subΓ->> }