{-# OPTIONS --without-K --safe #-}
module Mint.Statics.Properties.Contexts where
open import Data.Nat.Properties
open import Lib
open import Mint.Statics.Full
open import Mint.Statics.Refl
open import Mint.Statics.Misc
≈⇒len≡ : ⊢ Γ ≈ Δ →
         
         len Γ ≡ len Δ
≈⇒len≡ []-≈                 = refl
≈⇒len≡ (κ-cong Γ≈Δ)         = cong suc (≈⇒len≡ Γ≈Δ)
≈⇒len≡ (∺-cong Γ≈Δ _ _ _ _) = ≈⇒len≡ Γ≈Δ
≈⇒∥≈ : ∀ Ψs Ψs′ →
       ⊢ Ψs ++⁺ Γ ≈ Ψs′ ++⁺ Δ →
       len Ψs ≡ len Ψs′ →
       
       ⊢ Γ ≈ Δ
≈⇒∥≈ [] [] ⊢≈ eq                               = ⊢≈
≈⇒∥≈ (_ ∷ Ψs) (_ ∷ Ψs′) (κ-cong ⊢≈) eq         = ≈⇒∥≈ Ψs Ψs′ ⊢≈ (suc-injective eq)
≈⇒∥≈ (_ ∷ Ψs) (_ ∷ Ψs′) (∺-cong ⊢≈ _ _ _ _) eq = ≈⇒∥≈ (_ ∷ Ψs) (_ ∷ Ψs′) ⊢≈ eq
≈⇒∥⇒∥ : ∀ Ψs →
        ⊢ Ψs ++⁺ Γ ≈ Δ →
        
        ∃₂ λ Ψs′ Δ′ → Δ ≡ Ψs′ ++⁺ Δ′ × len Ψs ≡ len Ψs′ × ⊢ Γ ≈ Δ′
≈⇒∥⇒∥ [] ⊢≈                           = [] , _ , refl , refl , ⊢≈
≈⇒∥⇒∥ (_ ∷ Ψs) (κ-cong ⊢≈)
  with ≈⇒∥⇒∥ Ψs ⊢≈
...  | Ψs′ , Δ′ , eq , eql , ⊢≈∥      = [] ∷ Ψs′ , Δ′ , cong ([] ∷⁺_) eq , cong suc eql , ⊢≈∥
≈⇒∥⇒∥ (_ ∷ Ψs) (∺-cong ⊢≈ _ _ _ _)
  with ≈⇒∥⇒∥ (_ ∷ Ψs) ⊢≈
... | Ψ ∷ Ψs′ , Δ′ , refl , eql , ⊢≈∥ = (_ ∷ Ψ) ∷ Ψs′ , Δ′ , refl , eql , ⊢≈∥
⊢⇒∥⊢ : ∀ Ψs →
       ⊢ Ψs ++⁺ Γ →
       
       ⊢ Γ
⊢⇒∥⊢ [] ⊢Γ               = ⊢Γ
⊢⇒∥⊢ (_ ∷ Ψs) (⊢κ ⊢++)   = ⊢⇒∥⊢ Ψs ⊢++
⊢⇒∥⊢ (_ ∷ Ψs) (⊢∺ ⊢++ _) = ⊢⇒∥⊢ (_ ∷ Ψs) ⊢++
≈⇒∺⇒∺ : ⊢ T ∺ Γ ≈ Δ →
        
        ∃₂ λ T′ Δ′ → Δ ≡ T′ ∺ Δ′ × Γ ⊢ T ≈ T′ × Δ′ ⊢ T ≈ T′ × ⊢ Γ ≈ Δ′
≈⇒∺⇒∺ (∺-cong ⊢≈ ⊢T ⊢T′ T≈T′ T≈T′₁) = _ , _ , refl , (_ , T≈T′) , (_ , T≈T′₁) , ⊢≈
∈!⇒ty-wf : ∀ {x} →
           ⊢ Γ →
           x ∶ T ∈! Γ →
           
           Γ ⊢ T
∈!⇒ty-wf ⊢TΓ@(⊢∺ ⊢Γ ⊢T) here = _ , t[σ]-Se ⊢T (s-wk ⊢TΓ)
∈!⇒ty-wf ⊢TΓ@(⊢∺ ⊢Γ ⊢S) (there T∈Γ)
  with ∈!⇒ty-wf ⊢Γ T∈Γ
...  | i , ⊢T                = _ , t[σ]-Se ⊢T (s-wk ⊢TΓ)
presup-⊢≈ : ⊢ Γ ≈ Δ →
            
            ⊢ Γ × ⊢ Δ
presup-⊢≈ []-≈ = ⊢[] , ⊢[]
presup-⊢≈ (κ-cong Γ≈Δ)
  with presup-⊢≈ Γ≈Δ
...  | ⊢Γ , ⊢Δ = ⊢κ ⊢Γ , ⊢κ ⊢Δ
presup-⊢≈ (∺-cong Γ≈Δ ⊢T ⊢T′ _ _)
  with presup-⊢≈ Γ≈Δ
...  | ⊢Γ , ⊢Δ = ⊢∺ ⊢Γ ⊢T , ⊢∺ ⊢Δ ⊢T′
∈!⇒ty≈ : ∀ {x} →
         ⊢ Γ ≈ Δ →
         x ∶ T ∈! Γ →
         
         ∃ λ T′ → (x ∶ T′ ∈! Δ) × Γ ⊢ T ≈ T′ × Δ ⊢ T ≈ T′
∈!⇒ty≈ (∺-cong Γ≈Δ ⊢T ⊢T′ T≈T′ T≈T′₁) here
  with presup-⊢≈ Γ≈Δ
...  | ⊢Γ , ⊢Δ                            = -, here , (-, []-cong-Se′ T≈T′ (s-wk (⊢∺ ⊢Γ ⊢T))) , -, []-cong-Se′ T≈T′₁ (s-wk (⊢∺ ⊢Δ ⊢T′))
∈!⇒ty≈ (∺-cong Γ≈Δ ⊢T ⊢T′ _ _) (there T∈Γ)
  with presup-⊢≈ Γ≈Δ | ∈!⇒ty≈ Γ≈Δ T∈Γ
...  | ⊢Γ , ⊢Δ
     | T′ , T′∈Δ , (_ , T≈T′) , _ , T≈T′₁ = -, there T′∈Δ , (-, []-cong-Se′ T≈T′ (s-wk (⊢∺ ⊢Γ ⊢T))) , (-, []-cong-Se′ T≈T′₁ (s-wk (⊢∺ ⊢Δ ⊢T′)))
⊢≈-sym : ⊢ Γ ≈ Δ → ⊢ Δ ≈ Γ
⊢≈-sym []-≈                           = []-≈
⊢≈-sym (κ-cong Γ≈Δ)                   = κ-cong (⊢≈-sym Γ≈Δ)
⊢≈-sym (∺-cong Γ≈Δ ⊢T ⊢T′ T≈T′ T≈T′₁) = ∺-cong (⊢≈-sym Γ≈Δ) ⊢T′ ⊢T (≈-sym T≈T′₁) (≈-sym T≈T′)