{-# OPTIONS --cumulativity #-}
module ROmega.Types.Syntax where
open import Agda.Primitive
open import Level
open import Data.String
infixr 9 _`→_
infixr 9 _⇒_
infixr 10 _▹_
infixr 10 _R▹_
infixr 10 _≲_
infix 10 _·_~_
infixl 11 _·[_]
Label : Set
Label = String
data Kind : Level → Set where
★ : (ℓ : Level) → Kind ℓ
_`→_ : ∀ {ℓ₁ ℓ₂} → Kind ℓ₁ → Kind ℓ₂ → Kind (ℓ₁ ⊔ ℓ₂)
L : ∀ {ℓ} → Kind ℓ
R[_] : ∀ {ℓ} → Kind ℓ → Kind ℓ
lone ltwo lthree : Level
lone = lsuc lzero
ltwo = lsuc lone
lthree = lsuc ltwo
★₀ = ★ lzero
★₁ = ★ lone
★₂ = ★ ltwo
data KEnv : Level → Set
data Ty : {ℓ ι : Level} → KEnv ℓ → Kind ι → Set
data Pred {ℓ ι : Level} (Δ : KEnv ℓ) (κ : Kind ι) : Set
data Pred Δ κ where
_≲_ : (ρ₁ : Ty Δ R[ κ ]) →
(ρ₂ : Ty Δ R[ κ ]) →
Pred Δ κ
_·_~_ : (ρ₁ : Ty Δ R[ κ ]) →
(ρ₂ : Ty Δ R[ κ ]) →
(ρ₃ : Ty Δ R[ κ ]) →
Pred Δ κ
data KEnv where
ε : KEnv lzero
_,_ : ∀ {ℓ ι} → KEnv ℓ → Kind ι → KEnv (ℓ ⊔ ι)
data TVar : ∀ {ℓ ι} → KEnv ℓ → Kind ι → Set where
Z : ∀ {ℓ₁ ℓ₂} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂}
→ TVar (Δ , κ) κ
S : ∀ {ℓ₁ ℓ₂ ℓ₃} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂} {κ' : Kind ℓ₃}
→ TVar Δ κ → TVar (Δ , κ') κ
data Ty where
U : ∀ {ℓ : Level} {Δ : KEnv ℓ} →
Ty Δ ★₀
tvar : ∀ {ℓ₁ ℓ₂ : Level} {Δ : KEnv ℓ₁} {κ : Kind ℓ₂} →
TVar Δ κ →
Ty Δ κ
_`→_ : ∀ {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} →
Ty Δ (★ ℓ₂) → Ty Δ (★ ℓ₃) →
Ty Δ (★ (ℓ₂ ⊔ ℓ₃))
`∀ : ∀ {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} →
(κ : Kind ℓ₃) → Ty (Δ , κ) (★ ℓ₂) →
Ty Δ (★ (ℓ₂ ⊔ (lsuc ℓ₃)))
`λ : ∀ {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} (κ₁ : Kind ℓ₂) {κ₂ : Kind ℓ₃} →
Ty (Δ , κ₁) κ₂ →
Ty Δ (κ₁ `→ κ₂)
_·[_] : ∀ {ℓ₁ ℓ₂ ℓ₃ : Level} {Δ : KEnv ℓ₁} {κ₁ : Kind ℓ₂} {κ₂ : Kind ℓ₃} →
Ty Δ (κ₁ `→ κ₂) → Ty Δ κ₁ →
Ty Δ κ₂
_⇒_ : ∀ {ℓ ℓκ ℓτ} {κ : Kind ℓκ} {Δ : KEnv ℓ}
→ (π : Pred Δ κ) → Ty Δ (★ ℓτ) →
Ty Δ (★ (lsuc ℓκ ⊔ ℓτ))
lab : ∀ {ℓ : Level} {Δ : KEnv ℓ} →
Label →
Ty {ℓ}{lzero} Δ L
_▹_ : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} {κ : Kind ι} →
Ty Δ L → Ty Δ κ →
Ty Δ κ
_R▹_ : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} {κ : Kind ι} →
Ty Δ L → Ty Δ κ →
Ty Δ R[ κ ]
⌊_⌋ : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} →
Ty Δ L →
Ty Δ (★ ι)
∅ : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} →
Ty Δ (★ ι)
Π : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} →
Ty Δ R[ ★ ι ] →
Ty Δ (★ ι)
Σ : ∀ {ℓ ι : Level} {Δ : KEnv ℓ} →
Ty Δ R[ ★ ι ] →
Ty Δ (★ ι)
_·⌈_⌉ : ∀ {ℓ ι} {Δ : KEnv ℓ}
{κ₁ κ₂ : Kind ι} →
Ty Δ R[ κ₁ `→ κ₂ ] → Ty Δ κ₁ →
Ty Δ R[ κ₂ ]
⌈_⌉·_ : ∀ {ℓ ι} {Δ : KEnv ℓ}
{κ₁ κ₂ : Kind ι} →
Ty Δ (κ₁ `→ κ₂) → Ty Δ R[ κ₁ ] →
Ty Δ R[ κ₂ ]