import Syntax.Simple.Signature as S
import Syntax.BiTyped.Signature as B
module Theory.Pre.TypingErasure {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.BiTyped.Pre.Functor SD as P
open import Theory.Erasure
open import Syntax.BiTyped.Term BD
open import Syntax.BiTyped.Pre.Term BD
open import Syntax.Typed.Raw (erase BD)
private variable
Ξ : ℕ
Γ : Cxt 0
r : Raw _
d : Mode
A : Ty
mutual
typingErasure : Γ ⊢ r [ d ] A → Pre d r
typingErasure (var i {j} _) = ` j
typingErasure (A ∋ t) = A ∋ typingErasure t
typingErasure (t ↑ _) = (typingErasure t) ↑
typingErasure (op ts) = op (typingErasureᶜ (BD .ar _) ts)
typingErasureᶜ
: (D : OpD) {rs : R.⟦ eraseᶜ D ⟧ᶜ Raw (length Γ)}
→ ⟦ D ⟧ᶜ Raw _⊢_[_]_ Γ rs d A
→ P.⟦ D ⟧ᶜ Raw Pre d rs
typingErasureᶜ (ι _ _ Ds) (deq , _ , _ , ts) = deq , typingErasureᵃˢ Ds ts
typingErasureᵃˢ
: (Ds : ArgsD Ξ) {rs : R.⟦ eraseᵃˢ Ds ⟧ᵃˢ Raw (length Γ)} {σ : TSub Ξ 0}
→ ⟦ Ds ⟧ᵃˢ Raw _⊢_[_]_ σ Γ rs
→ P.⟦ Ds ⟧ᵃˢ Raw Pre rs
typingErasureᵃˢ [] _ = tt
typingErasureᵃˢ ((Δ ⊢[ _ ] _) ∷ Ds) (t , ts) = typingErasureᵃ Δ t , typingErasureᵃˢ Ds ts
typingErasureᵃ
: (Δ : TExps Ξ) {r : R.⟦ Δ ⟧ᵃ Raw (length Γ)} {σ : TSub Ξ 0}
→ ⟦ Δ ⟧ᵃ Raw (λ Γ' r' → Γ' ⊢ r' [ d ] A) σ Γ r
→ P.⟦ Δ ⟧ᵃ Raw Pre d r
typingErasureᵃ [] t = typingErasure t
typingErasureᵃ (_ ∷ Δ) t = typingErasureᵃ Δ t