{-# OPTIONS --allow-unsolved-metas #-} module A201602.Try3 where open import Data.Fin using (Fin; zero; suc; toℕ) open import Data.Nat using (ℕ; zero; suc; _+_) open import Data.Product using (Σ; _×_; _,_) data Vec (X : Set) : ℕ → Set where ∅ : Vec X zero _,_ : ∀{n} → Vec X n → X → Vec X (suc n) data _∈_ {X : Set} : ∀{n} → X → Vec X n → Set where Z : ∀{n x} {xs : Vec X n} → x ∈ (xs , x) S_ : ∀{n x y} {xs : Vec X n} → x ∈ xs → x ∈ (xs , y) infixl 4 _∘_ _∘²_ _∘³_ infixr 3 𝜆_ 𝜆²_ 𝜆³_ infixl 2 _∧_ infixr 1 _⊃_ infixr 0 _⊢_ _⊢_∷_ _⊢_∷_∷_ infixr 0 ⊩_ ⊩_∷_ ⊩_∷_∷_ infixr 0 _F⊩_ _F⊩_∷_ _F⊩_∷_∷_ Var : Set Var = ℕ FCx : ℕ → Set FCx = Vec Var data Ty {k : ℕ} (Φ : FCx k) : Set where fv_ : ∀{x} → x ∈ Φ → Ty Φ _⊃_ : Ty Φ → Ty Φ → Ty Φ _∧_ : Ty Φ → Ty Φ → Ty Φ Cx : {k : ℕ} {Φ : FCx k} → ℕ → Set Cx {Φ = Φ} n = Vec (Ty Φ) n data _⊢_ {k n : ℕ} {Φ : FCx k} (Γ : Cx n) : Ty Φ → Set where 𝑣_ : ∀{A} → A ∈ Γ → Γ ⊢ A 𝜆_ : ∀{A B} → Γ , A ⊢ B → Γ ⊢ A ⊃ B _∘_ : ∀{A B} → Γ ⊢ A ⊃ B → Γ ⊢ A → Γ ⊢ B 𝑝⟨_,_⟩ : ∀{A B} → Γ ⊢ A → Γ ⊢ B → Γ ⊢ A ∧ B 𝜋₀_ : ∀{A B} → Γ ⊢ A ∧ B → Γ ⊢ A 𝜋₁_ : ∀{A B} → Γ ⊢ A ∧ B → Γ ⊢ B ⊩_ : Ty ∅ → Set ⊩ A = ∀{n} {Γ : Cx n} → Γ ⊢ A _F⊩_ : ∀{k} (Φ : FCx k) → Ty Φ → Set Φ F⊩ A = ∀{n} {Γ : Cx n} → Γ ⊢ A tI : ∀{A} → ⊩ A ⊃ A tI = 𝜆 𝑣 Z tK : ∀{A B} → ⊩ A ⊃ B ⊃ A tK = 𝜆 𝜆 𝑣 S Z tS : ∀{A B C} → ⊩ (A ⊃ B ⊃ C) ⊃ (A ⊃ B) ⊃ A ⊃ C tS = 𝜆 𝜆 𝜆 (𝑣 S S Z ∘ 𝑣 Z) ∘ (𝑣 S Z ∘ 𝑣 Z) tJ : ∀{A} → ∅ , A F⊩ fv Z ⊃ fv Z tJ = 𝜆 𝑣 Z data _⊢_∷_ {k n : ℕ} {Φ : FCx k} (Γ : Cx n) : (A : Ty Φ) → Γ ⊢ A → Set where 𝑣²_ : ∀{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 B t s} → Γ ⊢ A ∷ t → Γ ⊢ B ∷ s → Γ ⊢ A ∧ B ∷ 𝑝⟨ t , s ⟩ 𝜋₀²_ : ∀{A B t} → Γ ⊢ A ∧ B ∷ t → Γ ⊢ A ∷ 𝜋₀ t 𝜋₁²_ : ∀{A B t} → Γ ⊢ A ∧ B ∷ t → Γ ⊢ B ∷ 𝜋₁ t !_ : ∀{A t} → Γ ⊢ A ∷ t → Γ ⊢ A ∷ t ⊩_∷_ : (A : Ty ∅) → ⊩ A → Set ⊩ A ∷ t = ∀{n} {Γ : Cx n} → Γ ⊢ A ∷ t _F⊩_∷_ : ∀{k} (Φ : FCx k) (A : Ty Φ) → Φ F⊩ A → Set Φ F⊩ A ∷ t = ∀{n} {Γ : Cx n} → Γ ⊢ A ∷ t tI² : ∀{A} → ⊩ A ⊃ A ∷ 𝜆 𝑣 Z tI² = 𝜆² (𝑣² Z) tK² : ∀{A B} → ⊩ A ⊃ B ⊃ A ∷ 𝜆 𝜆 𝑣 S Z tK² = 𝜆² 𝜆² 𝑣² S Z tS² : ∀{A B C} → ⊩ (A ⊃ B ⊃ C) ⊃ (A ⊃ B) ⊃ A ⊃ C ∷ 𝜆 𝜆 𝜆 (𝑣 S S Z ∘ 𝑣 Z) ∘ (𝑣 S Z ∘ 𝑣 Z) tS² = 𝜆² 𝜆² 𝜆² (𝑣² S S Z ∘² 𝑣² Z) ∘² (𝑣² S Z ∘² 𝑣² Z) data _⊢_∷_∷_ {k n : ℕ} {Φ : FCx k} (Γ : Cx n) : (A : Ty Φ) → (t : Γ ⊢ A) → Γ ⊢ A ∷ t → Set where 𝑣³_ : ∀{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 B t t₂ s s₂} → Γ ⊢ A ∷ t ∷ t₂ → Γ ⊢ B ∷ s ∷ s₂ → Γ ⊢ A ∧ B ∷ 𝑝⟨ t , s ⟩ ∷ 𝑝²⟨ t₂ , s₂ ⟩ 𝜋₀³_ : ∀{A B t t₂} → Γ ⊢ A ∧ B ∷ t ∷ t₂ → Γ ⊢ A ∷ 𝜋₀ t ∷ 𝜋₀² t₂ 𝜋₁³_ : ∀{A B t t₂} → Γ ⊢ A ∧ B ∷ t ∷ t₂ → Γ ⊢ B ∷ 𝜋₁ t ∷ 𝜋₁² t₂ !_ : ∀{A t t₂} → Γ ⊢ A ∷ t ∷ t₂ → Γ ⊢ A ∷ t ∷ t₂ ⇑_ : ∀{k n} {Φ : FCx k} {Γ : Cx n} {A : Ty Φ} {u : Γ ⊢ A} → (x : Γ ⊢ A ∷ u) → Γ ⊢ A ∷ u ∷ (! x) ⇑_ = {!!} ⇓_ : ∀{k n} {Φ : FCx k} {Γ : Cx n} {A : Ty Φ} {u : Γ ⊢ A} → Γ ⊢ A ∷ u → Γ ⊢ A ⇓_ {u = u} = λ _ → u ⊩_∷_∷_ : (A : Ty ∅) → (t : ⊩ A) → ⊩ A ∷ t → Set ⊩ A ∷ t ∷ t₂ = ∀{n} {Γ : Cx n} → Γ ⊢ A ∷ t ∷ t₂ _F⊩_∷_∷_ : ∀{k} (Φ : FCx k) (A : Ty Φ) → (t : Φ F⊩ A) → Φ F⊩ A ∷ t → Set Φ F⊩ A ∷ t ∷ t₂ = ∀{n} {Γ : Cx n} → Γ ⊢ A ∷ t ∷ t₂ tI³ : ∀{A} → ⊩ A ⊃ A ∷ 𝜆 𝑣 Z ∷ 𝜆² 𝑣² Z tI³ = 𝜆³ 𝑣³ Z tK³ : ∀{A B} → ⊩ A ⊃ B ⊃ A ∷ 𝜆 𝜆 𝑣 S Z ∷ 𝜆² 𝜆² 𝑣² S Z tK³ = 𝜆³ 𝜆³ 𝑣³ S Z tS³ : ∀{A B C} → ⊩ (A ⊃ B ⊃ C) ⊃ (A ⊃ B) ⊃ A ⊃ C ∷ 𝜆 𝜆 𝜆 (𝑣 S S Z ∘ 𝑣 Z) ∘ (𝑣 S Z ∘ 𝑣 Z) ∷ 𝜆² 𝜆² 𝜆² (𝑣² S S Z ∘² 𝑣² Z) ∘² (𝑣² S Z ∘² 𝑣² Z) tS³ = 𝜆³ 𝜆³ 𝜆³ (𝑣³ S S Z ∘³ 𝑣³ Z) ∘³ (𝑣³ S Z ∘³ 𝑣³ Z)