module GST.ReifyReflect where
open import Prelude
open import WSLN
open import GST.Syntax
open import GST.Context
open import GST.TypeSystem
open import GST.WellScoped
open import GST.Setoid
open import GST.Renaming
open import GST.Substitution
open import GST.Admissible
open import GST.UniqueTypes
open import GST.NormalForm
open import GST.Presheaf
open import GST.TypeSemantics
โ : (A : Ty) โ โ^[ ๐ A โถ Norm A ]
โ : (A : Ty) โ โ^[ Neut A โถ ๐ A ]
โโ : (A : Ty){ฮ : Cx} โ โฃ ๐ A โ ฮ โฃ โ Tm
โโ A ๐ช = nt (hom (โ A) โ ๐ช)
โโโข : {A : Ty}{ฮ : Cx}(๐ช : โฃ ๐ A โ ฮ โฃ) โ ฮ โขโฟ โโ A ๐ช โถ A
โโโข ๐ช = pf (hom (โ _) โ ๐ช)
โโ : {A : Ty}{a : Tm}{ฮ : Cx} โ ( ฮ โขแต a โถ A) โ โฃ ๐ A โ ฮ โฃ
โโ q = hom (โ _) โ mkโฃNeutโฃ _ q
module reify
(A B : Ty)
(ฮ : Cx)
(x : ๐ธ)
โฆ _ : x # ฮ โฆ
where
ฮx : Cx
ฮx = ฮ โจ x โถ A
๐ : โฃ ๐ A โ ฮx โฃ
๐ = hom (โ A) โ newvar x A
module _ (ฯ : โ^[ ใ ฮ ร^ ๐ A โถ ๐ B ]) where
๐ซ : โฃ ๐ B โ ฮx โฃ
๐ซ = hom ฯ โ (proj A , ๐)
โ๐ซ : Tm
โ๐ซ = โโ B ๐ซ
n : โฃ Norm (A โ B) โ ฮ โฃ
nt n = ๐ A (x ๏ผ โ๐ซ)
pf n = Lam {x = x}
(subst (ฮป c โ ฮ โจ x โถ A โขโฟ c โถ B)
(symm (concAbs' x โ๐ซ))
(โโโข ๐ซ))
(#abs x โ๐ซ)
โ ๐๐๐ญ = id
hom (โ (A โ B)) {ฮ} = mkSetd[โถ]
(reify.n A B ฮ x)
(ฮป f โ cong (ฮป c โ ๐ A (x ๏ผ c))
(hom (โ B) โ f (proj A , reify.๐ A B ฮ x)))
where
x = new (supp ฮ)
instance
_ : x # ฮ
_ = newโ (supp ฮ)
ntl (โ (A โ B)) {ฮ} {ฮ'} p ฯ = k
where
x x' : ๐ธ
x = new (supp ฮ)
x' = new (supp ฮ')
instance
_ : x # ฮ
_ = newโ (supp ฮ)
_ : x' # ฮ'
_ = newโ (supp ฮ')
open reify A B ฮ x
open reify A B ฮ' x'
renaming (ฮx to ฮx' ; ๐ to ๐' ; ๐ซ to ๐ซ' ; โ๐ซ to โ๐ซ')
p' : โ[ ฮx' โถ ฮx ]
rn p' = rn p โ/ x := x'
pf p' = liftRn (pf p)
e' : Rn[ ฮ ] โ rn p ~ (rn p โ/ x := x')
e' y yโฮ with x โ y
... | no _ = refl
... | equ = รelim (โโยฌโ it yโฮ)
p'๐ : ๐ A โ ฮx' โ ๐' ~ (๐ A โโฒ p') โ ๐
p'๐ = ~Trans (๐ A โ ฮx')
(~Symm (๐ A โ ฮx')
(hom (โ A) โ cong ๐ฏ (:=Eq{f = rn p}{x'} x)))
(ntl (โ A) p' (newvar x A))
๐ฎ : ๐ B โ ฮx' โ hom ฯ โ (p โแตฃ proj A , ๐') ~
๐ B โโฒ p' โ (hom ฯ โ (proj A , ๐))
๐ฎ = ~Trans (๐ B โ ฮx')
(hom ฯ โ (e' , p'๐))
(ntl ฯ p' (proj A , ๐))
t t' : Tm
t = โโ B (hom ฯ โ (proj A , ๐))
t' = โโ B (hom ฯ โ (p โแตฃ proj A , ๐'))
k' : t' โก (rn p โ/ x := x') * t
k' =
begin
โโ B (hom ฯ โ (p โแตฃ proj A , ๐'))
โกโจ hom (โ B) โ ๐ฎ โฉ
โโ B ((๐ B โโฒ p') โ hom ฯ โ (proj A , ๐))
โกโจ ntl (โ B) p' (hom ฯ โ (proj A , ๐)) โฉ
(rn p โ/ x := x') * t
โ
k : ๐ A (x' ๏ผ t') โก rn p * ๐ A (x ๏ผ t)
k =
begin
๐ A (x' ๏ผ t')
โกโจ cong (ฮป c โ ๐ A (x' ๏ผ c)) k' โฉ
๐ A (x' ๏ผ (rn p โ/ x := x') * t)
โกหโจ cong (๐ A) (rnAbs (rn p) x x'
(โโ B (hom ฯ โ (proj A , ๐)))
ฮป y ya yx e โ โโยฌโ it
(subst (_โ dom ( ฮ')) (symm e)
(rnDom (pf p)
(โโโ (suppโข
(tyโฟ (โโโข{B} (hom ฯ โ (proj A , ๐)))) ya)
(โ๏ฝ๏ฝ(โ ๐ธsymm (โขโโ ๐ธ yx))))))) โฉ
rn p * ๐ A (x ๏ผ t)
โ
โ ๐๐๐ญ = neu
hom (hom (โ (A โ B)) โ mkโฃNeutโฃ a q) โ (p , ๐ช) = hom (โ B) โ
mkโฃNeutโฃ
((rn p * a) โ โโ A ๐ช)
(App (rnโขแต (pf p) q) (pf (hom (โ A) โ ๐ช)))
hom (hom (โ (A โ B)) โ mkโฃNeutโฃ a q) โ (e , e') = hom (โ B) โ
congโ _โ_
(rnRespSupp _ _ a (ฮป x r โ e x (suppโข (tyแต q) r)))
(hom (โ A) โ e')
ntl (hom (โ (A โ B)) โ mkโฃNeutโฃ a q) {_}{ฮ''} p' (p , ๐ช) =
~Trans (๐ B โ ฮ'')
(hom (โ B) โ congโ _โ_
(rnAssoc (rn p) (rn p') a)
(ntl (โ A) p' ๐ช))
(ntl (โ B) p' (mkโฃNeutโฃ
((rn p * a) โ โโ A ๐ช)
(App (rnโขแต (pf p) q) (pf (hom (โ A) โ ๐ช)))))
(hom (โ (_ โ B)) โ refl) (_ , _) = hom (โ B) โ refl
ntl (โ (A โ B)) {ฮ} {ฮ'} p' a {ฮ''} (p , ๐ช) = hom (โ B) โ
cong (ฮป c โ c โ nt (hom (โ A) โ ๐ช))
(symm (rnAssoc (rn p') (rn p) (ut a)))
๐ผโ : โ ฮ โ โฃ ๐ ฮ โ ฮ โฃ
๐ผโ โ = tt
๐ผโ (ฮ โจ _ โถ A) =
(๐ ฮ โโฒ proj A โ ๐ผโ ฮ , โโ{A} (Var (isInNew refl)))