module Implicit.Interm2Decl.Corollaries where

open import Implicit.Language.All
open import Implicit.Decl.All as D
open import Implicit.Interm.All as I
open import Implicit.Interm2Decl.Main renaming (sound to sound-this)

si→sd : Γ  j # A  ≤⁺  B
       Γ ⊢r A
       Γ ⊢d j # A  B
si→sd s regA = ⊢d²→⊢d (sound-this s (⊢r-≫-eq regA) (⊢r-≫-eq (s+-polarity s)))

sound' : Γ  j # A    B
       Γ  A  A%
       Γ  B  B%
       Γ ⊢d j # A%  B%
sound' s grd1 grd2 = ⊢d²→⊢d (sound-this s grd1 grd2)

sound0' : Γ  ⊢r A
         Γ  ⊢r B
         Γ   j # A    B
         Γ  ⊢d j # A  B
sound0' regA regB s = sound' s (⊢r-≫-eq regA) (⊢r-≫-eq regB)

⊢sound : Γ  j # e  A
        Γ ⊢d j # e  A
⊢sound (⊢lit regΓ) = ⊢lit regΓ
⊢sound (⊢var regΓ x∈Γ) = ⊢var regΓ x∈Γ
⊢sound (⊢ann ⊢e) = ⊢ann (⊢sound ⊢e)
⊢sound (⊢lam₁ ⊢e) = ⊢lam₁ (⊢sound ⊢e)
⊢sound (⊢lam₂ ⊢e) = ⊢lam₂ (⊢sound ⊢e)
⊢sound (⊢app ⊢e ⊢e₁) = ⊢app (⊢sound ⊢e) (⊢sound ⊢e₁)
⊢sound (⊢sub ⊢e B≤A gc j≢Z) = ⊢sub (⊢sound ⊢e) (si→sd B≤A (⊢r-𝕣 (I.t-⊢r ⊢e))) gc j≢Z
⊢sound (⊢tabs ⊢e) = ⊢tabs (⊢sound ⊢e)
⊢sound (⊢tapp ⊢e st regA s) = ⊢tapp (⊢sound ⊢e) st regA (si→sd s (⊢r-𝕣 (st0-⊢r (I.t-⊢r ⊢e) st regA)))