module Implicit.Algo.Properties.Polarity where

open import Implicit.Language.All
open import Implicit.Algo.Base
open import Implicit.Algo.Properties.Extension

ss-polarity+ : Γ  A  ≤⁺  B  Δ
              Γ ⊢r B
ss-polarity- : Γ  A  ≤⁻  B  Δ
              Γ ⊢r A

ss-polarity+ (s-int regΓ) = ⊢r-int
ss-polarity+ (s-var-∙ regΓ x) = ⊢r-var-∙ x
ss-polarity+ (s-ex-l^ inst) = inst-⊢r inst
ss-polarity+ (s-ex-l= regΓ x-in) = ∋:=-⊢r regΓ x-in
ss-polarity+ (s-arr s s₁) = ⊢r-arr (ss-polarity- s) (⊆-⊢r' (ss-polarity+ s₁) (ss-⊆ s))
ss-polarity+ (s-∀ s) = ⊢r-∀ (ss-polarity+ s)

ss-polarity- (s-int regΓ) = ⊢r-int
ss-polarity- (s-var-∙ regΓ x) = ⊢r-var-∙ x
ss-polarity- (s-ex-r^ inst) = inst-⊢r inst
ss-polarity- (s-ex-r= regΓ x-in) = ∋:=-⊢r regΓ x-in
ss-polarity- (s-arr s s₁) = ⊢r-arr (ss-polarity+ s) (⊆-⊢r' (ss-polarity- s₁) (ss-⊆ s))
ss-polarity- (s-∀ s) = ⊢r-∀ (ss-polarity- s)


ss-polarity+-out : Γ  A  ≤⁺  B  Δ
                  Δ ⊢r B
ss-polarity+-out s = ⊆-⊢r (ss-polarity+ s) (ss-⊆ s)

ss-polarity--out : Γ  A  ≤⁻  B  Δ
                  Δ ⊢r A
ss-polarity--out s = ⊆-⊢r (ss-polarity- s) (ss-⊆ s)