initial commit

This commit is contained in:
JKF
2026-04-01 18:29:46 +02:00
parent 70e9a24640
commit f9e4b4d9aa
8 changed files with 2102 additions and 0 deletions

View File

@@ -0,0 +1,469 @@
module univTypes.SubjectReduction.Specification where
open import Data.Nat using (; zero; suc)
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
open import univTypes.Util.Fin using (Fin; zero; suc)
-- Fixities --------------------------------------------------------------------
infix 4 _↪_ _↪*_
infix 4 _⊢_⦂_
infixl 5 _,_
infix 5 `λ_
infixl 7 _·_
infix 9 `_
infixl 9 _[_]
-- Axioms ----------------------------------------------------------------------
-- Functional Extensionality
postulate
fun-ext : {ℓ₁ ℓ₂} {A : Set ℓ₁} {B : A Set ℓ₂} {f g : (x : A) B x}
( x f x g x)
f g
-- No other postulates are allowed!
-- Syntax ----------------------------------------------------------------------
data Term : Set where
`_ : {n} Fin n Term n
`λ_ : {n} Term (suc n) Term n
_·_ : {n} Term n Term n Term n
∀[x⦂_]_ : {n} Term n Term (suc n) Term n
-- My Extension
`Setω_ : {n} (l : Term n) Term n
`Setn_ : {n} (l : Term n) Term n
`Level : {n} Term n
`lzero : {n} Term n
`lsuc : {n} Term n Term n
_`⊔_ : {n} Term n Term n Term n
-- Extension
∃[x⦂_]_ : {n} Term n Term (suc n) Term n
_`,_ : {n} Term n Term n Term n
`proj₁ : {n} Term n Term n
`proj₂ : {n} Term n Term n
_`≡_ : {n} Term n Term n Term n
`refl : {n} Term n
`subst : {n} Term (suc n) Term n Term n Term n
-- Substitution ----------------------------------------------------------------
`Set : {n} Term n
`Set = `Setn (`lzero)
-- Renamings
Ren : Set
Ren m n = Fin m Fin n
extᵣ : {m n} Ren m n Ren (suc m) (suc n)
extᵣ ρ zero = zero
extᵣ ρ (suc x) = suc (ρ x)
ren : {m n}
Ren m n
(Term m Term n)
ren ρ (` x) = ` (ρ x)
ren ρ ( e) = (ren (extᵣ ρ) e)
ren ρ (e₁ · e₂) = (ren ρ e₁) · (ren ρ e₂)
ren ρ ([x⦂ e₁ ] e₂) = [x⦂ ren ρ e₁ ] ren (extᵣ ρ) e₂
ren ρ (`Setω l) = `Setω (ren ρ l)
ren ρ (`Setn x) = `Setn ren ρ x
ren ρ `Level = `Level
ren ρ `lzero = `lzero
ren ρ (`lsuc l) = `lsuc (ren ρ l)
ren ρ (l `⊔ r) = (ren ρ l) `⊔ (ren ρ r)
ren ρ (∃[x⦂ t₁ ] t₂) = ∃[x⦂ ren ρ t₁ ] ren (extᵣ ρ) t₂
ren ρ (e₁ `, e₂) = (ren ρ e₁) `, (ren ρ e₂)
ren ρ (`proj₁ e) = `proj₁ (ren ρ e)
ren ρ (`proj₂ e) = `proj₂ (ren ρ e)
ren ρ `refl = `refl
ren ρ (e₁ `≡ e₂) = ren ρ e₁ `≡ ren ρ e₂
ren ρ (`subst t e₁ e₂) = `subst (ren (extᵣ ρ) t) (ren ρ e₁) (ren ρ e₂)
wk : {n} Ren n (suc n)
wk x = suc x
-- Substitutions
Sub : Set
Sub m n = Fin m Term n
extₛ : {m n} Sub m n Sub (suc m) (suc n)
extₛ σ zero = ` zero
extₛ σ (suc x) = ren wk (σ x)
sub : {m n}
Sub m n
(Term m Term n)
sub σ (` x) = σ x
sub σ ( e) = (sub (extₛ σ) e)
sub σ (e₁ · e₂) = (sub σ e₁) · (sub σ e₂)
sub σ ([x⦂ e₁ ] e₂) = [x⦂ sub σ e₁ ] sub (extₛ σ) e₂
sub σ (`Setω l) = `Setω (sub σ l)
sub σ (`Setn l) = `Setn sub σ l
sub σ (`Level) = `Level
sub σ `lzero = `lzero
sub σ (`lsuc l) = `lsuc (sub σ l)
sub σ (l `⊔ r) = (sub σ l) `⊔ (sub σ r)
sub σ (∃[x⦂ t₁ ] t₂) = ∃[x⦂ sub σ t₁ ] sub (extₛ σ) t₂
sub σ (e₁ `, e₂) = (sub σ e₁) `, (sub σ e₂)
sub σ (`proj₁ e) = `proj₁ (sub σ e)
sub σ (`proj₂ e) = `proj₂ (sub σ e)
sub σ `refl = `refl
sub σ (e₁ `≡ e₂) = sub σ e₁ `≡ sub σ e₂
sub σ (`subst t e₁ e₂) = `subst (sub (extₛ σ) t) (sub σ e₁) (sub σ e₂)
0↦ : {n} Term n Sub (suc n) n
(0 e) zero = e
(0 e) (suc x) = ` x
_[_] : {n} Term (suc n) Term n Term n
e₁ [ e₂ ] = sub (0 e₂) e₁
-- Semantics -------------------------------------------------------------------
-- Values
mutual
data Value : {n} Term n Set where
val-λ : {n} {e : Term (suc n)}
Value e
------------
Value ( e)
val-∀ : {n} {e₁ : Term n} {e₂ : Term (suc n)}
Value e₁
Value e₂
--------------------
Value ([x⦂ e₁ ] e₂)
val-Setω : {n l}
Value {n = n} (`Setω l)
val-Setn : {n l}
Value l
Value {n = n} (`Setn l)
val-Level : {n}
Value {n = n} `Level
val-l : {n v}
Value {n = n} (`lzero)
val-lsuc : {n v l}
Value l
Value {n = n} (`lsuc l)
val-neu : {n} {e : Term n}
Neutral e
---------
Value e
val-∃ : {n} {e₁ : Term n} {e₂ : Term (suc n)}
Value e₁
Value e₂
--------------------
Value (∃[x⦂ e₁ ] e₂)
val-, : {n} {e₁ e₂ : Term n}
Value e₁
Value e₂
---------
Value (e₁ `, e₂)
val-≡ : {n} {e₁ : Term n} {e₂ : Term n}
Value e₁
Value e₂
--------------------
Value (e₁ `≡ e₂)
val-refl : {n}
Value {n = n} `refl
data Neutral : {n} Term n Set where
neu-` : {n} {x : Fin n}
Neutral (` x)
neu-· : {n} {e₁ e₂ : Term n}
Neutral e₁
Value e₂
-----------------
Neutral (e₁ · e₂)
neu-proj₁ : {n} {e : Term n}
Neutral e
-----------------
Neutral (`proj₁ e)
neu-proj₂ : {n} {e : Term n}
Neutral e
-----------------
Neutral (`proj₂ e)
neu-subst : {n} {t : Term (suc n)} {e₁ e₂ : Term n}
Value t
Neutral e₁
Value e₂
------------------------
Neutral (`subst t e₁ e₂)
-- Reduction
data _↪_ : {n} Term n Term n Set where
β-λ : {n} {e₁ : Term (suc n)} {e₂ : Term n}
( e₁) · e₂ e₁ [ e₂ ]
ξ-λ : {n} {e e' : Term (suc n)}
e e'
---------------
e e'
ξ-·₁ : {n} {e₁ e₂ e₁' : Term n}
e₁ e₁'
---------------------
e₁ · e₂ e₁' · e₂
ξ-·₂ : {n} {e₁ e₂ e₂' : Term n}
e₂ e₂'
---------------------
e₁ · e₂ e₁ · e₂'
ξ-∀₁ : {n} {t₁ t₁' : Term n} {t₂ : Term (suc n)}
t₁ t₁'
-------------------------------
[x⦂ t₁ ] t₂ [x⦂ t₁' ] t₂
ξ-∀₂ : {n} {t₁ : Term n} {t₂ t₂' : Term (suc n)}
t₂ t₂'
-------------------------------
[x⦂ t₁ ] t₂ [x⦂ t₁ ] t₂'
β-proj₁ : {n} {e₁ e₂ : Term n}
`proj₁ (e₁ `, e₂) e₁
β-proj₂ : {n} {e₁ e₂ : Term n}
`proj₂ (e₁ `, e₂) e₂
β-subst : {n} {t : Term (suc n)} {e : Term n}
`subst t `refl e e
ξ-∃₁ : {n} {t₁ t₁' : Term n} {t₂ : Term (suc n)}
t₁ t₁'
-------------------------------
∃[x⦂ t₁ ] t₂ ∃[x⦂ t₁' ] t₂
ξ-∃₂ : {n} {t₁ : Term n} {t₂ t₂' : Term (suc n)}
t₂ t₂'
-------------------------------
∃[x⦂ t₁ ] t₂ ∃[x⦂ t₁ ] t₂'
ξ-proj₁ : {n} {e e' : Term n}
e e'
`proj₁ e `proj₁ e'
ξ-proj₂ : {n} {e e' : Term n}
e e'
`proj₂ e `proj₂ e'
ξ-,₁ : {n} {e₁ e₁' e₂ : Term n}
e₁ e₁'
(e₁ `, e₂) (e₁' `, e₂)
ξ-,₂ : {n} {e₁ e₂ e₂' : Term n}
e₂ e₂'
(e₁ `, e₂) (e₁ `, e₂')
ξ-≡₁ : {n} {t₁ t₁' : Term n} {t₂ : Term n}
t₁ t₁'
-------------------------------
(t₁ `≡ t₂) (t₁' `≡ t₂)
ξ-≡₂ : {n} {t₁ : Term n} {t₂ t₂' : Term n}
t₂ t₂'
-------------------------------
(t₁ `≡ t₂) (t₁ `≡ t₂')
ξ-subst₁ : {n} {t t' : Term (suc n)} {e₁ e₂ : Term n}
t t'
`subst t e₁ e₂ `subst t' e₁ e₂
ξ-subst₂ : {n} {t : Term (suc n)} {e₁ e₁' e₂ : Term n}
e₁ e₁'
`subst t e₁ e₂ `subst t e₁' e₂
ξ-subst₃ : {n} {t : Term (suc n)} {e₁ e₂ e₂' : Term n}
e₂ e₂'
`subst t e₁ e₂ `subst t e₁ e₂'
-- Extension:
ξ-⊔₁ : {n} {t₁ t₁' : Term n} {t₂ : Term n}
t₁ t₁'
-------------------------------
(t₁ `⊔ t₂) (t₁' `⊔ t₂)
ξ-⊔₂ : {n} {t₁ : Term n} {t₂ t₂' : Term n}
t₂ t₂'
-------------------------------
(t₁ `⊔ t₂) (t₁ `⊔ t₂')
ξ-Setn : {n} {l l' : Term n}
l l'
`Setn l `Setn l'
ξ-Setω : {n} {l l' : Term n}
l l'
`Setω l `Setω l'
-- Reflexive, Transitive Closure of Reduction
data _↪*_ : {n} Term n Term n Set where
↪*-refl : {n} {e : Term n}
e ↪* e
↪*-step : {n} {e₁ e₂ e₃ : Term n}
e₁ e₂
e₂ ↪* e₃
e₁ ↪* e₃
↪*-trans : {n} {e₁ e₂ e₃ : Term n}
e₁ ↪* e₂
e₂ ↪* e₃
e₁ ↪* e₃
↪*-trans ↪*-refl q = q
↪*-trans (↪*-step x p) q = ↪*-step x (↪*-trans p q)
module ↪*-Reasoning where
infix 1 begin_
infixr 2 _↪⟨_⟩_ _↪*⟨_⟩_ _≡⟨_⟩_ _≡⟨⟩_
infix 3 _∎
begin_ : {n} {e₁ e₂ : Term n} e₁ ↪* e₂ e₁ ↪* e₂
begin p = p
_↪⟨_⟩_ : {n} (e₁ {e₂} {e₃} : Term n) e₁ e₂ e₂ ↪* e₃ e₁ ↪* e₃
_ ↪⟨ p q = ↪*-step p q
_↪*⟨_⟩_ : {n} (e₁ {e₂} {e₃} : Term n) e₁ ↪* e₂ e₂ ↪* e₃ e₁ ↪* e₃
_ ↪*⟨ p q = ↪*-trans p q
_≡⟨_⟩_ : {n} (e₁ {e₂} {e₃} : Term n) e₁ e₂ e₂ ↪* e₃ e₁ ↪* e₃
_ ≡⟨ refl q = q
_≡⟨⟩_ : {n} (e₁ {e₂} {e₃} : Term n) e₁ ↪* e₂ e₁ ↪* e₂
_ ≡⟨⟩ q = q
_∎ : {n} (e : Term n) e ↪* e
_ = ↪*-refl
-- Conversion
-- Two terms are convertible iff they reduce to a common term.
infix 4 _≈_
record _≈_ {n} (e₁ e₂ : Term n) : Set where
constructor mk-≈
field
e-common : Term n
e₁↪*e-common : e₁ ↪* e-common
e₂↪*e-common : e₂ ↪* e-common
open _≈_ public
-- Typing ----------------------------------------------------------------------
data Context : Set where
: Context zero
_,_ : {n} Context n Term n Context (suc n)
lookup : {n} Context n Fin n Term n
lookup (Γ , e) zero = ren wk e
lookup (Γ , e) (suc x) = ren wk (lookup Γ x)
data _⊢_⦂_ : {n} Context n Term n Term n Set where
⊢-` : {n t} {Γ : Context n} (x : Fin n)
lookup Γ x t
--------------
Γ ` x t
⊢-λ : {n} {Γ : Context n} {e : Term (suc n)} {t₁ l : Term n} {t₂ : Term (suc n)}
Γ t₁ `Setn l
Γ , t₁ e t₂
-----------------------
Γ e [x⦂ t₁ ] t₂
⊢-· : {n} {Γ : Context n} {e₁ e₂ : Term n} {t₁ : Term n} {t₂ : Term (suc n)}
Γ e₁ [x⦂ t₁ ] t₂
Γ e₂ t₁
-----------------------
Γ e₁ · e₂ t₂ [ e₂ ]
⊢-∀ : {n} {Γ : Context n} {t₁ l₁ l₃ : Term n} {t₂ l₂ : Term (suc n)}
Γ t₁ `Setn l₁
Γ , t₁ t₂ `Setn l₂
-----------------------
Γ [x⦂ t₁ ] t₂ `Setn l₃
⊢-≈ : {n} {Γ : Context n} {e : Term n} {t t' : Term n}
t t'
Γ e t
------------
Γ e t'
⊢-∃ : {n} {Γ : Context n} {t₁ : Term n} {t₂ : Term (suc n)}
Γ t₁ `Set
Γ , t₁ t₂ `Set
-----------------------
Γ ∃[x⦂ t₁ ] t₂ `Set
⊢-, : {n} {Γ : Context n} {e₁ e₂ : Term n} {t₁ : Term n} {t₂ : Term (suc n)}
Γ e₁ t₁
Γ e₂ t₂ [ e₁ ]
-----------------------
Γ (e₁ `, e₂) ∃[x⦂ t₁ ] t₂
⊢-proj₁ : {n} {Γ : Context n} {e : Term n} {t₁ : Term n} {t₂ : Term (suc n)}
Γ e ∃[x⦂ t₁ ] t₂
Γ `proj₁ e t₁
⊢-proj₂ : {n} {Γ : Context n} {e : Term n} {t₁ : Term n} {t₂ : Term (suc n)}
Γ e ∃[x⦂ t₁ ] t₂
Γ `proj₂ e t₂ [ `proj₁ e ]
⊢-≡ : {n} {Γ : Context n} {e₁ e₂ t : Term n}
Γ e₁ t
Γ e₂ t
-----------------------
Γ (e₁ `≡ e₂) `Set
⊢-refl : {n} {Γ : Context n} {e t : Term n}
Γ e t
------------------
Γ `refl e `≡ e
⊢-subst : {n} {Γ : Context n} {e₁ e₂ u₁ u₂ : Term n} {t' : Term n} {t : Term (suc n)}
Γ , t' t `Set
Γ u₁ t'
Γ u₂ t'
Γ e₁ (u₁ `≡ u₂)
Γ e₂ t [ u₁ ]
------------------------------
Γ `subst t e₁ e₂ t [ u₂ ]
-- Extension
⊢-Setn : {n} {Γ : Context n} {l}
Γ `Setn l (`Setn (`lsuc l))
⊢-Setω : {n} {Γ : Context n} {l}
Γ `Setω l (`Setω (`lsuc l))
⊢-lzero : {n} {Γ : Context n}
Γ `lzero `Level
⊢-lsuc : {n} {Γ : Context n} {l}
Γ l `Level
Γ `lsuc l `Level
⊢-⊔ : {n} {Γ : Context n} {l₁ l₂}
Γ l₁ `Level
Γ l₂ `Level
Γ (l₁ `⊔ l₂) `Level
⊢-Level : {n} {Γ : Context n}
Γ `Level `Set
cong₃ : {A B C D : Set} (f : A B C D) {x y u v a b} x y u v a b f x u a f y v b
cong₃ f refl refl refl = refl