module A201602.Try10 where
open import Data.Nat using (ℕ)
Var : Set
Var = ℕ
mutual
infixr 5 _∵_
infixl 4 _∧_
infixr 3 _⊃_
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
infixl 2 _,_
data Cx : Set where
∅ : Cx
_,_ : Cx → Ty → Cx
infixr 1 _∈_
data _∈_ : Ty → Cx → Set where
Z : ∀{Γ A} → A ∈ Γ , A
S_ : ∀{Γ A B} → A ∈ Γ → A ∈ Γ , B
mutual
infixr 0 _⊢_
data _⊢_ (Γ : Cx) : 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
infixr 0 _⊢_∷_
data _⊢_∷_ (Γ : Cx) : Tm → Ty → Set where
M𝑣¹ : ∀{A x} → 𝑣 x ∵ A ∈ Γ
→ Γ ⊢ 𝑣 x ∷ 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
infixr 0 _⊢_∷_∷_
data _⊢_∷_∷_ (Γ : Cx) : Tm → Tm → Ty → Set where
M𝑣² : ∀{A x x₂} → 𝑣 x₂ ∵ 𝑣 x ∵ A ∈ Γ
→ Γ ⊢ 𝑣 x₂ ∷ 𝑣 x ∷ 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
infixr 0 _⊢_∷_∷_∷_
data _⊢_∷_∷_∷_ (Γ : Cx) : Tm → Tm → Tm → Ty → Set where
eI⁰ : ∀{Γ A}
→ Γ ⊢ A ⊃ A
eI⁰ = M𝜆⁰ (M𝑣⁰ Z)
eI¹ : ∀{Γ A x}
→ Γ ⊢ 𝜆 x ∙ 𝑣 x ∷ (A ⊃ A)
eI¹ = M𝜆¹ (M𝑣¹ Z)
eI² : ∀{Γ A x u}
→ Γ ⊢ 𝜆² u ∙ 𝑣 u ∷ 𝜆 x ∙ 𝑣 x ∷ (A ⊃ A)
eI² = M𝜆² (M𝑣² Z)
e11 : ∀{Γ A x y}
→ Γ ⊢ 𝜆 y ∙ ⇓ 𝑣 y ∷ (𝑣 x ∵ A ⊃ A)
e11 = M𝜆¹ (M⇓¹ (M𝑣¹ Z))
e12 : ∀{Γ A x y}
→ Γ ⊢ 𝜆 y ∙ ⇑ 𝑣 y ∷ (𝑣 x ∵ A ⊃ ! 𝑣 x ∵ 𝑣 x ∵ A)
e12 = M𝜆¹ (M⇑¹ (M𝑣¹ Z))
e13 : ∀{Γ A B x y u v}
→ Γ ⊢ 𝜆² u ∙ 𝜆² v ∙ 𝑝²⟨ 𝑣 u , 𝑣 v ⟩ ∷ 𝜆 x ∙ 𝜆 y ∙ 𝑝⟨ 𝑣 x , 𝑣 y ⟩ ∷ (A ⊃ B ⊃ A ∧ B)
e13 = M𝜆² (M𝜆² (M𝑝² (M𝑣² (S Z)) (M𝑣² Z)))
e14 : ∀{Γ A B x y u v}
→ Γ ⊢ 𝜆 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)))))