module MLTT.Cofinite where
open import Prelude
open import WSLN
open import MLTT.Syntax
open import MLTT.Judgement
infix 1 _⊢_
data Ok : Cx → Set
data _⊢_ (Γ : Cx) : Jg → Set
data Ok where
ok◇ : Ok ◇
ok⨟ :
{l : Lvl}
{Γ : Cx}
{A : Ty}
{x : 𝔸}
(q₀ : Γ ⊢ A ⦂ l)
(q₁ : x # Γ)
(h : Ok Γ)
→
Ok (Γ ⨟ x ∶ A ⦂ l)
data _⊢_ Γ where
⊢conv :
{l : Lvl}
{a : Tm}
{A A' : Ty}
(q₀ : Γ ⊢ a ∶ A ⦂ l)
(q₁ : Γ ⊢ A = A' ⦂ l)
→
Γ ⊢ a ∶ A' ⦂ l
⊢𝐯 :
{l : Lvl}
{A : Ty}
{x : 𝔸}
(q₀ : Ok Γ)
(q₁ : (x , A , l) isIn Γ)
→
Γ ⊢ 𝐯 x ∶ A ⦂ l
⊢𝐔 :
{l : Lvl}
(q : Ok Γ)
→
Γ ⊢ 𝐔 l ⦂ (1+ l)
⊢𝚷 :
{l l' : Lvl}
{A : Tm}
{B : Tm[ 1 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ A ⦂ l)
(q₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
→
Γ ⊢ 𝚷 l l' A B ⦂ (max l l')
⊢𝛌 :
{l l' : Lvl}
{A : Ty}
{B : Ty[ 1 ]}
{b : Tm[ 1 ]}
(S : Fset𝔸)
(q₀ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ b [ x ] ∶ B [ x ] ⦂ l')
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
→
Γ ⊢ 𝛌 A b ∶ 𝚷 l l' A B ⦂ max l l'
⊢∙ :
{l l' : Lvl}
{A : Ty}
{B : Ty[ 1 ]}
{a b : Tm}
(S : Fset𝔸)
(q₀ : Γ ⊢ b ∶ 𝚷 l l' A B ⦂ max l l')
(q₁ : Γ ⊢ a ∶ A ⦂ l)
(q₂ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ b ∙[ A , B ] a ∶ B [ a ] ⦂ l'
⊢𝐈𝐝 :
{l : Lvl}
{A a b : Tm}
(q₀ : Γ ⊢ a ∶ A ⦂ l)
(q₁ : Γ ⊢ b ∶ A ⦂ l)
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ 𝐈𝐝 A a b ⦂ l
⊢𝐫𝐞𝐟𝐥 :
{l : Lvl}
{A : Ty}
{a : Tm}
(q : Γ ⊢ a ∶ A ⦂ l)
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ 𝐫𝐞𝐟𝐥 a ∶ 𝐈𝐝 A a a ⦂ l
⊢𝐉 :
{l l' : Lvl}
{A : Ty}
{C : Ty[ 2 ]}
{a b c e : Tm}
(S : Fset𝔸)
(q₀ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ A ⦂ l ⨟ y ∶ 𝐈𝐝 A a (𝐯 x) ⦂ l) ⊢
C [ x ][ y ] ⦂ l')
(q₁ : Γ ⊢ a ∶ A ⦂ l)
(q₂ : Γ ⊢ b ∶ A ⦂ l)
(q₃ : Γ ⊢ c ∶ C [ a ][ 𝐫𝐞𝐟𝐥 a ] ⦂ l')
(q₄ : Γ ⊢ e ∶ 𝐈𝐝 A a b ⦂ l)
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ 𝐈𝐝 A a (𝐯 x) ⦂ l)
→
Γ ⊢ 𝐉 C a b c e ∶ C [ b ][ e ] ⦂ l'
⊢𝐍𝐚𝐭 :
(q : Ok Γ)
→
Γ ⊢ 𝐍𝐚𝐭 ⦂ 0
⊢𝐳𝐞𝐫𝐨 :
(q : Ok Γ)
→
Γ ⊢ 𝐳𝐞𝐫𝐨 ∶ 𝐍𝐚𝐭 ⦂ 0
⊢𝐬𝐮𝐜𝐜 :
{a : Tm}
(q : Γ ⊢ a ∶ 𝐍𝐚𝐭 ⦂ 0)
→
Γ ⊢ 𝐬𝐮𝐜𝐜 a ∶ 𝐍𝐚𝐭 ⦂ 0
⊢𝐧𝐫𝐞𝐜 :
{l : Lvl}
{C : Ty[ 1 ]}
{c₀ a : Tm}
{c₊ : Tm[ 2 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ c₀ ∶ C [ 𝐳𝐞𝐫𝐨 ] ⦂ l)
(q₁ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0 ⨟ y ∶ C [ x ] ⦂ l) ⊢
c₊ [ x ][ y ] ∶ C [ 𝐬𝐮𝐜𝐜 (𝐯 x) ] ⦂ l)
(q₂ : Γ ⊢ a ∶ 𝐍𝐚𝐭 ⦂ 0)
(h : ∀ x → x # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0) ⊢ C [ x ] ⦂ l)
→
Γ ⊢ 𝐧𝐫𝐞𝐜 C c₀ c₊ a ∶ C [ a ] ⦂ l
Refl :
{l : Lvl}
{A : Ty}
{a : Tm}
(q : Γ ⊢ a ∶ A ⦂ l)
→
Γ ⊢ a = a ∶ A ⦂ l
Symm :
{l : Lvl}
{A : Ty}
{a a' : Tm}
(q : Γ ⊢ a = a' ∶ A ⦂ l)
→
Γ ⊢ a' = a ∶ A ⦂ l
Trans :
{l : Lvl}
{A : Ty}
{a a' a'' : Tm}
(q₀ : Γ ⊢ a = a' ∶ A ⦂ l)
(q₁ : Γ ⊢ a' = a'' ∶ A ⦂ l)
→
Γ ⊢ a = a'' ∶ A ⦂ l
=conv :
{l : Lvl}
{A A' : Ty}
{a a' : Tm}
(q₀ : Γ ⊢ a = a' ∶ A ⦂ l)
(q₁ : Γ ⊢ A = A' ⦂ l)
→
Γ ⊢ a = a' ∶ A' ⦂ l
𝚷Cong :
{l l' : Lvl}
{A A' : Ty}
{B B' : Ty[ 1 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ A = A' ⦂ l)
(q₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] = B' [ x ] ⦂ l')
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ 𝚷 l l' A B = 𝚷 l l' A' B' ⦂ (max l l')
𝛌Cong :
{l l' : Lvl}
{A A' : Ty}
{B : Ty[ 1 ]}
{b b' : Tm[ 1 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ A = A' ⦂ l)
(q₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ b [ x ] = b' [ x ] ∶ B [ x ] ⦂ l')
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
→
Γ ⊢ 𝛌 A b = 𝛌 A' b' ∶ 𝚷 l l' A B ⦂ max l l'
∙Cong :
{l l' : Lvl}
{A A' : Ty}
{B B' : Ty[ 1 ]}
{a a' b b' : Tm}
(S : Fset𝔸)
(q₀ : Γ ⊢ A = A' ⦂ l)
(q₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] = B' [ x ] ⦂ l')
(q₂ : Γ ⊢ b = b' ∶ 𝚷 l l' A B ⦂ max l l')
(q₃ : Γ ⊢ a = a' ∶ A ⦂ l)
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
→
Γ ⊢ b ∙[ A , B ] a = b' ∙[ A' , B' ] a' ∶ B [ a ] ⦂ l'
𝐈𝐝Cong :
{l : Lvl}
{A A' : Ty}
{a a' b b' : Tm}
(q₀ : Γ ⊢ A = A' ⦂ l)
(q₁ : Γ ⊢ a = a' ∶ A ⦂ l)
(q₂ : Γ ⊢ b = b' ∶ A ⦂ l)
→
Γ ⊢ 𝐈𝐝 A a b = 𝐈𝐝 A' a' b' ⦂ l
𝐫𝐞𝐟𝐥Cong :
{l : Lvl}
{A : Ty}
{a a' : Tm}
(q : Γ ⊢ a = a' ∶ A ⦂ l)
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ 𝐫𝐞𝐟𝐥 a = 𝐫𝐞𝐟𝐥 a' ∶ 𝐈𝐝 A a a ⦂ l
𝐉Cong :
{l l' : Lvl}
{A : Ty}
{C C' : Ty[ 2 ]}
{a a' b b' c c' e e' : Tm}
(S : Fset𝔸)
(q₀ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ A ⦂ l ⨟ y ∶ 𝐈𝐝 A a (𝐯 x) ⦂ l) ⊢
C [ x ][ y ] = C' [ x ][ y ] ⦂ l')
(q₁ : Γ ⊢ a = a' ∶ A ⦂ l)
(q₂ : Γ ⊢ b = b' ∶ A ⦂ l)
(q₃ : Γ ⊢ c = c' ∶ C [ a ][ 𝐫𝐞𝐟𝐥 a ] ⦂ l')
(q₄ : Γ ⊢ e = e' ∶ 𝐈𝐝 A a b ⦂ l)
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ 𝐈𝐝 A a (𝐯 x) ⦂ l)
→
Γ ⊢ 𝐉 C a b c e = 𝐉 C' a' b' c' e' ∶ C [ b ][ e ] ⦂ l'
𝐬𝐮𝐜𝐜Cong :
{a a' : Tm}
(q : Γ ⊢ a = a' ∶ 𝐍𝐚𝐭 ⦂ 0)
→
Γ ⊢ 𝐬𝐮𝐜𝐜 a = 𝐬𝐮𝐜𝐜 a' ∶ 𝐍𝐚𝐭 ⦂ 0
𝐧𝐫𝐞𝐜Cong :
{l : Lvl}
{C C' : Ty[ 1 ]}
{c₀ c₀' a a' : Tm}
{c₊ c₊' : Tm[ 2 ]}
(S : Fset𝔸)
(q₀ : ∀ x → x # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0) ⊢ C [ x ] = C' [ x ] ⦂ l)
(q₁ : Γ ⊢ c₀ = c₀' ∶ C [ 𝐳𝐞𝐫𝐨 ] ⦂ l)
(q₂ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0 ⨟ y ∶ C [ x ] ⦂ l) ⊢
c₊ [ x ][ y ] = c₊' [ x ][ y ] ∶ C [ 𝐬𝐮𝐜𝐜 (𝐯 x) ] ⦂ l)
(q₃ : Γ ⊢ a = a' ∶ 𝐍𝐚𝐭 ⦂ 0)
(h : ∀ x → x # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0) ⊢ C [ x ] ⦂ l)
→
Γ ⊢ 𝐧𝐫𝐞𝐜 C c₀ c₊ a = 𝐧𝐫𝐞𝐜 C' c₀' c₊' a' ∶ C [ a ] ⦂ l
𝚷Beta :
{l l' : Lvl}
{A : Ty}
{a : Tm}
{B : Ty[ 1 ]}
{b : Tm[ 1 ]}
(S : Fset𝔸)
(q₀ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ b [ x ] ∶ B [ x ] ⦂ l')
(q₁ : Γ ⊢ a ∶ A ⦂ l)
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ B [ x ] ⦂ l')
→
Γ ⊢ 𝛌 A b ∙[ A , B ] a = b [ a ] ∶ B [ a ] ⦂ l'
𝐈𝐝Beta :
{l l' : Lvl}
{A : Ty}
{C : Ty[ 2 ]}
{a c : Tm}
(S : Fset𝔸)
(q₀ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ A ⦂ l ⨟ y ∶ 𝐈𝐝 A a (𝐯 x) ⦂ l) ⊢
C [ x ][ y ] ⦂ l')
(q₁ : Γ ⊢ a ∶ A ⦂ l)
(q₂ : Γ ⊢ c ∶ C [ a ][ 𝐫𝐞𝐟𝐥 a ] ⦂ l')
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : ∀ x → x # S →
(Γ ⨟ x ∶ A ⦂ l) ⊢ 𝐈𝐝 A a (𝐯 x) ⦂ l)
→
Γ ⊢ 𝐉 C a a c (𝐫𝐞𝐟𝐥 a) = c ∶ C [ a ][ 𝐫𝐞𝐟𝐥 a ] ⦂ l'
𝐍𝐚𝐭Beta₀ :
{l : Lvl}
{C : Ty[ 1 ]}
{c₀ : Tm}
{c₊ : Tm[ 2 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ c₀ ∶ C [ 𝐳𝐞𝐫𝐨 ] ⦂ l)
(q₁ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0 ⨟ y ∶ C [ x ] ⦂ l) ⊢
c₊ [ x ][ y ] ∶ C [ 𝐬𝐮𝐜𝐜 (𝐯 x) ] ⦂ l)
(h : ∀ x → x # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0) ⊢ C [ x ] ⦂ l)
→
Γ ⊢ 𝐧𝐫𝐞𝐜 C c₀ c₊ 𝐳𝐞𝐫𝐨 = c₀ ∶ C [ 𝐳𝐞𝐫𝐨 ] ⦂ l
𝐍𝐚𝐭Beta₊ :
{l : Lvl}
{C : Ty[ 1 ]}
{c₀ a : Tm}
{c₊ : Tm[ 2 ]}
(S : Fset𝔸)
(q₀ : Γ ⊢ c₀ ∶ C [ 𝐳𝐞𝐫𝐨 ] ⦂ l)
(q₁ : ∀ x y → x # y # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0 ⨟ y ∶ C [ x ] ⦂ l) ⊢
c₊ [ x ][ y ] ∶ C [ 𝐬𝐮𝐜𝐜 (𝐯 x) ] ⦂ l)
(q₂ : Γ ⊢ a ∶ 𝐍𝐚𝐭 ⦂ 0)
(h : ∀ x → x # S →
(Γ ⨟ x ∶ 𝐍𝐚𝐭 ⦂ 0) ⊢ C [ x ] ⦂ l)
→
Γ ⊢ 𝐧𝐫𝐞𝐜 C c₀ c₊ (𝐬𝐮𝐜𝐜 a) =
c₊ [ a ][ 𝐧𝐫𝐞𝐜 C c₀ c₊ a ] ∶ C [ 𝐬𝐮𝐜𝐜 a ] ⦂ l
𝚷Eta :
{l l' : Lvl}
{A : Ty}
{B : Ty[ 1 ]}
{b b' : Tm}
(S : Fset𝔸)
(q₀ : Γ ⊢ b ∶ 𝚷 l l' A B ⦂ max l l')
(q₁ : Γ ⊢ b' ∶ 𝚷 l l' A B ⦂ max l l')
(q₂ : ∀ x → x # S → (Γ ⨟ x ∶ A ⦂ l) ⊢
b ∙[ A , B ] 𝐯 x = b' ∙[ A , B ] 𝐯 x ∶ B [ x ] ⦂ l')
(h : Γ ⊢ A ⦂ l)
→
Γ ⊢ b = b' ∶ 𝚷 l l' A B ⦂ max l l'
infix 4 ⊢_=_
data ⊢_=_ : (Γ Γ' : Cx) → Set where
=◇ : ⊢ ◇ = ◇
=⨟ :
{l : Lvl}
{Γ Γ' : Cx}
{A A' : Ty}
{x : 𝔸}
(q₀ : ⊢ Γ = Γ')
(q₁ : Γ ⊢ A = A' ⦂ l)
(q₂ : x # (Γ , Γ'))
(h₀ : Γ ⊢ A ⦂ l)
(h₁ : Γ' ⊢ A' ⦂ l)
→
⊢ (Γ ⨟ x ∶ A ⦂ l) = (Γ' ⨟ x ∶ A' ⦂ l)
infix 4 _▷_
data _▷_ : (Δ Γ : Cx) → Set where
▷◇ : ◇ ▷ ◇
▷proj :
{l : Lvl}
{Δ Γ : Cx}
{A : Ty}
{x : 𝔸}
(q₀ : Δ ▷ Γ)
(q₁ : Δ ⊢ A ⦂ l)
(q₂ : x # Δ)
→
Δ ⨟ x ∶ A ⦂ l ▷ Γ
▷⨟ :
{l : Lvl}
{Δ Γ : Cx}
{A : Ty}
{x : 𝔸}
(q₀ : Δ ▷ Γ)
(q₁ : Γ ⊢ A ⦂ l)
(q₂ : x # Δ)
(h : Δ ⊢ A ⦂ l)
→
Δ ⨟ x ∶ A ⦂ l ▷ Γ ⨟ x ∶ A ⦂ l
infix 4 _⊢ˢ_∶_
data _⊢ˢ_∶_ (Γ' : Cx) : Sb → Cx → Set where
◇ˢ :
{σ : Sb}
(q : Ok Γ')
→
Γ' ⊢ˢ σ ∶ ◇
⨟ˢ :
{l : Lvl}
{Γ : Cx}
{σ : Sb}
{A : Ty}
{x : 𝔸}
(q₀ : Γ' ⊢ˢ σ ∶ Γ)
(q₁ : Γ ⊢ A ⦂ l)
(q₂ : Γ' ⊢ σ x ∶ σ * A ⦂ l)
(q₃ : x # Γ)
→
Γ' ⊢ˢ σ ∶ (Γ ⨟ x ∶ A ⦂ l)
infix 4 _⊢ʳ_∶_
_⊢ʳ_∶_ : Cx → Rn → Cx → Set
(Δ ⊢ʳ ρ ∶ Γ) = Δ ⊢ˢ 𝐚 ∘ ρ ∶ Γ
infix 4 _⊢ˢ_=_∶_
data _⊢ˢ_=_∶_ (Γ' : Cx) : Sb → Sb → Cx → Set where
=◇ˢ :
{σ σ' : Sb}
(q : Ok Γ')
→
Γ' ⊢ˢ σ = σ' ∶ ◇
=⨟ˢ :
{l : Lvl}
{Γ : Cx}
{σ σ' : Sb}
{A : Ty}
{x : 𝔸}
(q₀ : Γ' ⊢ˢ σ = σ' ∶ Γ)
(q₁ : Γ ⊢ A ⦂ l)
(q₂ : Γ' ⊢ σ x = σ' x ∶ σ * A ⦂ l)
(q₃ : x # Γ)
→
Γ' ⊢ˢ σ = σ' ∶ (Γ ⨟ x ∶ A ⦂ l)