module Definition.Untyped {a} (M : Set a) where
open import Tools.Fin
open import Tools.Function
open import Tools.Nat
open import Tools.Product
open import Tools.List
open import Tools.PropositionalEquality as PE hiding (subst)
open import Definition.Untyped.NotParametrised public
private
variable
n m l : Nat
bs bs′ : List _
ts ts′ : GenTs _ _ _
infix 30 ΠΣ⟨_⟩_,_▷_▹_
infix 30 Π_,_▷_▹_
infix 30 Σ_,_▷_▹_
infix 30 Σˢ_,_▷_▹_
infix 30 Σʷ_,_▷_▹_
infix 30 Σ⟨_⟩_,_▷_▹_
infixl 30 _∘⟨_⟩_
infixl 30 _∘_
infix 30 ⟦_⟧_▹_
infixl 30 _ₛ•ₛ_ _•ₛ_ _ₛ•_
infix 25 _[_]
infix 25 _[_]₀
infix 25 _[_]↑
infix 25 _[_,_]₁₀
infix 25 _[_]↑²
infix 25 _[_][_]↑
infix 24 _∙[_][_][_]
data Term (n : Nat) : Set a where
var : (x : Fin n) → Term n
U : Universe-level → Term n
Empty : Term n
emptyrec : (p : M) (A t : Term n) → Term n
Unit : Strength → Universe-level → Term n
star : Strength → Universe-level → Term n
unitrec : Universe-level → (p q : M) (A : Term (1+ n))
(t u : Term n) → Term n
ΠΣ⟨_⟩_,_▷_▹_ : (b : BinderMode) (p q : M) (A : Term n)
(B : Term (1+ n)) → Term n
lam : (p : M) (t : Term (1+ n)) → Term n
_∘⟨_⟩_ : (t : Term n) (p : M) (u : Term n) → Term n
prod : Strength → (p : M) (t u : Term n) → Term n
fst : (p : M) (t : Term n) → Term n
snd : (p : M) (t : Term n) → Term n
prodrec : (r p q : M) (A : Term (1+ n)) (t : Term n)
(u : Term (2+ n)) → Term n
ℕ : Term n
zero : Term n
suc : (t : Term n) → Term n
natrec : (p q r : M) (A : Term (1+ n)) (z : Term n)
(s : Term (2+ n)) (t : Term n) → Term n
Id : (A t u : Term n) → Term n
rfl : Term n
J : (p q : M) (A t : Term n) (B : Term (2+ n)) (u v w : Term n) →
Term n
K : (p : M) (A t : Term n) (B : Term (1+ n)) (u v : Term n) →
Term n
[]-cong : Strength → (A t u v : Term n) → Term n
pattern Unit! = Unit _ _
pattern Unitʷ l = Unit 𝕨 l
pattern Unitˢ l = Unit 𝕤 l
pattern Π_,_▷_▹_ p q F G = ΠΣ⟨ BMΠ ⟩ p , q ▷ F ▹ G
pattern Σˢ_,_▷_▹_ p q F G = ΠΣ⟨ BMΣ 𝕤 ⟩ p , q ▷ F ▹ G
pattern Σʷ_,_▷_▹_ p q F G = ΠΣ⟨ BMΣ 𝕨 ⟩ p , q ▷ F ▹ G
pattern Σ_,_▷_▹_ p q F G = ΠΣ⟨ BMΣ _ ⟩ p , q ▷ F ▹ G
pattern Σ⟨_⟩_,_▷_▹_ s p q F G = ΠΣ⟨ BMΣ s ⟩ p , q ▷ F ▹ G
pattern _∘_ t u = t ∘⟨ _ ⟩ u
pattern prodˢ p t u = prod 𝕤 p t u
pattern prodʷ p t u = prod 𝕨 p t u
pattern prod! t u = prod _ _ t u
pattern star! = star _ _
pattern starʷ l = star 𝕨 l
pattern starˢ l = star 𝕤 l
pattern []-cong! A t u v = []-cong _ A t u v
pattern []-congʷ A t u v = []-cong 𝕨 A t u v
pattern []-congˢ A t u v = []-cong 𝕤 A t u v
private variable
t : Term _
data BindingType : Set a where
BM : BinderMode → (p q : M) → BindingType
pattern BΠ p q = BM BMΠ p q
pattern BΠ! = BΠ _ _
pattern BΣ s p q = BM (BMΣ s) p q
pattern BΣ! = BΣ _ _ _
pattern BΣʷ = BΣ 𝕨 _ _
pattern BΣˢ = BΣ 𝕤 _ _
⟦_⟧_▹_ : BindingType → Term n → Term (1+ n) → Term n
⟦ BM b p q ⟧ A ▹ B = ΠΣ⟨ b ⟩ p , q ▷ A ▹ B
data Numeral {n : Nat} : Term n → Set a where
zeroₙ : Numeral zero
sucₙ : Numeral t → Numeral (suc t)
sucᵏ : (k : Nat) → Term n
sucᵏ 0 = zero
sucᵏ (1+ n) = suc (sucᵏ n)
data Kind : (ns : List Nat) → Set a where
Ukind : Universe-level → Kind []
Emptykind : Kind []
Emptyreckind : (p : M) → Kind (0 ∷ 0 ∷ [])
Unitkind : Strength → Universe-level → Kind []
Starkind : Strength → Universe-level → Kind []
Unitreckind : Universe-level → (p q : M) → Kind (1 ∷ 0 ∷ 0 ∷ [])
Binderkind : (b : BinderMode) (p q : M) → Kind (0 ∷ 1 ∷ [])
Lamkind : (p : M) → Kind (1 ∷ [])
Appkind : (p : M) → Kind (0 ∷ 0 ∷ [])
Prodkind : Strength → (p : M) → Kind (0 ∷ 0 ∷ [])
Fstkind : (p : M) → Kind (0 ∷ [])
Sndkind : (p : M) → Kind (0 ∷ [])
Prodreckind : (r p q : M) → Kind (1 ∷ 0 ∷ 2 ∷ [])
Natkind : Kind []
Zerokind : Kind []
Suckind : Kind (0 ∷ [])
Natreckind : (p q r : M) → Kind (1 ∷ 0 ∷ 2 ∷ 0 ∷ [])
Idkind : Kind (0 ∷ 0 ∷ 0 ∷ [])
Reflkind : Kind []
Jkind : M → M → Kind (0 ∷ 0 ∷ 2 ∷ 0 ∷ 0 ∷ 0 ∷ [])
Kkind : M → Kind (0 ∷ 0 ∷ 1 ∷ 0 ∷ 0 ∷ [])
Boxcongkind : Strength → Kind (0 ∷ 0 ∷ 0 ∷ 0 ∷ [])
data Term′ (n : Nat) : Set a where
var : (x : Fin n) → Term′ n
gen : {bs : List Nat} (k : Kind bs) (ts : GenTs Term′ n bs) → Term′ n
private variable
k k′ : Kind _
toTerm : Term′ n → Term n
toTerm (var x) =
var x
toTerm (gen (Ukind l) []) =
U l
toTerm (gen (Binderkind b p q) (A ∷ₜ B ∷ₜ [])) =
ΠΣ⟨ b ⟩ p , q ▷ (toTerm A) ▹ (toTerm B)
toTerm (gen (Lamkind p) (t ∷ₜ [])) =
lam p (toTerm t)
toTerm (gen (Appkind p) (t ∷ₜ u ∷ₜ [])) =
toTerm t ∘⟨ p ⟩ toTerm u
toTerm (gen (Prodkind s p) (t ∷ₜ u ∷ₜ [])) =
prod s p (toTerm t) (toTerm u)
toTerm (gen (Fstkind p) (t ∷ₜ [])) =
fst p (toTerm t)
toTerm (gen (Sndkind p) (t ∷ₜ [])) =
snd p (toTerm t)
toTerm (gen (Prodreckind r p q) (A ∷ₜ t ∷ₜ u ∷ₜ [])) =
prodrec r p q (toTerm A) (toTerm t) (toTerm u)
toTerm (gen Natkind []) =
ℕ
toTerm (gen Zerokind []) =
zero
toTerm (gen Suckind (t ∷ₜ [])) =
suc (toTerm t)
toTerm (gen (Natreckind p q r) (A ∷ₜ z ∷ₜ s ∷ₜ n ∷ₜ [])) =
natrec p q r (toTerm A) (toTerm z) (toTerm s) (toTerm n)
toTerm (gen (Unitkind s l) []) =
Unit s l
toTerm (gen (Starkind s l) []) =
star s l
toTerm (gen (Unitreckind l p q) (A ∷ₜ t ∷ₜ u ∷ₜ [])) =
unitrec l p q (toTerm A) (toTerm t) (toTerm u)
toTerm (gen Emptykind []) =
Empty
toTerm (gen (Emptyreckind p) (A ∷ₜ t ∷ₜ [])) =
emptyrec p (toTerm A) (toTerm t)
toTerm (gen Idkind (A ∷ₜ t ∷ₜ u ∷ₜ [])) =
Id (toTerm A) (toTerm t) (toTerm u)
toTerm (gen Reflkind []) =
rfl
toTerm (gen (Jkind p q) (A ∷ₜ t ∷ₜ B ∷ₜ u ∷ₜ v ∷ₜ w ∷ₜ [])) =
J p q (toTerm A) (toTerm t) (toTerm B) (toTerm u) (toTerm v) (toTerm w)
toTerm (gen (Kkind p) (A ∷ₜ t ∷ₜ B ∷ₜ u ∷ₜ v ∷ₜ [])) =
K p (toTerm A) (toTerm t) (toTerm B) (toTerm u) (toTerm v)
toTerm (gen (Boxcongkind s) (A ∷ₜ t ∷ₜ u ∷ₜ v ∷ₜ [])) =
[]-cong s (toTerm A) (toTerm t) (toTerm u) (toTerm v)
fromTerm : Term n → Term′ n
fromTerm (var x) =
var x
fromTerm (U l) =
gen (Ukind l) []
fromTerm (ΠΣ⟨ b ⟩ p , q ▷ A ▹ B) =
gen (Binderkind b p q) (fromTerm A ∷ₜ fromTerm B ∷ₜ [])
fromTerm (lam p t) =
gen (Lamkind p) (fromTerm t ∷ₜ [])
fromTerm (t ∘⟨ p ⟩ u) =
gen (Appkind p) (fromTerm t ∷ₜ fromTerm u ∷ₜ [])
fromTerm (prod s p t u) =
gen (Prodkind s p) (fromTerm t ∷ₜ fromTerm u ∷ₜ [])
fromTerm (fst p t) =
gen (Fstkind p) (fromTerm t ∷ₜ [])
fromTerm (snd p t) =
gen (Sndkind p) (fromTerm t ∷ₜ [])
fromTerm (prodrec r p q A t u) =
gen (Prodreckind r p q)
(fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm u ∷ₜ [])
fromTerm ℕ =
gen Natkind []
fromTerm zero =
gen Zerokind []
fromTerm (suc t) =
gen Suckind (fromTerm t ∷ₜ [])
fromTerm (natrec p q r A z s n) =
gen (Natreckind p q r)
(fromTerm A ∷ₜ fromTerm z ∷ₜ fromTerm s ∷ₜ fromTerm n ∷ₜ [])
fromTerm (Unit s l) =
gen (Unitkind s l) []
fromTerm (star s l) =
gen (Starkind s l) []
fromTerm (unitrec l p q A t u) =
gen (Unitreckind l p q)
(fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm u ∷ₜ [])
fromTerm Empty =
gen Emptykind []
fromTerm (emptyrec p A t) =
gen (Emptyreckind p) (fromTerm A ∷ₜ fromTerm t ∷ₜ [])
fromTerm (Id A t u) =
gen Idkind (fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm u ∷ₜ [])
fromTerm rfl =
gen Reflkind []
fromTerm (J p q A t B u v w) =
gen (Jkind p q)
(fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm B ∷ₜ fromTerm u
∷ₜ fromTerm v ∷ₜ fromTerm w ∷ₜ [])
fromTerm (K p A t B u v) =
gen (Kkind p)
(fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm B
∷ₜ fromTerm u ∷ₜ fromTerm v ∷ₜ [])
fromTerm ([]-cong s A t u v) =
gen (Boxcongkind s)
(fromTerm A ∷ₜ fromTerm t ∷ₜ fromTerm u
∷ₜ fromTerm v ∷ₜ [])
wk : (ρ : Wk m n) (t : Term n) → Term m
wk ρ (var x) = var (wkVar ρ x)
wk ρ (U l) = U l
wk ρ (ΠΣ⟨ b ⟩ p , q ▷ A ▹ B) =
ΠΣ⟨ b ⟩ p , q ▷ wk ρ A ▹ wk (lift ρ) B
wk ρ (lam p t) = lam p (wk (lift ρ) t)
wk ρ (t ∘⟨ p ⟩ u) = wk ρ t ∘⟨ p ⟩ wk ρ u
wk ρ (prod s p t u) = prod s p (wk ρ t) (wk ρ u)
wk ρ (fst p t) = fst p (wk ρ t)
wk ρ (snd p t) = snd p (wk ρ t)
wk ρ (prodrec r p q A t u) =
prodrec r p q (wk (lift ρ) A) (wk ρ t) (wk (liftn ρ 2) u)
wk ρ ℕ = ℕ
wk ρ zero = zero
wk ρ (suc t) = suc (wk ρ t)
wk ρ (natrec p q r A z s n) =
natrec p q r (wk (lift ρ) A) (wk ρ z) (wk (liftn ρ 2) s) (wk ρ n)
wk ρ (Unit s l) = Unit s l
wk ρ (star s l) = star s l
wk ρ (unitrec l p q A t u) =
unitrec l p q (wk (lift ρ) A) (wk ρ t) (wk ρ u)
wk ρ Empty = Empty
wk ρ (emptyrec p A t) = emptyrec p (wk ρ A) (wk ρ t)
wk ρ (Id A t u) = Id (wk ρ A) (wk ρ t) (wk ρ u)
wk ρ rfl = rfl
wk ρ (J p q A t B u v w) =
J p q (wk ρ A) (wk ρ t) (wk (liftn ρ 2) B) (wk ρ u) (wk ρ v) (wk ρ w)
wk ρ (K p A t B u v) =
K p (wk ρ A) (wk ρ t) (wk (lift ρ) B) (wk ρ u) (wk ρ v)
wk ρ ([]-cong s A t u v) =
[]-cong s (wk ρ A) (wk ρ t) (wk ρ u) (wk ρ v)
mutual
wkGen : {m n : Nat} {bs : List Nat} (ρ : Wk m n)
(c : GenTs Term′ n bs) → GenTs Term′ m bs
wkGen ρ [] = []
wkGen ρ (_∷ₜ_ {b = b} t c) = wk′ (liftn ρ b) t ∷ₜ wkGen ρ c
wk′ : (ρ : Wk m n) (t : Term′ n) → Term′ m
wk′ ρ (var x) = var (wkVar ρ x)
wk′ ρ (gen k ts) = gen k (wkGen ρ ts)
wk1 : Term n → Term (1+ n)
wk1 = wk (step id)
wk2 : Term n → Term (1+ (1+ n))
wk2 = wk1 ∘→ wk1
wk₂ : Term n → Term (2+ n)
wk₂ = wk (step (step id))
wk[_] : ∀ k → Term n → Term (k + n)
wk[ 0 ] t = t
wk[ 1+ k ] t = wk1 (wk[ k ] t)
wk[_]′ : ∀ k → Term n → Term (k + n)
wk[ k ]′ = wk (stepn id k)
Subst : Nat → Nat → Set a
Subst m n = Fin n → Term m
head : Subst m (1+ n) → Term m
head σ = σ x0
tail : Subst m (1+ n) → Subst m n
tail σ x = σ (x +1)
substVar : (σ : Subst m n) (x : Fin n) → Term m
substVar σ x = σ x
idSubst : Subst n n
idSubst = var
wk1Subst : Subst m n → Subst (1+ m) n
wk1Subst σ x = wk1 (σ x)
wkSubst : ∀ k → Subst m n → Subst (k + m) n
wkSubst 0 = idᶠ
wkSubst (1+ k) = wk1Subst ∘→ wkSubst k
liftSubst : (σ : Subst m n) → Subst (1+ m) (1+ n)
liftSubst σ x0 = var x0
liftSubst σ (x +1) = wk1Subst σ x
liftSubstn : {k m : Nat} → Subst k m → (n : Nat) → Subst (n + k) (n + m)
liftSubstn σ Nat.zero = σ
liftSubstn σ (1+ n) = liftSubst (liftSubstn σ n)
_⇑ : Subst m n → Subst (1+ m) (1+ n)
_⇑ = liftSubst
_⇑[_] : Subst m n → ∀ k → Subst (k + m) (k + n)
_⇑[_] = liftSubstn
toSubst : Wk m n → Subst m n
toSubst pr x = var (wkVar pr x)
_[_] : (t : Term n) (σ : Subst m n) → Term m
var x [ σ ] = σ x
U l [ σ ] = U l
ΠΣ⟨ b ⟩ p , q ▷ A ▹ B [ σ ] =
ΠΣ⟨ b ⟩ p , q ▷ A [ σ ] ▹ (B [ σ ⇑ ])
lam p t [ σ ] = lam p (t [ σ ⇑ ])
t ∘⟨ p ⟩ u [ σ ] = (t [ σ ]) ∘⟨ p ⟩ (u [ σ ])
prod s p t u [ σ ] = prod s p (t [ σ ]) (u [ σ ])
fst p t [ σ ] = fst p (t [ σ ])
snd p t [ σ ] = snd p (t [ σ ])
prodrec r p q A t u [ σ ] =
prodrec r p q (A [ σ ⇑ ]) (t [ σ ]) (u [ σ ⇑[ 2 ] ])
ℕ [ σ ] = ℕ
zero [ σ ] = zero
suc t [ σ ] = suc (t [ σ ])
natrec p q r A z s n [ σ ] =
natrec p q r (A [ σ ⇑ ]) (z [ σ ]) (s [ σ ⇑[ 2 ] ]) (n [ σ ])
Unit s l [ σ ] = Unit s l
star s l [ σ ] = star s l
unitrec l p q A t u [ σ ] =
unitrec l p q (A [ σ ⇑ ]) (t [ σ ]) (u [ σ ])
Empty [ σ ] = Empty
emptyrec p A t [ σ ] = emptyrec p (A [ σ ]) (t [ σ ])
Id A t u [ σ ] = Id (A [ σ ]) (t [ σ ]) (u [ σ ])
rfl [ σ ] = rfl
J p q A t B u v w [ σ ] =
J p q (A [ σ ]) (t [ σ ]) (B [ σ ⇑[ 2 ] ]) (u [ σ ]) (v [ σ ])
(w [ σ ])
K p A t B u v [ σ ] =
K p (A [ σ ]) (t [ σ ]) (B [ σ ⇑ ]) (u [ σ ]) (v [ σ ])
[]-cong s A t u v [ σ ] =
[]-cong s (A [ σ ]) (t [ σ ]) (u [ σ ]) (v [ σ ])
mutual
substGen : {bs : List Nat} (σ : Subst m n)
(ts : GenTs Term′ n bs) → GenTs Term′ m bs
substGen σ [] = []
substGen σ (_∷ₜ_ {b} t ts) = t [ liftSubstn σ b ]′ ∷ₜ substGen σ ts
_[_]′ : (t : Term′ n) (σ : Subst m n) → Term′ m
var x [ σ ]′ = fromTerm (σ x)
gen k ts [ σ ]′ = gen k (substGen σ ts)
consSubst : Subst m n → Term m → Subst m (1+ n)
consSubst σ t x0 = t
consSubst σ t (x +1) = σ x
sgSubst : Term n → Subst n (1+ n)
sgSubst = consSubst idSubst
_ₛ•ₛ_ : Subst l m → Subst m n → Subst l n
_ₛ•ₛ_ σ σ′ x = σ′ x [ σ ]
_•ₛ_ : Wk l m → Subst m n → Subst l n
_•ₛ_ ρ σ x = wk ρ (σ x)
_ₛ•_ : Subst l m → Wk m n → Subst l n
_ₛ•_ σ ρ x = σ (wkVar ρ x)
_[_]₀ : (t : Term (1+ n)) (s : Term n) → Term n
t [ s ]₀ = t [ sgSubst s ]
_[_]↑ : (t : Term (1+ n)) (s : Term (1+ n)) → Term (1+ n)
t [ s ]↑ = t [ consSubst (wk1Subst idSubst) s ]
_[_,_]₁₀ : (t : Term (2+ n)) (s s′ : Term n) → Term n
t [ s , s′ ]₁₀ = t [ consSubst (sgSubst s) s′ ]
_[_]↑² : (t : Term (1+ n)) (s : Term (2+ n)) → Term (2+ n)
t [ s ]↑² = t [ consSubst (wk1Subst (wk1Subst idSubst)) s ]
_[_][_]↑ : Term (1+ n) → ∀ k → Term (k + n) → Term (k + n)
t [ k ][ u ]↑ = t [ consSubst (wkSubst k idSubst) u ]
_∙[_][_][_] :
Con Term m → ∀ k → Con Term (k + n) → Subst m n → Con Term (k + m)
Δ ∙[ 0 ][ _ ][ _ ] = Δ
Δ ∙[ 1+ k ][ Γ ∙ A ][ σ ] = Δ ∙[ k ][ Γ ][ σ ] ∙ A [ σ ⇑[ k ] ]
gen-cong⁻¹ :
gen {bs = bs} k ts ≡ gen {bs = bs′} k′ ts′ →
∃ λ (eq : bs ≡ bs′) →
PE.subst Kind eq k ≡ k′ ×
PE.subst (GenTs Term′ _) eq ts ≡ ts′
gen-cong⁻¹ refl = refl , refl , refl
∷-cong⁻¹ :
∀ {b} {t t′ : Term′ (b + n)} →
_∷ₜ_ {A = Term′} {b = b} t ts ≡ t′ ∷ₜ ts′ →
t ≡ t′ × ts ≡ ts′
∷-cong⁻¹ refl = refl , refl