module Implicit.Decl.Equiv where

open import Implicit.Language.All
open import Implicit.Decl.Subtyping
open import Implicit.Decl.SubtypingV2
open import Implicit.Decl.AuxLemmas


⊢d→⊢d² : Γ ⊢d j # A  B
       Γ ⊢d² j # A  B
⊢d→⊢d² (s-refl regΔ cloA) = s-refl regΔ cloA
⊢d→⊢d² (s-int regΔ) = s-int regΔ
⊢d→⊢d² (s-var-∙ regΔ inΔ) = s-var-∙ regΔ inΔ
⊢d→⊢d² (s-arr₁ s s₁) = s-arr₁ (⊢d→⊢d² s) (⊢d→⊢d² s₁)
⊢d→⊢d² (s-arr₂ s s₁) = s-arr₂ (⊢d→⊢d² s) (⊢d→⊢d² s₁)
⊢d→⊢d² (s-arr₃ regA s) = s-arr₃ regA (⊢d→⊢d² s)
⊢d→⊢d² (s-∀ s) = s-∀ (⊢d→⊢d² s)
⊢d→⊢d² (s-∀l {B = B} {A* = A*} {C = C} {D = D} regB st s fd)
  with  C' , upC ↑ty0-total C
  with  D' , upD ↑ty0-total D
  with  A*' , upA* ↑ty0-total A*
  with regA*s1-⊢r-l s
  with regAst-⊢r'' regA* ▶Z regB st
  = s-∀l {B = B} {A% = A*'} (st-↑ty-≫0 st regA* upA* regB) regA (s2-weaken=0 (⊢d→⊢d² s) upA* (↑ty-arr upC upD) regB) fd upC upD
⊢d→⊢d² (s-∀l-no-appear {B = B} {A* = A*} {j = j} {C = C} {D = D} regB st s fd)
  with  C' , upC ↑ty0-total C
  with  D' , upD ↑ty0-total D
  with  A*' , upA* ↑ty0-total A*
  with regA*s1-⊢r-l s
  with regAst-⊢r'' regA* ▶Z regB st
  = s-∀l-no-appear (≫-weaken^ {k = #0} (⊢r-≫-eq regA*) ▶Z (st-↑ty fd st) upA*) regA (s2-weaken^0 (⊢d→⊢d² s) upA* (↑ty-arr upC upD)) fd upC upD

⊢d²→⊢d : Γ ⊢d² j # A  B
          Γ ⊢d j # A  B
⊢d²→⊢d (s-refl regΔ cloA) = s-refl regΔ cloA
⊢d²→⊢d (s-int regΔ) = s-int regΔ
⊢d²→⊢d (s-var-∙ regΔ inΔ) = s-var-∙ regΔ inΔ
⊢d²→⊢d (s-arr₁ s s₁) = s-arr₁ (⊢d²→⊢d s) (⊢d²→⊢d s₁)
⊢d²→⊢d (s-arr₂ s s₁) = s-arr₂ (⊢d²→⊢d s) (⊢d²→⊢d s₁)
⊢d²→⊢d (s-arr₃ regA s) = s-arr₃ regA (⊢d²→⊢d s)
⊢d²→⊢d (s-∀ s) = s-∀ (⊢d²→⊢d s)
⊢d²→⊢d (s-∀l {B = B} grd regA s fd upC upD)
  with reg-S= r regA₁s2-sregular s
  with  preA% , upp ↑ty-surjective (⊢r-¬ε (s2-⊢r-l s) Z)
  = s-∀l regA₁ (≫-↑ty-st'0 regA regA₁ grd upp) (s1-strengthen=0 (⊢d²→⊢d s) upp (↑ty-arr upC upD)) fd
⊢d²→⊢d (s-∀l-no-appear grd regA s fd upC upD)
  with reg-S^ rs2-sregular s
  with  preA% , upp ↑ty-surjective (⊢r-¬ε-^ (s2-⊢r-l s) Z)
  with  preA , upA ↑ty-surjective fd
  with refl⊢r-≫-eq' (⊢r-weaken^0 (⊢r-strengthen∙0 regA upA) upA) grd
  = s-∀l-no-appear ⊢r-int (↑ty-st upp) (s1-strengthen^0 (⊢d²→⊢d s) upp (↑ty-arr upC upD)) fd