module NCILL.Admit.Zero where open import Data.List open import ListExtras open import AssocProofs open import NCILL.Types open import NCILL.Ctx open import NCILL.Sequent open import NCILL.ProofUtils absurd-T0 : (Γ Δ₁ Δ₂ : Ctx) → (C : Ty) → Sqnt Γ ♯0 → Sqnt (Δ₁ ++ Γ ++ Δ₂) C absurd-T0 _ Δ₁ _ _ var = zero-L Δ₁ absurd-T0 _ Δ₁ Δ₂ C (impl-L {Ψ} Ω₁ {Ω₂} {A} {B} t₁ t₂) = process absurd-T0 (Ω₁ ++ B ∷ Ω₂) Δ₁ Δ₂ C t₂ by Δ₁ ++ (Ω₁ ++ B ∷ Ω₂) ++ Δ₂ ⊢ C ≡Γ⟨ obligation₂ ⟩ (Δ₁ ++ Ω₁) ++ B ∷ Ω₂ ++ Δ₂ ⊢ C $⟨ impl-L (Δ₁ ++ Ω₁) t₁ ⟩ (Δ₁ ++ Ω₁) ++ Ψ ++ A ⊸ B ∷ Ω₂ ++ Δ₂ ⊢ C ≡Γ⟨ obligation₁ ⟩ Δ₁ ++ (Ω₁ ++ Ψ ++ A ⊸ B ∷ Ω₂) ++ Δ₂ ⊢ C ∎ where obligation₁ : (Δ₁ ++ Ω₁) ++ Ψ ++ A ⊸ B ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ Ψ ++ A ⊸ B ∷ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs++xs≡xs++[xs++xs++xs]++xs Δ₁ Ω₁ Ψ (A ⊸ B ∷ Ω₂) Δ₂ obligation₂ : Δ₁ ++ (Ω₁ ++ B ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ B ∷ Ω₂ ++ Δ₂ obligation₂ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (B ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (impl-Lʳ {Ψ} Ω₁ {Ω₂} {A} {B} t₁ t₂) = process absurd-T0 (Ω₁ ++ B ∷ Ω₂) Δ₁ Δ₂ C t₂ by Δ₁ ++ (Ω₁ ++ B ∷ Ω₂) ++ Δ₂ ⊢ C ≡Γ⟨ obligation₂ ⟩ (Δ₁ ++ Ω₁) ++ B ∷ Ω₂ ++ Δ₂ ⊢ C $⟨ impl-Lʳ (Δ₁ ++ Ω₁) t₁ ⟩ (Δ₁ ++ Ω₁) ++ A ⊸ʳ B ∷ Ψ ++ Ω₂ ++ Δ₂ ⊢ C ≡Γ⟨ obligation₁ ⟩ Δ₁ ++ (Ω₁ ++ A ⊸ʳ B ∷ Ψ ++ Ω₂) ++ Δ₂ ⊢ C ∎ where obligation₁ : (Δ₁ ++ Ω₁) ++ A ⊸ʳ B ∷ Ψ ++ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ A ⊸ʳ B ∷ Ψ ++ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs++xs≡xs++[xs++xs++xs]++xs Δ₁ Ω₁ (A ⊸ʳ B ∷ Ψ) Ω₂ Δ₂ obligation₂ : Δ₁ ++ (Ω₁ ++ B ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ B ∷ Ω₂ ++ Δ₂ obligation₂ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (B ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (times-L Ω₁ {Ω₂} {A} {B} x) = subst-Sqnt-Γ obligation₂ (times-L (Δ₁ ++ Ω₁) (subst-Sqnt-Γ obligation₁ (absurd-T0 (Ω₁ ++ A ∷ B ∷ Ω₂) Δ₁ Δ₂ C x))) where obligation₁ : Δ₁ ++ (Ω₁ ++ A ∷ B ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ A ∷ B ∷ Ω₂ ++ Δ₂ obligation₁ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (A ∷ B ∷ Ω₂) Δ₂ obligation₂ : (Δ₁ ++ Ω₁) ++ A ⊗ B ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ A ⊗ B ∷ Ω₂) ++ Δ₂ obligation₂ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (A ⊗ B ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (plus-L Ω₁ {Ω₂} {A} {B} e₁ e₂) = subst-Sqnt-Γ obligation₁ (plus-L (Δ₁ ++ Ω₁) (subst-Sqnt-Γ (obligation₂ A) x₁) (subst-Sqnt-Γ (obligation₂ B) x₂)) where obligation₁ : (Δ₁ ++ Ω₁) ++ A ⊕ B ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ A ⊕ B ∷ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (A ⊕ B ∷ Ω₂) Δ₂ obligation₂ : ∀ X → Δ₁ ++ (Ω₁ ++ X ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ X ∷ Ω₂ ++ Δ₂ obligation₂ X = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (X ∷ Ω₂) Δ₂ x₁ = absurd-T0 _ Δ₁ Δ₂ C e₁ x₂ = absurd-T0 _ Δ₁ Δ₂ C e₂ absurd-T0 _ Δ₁ Δ₂ C (zero-L Ω₁ {Ω₂}) = subst-Sqnt-Γ obligation₁ (zero-L (Δ₁ ++ Ω₁)) where obligation₁ : (Δ₁ ++ Ω₁) ++ ♯0 ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ ♯0 ∷ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (♯0 ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (with-L₁ Ω₁ {Ω₂} {A} {B} e) = subst-Sqnt-Γ obligation₁ (with-L₁ (Δ₁ ++ Ω₁) (subst-Sqnt-Γ obligation₂ (absurd-T0 (Ω₁ ++ A ∷ Ω₂) Δ₁ Δ₂ C e))) where obligation₁ : (Δ₁ ++ Ω₁) ++ A & B ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ A & B ∷ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (A & B ∷ Ω₂) Δ₂ obligation₂ : Δ₁ ++ (Ω₁ ++ A ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ A ∷ Ω₂ ++ Δ₂ obligation₂ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (A ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (with-L₂ Ω₁ {Ω₂} {A} {B} e) = subst-Sqnt-Γ obligation₁ (with-L₂ (Δ₁ ++ Ω₁) (subst-Sqnt-Γ obligation₂ (absurd-T0 (Ω₁ ++ B ∷ Ω₂) Δ₁ Δ₂ C e))) where obligation₁ : (Δ₁ ++ Ω₁) ++ A & B ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ A & B ∷ Ω₂) ++ Δ₂ obligation₁ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (A & B ∷ Ω₂) Δ₂ obligation₂ : Δ₁ ++ (Ω₁ ++ B ∷ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ B ∷ Ω₂ ++ Δ₂ obligation₂ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ (B ∷ Ω₂) Δ₂ absurd-T0 _ Δ₁ Δ₂ C (unit-L Ω₁ {Ω₂} t) = subst-Sqnt-Γ obligation₂ (unit-L (Δ₁ ++ Ω₁) (subst-Sqnt-Γ obligation₁ (absurd-T0 _ Δ₁ Δ₂ C t))) where obligation₁ : Δ₁ ++ (Ω₁ ++ Ω₂) ++ Δ₂ ≡ (Δ₁ ++ Ω₁) ++ Ω₂ ++ Δ₂ obligation₁ = xs++[xs++xs]++xs≡[xs++xs]++xs++xs Δ₁ Ω₁ Ω₂ Δ₂ obligation₂ : (Δ₁ ++ Ω₁) ++ ♯1 ∷ Ω₂ ++ Δ₂ ≡ Δ₁ ++ (Ω₁ ++ ♯1 ∷ Ω₂) ++ Δ₂ obligation₂ = [xs++xs]++xs++xs≡xs++[xs++xs]++xs Δ₁ Ω₁ (♯1 ∷ Ω₂) Δ₂