import Graded.Modality
open import Definition.Typed.Restrictions
open import Tools.Product
module Definition.Typed.Properties.Admissible.Erased.Eta
{a} {M : Set a}
(open Graded.Modality M)
{𝕄 : Modality}
(R : Type-restrictions 𝕄)
where
open Modality 𝕄
open Type-restrictions R
open import Definition.Typed R
import Definition.Typed.Properties.Admissible.Erased.Primitive R as ET
open import Definition.Typed.Properties.Admissible.Sigma R
open import Definition.Typed.Properties.Well-formed R
open import Definition.Typed.Inversion R
open import Definition.Typed.Well-formed R
open import Definition.Untyped M hiding (_[_])
open import Definition.Untyped.Erased 𝕄 𝕤 hiding (erased)
open import Definition.Untyped.Erased.Eta 𝕄
open import Tools.Function
import Tools.PropositionalEquality as PE
open import Tools.Sum
private variable
Γ : Con Term _
A B t u : Term _
opaque
Erased-β :
Erasedˢ-allowed →
Γ ⊢ t ∷ A →
Γ ⊢ erased [ t ] ≡ t ∷ A
Erased-β (Unit-ok , Σ-ok) ⊢t =
let ⊢A = wf-⊢∷ ⊢t in
Σ-β₁-≡ (Unitⱼ (∙ ⊢A) Unit-ok) ⊢t (starⱼ (wf ⊢A) Unit-ok) Σ-ok
opaque
erasedⱼ : Γ ⊢ t ∷ Erased A → Γ ⊢ erased t ∷ A
erasedⱼ ⊢t = fstⱼ′ ⊢t
opaque
erased-cong : Γ ⊢ t ≡ u ∷ Erased A → Γ ⊢ erased t ≡ erased u ∷ A
erased-cong t≡u = fst-cong′ t≡u
opaque
Erased-η-≡ :
Γ ⊢ t ∷ Erased A →
Γ ⊢ u ∷ Erased A →
Γ ⊢ erased t ≡ erased u ∷ A →
Γ ⊢ t ≡ u ∷ Erased A
Erased-η-≡ ⊢t ⊢u t≡u =
Σ-η′ ⊢t ⊢u t≡u (η-unit (sndⱼ′ ⊢t) (sndⱼ′ ⊢u) (inj₁ PE.refl))
opaque
[erased] :
Γ ⊢ t ∷ Erased A →
Γ ⊢ [ erased t ] ≡ t ∷ Erased A
[erased] ⊢t =
let ⊢A , ⊢Unit , Σˢ-ok = inversion-ΠΣ (wf-⊢∷ ⊢t)
Erased-ok = inversion-Unit ⊢Unit , Σˢ-ok
in
Erased-η-≡ (ET.[]ⱼ Erased-ok ⊢A (erasedⱼ ⊢t)) ⊢t $
Erased-β Erased-ok (erasedⱼ ⊢t)
opaque
inversion-erased :
Γ ⊢ erased t ∷ A →
∃₂ λ q B → Γ ⊢ t ∷ Σˢ 𝟘 , q ▷ A ▹ B × Σˢ-allowed 𝟘 q
inversion-erased ⊢erased =
case inversion-fst ⊢erased of λ {
(_ , C , q , _ , ⊢C , ⊢t , ≡B) →
case ⊢∷ΠΣ→ΠΣ-allowed ⊢t of λ {
Σˢ-ok →
q
, C
, conv ⊢t (ΠΣ-cong (_⊢_≡_.sym ≡B) (refl ⊢C) Σˢ-ok)
, Σˢ-ok }}