\begin{code}
module Type.BetaNBE.Stability where
\end{code}

\begin{code}
open import Type
open import Type.BetaNormal
open import Type.BetaNormal.Equality
open import Type.BetaNBE
open import Type.BetaNBE.Completeness

open import Relation.Binary.PropositionalEquality
open import Function
\end{code}

If you take a normal form, embed it back into syntax and then
normalize it again, you get the same result. This is an important
property for substitution on normal forms: we don't want to eta expand
variables otherwise substituting in by the identity substitution can
perturb the expression.

\begin{code}
stability : ∀{Φ K}(n : Φ ⊢Nf⋆ K)  nf (embNf n)  n
stabilityNe : ∀{Φ K}(n : Φ ⊢Ne⋆ K)  CR K (eval (embNe n) (idEnv _)) (reflect n)

stability (Π B) =
  cong Π (trans (idext  { Z  reflectCR refl
                          ; (S α)  renVal-reflect S (` α)})
                       (embNf B))
                (stability B))
stability (A  B) = cong₂ _⇒_ (stability A) (stability B)
stability (ƛ B)    =
  cong ƛ (trans (reifyCR (idext  { Z  reflectCR refl
                                      ; (S α)  renVal-reflect S (` α)})
                                   (embNf B)))
                (stability B))
stability (con tcn)   = refl
stability (μ A B) = cong₂ μ (stability A) (stability B)
stability {K = *}     (ne n) = stabilityNe n
stability {K = K  J} (ne n) = reifyCR (stabilityNe n)

stabilityNe (` α)    = reflectCR refl
stabilityNe (n · n') = transCR
  (AppCR (stabilityNe n) (idext idCR (embNf n')))
  (reflectCR (cong₂ _·_ refl (stability n')))
\end{code}