module A201602.Try11 where
open import Data.Nat using (ℕ ; zero ; suc)
infixl 5 _∘_ _∘²_
infixr 4 𝜆_∙_ 𝜆²_∙_
infixr 3 _∵_
infixl 2 _∧_
infixr 1 _⊃_ _⊃⊂_
infixr 0 _⊢_
infixr 0 _⊢_∷_
infixr 0 _⊢_∷_∷_
infixr 0 _⊢_∷_∷_∷_
Var : Set
Var = ℕ
mutual
data Ty : Set where
⊥ : Ty
_⊃_ : Ty → Ty → Ty
_∧_ : Ty → Ty → Ty
_∵_ : Tm → Ty → Ty
data Tm : Set where
𝑣_ : Var → Tm
𝜆_∙_ : Var → Tm → Tm
𝜆²_∙_ : Var → Tm → Tm
_∘_ : Tm → Tm → Tm
_∘²_ : Tm → Tm → Tm
𝑝⟨_,_⟩ : Tm → Tm → Tm
𝑝²⟨_,_⟩ : Tm → Tm → Tm
𝜋₀_ : Tm → Tm
𝜋₀²_ : Tm → Tm
𝜋₁_ : Tm → Tm
𝜋₁²_ : Tm → Tm
!_ : Tm → Tm
⇑_ : Tm → Tm
⇑²_ : Tm → Tm
⇓_ : Tm → Tm
⇓²_ : Tm → Tm
⊤ : Ty
⊤ = ⊥ ⊃ ⊥
¬_ : Ty → Ty
¬ A = A ⊃ ⊥
_⊃⊂_ : Ty → Ty → Ty
A ⊃⊂ B = A ⊃ B ∧ B ⊃ A
data Cx : ℕ → Set where
∅ : Cx zero
_,_ : ∀{n} → Cx n → Ty → Cx (suc n)
data _∈_ : ∀{n} → Ty → Cx n → Set where
Z : ∀{n A} {Γ : Cx n} → A ∈ (Γ , A)
S_ : ∀{n A B} {Γ : Cx n} → A ∈ Γ → A ∈ (Γ , B)
mutual
data _⊢_ {n : ℕ} (Γ : Cx n) : Ty → Set where
M𝑣⁰ : ∀{A} → A ∈ Γ
→ Γ ⊢ A
M𝜆⁰ : ∀{A B} → Γ , A ⊢ B
→ Γ ⊢ A ⊃ B
M∘⁰ : ∀{A B} → Γ ⊢ A ⊃ B → Γ ⊢ A
→ Γ ⊢ B
M𝑝⁰ : ∀{A B} → Γ ⊢ A → Γ ⊢ B
→ Γ ⊢ A ∧ B
M𝜋₀⁰ : ∀{A B} → Γ ⊢ A ∧ B
→ Γ ⊢ A
M𝜋₁⁰ : ∀{A B} → Γ ⊢ A ∧ B
→ Γ ⊢ B
M⇑⁰ : ∀{A u} → Γ ⊢ u ∵ A
→ Γ ⊢ ! u ∵ u ∵ A
M⇓⁰ : ∀{A u} → Γ ⊢ u ∵ A
→ Γ ⊢ A
M⁰⁺¹ : ∀{A u} → Γ ⊢ u ∷ A
→ Γ ⊢ u ∵ A
data _⊢_∷_ {n : ℕ} (Γ : Cx n) : Tm → Ty → Set where
M𝑣¹ : ∀{A t} → (t ∵ A) ∈ Γ
→ Γ ⊢ t ∷ A
M𝜆¹ : ∀{A B x t} → Γ , (𝑣 x ∵ A) ⊢ t ∷ B
→ Γ ⊢ 𝜆 x ∙ t ∷ A ⊃ B
M∘¹ : ∀{A B t s} → Γ ⊢ t ∷ A ⊃ B → Γ ⊢ s ∷ A
→ Γ ⊢ t ∘ s ∷ B
M𝑝¹ : ∀{A B t s} → Γ ⊢ t ∷ A → Γ ⊢ s ∷ B
→ Γ ⊢ 𝑝⟨ t , s ⟩ ∷ A ∧ B
M𝜋₀¹ : ∀{A B t} → Γ ⊢ t ∷ A ∧ B
→ Γ ⊢ 𝜋₀ t ∷ A
M𝜋₁¹ : ∀{A B t} → Γ ⊢ t ∷ A ∧ B
→ Γ ⊢ 𝜋₁ t ∷ B
M⇑¹ : ∀{A u t} → Γ ⊢ t ∷ u ∵ A
→ Γ ⊢ ⇑ t ∷ ! u ∵ u ∵ A
M⇓¹ : ∀{A u t} → Γ ⊢ t ∷ u ∵ A
→ Γ ⊢ ⇓ t ∷ A
M¹⁻¹ : ∀{A u t} → Γ ⊢ t ∵ u ∵ A
→ Γ ⊢ t ∷ u ∵ A
M¹⁺¹ : ∀{A u t} → Γ ⊢ t ∷ u ∷ A
→ Γ ⊢ t ∷ u ∵ A
data _⊢_∷_∷_ {n : ℕ} (Γ : Cx n) : Tm → Tm → Ty → Set where
M𝑣² : ∀{A t t₂} → (t₂ ∵ t ∵ A) ∈ Γ
→ Γ ⊢ t₂ ∷ t ∷ A
M𝜆² : ∀{A B x t x₂ t₂} → Γ , (𝑣 x₂ ∵ 𝑣 x ∵ A) ⊢ t₂ ∷ t ∷ B
→ Γ ⊢ 𝜆² x₂ ∙ t₂ ∷ 𝜆 x ∙ t ∷ A ⊃ B
M∘² : ∀{A B t s t₂ s₂} → Γ ⊢ t₂ ∷ t ∷ A ⊃ B → Γ ⊢ s₂ ∷ s ∷ A
→ Γ ⊢ t₂ ∘² s₂ ∷ t ∘ s ∷ B
M𝑝² : ∀{A B t s t₂ s₂} → Γ ⊢ t₂ ∷ t ∷ A → Γ ⊢ s₂ ∷ s ∷ B
→ Γ ⊢ 𝑝²⟨ t₂ , s₂ ⟩ ∷ 𝑝⟨ t , s ⟩ ∷ A ∧ B
M𝜋₀² : ∀{A B t t₂} → Γ ⊢ t₂ ∷ t ∷ A ∧ B
→ Γ ⊢ 𝜋₀² t₂ ∷ 𝜋₀ t ∷ A
M𝜋₁² : ∀{A B t t₂} → Γ ⊢ t₂ ∷ t ∷ A ∧ B
→ Γ ⊢ 𝜋₁² t₂ ∷ 𝜋₁ t ∷ B
M⇑² : ∀{A u t t₂} → Γ ⊢ t₂ ∷ t ∷ u ∵ A
→ Γ ⊢ ⇑² t₂ ∷ ⇑ t ∷ ! u ∵ u ∵ A
M⇓² : ∀{A u t t₂} → Γ ⊢ t₂ ∷ t ∷ u ∵ A
→ Γ ⊢ ⇓² t₂ ∷ ⇓ t ∷ A
M²⁻² : ∀{A u t t₂} → Γ ⊢ t₂ ∵ t ∵ u ∵ A
→ Γ ⊢ t₂ ∷ t ∷ u ∵ A
M²⁻¹ : ∀{A u t t₂} → Γ ⊢ t₂ ∷ t ∵ u ∵ A
→ Γ ⊢ t₂ ∷ t ∷ u ∵ A
M²⁺¹ : ∀{A u t t₂} → Γ ⊢ t₂ ∷ t ∷ u ∷ A
→ Γ ⊢ t₂ ∷ t ∷ u ∵ A
data _⊢_∷_∷_∷_ {n : ℕ} (Γ : Cx n) : Tm → Tm → Tm → Ty → Set where
eI⁰ : ∀{n A} {Γ : Cx n}
→ Γ ⊢ A ⊃ A
eI⁰ = M𝜆⁰ (M𝑣⁰ Z)
eI¹ : ∀{n A x} {Γ : Cx n}
→ Γ ⊢ 𝜆 x ∙ 𝑣 x ∷ (A ⊃ A)
eI¹ = M𝜆¹ (M𝑣¹ Z)
eI² : ∀{n A x u} {Γ : Cx n}
→ Γ ⊢ 𝜆² u ∙ 𝑣 u ∷ 𝜆 x ∙ 𝑣 x ∷ (A ⊃ A)
eI² = M𝜆² (M𝑣² Z)
e11 : ∀{n A x y} {Γ : Cx n}
→ Γ ⊢ 𝜆 y ∙ ⇓ 𝑣 y ∷ (x ∵ A ⊃ A)
e11 = M𝜆¹ (M⇓¹ (M𝑣¹ Z))
e12 : ∀{n A x y} {Γ : Cx n}
→ Γ ⊢ 𝜆 y ∙ ⇑ 𝑣 y ∷ (x ∵ A ⊃ ! x ∵ x ∵ A)
e12 = M𝜆¹ (M⇑¹ (M𝑣¹ Z))
e13 : ∀{n A B x y u v} {Γ : Cx n}
→ Γ ⊢ 𝜆² u ∙ 𝜆² v ∙ 𝑝²⟨ 𝑣 u , 𝑣 v ⟩ ∷ 𝜆 x ∙ 𝜆 y ∙ 𝑝⟨ 𝑣 x , 𝑣 y ⟩ ∷ (A ⊃ B ⊃ A ∧ B)
e13 = M𝜆² (M𝜆² (M𝑝² (M𝑣² (S Z)) (M𝑣² Z)))
e14 : ∀{n A B x y u v} {Γ : Cx n}
→ Γ ⊢ 𝜆 u ∙ 𝜆 v ∙ ⇑ 𝑝²⟨ 𝑣 u , 𝑣 v ⟩ ∷ (x ∵ A ⊃ y ∵ B ⊃ ! 𝑝⟨ x , y ⟩ ∵ 𝑝⟨ x , y ⟩ ∵ (A ∧ B))
e14 = M𝜆¹ (M𝜆¹ (M⇑¹ (M¹⁺¹ (M𝑝² (M𝑣² (S Z)) (M𝑣² Z)))))