\begin{code}
module Scoped.Erasure where
\end{code}
\begin{code}
open import Scoped
open import Untyped
open import Untyped.RenamingSubstitution
open import Builtin
open import Utils
open import Data.Nat
open import Data.Nat.Properties
open import Data.Fin using (Fin;zero;suc)
open import Data.Vec
open import Relation.Binary.PropositionalEquality
open import Data.Sum
open import Data.Product
\end{code}
\begin{code}
len : ∀{n} → Weirdℕ n → ℕ
len Z = 0
len (S i) = suc (len i)
len (T i) = len i
lemma : ∀ b → Scoped.arity⋆ b + Scoped.arity b ≡ Untyped.arity b
lemma addInteger = refl
lemma subtractInteger = refl
lemma multiplyInteger = refl
lemma divideInteger = refl
lemma quotientInteger = refl
lemma remainderInteger = refl
lemma modInteger = refl
lemma lessThanInteger = refl
lemma lessThanEqualsInteger = refl
lemma greaterThanInteger = refl
lemma greaterThanEqualsInteger = refl
lemma equalsInteger = refl
lemma concatenate = refl
lemma takeByteString = refl
lemma dropByteString = refl
lemma sha2-256 = refl
lemma sha3-256 = refl
lemma verifySignature = refl
lemma equalsByteString = refl
lemma ifThenElse = refl
lemma charToString = refl
lemma append = refl
lemma trace = refl
\end{code}
\begin{code}
eraseVar : ∀{n}{i : Weirdℕ n} → WeirdFin i → Fin (len i)
eraseVar Z = zero
eraseVar (S x) = suc (eraseVar x)
eraseVar (T x) = eraseVar x
eraseTC : Scoped.TermCon → Untyped.TermCon
eraseTC (integer i) = integer i
eraseTC (bytestring b) = bytestring b
eraseTC (string s) = string s
eraseTC (bool b) = bool b
eraseTC (char c) = char c
eraseTC unit = unit
eraseTm : ∀{n}{i : Weirdℕ n} → ScopedTm i → len i ⊢
eraseTel⋆ : ∀{m n}(i : Weirdℕ n) → Vec (ScopedTy n) m → Vec (len i ⊢) m
eraseTel⋆ i [] = []
eraseTel⋆ i (A ∷ As) = plc_dummy ∷ eraseTel⋆ i As
eraseTel : ∀{m n}{i : Weirdℕ n} → Vec (ScopedTm i) m → Vec (len i ⊢) m
eraseTel [] = []
eraseTel (t ∷ ts) = eraseTm t ∷ eraseTel ts
eraseTm (` x) = ` (eraseVar x)
eraseTm (Λ K t) = ƛ (weaken (eraseTm t))
eraseTm (t ·⋆ A) = eraseTm t · plc_dummy
eraseTm (ƛ A t) = ƛ (eraseTm t)
eraseTm (t · u) = eraseTm t · eraseTm u
eraseTm (con c) = con (eraseTC c)
eraseTm (error A) = error
eraseTm (wrap pat arg t) = eraseTm t
eraseTm (unwrap t) = eraseTm t
eraseTm (ibuiltin b) = builtin b (≤″⇒≤‴ (≤⇒≤″ z≤n)) []
\end{code}