{-# OPTIONS --allow-unsolved-metas #-}

module A201602.Try8 where

{-

...
          ⇑²   ⇓³
level 3:  t₂ : t : u : A
          ⇑    ⇓²
level 2:  t : u : A
          !    ⇓
level 1:  u : A
          int  ¡
level 0:  A true

-}


infixl 3 _∘_ _∘²_ _∘³_
infixl 2 𝜆_ 𝜆²_ 𝜆³_
infixr 1 _⊃_
infixr 0 _⊢_ ⊩_
infixr 0 _⊢_∷_ ⊩_∷_
infixr 0 _⊢_∷_∷_ ⊩_∷_∷_
infixr 0 _⊢_∷_∷_∷_


mutual
  data Cx : Set where
    ∅   : Cx
    _,_ : Cx → Ty → Cx

  data Ty : Set where
    ⊥   : Ty
    _⊃_ : Ty → Ty → Ty
    [_∶_]     : (A : Ty) → ∅ ⊢ A → Ty
    τ_∷_∷_   : (A : Ty) (t : ∅ ⊢ A) → ∅ ⊢ A ∷ t → Ty
    τ_∷_∷_∷_ : (A : Ty) (t : ∅ ⊢ A) (t₂ : ∅ ⊢ A ∷ t) → ∅ ⊢ A ∷ t ∷ t₂ → Ty

  data _∈_ : Ty → Cx → Set where
    Z  : ∀{A Γ} → A ∈ (Γ , A)
    S_ : ∀{A B Γ} → A ∈ Γ → A ∈ (Γ , B)


  data _⊢_ (Γ : Cx) : Ty → Set where
    wk_ : ∀{A}  → ∅ ⊢ A
                → Γ ⊢ A

    wk′_ : ∀{A t}  → ∅ ⊢ A ∷ t
                   → Γ ⊢ [ A ∶ t ]

    wk″_ : ∀{A t t₂}  → ∅ ⊢ A ∷ t ∷ t₂
                      → Γ ⊢ (τ A ∷ t ∷ t₂)

    𝑣_ : ∀{A}  → A ∈ Γ
               → Γ ⊢ A

    𝜆_ : ∀{A B}  → Γ , A ⊢ B
                 → Γ ⊢ A ⊃ B

    _∘_ : ∀{A B}  → Γ ⊢ A ⊃ B  → Γ ⊢ A
                  → Γ ⊢ B

    !_ : ∀{A}  → (u : ∅ ⊢ A)
               → Γ ⊢ [ A ∶ u ]

    ⇓_ : ∀{A u}  → Γ ⊢ A ∷ u
                 → Γ ⊢ A


  data _⊢_∷_ (Γ : Cx) : (A : Ty) → Γ ⊢ A → Set where
    wk_ : ∀{A t}  → ∅ ⊢ A ∷ t
                  → Γ ⊢ A ∷ wk t

    wk′_ : ∀{A t t₂}  → ∅ ⊢ A ∷ t ∷ t₂
                      → Γ ⊢ [ A ∶ t ] ∷ wk′ t₂

    wk″_ : ∀{A t t₂ t₃}  → ∅ ⊢ A ∷ t ∷ t₂ ∷ t₃
                         → Γ ⊢ (τ A ∷ t ∷ t₂) ∷ wk″ t₃

--    kw_  : ∀{A t}  → Γ ⊢ (τ A ∷ t)
--                   → Γ ⊢ A ∷ wk t

    𝑣_ : ∀{A x}  → [ A ∶ x ] ∈ Γ
                 → Γ ⊢ A ∷ wk x

    𝑣²_ : ∀{A}  → (x : A ∈ Γ)
                → Γ ⊢ A ∷ 𝑣 x

    𝜆²_ : ∀{A B t}  → Γ , A ⊢ B ∷ t
                    → Γ ⊢ A ⊃ B ∷ 𝜆 t

    _∘²_ : ∀{A B t s}  → Γ ⊢ A ⊃ B ∷ t  → Γ ⊢ A ∷ s
                       → Γ ⊢ B ∷ t ∘ s

    !_ : ∀{A}  → (u : Γ ⊢ A)
               → Γ ⊢ A ∷ u

    ⇑_ : ∀{A u}  → Γ ⊢ [ A ∶ u ]
                 → Γ ⊢ [ A ∶ u ] ∷ ! u

    ⇓²_ : ∀{A u t}  → Γ ⊢ A ∷ u ∷ t
                    → Γ ⊢ A ∷ ⇓ t


  data _⊢_∷_∷_ (Γ : Cx) : (A : Ty) (t : Γ ⊢ A) → Γ ⊢ A ∷ t → Set where
    wk_ : ∀{A t t₂}  → ∅ ⊢ A ∷ t ∷ t₂
                     → Γ ⊢ A ∷ wk t ∷ wk t₂

    wk′_ : ∀{A t t₂ t₃}  → ∅ ⊢ A ∷ t ∷ t₂ ∷ t₃
                         → Γ ⊢ [ A ∶ t ] ∷ wk′ t₂ ∷ wk′ t₃

--    kw_  : ∀{A t t₂}  → Γ ⊢ (τ A ∷ t ∷ t₂)
--                      → Γ ⊢ A ∷ wk t ∷ wk t₂

    𝑣_ : ∀{A x x₂}  → (τ A ∷ x ∷ x₂) ∈ Γ
                    → Γ ⊢ A ∷ wk x ∷ wk x₂

    𝑣³_ : ∀{A}  → (x : A ∈ Γ)
                → Γ ⊢ A ∷ 𝑣 x ∷ 𝑣² x

    𝜆³_ : ∀{A B t t₂}  → Γ , A ⊢ B ∷ t ∷ t₂
                       → Γ ⊢ A ⊃ B ∷ 𝜆 t ∷ 𝜆² t₂

    _∘³_ : ∀{A B t t₂ s s₂}  → Γ ⊢ A ⊃ B ∷ t ∷ t₂  → Γ ⊢ A ∷ s ∷ s₂
                             → Γ ⊢ B ∷ t ∘ s ∷ t₂ ∘² s₂

    ⇑_ : ∀{A u}  → Γ ⊢ A ∷ u
                 → Γ ⊢ A ∷ u ∷ ! u

    ⇓³_ : ∀{A u t t₂}  → Γ ⊢ A ∷ u ∷ t ∷ t₂
                       → Γ ⊢ A ∷ ⇓ t ∷ ⇓² t₂


  data _⊢_∷_∷_∷_ (Γ : Cx) : (A : Ty) (t : Γ ⊢ A) (t₂ : Γ ⊢ A ∷ t) → Γ ⊢ A ∷ t ∷ t₂ → Set where
    ⇑²_ : ∀{A u t}  → Γ ⊢ A ∷ u ∷ t
                    → Γ ⊢ A ∷ u ∷ ! u ∷ ⇑ t


⊩_ : Ty → Set
⊩ A = {Γ : Cx} → Γ ⊢ A

⊩_∷_ : (A : Ty) → ∅ ⊢ A → Set
⊩ A ∷ t = {Γ : Cx} → Γ ⊢ A ∷ wk t

⊩_∷_∷_ : (A : Ty) (t : ∅ ⊢ A) → ∅ ⊢ A ∷ t → Set
⊩ A ∷ t ∷ t₂ = {Γ : Cx} → Γ ⊢ A ∷ wk t ∷ wk t₂


eI : ∀{Γ A} → Γ ⊢ A ⊃ A
eI = 𝜆 𝑣 Z

eI² : ∀{Γ A} → Γ ⊢ A ⊃ A ∷ 𝜆 𝑣 Z
eI² = 𝜆² 𝑣² Z

eI²′ : ∀{Γ A} → Γ ⊢ A ⊃ A ∷ 𝜆 𝑣 Z
eI²′ = ! (𝜆 𝑣 Z)

eI³ : ∀{Γ A} → Γ ⊢ A ⊃ A ∷ 𝜆 𝑣 Z ∷ 𝜆² 𝑣² Z
eI³ = 𝜆³ 𝑣³ Z

eI³′ : ∀{Γ A} → Γ ⊢ A ⊃ A ∷ 𝜆 𝑣 Z ∷ ! (𝜆 𝑣 Z)
eI³′ = ⇑ (! (𝜆 𝑣 Z))


{-
proposition:
  if x proves A, then A.
proof:
  assume x proves A.
  reflect x.
-}

e11 : ∀{Γ A x} → Γ ⊢ [ A ∶ 𝑣 x ] ⊃ A ∷ 𝜆 ⇓ 𝑣 Z
e11 = ! (𝜆 ⇓ 𝑣 Z)  -- why "!"?

{-
proposition:
  if x proves A, then !x proves that x proves A.
proof:
  assume x proves A.
  reify x.
-}

e12 : ∀{Γ A x} → Γ ⊢ [ A ∶ 𝑣 x ] ⊃ (τ A ∷ 𝑣 x ∷ ! 𝑣 x) ∷ 𝜆 {!⇑ ?!}
e12 = {!!}


--                Γ ⊢    A ∷ u    ∷  !  u
--Γ , (τ A ∷ (𝑣 x)) ⊢ (τ A ∷ 𝑣 x) ∷ (! (𝑣 x))