module Implicit.Language.OpenClose.Base where
open import Implicit.Language.Base
open import Implicit.Language.Lookup.All
open import Implicit.Language.Regular.Base
open import Implicit.Language.Shift.Base
infix 3 _⊢o_
data _⊢o_ : Env n m → Type m → Set where
⊢o-var-^ :
Δ ∋^ X
→ Δ ⊢o ‶ X
⊢o-arr-l :
Δ ⊢o A
→ Δ ⊢o (A `→ B)
⊢o-arr-r :
Δ ⊢o B
→ Δ ⊢o (A `→ B)
⊢o-∀ :
Δ ,∙ ⊢o A
→ Δ ⊢o `∀ A
⊢r-⊢o-false : Γ ⊢r A
→ Γ ⊢o A
→ ⊥
⊢r-⊢o-false (⊢r-var-∙ inΓ) (⊢o-var-^ x) = ∋^-∋∙-false x inΓ
⊢r-⊢o-false (⊢r-arr regA regA₁) (⊢o-arr-l opnA) = ⊢r-⊢o-false regA opnA
⊢r-⊢o-false (⊢r-arr regA regA₁) (⊢o-arr-r opnA) = ⊢r-⊢o-false regA₁ opnA
⊢r-⊢o-false (⊢r-∀ regA) (⊢o-∀ opnA) = ⊢r-⊢o-false regA opnA
infix 3 _⊢c_
data _⊢c_ : Env n m → Type m → Set where
⊢c-int :
Δ ⊢c Int
⊢c-var-∙ :
(inΔ : Δ ∋∙ X)
→ Δ ⊢c ‶ X
⊢c-var-= :
(inΔ : Δ ∋= X)
→ Δ ⊢c ‶ X
⊢c-arr :
Δ ⊢c A
→ Δ ⊢c B
→ Δ ⊢c (A `→ B)
⊢c-∀ :
Δ ,∙ ⊢c A
→ Δ ⊢c `∀ A
⊢c-^∈-¬ε : Γ ⊢c A
→ Γ ∋^ k
→ k ¬ε A
⊢c-^∈-¬ε ⊢c-int inΓ = ¬ε-int
⊢c-^∈-¬ε (⊢c-var-∙ inΓ₁) inΓ = ¬ε-var (∋∙-∋^-≢ inΓ₁ inΓ)
⊢c-^∈-¬ε (⊢c-var-= inΓ₁) inΓ = ¬ε-var (∋=-∋^-≢ inΓ₁ inΓ)
⊢c-^∈-¬ε (⊢c-arr cloA cloA₁) inΓ = ¬ε-arr (⊢c-^∈-¬ε cloA inΓ) (⊢c-^∈-¬ε cloA₁ inΓ)
⊢c-^∈-¬ε (⊢c-∀ cloA) inΓ = ¬ε-∀ (⊢c-^∈-¬ε cloA (S∙ inΓ))