{-

Internal interpretation of extensional type theory.

Each universe Type ℓ of our ambient extensional type theory gives us an /internal/
interpretation of extensional type theory: contexts are elements of Type ℓ and a type over
Γ is a family Γ → Type ℓ.

To build an interpretation of homotopy type theory, where contexts are again interpreted
as types Γ : Type ℓ and types are interpreted as families Γ → Type ℓ equipped with
/fibration structures/, it is convenient to have some suggestive notation for the internal
extensional type theory.

To disambiguate from the interpretation of homotopy type theory when necessary, we use the
superscript ˣ to indicate operators on eXtensional types/terms. Note that we sometimes use
ˣ to mark an operator on extensional types/terms which is however named for its role in
the homotopical interpretation. For example, we write A ≃ˣ B for the underlying
extensional type of the fibrant type of equivalences A ≃ᶠ B (with inverses up to path
equality), even though this is distinct from the standard type of equivalences (i.e., with
inverses up to strict equality) for the extensional type theory.

-}

module internal-extensional-type-theory where

open import basic

private variable
   ℓ' ℓ'' : Level
  Γ Δ : Type 

infix  1 _⊢ˣ_
infixl 3 _▷ˣ_ _,,_ _,ˣ_
infixr 3 _→ˣ_ _×ˣ_

--↓ Term judgment of the extensional type theory.

_⊢ˣ_ : (Γ : Type ) (A : Γ  Type ℓ')  Type (  ℓ')
(Γ ⊢ˣ A) = Π Γ A

--↓ Term equality judgment.

syntax EqTermSyntaxˣ Γ A a₀ a₁ = Γ ⊢ˣ a₀  a₁  A

EqTermSyntaxˣ : (Γ : Type ) (A : Γ  Type ℓ') (a₀ a₁ : Γ ⊢ˣ A)  Type (  ℓ')
EqTermSyntaxˣ Γ A a₀ a₁ = a₀  a₁

infix 1 EqTermSyntaxˣ

--↓ Context and substitution extension for the extensional type theory.

_▷ˣ_ : (Γ : Type )  (Γ  Type ℓ')  Type (  ℓ')
Γ ▷ˣ A = Σ Γ A

_,,_ : {A : Γ  Type ℓ''} (ρ : Δ  Γ) (a : Δ ⊢ˣ A  ρ)  (Δ  Γ ▷ˣ A)
(ρ ,, a) δ .fst = ρ δ
(ρ ,, a) δ .snd = a δ

--↓ Projection substitution from an extended context.
--↓ In Agda's input mode, this is \MIp.

𝒑 : {Γ : Type } {A : Γ  Type ℓ'}  Γ ▷ˣ A  Γ
𝒑 = fst

--↓ Variable term in an extended context.
--↓ In Agda's input mode, this is \MIq.

𝒒 : {Γ : Type } {A : Γ  Type ℓ'}  Γ ▷ˣ A ⊢ˣ A  𝒑
𝒒 = snd

------------------------------------------------------------------------------------------
-- Π-types
------------------------------------------------------------------------------------------

Πˣ : (A : Γ  Type ) (B : Γ ▷ˣ A  Type ℓ')  Γ  Type (  ℓ')
Πˣ A B γ = (a : A γ)  B (γ , a)

_→ˣ_ : (A : Γ  Type ) (B : Γ  Type ℓ')  Γ  Type (  ℓ')
A →ˣ B = Πˣ A (B  𝒑)

λˣ : {A : Γ  Type } {B : Γ ▷ˣ A  Type ℓ'}
   Γ ▷ˣ A ⊢ˣ B
   Γ ⊢ˣ Πˣ A B
λˣ f γ a = f (γ , a)

appˣ : {A : Γ  Type } {B : Γ ▷ˣ A  Type ℓ'}
   (f : Γ ⊢ˣ Πˣ A B) (a : Γ ⊢ˣ A)
   Γ ⊢ˣ B  (id ,, a)
appˣ f a γ = f γ (a γ)

------------------------------------------------------------------------------------------
-- Σ-types
------------------------------------------------------------------------------------------

Σˣ : (A : Γ  Type ) (B : Γ ▷ˣ A  Type ℓ')  Γ  Type (  ℓ')
Σˣ A B γ = Σ a  A γ , B (γ , a)

_×ˣ_ : (A : Γ  Type ) (B : Γ  Type ℓ')  Γ  Type (  ℓ')
A ×ˣ B = Σˣ A (B  𝒑)

_,ˣ_ : {A : Γ  Type } {B : Γ ▷ˣ A  Type ℓ'}
  (a : Γ ⊢ˣ A)  Γ ⊢ˣ B  (id ,, a)  Γ ⊢ˣ Σˣ A B
(a  b) γ .fst = a γ
(a  b) γ .snd = b γ

fstˣ : {A : Γ  Type } {B : Γ ▷ˣ A  Type ℓ'}
   Γ ⊢ˣ Σˣ A B  Γ ⊢ˣ A
fstˣ = fst ∘_

sndˣ : {A : Γ  Type } {B : Γ ▷ˣ A  Type ℓ'}
  (t : Γ ⊢ˣ Σˣ A B)  Γ ⊢ˣ B  (id ,, fstˣ t)
sndˣ = snd ∘_

------------------------------------------------------------------------------------------
-- Isomorphisms
------------------------------------------------------------------------------------------

_≅ˣ_ : (A : Γ  Type ) (B : Γ  Type ℓ')  (Γ  Type (  ℓ'))
_≅ˣ_ A B γ = A γ  B γ

------------------------------------------------------------------------------------------
-- Binary coproducts
------------------------------------------------------------------------------------------

_⊎ˣ_ : (A : Γ  Type ) (B : Γ  Type ℓ')  (Γ  Type (  ℓ'))
(A ⊎ˣ B) γ = A γ  B γ