Files
univTypes/SubjectReduction/Specification.agda
2026-04-01 18:29:46 +02:00

470 lines
15 KiB
Agda
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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