{-# OPTIONS --safe --without-K #-}
module IS4.Norm.NbE.Reification where
open import Data.Unit using (⊤; tt) renaming ()
open import Data.Product using (Σ; ∃; _,_; -,_) renaming (_×_ to _∧_; proj₁ to fst; proj₂ to snd)
open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans; subst; cong; cong₂; module ≡-Reasoning)
import Relation.Binary.Reasoning.Setoid as EqReasoning
open import IS4.Norm.NbE.Model
open import IS4.Term hiding (factorWk)
reflect : (a : Ty) → (n : Ne Γ a) → Tm' Γ a
reflect-pres-≋ : ∀ (a : Ty) {n n' : Ne Γ a} (n≡n' : n ≡ n') → reflect a n ≋[ evalTy a ] reflect a n'
reflect-natural : ∀ (a : Ty) (n : Ne Γ a) (w : Γ ⊆ Γ') → reflect a (wkNe w n) ≋[ evalTy a ] wk[ evalTy a ] w (reflect a n)
reify : (a : Ty) → (x : Tm' Γ a) → Nf Γ a
reify-pres-≋ : ∀ (a : Ty) {x x' : Tm' Γ a} (x≋x' : x ≋[ evalTy a ] x') → reify a x ≡ reify a x'
reify-natural : ∀ (a : Ty) (x : Tm' Γ a) (w : Γ ⊆ Γ') → reify a (wk[ evalTy a ] w x) ≡ wkNf w (reify a x)
var0' : (a : Ty) → Tm' (Γ `, a) a
var0' a = reflect a (var zero)
-- interpretation of neutrals
reflect ι n = n
reflect (a ⇒ b) n = record
{ fun = λ w p → reflect b (app (wkNe w n) (reify a p))
; pres-≋ = λ w p≋p' → reflect-pres-≋ b (cong (app (wkNe w n)) (reify-pres-≋ a p≋p'))
; natural = λ w w' p → let open EqReasoning ≋[ evalTy b ]-setoid in begin
wk[ evalTy b ] w' (reflect b (app (wkNe w n) (reify a p))) ≈˘⟨ reflect-natural b _ w' ⟩
reflect b (wkNe w' (app (wkNe w n) (reify a p))) ≡⟨⟩
reflect b (app (wkNe w' (wkNe w n)) (wkNf w' (reify a p))) ≡˘⟨ cong (λ m → reflect b (app _ m)) (reify-natural a p w') ⟩
reflect b (app (wkNe w' (wkNe w n)) (reify a (wk[ evalTy a ] w' p))) ≡⟨ cong (λ n → reflect b (app n _)) (wkNePres∙ w w' n) ⟩
reflect b (app (wkNe (w ∙ w') n) (reify a (wk[ evalTy a ] w' p))) ∎
}
reflect (□ a) n = record
{ fun = λ w (_ , e) → reflect a (unbox (wkNe w n) e)
; natural = λ w r@(_ , e) w' → let open EqReasoning ≋[ evalTy a ]-setoid in begin
reflect a (unbox (wkNe (w ∙ factorWk r w') n) (factorExt e w')) ≡˘⟨ cong (λ n → reflect a (unbox n _)) (wkNePres∙ w (factorWk r w') n) ⟩
reflect a (unbox (wkNe (factorWk r w') (wkNe w n)) (factorExt e w')) ≡⟨⟩
reflect a (wkNe w' (unbox (wkNe w n) e)) ≈⟨ reflect-natural a (unbox (wkNe w n) e) w' ⟩
wk[ evalTy a ] w' (reflect a (unbox (wkNe w n) e)) ∎
}
reflect-pres-≋ = λ a n≡n' → ≋[ evalTy a ]-reflexive (cong (reflect a) n≡n')
reflect-natural ι n w = ≋[ evalTy ι ]-refl
reflect-natural (a ⇒ b) n w = record
{ pw = λ w' p → let open EqReasoning ≋[ evalTy b ]-setoid in begin
reflect (a ⇒ b) (wkNe w n) .apply w' p ≡⟨⟩
reflect b (app (wkNe w' (wkNe w n)) (reify a p)) ≡⟨ cong (λ n → reflect b (app n (reify a p))) (wkNePres∙ w w' n) ⟩
reflect b (app (wkNe (w ∙ w') n) (reify a p)) ≡⟨⟩
wk[ evalTy (a ⇒ b) ] w (reflect (a ⇒ b) n) .apply w' p ∎
}
reflect-natural (□ a) n w = record
{ pw = λ w' r@(_ , e) → let open EqReasoning ≋[ evalTy a ]-setoid in begin
reflect (□ a) (wkNe w n) .apply w' r ≡⟨⟩
reflect a (unbox (wkNe w' (wkNe w n)) e) ≡⟨ cong (λ n → reflect a (unbox n e)) (wkNePres∙ w w' n) ⟩
reflect a (unbox (wkNe (w ∙ w') n) e) ≡⟨⟩
wk[ evalTy (□ a) ] w (reflect (□ a) n) .apply w' r ∎
}
-- reify values to normal forms
reify ι n = up n
reify (a ⇒ b) f = lam (reify b (f .apply fresh[ a ] (var0' a)))
reify (□ a) b = box (reify a (b .apply idWk new◁IS4))
reify-pres-≋ ι x≋x' = cong up x≋x'
reify-pres-≋ (a ⇒ b) x≋x' = cong lam (reify-pres-≋ b (x≋x' .pw fresh[ a ] (var0' a)))
reify-pres-≋ (□ a) x≋x' = cong box (reify-pres-≋ a (x≋x' .pw idWk new◁IS4))
reify-natural ι x w = refl
reify-natural (a ⇒ b) x w = let open ≡-Reasoning in begin
reify (a ⇒ b) (wk[ evalTy (a ⇒ b) ] w x) ≡⟨⟩
lam (reify b (x .apply (w ∙ fresh[ a ]) (var0' a))) ≡˘⟨ cong₂ (λ w n → lam (reify b (x .apply w (reflect a n)))) fresh-keep refl ⟩
lam (reify b (x .apply (fresh[ a ] ∙ keep[ a ] w) (reflect a (wkNe (keep[ a ] w) var0)))) ≡⟨ cong lam (reify-pres-≋ b (x .apply-≋ _ (reflect-natural a var0 (keep[ a ] w)))) ⟩
lam (reify b (x .apply (fresh[ a ] ∙ keep[ a ] w) (wk[ evalTy a ] (keep[ a ] w) (var0' a)))) ≡˘⟨ cong lam (reify-pres-≋ b (x .natural fresh[ a ] (keep[ a ] w) _)) ⟩
lam (reify b (wk[ evalTy b ] (keep[ a ] w) (x .apply fresh[ a ] (var0' a)))) ≡⟨ cong lam (reify-natural b _ (keep[ a ] w)) ⟩
lam (wkNf (keep[ a ] w) (reify b (x .apply fresh[ a ] (var0' a)))) ≡⟨⟩
wkNf w (reify (a ⇒ b) x) ∎
reify-natural (□ a) x w = let open ≡-Reasoning in begin
reify (□ a) (wk[ evalTy (□ a) ] w x) ≡⟨⟩
box (reify a (wk[ evalTy (□ a) ] w x .apply idWk new◁IS4)) ≡⟨⟩
box (reify a (x .apply (w ∙ idWk) new◁IS4)) ≡⟨ cong (λ w → box (reify a (x .apply w new◁IS4))) (rightIdWk w) ⟩
box (reify a (x .apply w new◁IS4)) ≡˘⟨ cong (λ w → box (reify a (x .apply w new◁IS4))) (leftIdWk w) ⟩
box (reify a (x .apply (idWk ∙ w) new◁IS4)) ≡⟨⟩
box (reify a (x .apply (idWk ∙ factorWk new◁IS4 (keep# w)) (factor◁ new◁IS4 (keep# w)))) ≡⟨ cong box (reify-pres-≋ a (x .natural idWk new◁IS4 (keep# w))) ⟩
box (reify a (wk[ evalTy a ] (keep# w) (x .apply idWk new◁IS4))) ≡⟨ cong box (reify-natural a (x .apply idWk new◁IS4) (keep# w)) ⟩
box (wkNf (keep# w) (reify a (x .apply idWk new◁IS4))) ≡⟨⟩
wkNf w (reify (□ a) x) ∎
-- (reflected) identity substitution (one direction of the prinicipal lemma?)
idₛ' : (Γ : Ctx) → Sub' Γ Γ
idₛ' [] = tt
idₛ' (Γ `, a) = record { elem = (wkSub' Γ fresh[ a ] (idₛ' Γ) , (var0' a)) }
idₛ' (Γ #) = elem (-, new◁IS4 , idₛ' Γ)
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.