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
p p′ : M
n m ℓ : 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 _[_]↑²
data Kind : (ns : List Nat) → Set a where
Ukind : Kind []
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 ∷ [])
Unitkind : Strength → Kind []
Starkind : Strength → Kind []
Unitreckind : (p q : M) → Kind (1 ∷ 0 ∷ 0 ∷ [])
Emptykind : Kind []
Emptyreckind : (p : M) → Kind (0 ∷ 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
F H t u t′ u′ : Term n
E G : Term (1+ n)
k k′ : Kind _
pattern U = gen Ukind []
pattern ℕ = gen Natkind []
pattern Empty = gen Emptykind []
pattern Unit! = gen (Unitkind _) []
pattern Unit s = gen (Unitkind s) []
pattern Unitʷ = gen (Unitkind 𝕨) []
pattern Unitˢ = gen (Unitkind 𝕤) []
pattern ΠΣ⟨_⟩_,_▷_▹_ b p q F G = gen (Binderkind b p q) (F ∷ₜ G ∷ₜ [])
pattern Π_,_▷_▹_ p q F G = gen (Binderkind BMΠ p q) (F ∷ₜ G ∷ₜ [])
pattern Σˢ_,_▷_▹_ p q F G = gen (Binderkind (BMΣ 𝕤) p q) (F ∷ₜ G ∷ₜ [])
pattern Σʷ_,_▷_▹_ p q F G = gen (Binderkind (BMΣ 𝕨) p q) (F ∷ₜ G ∷ₜ [])
pattern Σ_,_▷_▹_ p q F G = gen (Binderkind (BMΣ _) p q) (F ∷ₜ G ∷ₜ [])
pattern Σ⟨_⟩_,_▷_▹_ s p q F G =
gen (Binderkind (BMΣ s) p q) (F ∷ₜ G ∷ₜ [])
pattern lam p t = gen (Lamkind p) (t ∷ₜ [])
pattern _∘⟨_⟩_ t p u = gen (Appkind p) (t ∷ₜ u ∷ₜ [])
pattern _∘_ t u = gen (Appkind _) (t ∷ₜ u ∷ₜ [])
pattern prodˢ p t u = gen (Prodkind 𝕤 p) (t ∷ₜ u ∷ₜ [])
pattern prodʷ p t u = gen (Prodkind 𝕨 p) (t ∷ₜ u ∷ₜ [])
pattern prod m p t u = gen (Prodkind m p) (t ∷ₜ u ∷ₜ [])
pattern prod! t u = gen (Prodkind _ _) (t ∷ₜ u ∷ₜ [])
pattern fst p t = gen (Fstkind p) (t ∷ₜ [])
pattern snd p t = gen (Sndkind p) (t ∷ₜ [])
pattern prodrec r p q A t u =
gen (Prodreckind r p q) (A ∷ₜ t ∷ₜ u ∷ₜ [])
pattern zero = gen Zerokind []
pattern suc t = gen Suckind (t ∷ₜ [])
pattern natrec p q r A z s n =
gen (Natreckind p q r) (A ∷ₜ z ∷ₜ s ∷ₜ n ∷ₜ [])
pattern star! = gen (Starkind _) []
pattern star s = gen (Starkind s) []
pattern starʷ = gen (Starkind 𝕨) []
pattern starˢ = gen (Starkind 𝕤) []
pattern unitrec p q A t u = gen (Unitreckind p q) (A ∷ₜ t ∷ₜ u ∷ₜ [])
pattern emptyrec p A t = gen (Emptyreckind p) (A ∷ₜ t ∷ₜ [])
pattern Id A t u = gen Idkind (A ∷ₜ t ∷ₜ u ∷ₜ [])
pattern rfl = gen Reflkind []
pattern J p q A t B u v w =
gen (Jkind p q) (A ∷ₜ t ∷ₜ B ∷ₜ u ∷ₜ v ∷ₜ w ∷ₜ [])
pattern K p A t B u v = gen (Kkind p) (A ∷ₜ t ∷ₜ B ∷ₜ u ∷ₜ v ∷ₜ [])
pattern []-cong! A t u v = gen (Boxcongkind _) (A ∷ₜ t ∷ₜ u ∷ₜ v ∷ₜ [])
pattern []-cong m A t u v = gen (Boxcongkind m) (A ∷ₜ t ∷ₜ u ∷ₜ v ∷ₜ [])
pattern []-congʷ A t u v = gen (Boxcongkind 𝕨) (A ∷ₜ t ∷ₜ u ∷ₜ v ∷ₜ [])
pattern []-congˢ A t u v = gen (Boxcongkind 𝕤) (A ∷ₜ t ∷ₜ u ∷ₜ v ∷ₜ [])
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
B-PE-injectivity : ∀ W W' → ⟦ W ⟧ F ▹ G PE.≡ ⟦ W' ⟧ H ▹ E
→ F PE.≡ H × G PE.≡ E × W PE.≡ W'
B-PE-injectivity (BΠ p q) (BΠ .p .q) PE.refl =
PE.refl , PE.refl , PE.refl
B-PE-injectivity (BΣ p q m) (BΣ .p .q .m) PE.refl =
PE.refl , PE.refl , PE.refl
BΠ-PE-injectivity : ∀ {p p′ q q′} → BΠ p q PE.≡ BΠ p′ q′ → p PE.≡ p′ × q PE.≡ q′
BΠ-PE-injectivity PE.refl = PE.refl , PE.refl
BΣ-PE-injectivity :
∀ {p p′ q q′ m m′} →
BΣ m p q PE.≡ BΣ m′ p′ q′ → p PE.≡ p′ × q PE.≡ q′ × m PE.≡ m′
BΣ-PE-injectivity PE.refl = PE.refl , PE.refl , PE.refl
suc-PE-injectivity : suc t PE.≡ suc u → t PE.≡ u
suc-PE-injectivity PE.refl = PE.refl
prod-PE-injectivity : ∀ {m m′} → prod m p t u PE.≡ prod m′ p′ t′ u′
→ m PE.≡ m′ × p PE.≡ p′ × t PE.≡ t′ × u PE.≡ u′
prod-PE-injectivity PE.refl = PE.refl , PE.refl , PE.refl , PE.refl
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)
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 : {m n : Nat} (ρ : Wk m n) (t : Term n) → Term m
wk ρ (var x) = var (wkVar ρ x)
wk ρ (gen k c) = gen k (wkGen ρ c)
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))
wk3 : Term n → Term (3+ n)
wk3 = wk1 ∘→ wk2
wk₃ : Term n → Term (3+ n)
wk₃ = wk (step (step (step id)))
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
toSubst : Wk m n → Subst m n
toSubst pr x = var (wkVar pr x)
mutual
substGen : {bs : List Nat} (σ : Subst m n) (g : 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 [ σ ] = substVar σ x
gen x c [ σ ] = gen x (substGen σ c)
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 ℓ m → Subst m n → Subst ℓ n
_ₛ•ₛ_ σ σ′ x = σ′ x [ σ ]
_•ₛ_ : Wk ℓ m → Subst m n → Subst ℓ n
_•ₛ_ ρ σ x = wk ρ (σ x)
_ₛ•_ : Subst ℓ m → Wk m n → Subst ℓ 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 ]
B-subst : (σ : Subst m n) (W : BindingType) (F : Term n) (G : Term (1+ n))
→ (⟦ W ⟧ F ▹ G) [ σ ] PE.≡ ⟦ W ⟧ F [ σ ] ▹ (G [ liftSubst σ ])
B-subst σ (BΠ p q) F G = PE.refl
B-subst σ (BΣ m p q) F G = PE.refl
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