import Syntax.Simple.Signature as S import Syntax.BiTyped.Signature as B module Theory.Soundness {SD : S.SigD} (BD : B.SigD SD) where open import Prelude open import Syntax.Simple SD open import Syntax.Context SD open B SD open import Syntax.BiTyped.Functor SD import Syntax.Typed.Functor SD as T import Syntax.Typed.Raw.Functor SD as R open import Theory.Erasure open import Syntax.BiTyped.Term BD open import Syntax.Typed.Term (erase BD) open import Syntax.Typed.Raw.Term (erase BD) private variable Ξ : ℕ Γ : Cxt 0 r : Raw _ d : Mode A : Ty mutual soundness : Γ ⊢ r [ d ] A → Γ ⊢ r ⦂ A soundness (var i eq) = var i eq soundness (A ∋ t) = A ∋ soundness t soundness (t ↑ refl) = soundness t soundness (op {rs = i , _} (_ , σ , σ-eq , ts)) = op (σ , σ-eq , soundnessᵃˢ (BD .ar i .args) ts) soundnessᵃˢ : (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw (length Γ)} {σ : TSub Ξ 0} → ⟦ Ds ⟧ᵃˢ Raw _⊢_[_]_ σ Γ rs → T.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw _⊢_⦂_ σ Γ rs soundnessᵃˢ [] _ = tt soundnessᵃˢ ((Δ ⊢[ _ ] _) ∷ Ds) (t , ts) = soundnessᵃ Δ t , soundnessᵃˢ Ds ts soundnessᵃ : (Δ : TExps Ξ) {r : R.⟦ Δ ⟧ᵃ Raw (length Γ)} {σ : TSub Ξ 0} → ⟦ Δ ⟧ᵃ Raw (_⊢_[ d ] A) σ Γ r → T.⟦ Δ ⟧ᵃ Raw (_⊢_⦂ A) σ Γ r soundnessᵃ [] t = soundness t soundnessᵃ (_ ∷ Δ) t = soundnessᵃ Δ t