module A201605.AltArtemov.Old.Common.Ty.WithG where

open import A201605.AltArtemov.Try2.Tm public


data Ty (g : ℕ) : ℕ → Set where
  ⊥  : ∀ {n} → Ty g n
  _⊃_ : ∀ {n} → Ty g n → Ty g n → Ty g n
  _∧_ : ∀ {n} → Ty g n → Ty g n → Ty g n
  _∶_ : ∀ {n} → Tm g n → Ty g n → Ty g (suc n)

infixr 5 _⊃_
infixr 15 _∶_

ren-ty : ∀ {g g′ n} → g′ ≥ g → Ty g n → Ty g′ n
ren-ty h ⊥      = ⊥
ren-ty h (A ⊃ B) = ren-ty h A ⊃ ren-ty h B
ren-ty h (A ∧ B) = ren-ty h A ∧ ren-ty h B
ren-ty h (t ∶ A) = ren-tm h t ∶ ren-ty h A

wk-ty : ∀ {g n} → Ty g n → Ty (suc g) n
wk-ty = ren-ty ≥wk

wk*-ty : ∀ {g n} → Ty 0 n → Ty g n
wk*-ty = ren-ty ≥to

ren-ty-id : ∀ {g n} (A : Ty g n) → ren-ty ≥id A ≡ A
ren-ty-id ⊥      = refl
ren-ty-id (A ⊃ B) = cong₂ _⊃_ (ren-ty-id A) (ren-ty-id B)
ren-ty-id (A ∧ B) = cong₂ _∧_ (ren-ty-id A) (ren-ty-id B)
ren-ty-id (t ∶ A) = cong₂ _∶_ (ren-tm-id t) (ren-ty-id A)

ren-ty-○ : ∀ {g g′ g″ n} (h′ : g″ ≥ g′) (h : g′ ≥ g) (A : Ty g n) →
             ren-ty h′ (ren-ty h A) ≡ ren-ty (h′ ○ h) A
ren-ty-○ h′ h ⊥      = refl
ren-ty-○ h′ h (A ⊃ B) = cong₂ _⊃_ (ren-ty-○ h′ h A) (ren-ty-○ h′ h B)
ren-ty-○ h′ h (A ∧ B) = cong₂ _∧_ (ren-ty-○ h′ h A) (ren-ty-○ h′ h B)
ren-ty-○ h′ h (t ∶ A) = cong₂ _∶_ (ren-tm-○ h′ h t) (ren-ty-○ h′ h A)