{-# OPTIONS --safe --without-K #-}
module IS4.Term.NormalForm.Properties where

open import Relation.Binary.PropositionalEquality
  using (_≡_ ; refl ; trans ; subst₂ ; cong ; cong₂ ; module ≡-Reasoning)

open import PEUtil

open import IS4.Term.Base
open import IS4.Term.NormalForm.Base

private
  module _ {e : CExt Δ Γ ΓR} {e' : CExt Δ Γ' ΓR'} where
    cong-unbox≡′′ : {n : Ne Γ ( a)} {n' : Ne Γ' ( a)}
       (Γ≡Γ' : Γ  Γ')
       (n≡n' : subst1 Ne Γ≡Γ' n  n')
       unbox n e ≡[ Ne Δ a ] unbox n' e'
    cong-unbox≡′′ Γ≡Γ' n≡n' =
      idcong₄ unbox Γ≡Γ' (extRUniq′ Γ≡Γ' e e') n≡n' (ExtIsProp _ _)

  cong-unbox≡ : {n : Ne Γ ( a)} {n' : Ne Γ ( a)}
     (n≡n' : n  n')
     unbox n e ≡[ Ne _ a ] unbox n' e
  cong-unbox≡ = cong-unbox≡′′ refl

  cong-unbox≡2 : {n : Ne Γ ( a)}
     unbox n e ≡[ Ne _ a ] unbox n e'
  cong-unbox≡2 = cong-unbox≡′′ refl refl

  cong-unbox≡′ : {n : Ne Γ ( a)} {n' : Ne Γ ( a)}
     (n≡n' : n  n')
     unbox n e ≡[ Ne _ a ] unbox n' e'
  cong-unbox≡′ = cong-unbox≡′′ refl

------------------------
-- Naturality conditions
------------------------

-- Normal forms and neutrals obey "naturality" of embeddding, i.e.,
-- weakening can be commuted with embedding.

-- the mutual brothers normal forms and neutrals who,
-- as always, must be handled (mutually) together
nat-embNe : (w : Γ  Γ') (n : Ne Γ a)
   wkTm w (embNe n)  embNe (wkNe w n)
nat-embNf : (w : Γ  Γ') (n : Nf Γ a)
   wkTm w (embNf n)  embNf (wkNf w n)

nat-embNf w (up  n) = nat-embNe w n
nat-embNf w (lam n) = cong lam (nat-embNf (keep w) n)
nat-embNf w (box n) = cong box (nat-embNf (keep# w) n)

nat-embNe w (var   v)   = refl
nat-embNe w (app   n m) = cong₂ app   (nat-embNe w n) (nat-embNf w m)
nat-embNe w (unbox n e) = cong1 unbox (nat-embNe (factorWk e w) n)

wkNePresId : (n : Ne Γ a)  wkNe idWk n  n
wkNfPresId : (n : Nf Γ a)  wkNf idWk n  n

wkNePresId (var   v)   = cong  var (wkVarPresId v)
wkNePresId (app   n m) = cong₂ app (wkNePresId n) (wkNfPresId m)
wkNePresId (unbox n e) = let open ≡-Reasoning in begin
  wkNe idWk (unbox n e)
    ≡⟨⟩
  unbox (wkNe (factorWk e idWk) n) (factorExt e idWk)
    ≡⟨ cong-unbox≡′′
         (lCtxPresId e)
         (trans
           (subst-application1′ wkNe (lCtxPresId e))
           (cong1 wkNe (factorWkPresId e)))
     
  unbox (wkNe idWk n) e
    ≡⟨ cong1 unbox (wkNePresId n) 
  unbox n e 

wkNfPresId (up  n) = cong up  (wkNePresId n)
wkNfPresId (lam n) = cong lam (wkNfPresId n)
wkNfPresId (box n) = cong box (wkNfPresId n)

wkNePres∙ : (w : Γ  Γ') (w' : Γ'  Γ'') (n : Ne Γ a)
   wkNe w' (wkNe w n)  wkNe (w  w') n
wkNfPres∙ : (w : Γ  Γ') (w' : Γ'  Γ'') (n : Nf Γ a)
   wkNf w' (wkNf w n)  wkNf (w  w') n

wkNePres∙                 w w' (var        v)   = cong  var (wkVarPres∙ w w' v)
wkNePres∙                 w w' (app        n m) = cong₂ app (wkNePres∙  w w' n) (wkNfPres∙ w w' m)
wkNePres∙ {Γ'' = Γ''} {a} w w' (unbox {ΓL} n e) = let open ≡-Reasoning in begin
  wkNe w' (wkNe w (unbox n e))
    ≡⟨⟩
  unbox
    (wkNe (factorWk (factorExt e w) w') (wkNe (factorWk e w) n))
    (factorExt (factorExt e w) w')
    ≡⟨ cong-unbox≡′ (wkNePres∙ _ _ n) 
  unbox
    (wkNe (factorWk e w  factorWk (factorExt e w) w') n)
    (factorExt (factorExt e w) w')
    ≡˘⟨ cong-unbox≡′′
         (lCtxPres∙ e w w')
         (trans
           (subst-application1′ wkNe (lCtxPres∙ e w w'))
           (cong1 wkNe (factorWkPres∙ e w w')))
      
  unbox (wkNe (factorWk e (w  w')) n) (factorExt e (w  w'))
    ≡⟨⟩
  wkNe (w  w') (unbox n e) 

wkNfPres∙ w w' (up  n) = cong up  (wkNePres∙ w         w'         n)
wkNfPres∙ w w' (lam n) = cong lam (wkNfPres∙ (keep  w) (keep  w') n)
wkNfPres∙ w w' (box n) = cong box (wkNfPres∙ (keep# w) (keep# w') n)

Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.