« Home

FIXME. SOGAT of type theory with erasure with Π\Pi-types, a Tarski universe, and natural numbers [ag-000X]

Learn from https://github.com/kontheocharis/erasure-agda
{-# OPTIONS --without-K --rewriting --no-exact-split --prop --confluence-check #-}
open import MLTT.Spartan hiding (Π; zero; succ)
open import UF.FunExt
open import UF.Subsingletons

module ag-000X (funext : Fun-Ext) (pe : Prop-Ext) where

postulate
  propfunext : {P : Prop} {C : P  𝓤 ̇}   {f g : (x : P)  C x}  (∀ x  f x  g x)  f  g

coe : {X X' : 𝓤 ̇ }  X  X'  X  X'
coe = transport id

cong : {𝓤 : Universe} {A A' : 𝓤 ̇ } {x y : A}  (f : A  A')  x  y  f x  f y
cong f refl = refl

ap-→ : {𝓤 : Universe} {A A' : 𝓤 ̇ }   {C C' : 𝓤 ̇ }  A  A'  C  C'  (A  C)  (A'  C')
ap-→ refl refl = refl

mode

data Mode : 𝓤₀  ̇ where
  z ω : Mode

opaque
  _*_ : Mode  Mode  Mode
  j * ω = j
  ω * j = j
  z * j = z

variable
  i j : Mode

opaque
  unfolding _*_

  j*ω : j * ω  j
  j*ω {z} = refl
  j*ω {ω} = refl

  ω*j : ω * j  j
  ω*j {z} = refl
  ω*j {ω} = refl

  z*j : z * j  z
  z*j {z} = refl
  z*j {ω} = refl

  j*z : j * z  z
  j*z {z} = refl
  j*z {ω} = refl

-- Better definitional computation for _*_
{-# BUILTIN REWRITE _=_ #-}
{-# REWRITE j*ω ω*j z*j j*z #-}
record TTwE-sorts : (𝓤  𝓥)  ̇ where
  field
    # : Prop
    Ty : 𝓤 ̇
    Tm : Mode  Ty  𝓥 ̇

     :  {A}  (#  Tm ω A)  Tm z A
     :  {A}  #  Tm z A  Tm ω A
    ↓↑ :  {A} {t : Tm z A}    p   p t)  t
    ↑↓ :  {A} {t# : #  Tm ω A} {p : #}   p ( t#)  t# p

  coeTm :  {A B : Ty}  A  B  Tm i A  Tm i B
  coeTm {i = i} p a = coe (ap (Tm i) p) a

SOGAT

module _ (sorts : TTwE-sorts {𝓤} {𝓥}) where
  open TTwE-sorts sorts

  private
    variable
      A B C : Ty
      A# B# C# : #  Ty
      X Y Z : Tm z A  Ty
      X# Y# Z# : (p : #)  Tm z A  Ty
      t u v v' : Tm i A
      t# u# v# : (p : #)  Tm i A
      f g h : (a : Tm j B)  Tm i A

  ↓* : Tm i A  Tm z A
  ↓* {i = z} t = t
  ↓* {i = ω} t =   _  t)

  record TTwE-ctors : (𝓤  𝓥)  ̇ where
    field
      -- Pi types
      Π : (j : Mode)  (A : Ty)  (Tm z A  Ty)  Ty
      lam : ((a : Tm j A)  Tm ω (X (↓* a)))  Tm ω (Π j A X)
      app : Tm ω (Π j A X)  (a : Tm j A)  Tm ω (X (↓* a))
      lam-app : lam {j} (app t)  t
      app-lam :  {A} {X : Tm z A  Ty} {j} {f : (a : Tm j A)  Tm ω (X (↓* a))}  app {j} (lam {A = A} {X = X} f)  f

      -- Universe
      U : Ty
      El : Tm z U  Ty

      -- Natural numbers
      Nat : Ty
      zero : Tm ω Nat
      succ : Tm ω Nat  Tm ω Nat
      elim-Nat : (X : Tm z Nat  Ty)
         (Tm ω (X (↓* zero)))
         ((n : Tm ω Nat)  Tm ω (X (↓* n))  Tm ω (X (↓* (succ n))))
         (n : Tm ω Nat)  Tm ω (X (↓* n))

      -- Computation for elim-Nat
      elim-Nat-zero :  {mz ms}  elim-Nat X mz ms zero  mz
      elim-Nat-succ :  {mz ms n}  elim-Nat X mz ms (succ n)  ms n (elim-Nat X mz ms n)

    lamz : ((a : Tm z A)  Tm z (X a))  Tm z (Π j A X)
    lamz f =   p  lam  x   p (f (↓* x))) )

    appz : Tm z (Π j A X)  (a : Tm z A)  Tm z (X a)
    appz {j = z} f x =   p  app ( p f) x)
    appz {j = ω} {X = X} f x =   p  coeTm (ap X ↓↑) (app ( p f) ( p x) ))

    ap-Tm : A  B  Tm i A  Tm i B
    ap-Tm refl = refl

    -- ap-Π : (p : A = B) → X =[ ap-→ (ap-Tm p) refl ] Y → Π i A X = Π i B Y
    -- ap-Π refl refl = refl

    -- ap-app : t = u → (p : v = v') → app {j = j} {X = X}  t v =[ cong (λ x → Tm ω (X (↓* x))) p ] app u v'
    -- ap-app refl refl = refl

    -- ap-$' : (pA : A = B) → (pX : X =[ ap-→ (ap-Tm pA) refl ] Y) → (p : v =[ ap-Tm pA ] v') → X (↓* {j} v) = Y (↓* {j} v')
    -- ap-$' refl refl refl = refl

    -- ap-app' : ∀ {t : Tm ω (Π ω A X)} {u : Tm ω (Π ω A X)} {v : Tm ω A} {v' : Tm z A} {π}
    --   → (pX : X (↓* v) = X v')
    --   → t = u
    --   → (p : v = (↑ π v'))
    --   → app {A = A} {X = X} t v =[ ap-Tm pX ] coe (ap-Tm (ap X ↓↑)) (app {A = A} {X = X} u (↑ π v'))
    -- ap-app' q refl refl = refl

    swap-↓ : (∀ p  t# p   p u)   t#  u
    swap-↓ f = (ap  (propfunext f))  ↓↑

    -- lamz-appz : lamz {X = X} {j = j} (appz t) = t
    -- lamz-appz {j = z} {t = t} =
    --   (ap ↓ (propfunext (λ p → (cong lam (funext (λ x → ↑↓))) ∙ lam-app)))
    --   ∙ ↓↑
    -- lamz-appz {j = ω} {t = t} =
    --   (ap ↓ (propfunext (λ p → (cong lam (funext (λ x → ↑↓))) ∙ lam-app)))
    --   ∙ ↓↑

    -- appz-lamz : ∀ {j} {X : Tm z A → Ty} {f : (a : Tm z A) → Tm z (X a)} → appz {j = j} {X = X} (lamz {j = j} f) = f
    -- appz-lamz {j = z} {f = f} = funext (λ t →
    --   (cong ↓ (propfunext (λ p → cong (λ g → app g t) ↑↓)))
    --   ∙ (cong ↓ (propfunext (λ p → app-lam)))
    --   ∙ ↓↑)
    -- appz-lamz {j = ω} {X = X} {f = f} = funext (λ t →
    --   (cong ↓ (propfunext (λ p → cong (λ g → app g (↑ p t)) ↑↓)))
    --   ∙ (cong ↓ (propfunext (λ p → app-lam)))
    --   ∙ ↓↑)

    zeroz : Tm z Nat
    zeroz = ↓* zero

    succz : Tm z Nat  Tm z Nat
    succz n =   p  succ ( p n))

    -- elim-Natz : (X : Tm z Nat → Ty)
    --   → (Tm z (X zeroz))
    --   → ((n : Tm z Nat) → Tm z (X n) → Tm z (X (succz n)))
    --   → (n : Tm z Nat) → Tm z (X n)
    -- elim-Natz X ze su n = coe (cong El (refl)) (↓ λ p →
    --   elim-Nat X (↑ p ze) (λ n pn → ↑ p (su (↓* n) (↓* pn))) (↑ p n))

record TTwE : (𝓤  𝓥)  ̇ where
  field
    sorts : TTwE-sorts {𝓤} {𝓥}
  open TTwE-sorts sorts public
  field
    ctors : TTwE-ctors sorts
  open TTwE-ctors ctors public