Skip to content

Instantly share code, notes, and snippets.

@AndrasKovacs
Last active November 3, 2024 19:20
Show Gist options
  • Save AndrasKovacs/1417f92a411b53798c880fd0a6b44169 to your computer and use it in GitHub Desktop.
Save AndrasKovacs/1417f92a411b53798c880fd0a6b44169 to your computer and use it in GitHub Desktop.
TT in TT using only induction-induction
{-# OPTIONS --without-K #-}
-- version 1, conversion is indexed over conversion
module IndexedConv where
data Con : Set
data Ty : Con Set
data Sub : Con Con Set
data Tm : Γ Ty Γ Set
data Con~ : Con Con Set
data Ty~ : {Γ₀ Γ₁} Con~ Γ₀ Γ₁ Ty Γ₀ Ty Γ₁ Set
data Sub~ : {Γ₀ Γ₁ Δ₀ Δ₁} Con~ Γ₀ Γ₁ Con~ Δ₀ Δ₁ Sub Γ₀ Δ₀ Sub Γ₁ Δ₁ Set
data Tm~ : {Γ₀ Γ₁ A₀ A₁}(Γ₂ : Con~ Γ₀ Γ₁) Ty~ Γ₂ A₀ A₁ Tm Γ₀ A₀ Tm Γ₁ A₁ Set
variable
Γ Δ Γ₀ Γ₁ Δ₀ Δ₁ θ θ₀ θ₁ : Con
A B C A₀ A₁ B₀ B₁ : Ty _
t u v t₀ t₁ u₀ u₁ : Tm _ _
σ δ ν σ₀ σ₁ δ₀ δ₁ ν₀ ν₁ : Sub _ _
Γ₂ : Con~ Γ₀ Γ₁
Δ₂ : Con~ Δ₀ Δ₁
θ₂ : Con~ θ₀ θ₁
A₂ : Ty~ _ A₀ A₁
B₂ : Ty~ _ B₀ B₁
infixl 4 _,_
infixr 5 _∘_
infix 5 _[_]
data Con where
: Con
_,_ : Γ Ty Γ Con
data Ty where
coe : Con~ Γ₀ Γ₁ Ty Γ₀ Ty Γ₁
------------------------------------------------------------
_[_] : Ty Δ Sub Γ Δ Ty Γ
U : Ty Γ
Π : (A : Ty Γ) Ty (Γ , A) Ty Γ
El : Tm Γ U Ty Γ
data Sub where
coe : Con~ Γ₀ Γ₁ Con~ Δ₀ Δ₁ Sub Γ₀ Δ₀ Sub Γ₁ Δ₁
------------------------------------------------------------
id : Sub Γ Γ
_∘_ : Sub Δ θ Sub Γ Δ Sub Γ θ
ε : Sub Γ ∙
p : Sub (Γ , A) Γ
_,_ :: Sub Γ Δ) Tm Γ (A [ σ ]) Sub Γ (Δ , A)
data Tm where
coe : Γ₂ Ty~ Γ₂ A₀ A₁ Tm Γ₀ A₀ Tm Γ₁ A₁
------------------------------------------------------------
_[_] : Tm Δ A : Sub Γ Δ) Tm Γ (A [ σ ])
q : Tm (Γ , A) (A [ p ])
lam : Tm (Γ , A) B Tm Γ (Π A B)
app : Tm Γ (Π A B) Tm (Γ , A) B
data Con~ where
rfl : Con~ Γ Γ
sym : Con~ Γ Δ Con~ Δ Γ
trs : Con~ Γ Δ Con~ Δ θ Con~ Γ θ
------------------------------------------------------------
: Con~ ∙ ∙
_,_ : Γ₂ Ty~ Γ₂ A₀ A₁ Con~ (Γ₀ , A₀) (Γ₁ , A₁)
data Ty~ where
rfl : Ty~ rfl A A
sym : {Γ₀₁} Ty~ Γ₀₁ A B Ty~ (sym Γ₀₁) B A
trs : {Γ₀₁ Γ₁₂} Ty~ Γ₀₁ A B Ty~ Γ₁₂ B C Ty~ (trs Γ₀₁ Γ₁₂) A C
coh : Γ₂ A Ty~ {Γ₀}{Γ₁} Γ₂ A (coe Γ₂ A)
reix : {Γ₂'} Ty~ Γ₂ A₀ A₁ Ty~ Γ₂' A₀ A₁
------------------------------------------------------------
_[_] : Ty~ Δ₂ A₀ A₁ Sub~ Γ₂ Δ₂ σ₀ σ₁ Ty~ Γ₂ (A₀ [ σ₀ ]) (A₁ [ σ₁ ])
U : Ty~ Γ₂ U U
Π : (A₂ : Ty~ Γ₂ A₀ A₁) Ty~ (Γ₂ , A₂) B₀ B₁ Ty~ Γ₂ (Π A₀ B₀) (Π A₁ B₁)
El : Tm~ Γ₂ U t₀ t₁ Ty~ Γ₂ (El t₀) (El t₁)
------------------------------------------------------------
[id] : Ty~ rfl (A [ id ]) A
[∘] : Ty~ rfl (A [ σ ∘ δ ]) (A [ σ ] [ δ ])
U[] : Ty~ rfl (U [ σ ]) U
Π[] : Ty~ rfl (Π A B [ σ ]) (Π (A [ σ ]) (B [ σ ∘ p , coe (sym rfl) (sym [∘]) q ]))
El[] : Ty~ rfl (El t [ σ ]) (El (coe rfl U[] (t [ σ ])))
data Sub~ where
rfl : Sub~ rfl rfl σ σ
sym : {Γ₀₁ Δ₀₁} Sub~ Γ₀₁ Δ₀₁ σ δ Sub~ (sym Γ₀₁) (sym Δ₀₁) δ σ
trs : {Γ₀₁ Δ₀₁ Γ₁₂ Δ₁₂} Sub~ Γ₀₁ Δ₀₁ σ δ Sub~ Γ₁₂ Δ₁₂ δ ν Sub~ (trs Γ₀₁ Γ₁₂) (trs Δ₀₁ Δ₁₂) σ ν
coh : Γ₂ Δ₂ σ Sub~ {Γ₀}{Γ₁} {Δ₀}{Δ₁} Γ₂ Δ₂ σ (coe Γ₂ Δ₂ σ)
reix : {Γ₂' Δ₂'} Sub~ Γ₂ Δ₂ σ₀ σ₁ Sub~ Γ₂' Δ₂' σ₀ σ₁
------------------------------------------------------------
id : Sub~ Γ₂ Γ₂ id id
_∘_ : Sub~ Δ₂ θ₂ σ₀ σ₁ Sub~ Γ₂ Δ₂ δ₀ δ₁ Sub~ Γ₂ θ₂ (σ₀ ∘ δ₀) (σ₁ ∘ δ₁)
ε : Sub~ Γ₂ ∙ ε ε
p : Sub~ (Γ₂ , A₂) Γ₂ p p
_,_ : (σ₂ : Sub~ Γ₂ Δ₂ σ₀ σ₁) Tm~ Γ₂ (A₂ [ σ₂ ]) t₀ t₁ Sub~ Γ₂ (Δ₂ , A₂) (σ₀ , t₀) (σ₁ , t₁)
------------------------------------------------------------
εη : Sub~ rfl rfl σ ε
idl : Sub~ rfl rfl (id ∘ σ) σ
idr : Sub~ rfl rfl (σ ∘ id) σ
ass : Sub~ rfl rfl (σ ∘ δ ∘ ν) ((σ ∘ δ) ∘ ν)
p∘ : Sub~ rfl rfl (p ∘ (σ , t)) σ
pq : Sub~ rfl rfl (p , q) (id {Γ , A})
,∘ : Sub~ rfl rfl ((σ , t) ∘ δ) (σ ∘ δ , coe (sym rfl) (sym [∘]) (t [ δ ]))
data Tm~ where
rfl : Tm~ rfl rfl t t
sym : {Γ₀₁ A₀₁} Tm~ Γ₀₁ A₀₁ t u Tm~ (sym Γ₀₁) (sym A₀₁) u t
trs : {Γ₀₁ A₀₁ Γ₁₂ A₁₂} Tm~ Γ₀₁ A₀₁ t u Tm~ Γ₁₂ A₁₂ u v Tm~ (trs Γ₀₁ Γ₁₂) (trs A₀₁ A₁₂) t v
coh : Γ₂ A₂ t Tm~ {Γ₀}{Γ₁} {A₀}{A₁} Γ₂ A₂ t (coe Γ₂ A₂ t)
reix : {Γ₂' A₂'} Tm~ Γ₂ A₂ t₀ t₁ Tm~ Γ₂' A₂' t₀ t₁
------------------------------------------------------------
_[_] : Tm~ Δ₂ A₂ t₀ t₁ (σ₂ : Sub~ Γ₂ Δ₂ σ₀ σ₁) Tm~ Γ₂ (A₂ [ σ₂ ]) (t₀ [ σ₀ ]) (t₁ [ σ₁ ])
q : Tm~ (Γ₂ , A₂) (A₂ [ p {A₂ = A₂} ]) q q
lam : Tm~ (Γ₂ , A₂) B₂ t₀ t₁ Tm~ Γ₂ (Π A₂ B₂) (lam t₀) (lam t₁)
app : Tm~ Γ₂ (Π A₂ B₂) t₀ t₁ Tm~ (Γ₂ , A₂) B₂ (app t₀) (app t₁)
------------------------------------------------------------
q[] : Tm~ (trs (sym rfl) rfl) (trs (sym [∘]) (rfl [ p∘ ])) (q [ σ , t ]) t
lam[] : Tm~ rfl Π[] (lam t [ σ ]) (lam (t [ σ ∘ p , coe (sym rfl) (sym [∘]) q ]))
Πβ : Tm~ rfl rfl (app (lam t)) t
Πη : Tm~ rfl rfl (lam (app t)) t
-- version 2: conversion is "John Major" style, it stands for a bundle of conversions in the base type and the dependent type
module JMConv where
data Con : Set
data Ty : Con Set
data Sub : Con Con Set
data Tm : Γ Ty Γ Set
data Con~ : Con Con Set
data Ty~ : {Γ₀ Γ₁} Ty Γ₀ Ty Γ₁ Set
data Sub~ : {Γ₀ Γ₁ Δ₀ Δ₁} Sub Γ₀ Δ₀ Sub Γ₁ Δ₁ Set
data Tm~ : {Γ₀ Γ₁ A₀ A₁} Tm Γ₀ A₀ Tm Γ₁ A₁ Set
variable
Γ Δ Γ₀ Γ₁ Δ₀ Δ₁ θ θ₀ θ₁ : Con
A B C A₀ A₁ B₀ B₁ : Ty _
t u v t₀ t₁ u₀ u₁ : Tm _ _
σ δ ν σ₀ σ₁ δ₀ δ₁ ν₀ ν₁ : Sub _ _
Γ₂ : Con~ Γ₀ Γ₁
Δ₂ : Con~ Δ₀ Δ₁
θ₂ : Con~ θ₀ θ₁
A₂ : Ty~ A₀ A₁
B₂ : Ty~ B₀ B₁
HTy~ : Ty Γ Ty Γ Set
HTy~ = Ty~
HSub~ : Sub Γ Δ Sub Γ Δ Set
HSub~ = Sub~
HTm~ : Tm Γ A Tm Γ A Set
HTm~ = Tm~
infixl 4 _,_
infixr 5 _∘_
infix 5 _[_]
data Con where
: Con
_,_ : Γ Ty Γ Con
data Ty where
coe : Con~ Γ₀ Γ₁ Ty Γ₀ Ty Γ₁
------------------------------------------------------------
_[_] : Ty Δ Sub Γ Δ Ty Γ
U : Ty Γ
Π : (A : Ty Γ) Ty (Γ , A) Ty Γ
El : Tm Γ U Ty Γ
data Sub where
coe : Con~ Γ₀ Γ₁ Con~ Δ₀ Δ₁ Sub Γ₀ Δ₀ Sub Γ₁ Δ₁
------------------------------------------------------------
id : Sub Γ Γ
_∘_ : Sub Δ θ Sub Γ Δ Sub Γ θ
ε : Sub Γ ∙
p : Sub (Γ , A) Γ
_,_ :: Sub Γ Δ) Tm Γ (A [ σ ]) Sub Γ (Δ , A)
data Tm where
coe : Ty~ A₀ A₁ Tm Γ₀ A₀ Tm Γ₁ A₁
------------------------------------------------------------
_[_] : Tm Δ A : Sub Γ Δ) Tm Γ (A [ σ ])
q : Tm (Γ , A) (A [ p ])
lam : Tm (Γ , A) B Tm Γ (Π A B)
app : Tm Γ (Π A B) Tm (Γ , A) B
data Con~ where
rfl : Con~ Γ Γ
sym : Con~ Γ Δ Con~ Δ Γ
trs : Con~ Γ Δ Con~ Δ θ Con~ Γ θ
Ty~₀ : Ty~ {Γ₀}{Γ₁} A B Con~ Γ₀ Γ₁
Sub~₀ : Sub~ {Γ₀}{Γ₁}{Δ₀}{Δ₁} σ₀ σ₁ Con~ Γ₀ Γ₁
Sub~₁ : Sub~ {Γ₀}{Γ₁}{Δ₀}{Δ₁} σ₀ σ₁ Con~ Δ₀ Δ₁
------------------------------------------------------------
: Con~ ∙ ∙
_,_ : Ty~ A₀ A₁ Con~ (Γ₀ , A₀) (Γ₁ , A₁)
data Ty~ where
rfl : Ty~ A A
sym : Ty~ A B Ty~ B A
trs : Ty~ A B Ty~ B C Ty~ A C
coh : (Γ₂ : Con~ Γ₀ Γ₁) A Ty~ A (coe Γ₂ A)
Tm~₁ : Tm~ {Γ₀}{Γ₁}{A₀}{A₁} t₀ t₁ Ty~ A₀ A₁
------------------------------------------------------------
_[_] : Ty~ A₀ A₁ Sub~ σ₀ σ₁ Ty~ (A₀ [ σ₀ ]) (A₁ [ σ₁ ])
U : Con~ Γ₀ Γ₁ Ty~ (U{Γ₀}) (U{Γ₁})
Π : (A₂ : Ty~ A₀ A₁) Ty~ B₀ B₁ Ty~ (Π A₀ B₀) (Π A₁ B₁)
El : Tm~ t₀ t₁ Ty~ (El t₀) (El t₁)
------------------------------------------------------------
[id] : HTy~ (A [ id ]) A
[∘] : HTy~ (A [ σ ∘ δ ]) (A [ σ ] [ δ ])
U[] : HTy~ (U [ σ ]) U
Π[] : HTy~ (Π A B [ σ ]) (Π (A [ σ ]) (B [ σ ∘ p , coe (sym [∘]) Tm.q ]))
El[] : HTy~ (El t [ σ ]) (El (coe U[] (t [ σ ])))
data Sub~ where
rfl : Sub~ σ σ
sym : Sub~ σ δ Sub~ δ σ
trs : Sub~ σ δ Sub~ δ ν Sub~ σ ν
coh : Γ₂ Δ₂ σ Sub~ {Γ₀}{Γ₁} {Δ₀}{Δ₁} σ (coe Γ₂ Δ₂ σ)
id : Con~ Γ₀ Γ₁ Sub~ (id {Γ₀}) (id {Γ₁})
_∘_ : Sub~ σ₀ σ₁ Sub~ δ₀ δ₁ Sub~ (σ₀ ∘ δ₀) (σ₁ ∘ δ₁)
ε : Con~ Γ₀ Γ₁ Sub~ (ε{Γ₀}) (ε{Γ₁})
p : Ty~ A₀ A₁ Sub~ (p {Γ₀}{A₀}) (p {Γ₁}{A₁})
_,_ : (σ₂ : Sub~ σ₀ σ₁) Tm~ t₀ t₁ Sub~ (σ₀ , t₀) (σ₁ , t₁)
------------------------------------------------------------
εη : HSub~ σ ε
idl : HSub~ (id ∘ σ) σ
idr : HSub~ (σ ∘ id) σ
ass : HSub~ (σ ∘ δ ∘ ν) ((σ ∘ δ) ∘ ν)
p∘ : HSub~ (p ∘ (σ , t)) σ
pq : HSub~ (p , q) (id {Γ , A})
,∘ : HSub~ ((σ , t) ∘ δ) (σ ∘ δ , coe (sym [∘]) (t [ δ ]))
data Tm~ where
rfl : Tm~ t t
sym : Tm~ t u Tm~ u t
trs : Tm~ t u Tm~ u v Tm~ t v
coh : A₂ t Tm~ {Γ₀}{Γ₁} {A₀}{A₁} t (coe A₂ t)
------------------------------------------------------------
_[_] : Tm~ t₀ t₁ (σ₂ : Sub~ σ₀ σ₁) Tm~ (t₀ [ σ₀ ]) (t₁ [ σ₁ ])
q : Ty~ A₀ A₁ Tm~ (q{Γ₀}{A₀}) (q{Γ₁}{A₁})
lam : Tm~ t₀ t₁ Tm~ (lam t₀) (lam t₁)
app : Tm~ t₀ t₁ Tm~ (app t₀) (app t₁)
------------------------------------------------------------
q[] : Tm~ (q [ σ , t ]) t
lam[] : Tm~ (lam t [ σ ]) (lam (t [ σ ∘ p , coe (sym [∘]) q ]))
Πβ : HTm~ (app (lam t)) t
Πη : HTm~ (lam (app t)) t
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment