-- correctness of selective CPS transformation -- tested on Agda 2.6.0, standard library 0.17 module tfp19 where open import Data.Unit open import Data.Empty open import Data.Nat open import Function open import Relation.Binary.PropositionalEquality -- annotation data ann : Set where P : ann -- pure I : ann -- impure data _≤ₐ_ : ann → ann → Set where P≤ₐP : P ≤ₐ P P≤ₐI : P ≤ₐ I I≤ₐI : I ≤ₐ I P≤ₐa : {a : ann} → P ≤ₐ a P≤ₐa {P} = P≤ₐP P≤ₐa {I} = P≤ₐI a≤ₐI : {a : ann} → a ≤ₐ I a≤ₐI {P} = P≤ₐI a≤ₐI {I} = I≤ₐI a≤ₐa : {a : ann} → a ≤ₐ a a≤ₐa {P} = P≤ₐP a≤ₐa {I} = I≤ₐI ≤ₐ-trans : {a₁ a₂ a₃ : ann} → a₁ ≤ₐ a₂ → a₂ ≤ₐ a₃ → a₁ ≤ₐ a₃ ≤ₐ-trans P≤ₐP leq₂ = leq₂ ≤ₐ-trans P≤ₐI leq₂ = P≤ₐa ≤ₐ-trans I≤ₐI leq₂ = leq₂ -- type data typ : Set where Nat : typ Boolean : typ _⇒_cps[_,_,_] : typ → typ → typ → typ → ann → typ -- constraint _≠_⇒_=i : typ → typ → ann → Set τ₁ ≠ τ₂ ⇒ P =i = τ₁ ≡ τ₂ τ₁ ≠ τ₂ ⇒ I =i = ⊤ τ₁≠τ₂⇒a₁≤ₐa₂=i : {τ₁ τ₂ : typ} → {a₁ a₂ : ann} → τ₁ ≠ τ₂ ⇒ a₁ =i → a₁ ≤ₐ a₂ → τ₁ ≠ τ₂ ⇒ a₂ =i τ₁≠τ₂⇒a₁≤ₐa₂=i {a₁ = P} {P} refl P≤ₐP = refl τ₁≠τ₂⇒a₁≤ₐa₂=i {a₁ = P} {I} refl P≤ₐI = tt τ₁≠τ₂⇒a₁≤ₐa₂=i {a₁ = I} tt I≤ₐI = tt -- source term mutual data value[_]_cps[τ,τ,P] (var : typ → Set) : typ → Set where Num : ℕ → value[ var ] Nat cps[τ,τ,P] Var : {τ₁ : typ} → var τ₁ → value[ var ] τ₁ cps[τ,τ,P] Fun : {a₁ : ann} → {a₂ : ann} → {τ₁ τ₂ τ₃ τ₄ : typ} → a₁ ≤ₐ a₂ → τ₃ ≠ τ₄ ⇒ a₁ =i → (var τ₂ → term[ var ] τ₁ cps[ τ₃ , τ₄ , a₁ ]) → value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₂ ]) cps[τ,τ,P] data term[_]_cps[_,_,_] (var : typ → Set) : typ → typ → typ → ann → Set where Val : {τ₁ τ₂ : typ} → value[ var ] τ₁ cps[τ,τ,P] → term[ var ] τ₁ cps[ τ₂ , τ₂ , P ] App : {a₁ a₂ a₃ a : ann} {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} → a₁ ≤ₐ a → a₂ ≤ₐ a → a₃ ≤ₐ a → τ₅ ≠ τ₆ ⇒ a₁ =i → τ₄ ≠ τ₅ ⇒ a₂ =i → τ₃ ≠ τ₄ ⇒ a₃ =i → term[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[ τ₅ , τ₆ , a₁ ] → term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ] → term[ var ] τ₁ cps[ τ₃ , τ₆ , a ] Reset : {a₁ : ann} → {τ₁ τ₂ τ₃ : typ} → τ₁ ≠ τ₂ ⇒ a₁ =i → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ] → term[ var ] τ₂ cps[ τ₃ , τ₃ , P ] Shift : (a₁ a₂ : ann) → {τ τ₁ τ₂ τ₃ τ₄ : typ} → τ₁ ≠ τ₂ ⇒ a₁ =i → (var (τ₃ ⇒ τ₄ cps[ τ , τ , a₂ ]) → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]) → term[ var ] τ₃ cps[ τ₄ , τ₂ , I ] -- well-formed terms satisfy answer-type constraints (not used) -- wf-term : {var : typ → Set} → {τ₁ τ₂ τ₃ : typ} → (a : ann) → -- (e : term[ var ] τ₁ cps[ τ₂ , τ₃ , a ]) → -- τ₂ ≠ τ₃ ⇒ a =i -- wf-term a (Val v) = refl -- wf-term (P) (App {P} {P} {P} leq₁ leq₂ leq₃ refl refl refl e₁ e₂) = refl -- wf-term (I) (App {P} {P} {P} leq₁ leq₂ leq₃ refl refl refl e₁ e₂) = tt -- wf-term a (App {P} {P} {I} leq₁ leq₂ I≤ₐI refl refl tt e₁ e₂) = tt -- wf-term a (App {P} {I} leq₁ I≤ₐI leq₃ refl tt c₃ e₁ e₂) = tt -- wf-term a (App {I} I≤ₐI leq₂ leq₃ tt c₂ c₃ e₁ e₂) = tt -- wf-term a (Reset τ₁ τ₂ τ₃ c e₁) = refl -- wf-term a (Shift a₁ a₂ τ₁ τ₂ τ₃ τ₄ τ₅ c e₁) = tt -- syntactically pure (not used) -- mutual -- syntactically-pureV : {var : typ → Set} → {τ₁ τ₂ : typ} → -- value[ var ] τ₁ cps[τ,τ,P] → Set -- syntactically-pureV v = ⊤ -- syntactically-pureT : {var : typ → Set} → {τ₁ τ₂ τ₃ : typ} → {a : ann} → -- term[ var ] τ₁ cps[ τ₂ , τ₃ , a ] → Set -- syntactically-pureT (Val x) = ⊤ -- syntactically-pureT (App leq₁ leq₂ leq₃ c₁ c₂ c₃ e₁ e₂) = ⊥ -- syntactically-pureT (Reset τ₁ τ₂ τ₃ c e₁) = ⊤ -- syntactically-pureT e = ⊥ -- substitution relation mutual data SubstVal {var : typ → Set} : {τ₁ τ₂ : typ} → (var τ₁ → value[ var ] τ₂ cps[τ,τ,P]) → value[ var ] τ₁ cps[τ,τ,P] → value[ var ] τ₂ cps[τ,τ,P] → Set where sVar= : {τ₁ : typ} {v : value[ var ] τ₁ cps[τ,τ,P]} → SubstVal (λ x → Var x) v v sVar≠ : {τ₁ τ₂ : typ} {v : value[ var ] τ₂ cps[τ,τ,P]} {x : var τ₁} → SubstVal (λ _ → Var x) v (Var x) sNum : {τ₁ : typ} {v : value[ var ] τ₁ cps[τ,τ,P]} {n : ℕ} → SubstVal (λ _ → Num n) v (Num n) sFun : {τ τ₁ τ₂ τ₃ τ₄ : typ} {a₁ a₂ : ann} → (leq : a₁ ≤ₐ a₂) → (c : τ₃ ≠ τ₄ ⇒ a₁ =i) → {e₁ : var τ₁ → var τ → term[ var ] τ₂ cps[ τ₃ , τ₄ , a₁ ]} → {v : value[ var ] τ₁ cps[τ,τ,P]} → {e₁′ : var τ → term[ var ] τ₂ cps[ τ₃ , τ₄ , a₁ ]} → ((x : var τ) → Subst (λ y → (e₁ y) x) v (e₁′ x)) → SubstVal (λ y → Fun leq c (e₁ y)) v (Fun leq c e₁′) data Subst {var : typ → Set} : {τ₁ τ₂ τ₃ τ₄ : typ} {a : ann} → (var τ₁ → term[ var ] τ₂ cps[ τ₃ , τ₄ , a ]) → value[ var ] τ₁ cps[τ,τ,P] → term[ var ] τ₂ cps[ τ₃ , τ₄ , a ] → Set where sVal : {τ τ₁ τ₂ : typ} → {v₁ : var τ → value[ var ] τ₁ cps[τ,τ,P]} → {v : value[ var ] τ cps[τ,τ,P]} → {v₁′ : value[ var ] τ₁ cps[τ,τ,P]} → SubstVal v₁ v v₁′ → Subst {τ₃ = τ₂} (λ y → Val (v₁ y)) v (Val v₁′) sApp : {a₁ a₂ a₃ a : ann} {τ τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} → (leq₁ : a₁ ≤ₐ a) → (leq₂ : a₂ ≤ₐ a) → (leq₃ : a₃ ≤ₐ a) → (c₁ : τ₅ ≠ τ₆ ⇒ a₁ =i) → (c₂ : τ₄ ≠ τ₅ ⇒ a₂ =i) → (c₃ : τ₃ ≠ τ₄ ⇒ a₃ =i) → {e₁ : var τ → term[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[ τ₅ , τ₆ , a₁ ]} {e₂ : var τ → term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]} {v : value[ var ] τ cps[τ,τ,P]} {e₁′ : term[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[ τ₅ , τ₆ , a₁ ]} {e₂′ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]} → Subst e₁ v e₁′ → Subst e₂ v e₂′ → Subst (λ y → App leq₁ leq₂ leq₃ c₁ c₂ c₃ (e₁ y) (e₂ y)) v (App leq₁ leq₂ leq₃ c₁ c₂ c₃ e₁′ e₂′) sShift : {a₁ a₂ : ann} {τ τ₁ τ₂ τ₃ τ₄ τ₅ : typ} → (c : τ₁ ≠ τ₂ ⇒ a₁ =i) → {e₁ : var τ₅ → var (τ₃ ⇒ τ₄ cps[ τ , τ , a₂ ]) → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]} → {v : value[ var ] τ₅ cps[τ,τ,P]} → {e₁′ : var (τ₃ ⇒ τ₄ cps[ τ , τ , a₂ ]) → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]} → ((k : var (τ₃ ⇒ τ₄ cps[ τ , τ , a₂ ])) → Subst (λ y → (e₁ y) k) v (e₁′ k)) → Subst (λ y → Shift a₁ a₂ c (e₁ y)) v (Shift a₁ a₂ c e₁′) sReset : {a₁ : ann} {τ τ₁ τ₂ τ₃ : typ} → (c : τ₁ ≠ τ₂ ⇒ a₁ =i) → {e₁ : var τ → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]} → {v : value[ var ] τ cps[τ,τ,P]} → {e₁′ : term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]} → Subst e₁ v e₁′ → Subst {τ₃ = τ₃} (λ y → Reset c (e₁ y)) v (Reset c e₁′) -- frame data frame[_,_cps[_,_,_]]_cps[_,_,_] (var : typ → Set) : typ → typ → typ → ann → typ → typ → typ → ann → Set where App₁ : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} {a a₁ a₂ a₃ : ann} → a₁ ≤ₐ a → a₂ ≤ₐ a → a₃ ≤ₐ a → τ₅ ≠ τ₆ ⇒ a₁ =i → τ₄ ≠ τ₅ ⇒ a₂ =i → τ₃ ≠ τ₄ ⇒ a₃ =i → (e₂ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]) → frame[ var , (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[ τ₅ , τ₆ , a₁ ]] τ₁ cps[ τ₃ , τ₆ , a ] App₂ : {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ a₃ : ann} → a₂ ≤ₐ a → a₃ ≤ₐ a → τ₄ ≠ τ₅ ⇒ a₂ =i → τ₃ ≠ τ₄ ⇒ a₃ =i → (v₁ : value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[τ,τ,P]) → frame[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] Reset : {τ₁ τ₂ τ₃ : typ} {a₁ : ann} → τ₁ ≠ τ₂ ⇒ a₁ =i → frame[ var , τ₁ cps[ τ₁ , τ₂ , a₁ ]] τ₂ cps[ τ₃ , τ₃ , P ] frame-plug : {var : typ → Set} {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} {a a₂ : ann} → frame[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₆ , a ] → term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ] → term[ var ] τ₁ cps[ τ₃ , τ₆ , a ] frame-plug (App₁ leq₁ leq₂ leq₃ c₁ c₂ c₃ e₂) e₁ = App leq₁ leq₂ leq₃ c₁ c₂ c₃ e₁ e₂ frame-plug {a = P} (App₂ leq₁ leq₂ c₁ c₂ v₁) e₂ = App P≤ₐP leq₁ leq₂ refl c₁ c₂ (Val v₁) e₂ frame-plug {a = I} (App₂ leq₁ leq₂ c₁ c₂ v₁) e₂ = App P≤ₐI leq₁ leq₂ refl c₁ c₂ (Val v₁) e₂ frame-plug {τ₁ = τ₁} {τ₂} {τ₃} (Reset c) e₁ = Reset c e₁ data same-frame′ {var : typ → Set} {τ₁ τ₅ : typ} {a₁ a₁′ : ann} : {τ τ₃ τ₄ τ₆ : typ} {a a′ : ann} → frame[ var , τ cps[ τ₅ , τ₄ , a₁ ]] τ₁ cps[ τ₃ , τ₆ , a ] → frame[ var , τ cps[ τ₅ , τ₄ , a₁′ ]] τ₁ cps[ τ₃ , τ₆ , a′ ] → Set where App₁ : {τ₂ τ₃ τ₄ τ₆ : typ} → {a a′ a₂ a₃ : ann} → (a₁≤ₐa : a₁ ≤ₐ a) → (a₂≤ₐa : a₂ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (a₁′≤ₐa′ : a₁′ ≤ₐ a′) → (a₂≤ₐa′ : a₂ ≤ₐ a′) → (a₃≤ₐa′ : a₃ ≤ₐ a′) → (a₁′≤ₐa₁ : a₁′ ≤ₐ a₁) → (a′≤ₐa : a′ ≤ₐ a) → (c₁ : τ₅ ≠ τ₆ ⇒ a₁ =i) → (c₂ : τ₄ ≠ τ₅ ⇒ a₂ =i) → (c₃ : τ₃ ≠ τ₄ ⇒ a₃ =i) → (c₁′ : τ₅ ≠ τ₆ ⇒ a₁′ =i) → (e₂ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]) → same-frame′ (App₁ a₁≤ₐa a₂≤ₐa a₃≤ₐa c₁ c₂ c₃ e₂) (App₁ a₁′≤ₐa′ a₂≤ₐa′ a₃≤ₐa′ c₁′ c₂ c₃ e₂) App₂ : {τ₂ τ₃ τ₆ : typ} {a a′ a₃ : ann} → (a₁≤ₐa : a₁ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (a₁′≤ₐa′ : a₁′ ≤ₐ a′) → (a₃≤ₐa′ : a₃ ≤ₐ a′) → (a₁′≤ₐa₁ : a₁′ ≤ₐ a₁) → (a′≤ₐa : a′ ≤ₐ a) → (c₂ : τ₅ ≠ τ₆ ⇒ a₁ =i) → (c₃ : τ₃ ≠ τ₅ ⇒ a₃ =i) → (c₂′ : τ₅ ≠ τ₆ ⇒ a₁′ =i) → (v₁ : value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₅ , a₃ ]) cps[τ,τ,P]) → same-frame′ (App₂ a₁≤ₐa a₃≤ₐa c₂ c₃ v₁) (App₂ a₁′≤ₐa′ a₃≤ₐa′ c₂′ c₃ v₁) Reset : {τ₆ : typ} → (a₁′≤ₐa₁ : a₁′ ≤ₐ a₁) → (c : τ₅ ≠ τ₁ ⇒ a₁ =i) → (c′ : τ₅ ≠ τ₁ ⇒ a₁′ =i) → same-frame′ {τ₃ = τ₆} (Reset c) (Reset c′) -- context (not used) -- data context[_,_cps[_,_,_]]_cps[_,_,_] (var : typ → Set) -- : typ → typ → typ → ann → typ → typ → typ → ann → Set where -- Hole : {τ₁ τ₂ τ₃ : typ} {a : ann} → -- τ₂ ≠ τ₃ ⇒ a =i → -- context[ var , τ₁ cps[ τ₂ , τ₃ , a ]] τ₁ cps[ τ₂ , τ₃ , a ] -- Frame : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ τ₇ : typ} {a₁ a₂ a₃ : ann} → -- (f : frame[ var , τ₄ cps[ τ₅ , τ₃ , a₂ ]] τ₆ -- cps[ τ₇ , τ₃ , a₃ ]) → -- (e : context[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ -- cps[ τ₅ , τ₃ , a₂ ]) → -- context[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₆ cps[ τ₇ , τ₃ , a₃ ] -- context-plug : {var : typ → Set} -- {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ : ann} → -- context[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ -- cps[ τ₃ , τ₅ , a ] → -- term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ] → -- term[ var ] τ₁ cps[ τ₃ , τ₅ , a ] -- context-plug (Hole c) e₁ = e₁ -- context-plug (Frame f con) e₁ = frame-plug f (context-plug con e₁) -- pure frame data pframe[_,_cps[_,_,_]]_cps[_,_,_] (var : typ → Set) : typ → typ → typ → ann → typ → typ → typ → ann → Set where App₁ : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} {a a₁ a₂ a₃ : ann} → a₁ ≤ₐ a → a₂ ≤ₐ a → a₃ ≤ₐ a → τ₅ ≠ τ₆ ⇒ a₁ =i → τ₄ ≠ τ₅ ⇒ a₂ =i → τ₃ ≠ τ₄ ⇒ a₃ =i → (e₂ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]) → pframe[ var , (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[ τ₅ , τ₆ , a₁ ]] τ₁ cps[ τ₃ , τ₆ , a ] App₂ : {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ a₃ : ann} → a₂ ≤ₐ a → a₃ ≤ₐ a → τ₄ ≠ τ₅ ⇒ a₂ =i → τ₃ ≠ τ₄ ⇒ a₃ =i → (v₁ : value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , a₃ ]) cps[τ,τ,P]) → pframe[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] pframe-plug : {var : typ → Set} {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ : ann} → pframe[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] → term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ] → term[ var ] τ₁ cps[ τ₃ , τ₅ , a ] pframe-plug (App₁ leq₁ leq₂ leq₃ c₁ c₂ c₃ e₂) e₁ = App leq₁ leq₂ leq₃ c₁ c₂ c₃ e₁ e₂ pframe-plug (App₂ leq₁ leq₂ c₁ c₂ v₁) e₂ = App P≤ₐa leq₁ leq₂ refl c₁ c₂ (Val v₁) e₂ wf-pframe : {var : typ → Set} {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ : ann} → pframe[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] → τ₃ ≠ τ₅ ⇒ a =i wf-pframe {a = P} (App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) = refl wf-pframe {a = I} (App₁ leq₁ leq₂ leq₃ c₁ c₂ c₃ e₂) = tt wf-pframe {a = P} (App₂ P≤ₐP P≤ₐP refl refl v₁) = refl wf-pframe {a = I} (App₂ leq₁ leq₂ c₁ c₂ v₁) = tt {- data same-pframe {var : typ → Set} {τ₁ τ₃ τ₅ τ₆ : typ} {a a₁ : ann} : {τ τ₇ : typ} → pframe[ var , τ cps[ τ₅ , τ₆ , I ]] τ₁ cps[ τ₃ , τ₆ , I ] → pframe[ var , τ cps[ τ₅ , τ₇ , a₁ ]] τ₁ cps[ τ₃ , τ₇ , a ] → Set where App₁ : {τ₂ τ₄ : typ} → {a₂ a₃ : ann} → (a₁≤ₐa : a₁ ≤ₐ a) → (a₂≤ₐa : a₂ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (c₁ : τ₅ ≠ τ₆ ⇒ a₁ =i) → (c₂ : τ₄ ≠ τ₅ ⇒ a₂ =i) → (c₃ : τ₃ ≠ τ₄ ⇒ a₃ =i) → (e₂ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]) → same-pframe (App₁ I≤ₐI a≤ₐI a≤ₐI tt c₂ c₃ e₂) (App₁ a₁≤ₐa a₂≤ₐa a₃≤ₐa c₁ c₂ c₃ e₂) App₂ : {τ τ₂ τ₇ : typ} {a₃ : ann} → (a₁≤ₐa : a₁ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (c₁ : τ₅ ≠ τ₇ ⇒ a₁ =i) → (c₃ : τ₃ ≠ τ₅ ⇒ a₃ =i) → (v₁ : value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₅ , a₃ ]) cps[τ,τ,P]) → same-pframe (App₂ I≤ₐI a≤ₐI tt c₃ v₁) (App₂ a₁≤ₐa a₃≤ₐa c₁ c₃ v₁) -} data same-pframe′ {var : typ → Set} {τ₁ τ₃ τ₅ τ₆ : typ} {a a′ : ann} : {τ : typ} {a₁ a₁′ : ann} → pframe[ var , τ cps[ τ₅ , τ₆ , a₁ ]] τ₁ cps[ τ₃ , τ₆ , a ] → pframe[ var , τ cps[ τ₅ , τ₆ , a₁′ ]] τ₁ cps[ τ₃ , τ₆ , a′ ] → Set where App₁ : {τ₂ τ₄ : typ} → {a₁ a₁′ a₂ a₃ : ann} → (a₁≤ₐa : a₁ ≤ₐ a) → (a₂≤ₐa : a₂ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (a₁′≤ₐa′ : a₁′ ≤ₐ a′) → (a₂≤ₐa′ : a₂ ≤ₐ a′) → (a₃≤ₐa′ : a₃ ≤ₐ a′) → (a₁′≤ₐa₁ : a₁′ ≤ₐ a₁) → (a′≤ₐa : a′ ≤ₐ a) → (c₁ : τ₅ ≠ τ₆ ⇒ a₁ =i) → (c₂ : τ₄ ≠ τ₅ ⇒ a₂ =i) → (c₃ : τ₃ ≠ τ₄ ⇒ a₃ =i) → (c₁′ : τ₅ ≠ τ₆ ⇒ a₁′ =i) → (e₂ : term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ]) → same-pframe′ (App₁ a₁≤ₐa a₂≤ₐa a₃≤ₐa c₁ c₂ c₃ e₂) (App₁ a₁′≤ₐa′ a₂≤ₐa′ a₃≤ₐa′ c₁′ c₂ c₃ e₂) App₂ : {τ₂ : typ} {a₂ a₂′ a₃ : ann} → (a₂≤ₐa : a₂ ≤ₐ a) → (a₃≤ₐa : a₃ ≤ₐ a) → (a₂′≤ₐa′ : a₂′ ≤ₐ a′) → (a₃≤ₐa′ : a₃ ≤ₐ a′) → (a₂′≤ₐa₂ : a₂′ ≤ₐ a₂) → (a′≤ₐa : a′ ≤ₐ a) → (c₂ : τ₅ ≠ τ₆ ⇒ a₂ =i) → (c₃ : τ₃ ≠ τ₅ ⇒ a₃ =i) → (c₂′ : τ₅ ≠ τ₆ ⇒ a₂′ =i) → (v₁ : value[ var ] (τ₂ ⇒ τ₁ cps[ τ₃ , τ₅ , a₃ ]) cps[τ,τ,P]) → same-pframe′ (App₂ a₂≤ₐa a₃≤ₐa c₂ c₃ v₁) (App₂ a₂′≤ₐa′ a₃≤ₐa′ c₂′ c₃ v₁) -- pure context : for RShift data pcontext[_,_cps[_,_,_]]_cps[_,_,_] (var : typ → Set) : typ → typ → typ → ann → typ → typ → typ → ann → Set where Hole : {τ₁ τ₂ τ₃ : typ} {a : ann} → τ₂ ≠ τ₃ ⇒ a =i → pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a ]] τ₁ cps[ τ₂ , τ₃ , a ] Frame : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ τ₇ : typ} {a₁ a₂ a₃ : ann} → (f : pframe[ var , τ₄ cps[ τ₅ , τ₃ , a₂ ]] τ₆ cps[ τ₇ , τ₃ , a₃ ]) → (e : pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ cps[ τ₅ , τ₃ , a₂ ]) → pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₆ cps[ τ₇ , τ₃ , a₃ ] pcontext-plug : {var : typ → Set} {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} → {a a₂ : ann} → pcontext[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] → term[ var ] τ₂ cps[ τ₄ , τ₅ , a₂ ] → term[ var ] τ₁ cps[ τ₃ , τ₅ , a ] pcontext-plug (Hole c) e₁ = e₁ pcontext-plug (Frame f p) e₁ = pframe-plug f (pcontext-plug p e₁) wf-pcontext : {var : typ → Set} {τ₁ τ₂ τ₃ τ₄ τ₅ : typ} {a a₂ : ann} → pcontext[ var , τ₂ cps[ τ₄ , τ₅ , a₂ ]] τ₁ cps[ τ₃ , τ₅ , a ] → τ₃ ≠ τ₅ ⇒ a =i wf-pcontext (Hole c) = c wf-pcontext (Frame f p) = wf-pframe f {- data same-pcontext {var : typ → Set} {τ₁ τ₂ τ₃ : typ} : {τ₄ τ₆ τ₇ τ₈ : typ} {a : ann} → pcontext[ var , τ₁ cps[ τ₂ , τ₃ , I ]] τ₄ cps[ τ₇ , τ₃ , I ] → pcontext[ var , τ₁ cps[ τ₂ , τ₂ , P ]] τ₆ cps[ τ₇ , τ₈ , a ] → Set where Hole : same-pcontext (Hole tt) (Hole refl) Frame : {τ₄ τ₅ τ₆ τ₇ : typ} → {a₂ a₃ : ann} → {f₁ : pframe[ var , τ₄ cps[ τ₅ , τ₃ , I ]] τ₆ cps[ τ₇ , τ₃ , I ]} → {f₂ : pframe[ var , τ₄ cps[ τ₅ , τ₂ , a₂ ]] τ₆ cps[ τ₇ , τ₂ , a₃ ]} → same-pframe f₁ f₂ → {p₁ : pcontext[ var , τ₁ cps[ τ₂ , τ₃ , I ]] τ₄ cps[ τ₅ , τ₃ , I ]} → {p₂ : pcontext[ var , τ₁ cps[ τ₂ , τ₂ , P ]] τ₄ cps[ τ₅ , τ₂ , a₂ ]} → same-pcontext p₁ p₂ → same-pcontext (Frame f₁ p₁) (Frame f₂ p₂) -} data same-pcontext′ {var : typ → Set} {τ₁ τ₂ τ₃ : typ} : {τ₄ τ₆ τ₇ : typ} {a₁ a₁′ a₃ a₃′ : ann} → pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ cps[ τ₇ , τ₃ , a₃ ] → pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁′ ]] τ₆ cps[ τ₇ , τ₃ , a₃′ ] → Set where Hole : {a₁ a₁′ : ann} → (c₁ : τ₂ ≠ τ₃ ⇒ a₁ =i) → (c₁′ : τ₂ ≠ τ₃ ⇒ a₁′ =i) → same-pcontext′ (Hole c₁) (Hole c₁′) Frame : {τ₄ τ₅ τ₆ τ₇ : typ} → {a₁ a₁′ a₂ a₂′ a₃ a₃′ : ann} → {a₁≤ₐa₂ : a₁ ≤ₐ a₂} → {a₁′≤ₐa₂′ : a₁′ ≤ₐ a₂′} → {f₁ : pframe[ var , τ₄ cps[ τ₅ , τ₃ , a₂ ]] τ₆ cps[ τ₇ , τ₃ , a₃ ]} → {f₂ : pframe[ var , τ₄ cps[ τ₅ , τ₃ , a₂′ ]] τ₆ cps[ τ₇ , τ₃ , a₃′ ]} → same-pframe′ f₁ f₂ → {p₁ : pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ cps[ τ₅ , τ₃ , a₂ ]} → {p₂ : pcontext[ var , τ₁ cps[ τ₂ , τ₃ , a₁′ ]] τ₄ cps[ τ₅ , τ₃ , a₂′ ]} → same-pcontext′ p₁ p₂ → same-pcontext′ (Frame f₁ p₁) (Frame f₂ p₂) -- reduction rules data Reduce {var : typ → Set} : {τ₁ τ₂ τ₃ : typ} → {a₁ a₂ : ann} → term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ] → term[ var ] τ₁ cps[ τ₂ , τ₃ , a₂ ] → Set where RBeta : {τ τ₁ τ₂ τ₃ : typ} → {a a₁ a₃ : ann} → {e₁ : var τ → term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]} → {v₂ : value[ var ] τ cps[τ,τ,P]} → {e₁′ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]} → (a₁≤ₐa₃ : a₁ ≤ₐ a₃) → (a₃≤ₐa : a₃ ≤ₐ a) → (c₁ : τ₂ ≠ τ₃ ⇒ a₁ =i) → (c₃ : τ₂ ≠ τ₃ ⇒ a₃ =i) → Subst e₁ v₂ e₁′ → Reduce (App P≤ₐa P≤ₐa a₃≤ₐa refl refl c₃ (Val (Fun a₁≤ₐa₃ c₁ e₁)) (Val v₂)) e₁′ RFrame : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} → {a₁ a₁′ a₂ : ann} → {e₁ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]} → {e₂ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁′ ]} → {f₁ : frame[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ cps[ τ₅ , τ₆ , a₂ ]} → {f₂ : frame[ var , τ₁ cps[ τ₂ , τ₃ , a₁′ ]] τ₄ cps[ τ₅ , τ₆ , a₂ ]} → same-frame′ f₁ f₂ → -- changed Reduce e₁ e₂ → Reduce (frame-plug f₁ e₁) (frame-plug f₂ e₂) RReset : {τ₁ τ₂ : typ} → {v₁ : value[ var ] τ₁ cps[τ,τ,P]} → Reduce {τ₂ = τ₂} (Reset refl (Val v₁)) (Val v₁) RShift : {τ₀ τ₁ τ₃ τ₄ τ α : typ} → {a₁ a₂ a₃ a₄ a₅ : ann} → {a₁≤ₐa₃ : a₁ ≤ₐ a₃} → {a₃≤ₐa₄ : a₃ ≤ₐ a₄} → (p₁ : pcontext[ var , τ₀ cps[ τ , τ , I ]] τ₄ cps[ τ₄ , τ , I ]) → (p₂ : pcontext[ var , τ₀ cps[ τ , τ , P ]] τ₄ cps[ τ₄ , τ , a₅ ]) → same-pcontext′ p₁ p₂ → -- changed (c : τ₁ ≠ τ ⇒ a₁ =i) → (c₅ : τ₄ ≠ τ ⇒ a₅ =i) → (e₁ : var (τ₀ ⇒ τ cps[ α , α , a₂ ]) → term[ var ] τ₁ cps[ τ₁ , τ , a₁ ]) → Reduce {τ₂ = τ₃} (Reset tt (pcontext-plug p₁ (Shift a₁ a₂ c e₁))) (Reset {a₁ = a₄} (τ₁≠τ₂⇒a₁≤ₐa₂=i c (≤ₐ-trans a₁≤ₐa₃ a₃≤ₐa₄)) (App P≤ₐa P≤ₐa a₃≤ₐa₄ refl refl (τ₁≠τ₂⇒a₁≤ₐa₂=i c a₁≤ₐa₃) (Val (Fun a₁≤ₐa₃ c e₁)) (Val (Fun P≤ₐa refl (λ x → let e = pcontext-plug p₂ (Val (Var x)) in Reset (wf-pcontext {τ₂ = τ₀} p₂) e))))) data Reduce* {var : typ → Set} : {τ₁ τ₂ τ₃ : typ} {a₁ a₂ : ann} → term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ] → term[ var ] τ₁ cps[ τ₂ , τ₃ , a₂ ] → Set where R*Id : {τ₁ τ₂ τ₃ : typ} {a₁ : ann} → (e : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]) → Reduce* e e R*Trans : {τ₁ τ₂ τ₃ : typ} {a₁ a₂ a₃ : ann} → (e₁ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]) → (e₂ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₂ ]) → (e₃ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₃ ]) → Reduce e₁ e₂ → Reduce* e₂ e₃ → Reduce* e₁ e₃ -- target type data cpstyp : Set where Nat : cpstyp Boolean : cpstyp _⇒_ : cpstyp → cpstyp → cpstyp -- target term mutual data cpsvalue[_] (var : cpstyp → Set) : cpstyp → Set where CPSVar : {τ₁ : cpstyp} → var τ₁ → cpsvalue[ var ] τ₁ CPSNum : ℕ → cpsvalue[ var ] Nat CPSFun : {τ₁ τ₂ : cpstyp} → (var τ₂ → cpsterm[ var ] τ₁) → cpsvalue[ var ] (τ₂ ⇒ τ₁) data cpsterm[_] (var : cpstyp → Set) : cpstyp → Set where CPSVal : {τ₁ : cpstyp} → cpsvalue[ var ] τ₁ → cpsterm[ var ] τ₁ CPSApp : {τ₁ τ₂ : cpstyp} → cpsterm[ var ] (τ₂ ⇒ τ₁) → cpsterm[ var ] τ₂ → cpsterm[ var ] τ₁ CPSLet : {τ₁ τ₂ : cpstyp} → cpsterm[ var ] τ₁ → (var τ₁ → cpsterm[ var ] τ₂) → cpsterm[ var ] τ₂ -- CPS transformation cpsT : typ → cpstyp cpsT Nat = Nat cpsT Boolean = Boolean cpsT (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , P ]) = cpsT τ₂ ⇒ cpsT τ₁ cpsT (τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , I ]) = cpsT τ₂ ⇒ ((cpsT τ₁ ⇒ cpsT τ₃) ⇒ cpsT τ₄) mutual cpsV : {τ₁ : typ} → {var : cpstyp → Set} → value[ var ∘ cpsT ] τ₁ cps[τ,τ,P] → cpsvalue[ var ] (cpsT τ₁) cpsV (Num n) = CPSNum n cpsV (Var x) = CPSVar x cpsV (Fun P≤ₐP refl e₁) = CPSFun (λ x → cpsP (e₁ x)) cpsV (Fun P≤ₐI refl e₁) = CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))) cpsV (Fun I≤ₐI tt e₁) = CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))) cpsP : {τ₁ τ₂ : typ} → {var : cpstyp → Set} → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ] → cpsterm[ var ] (cpsT τ₁) cpsP (Val x) = CPSVal (cpsV x) cpsP (App P≤ₐP P≤ₐP P≤ₐP refl refl refl e₁ e₂) = CPSApp (cpsP e₁) (cpsP e₂) cpsP (Reset {P} refl e₁) = cpsP e₁ cpsP (Reset {I} tt e₁) = cpsI e₁ CPSVal cpsI : {τ₁ τ₂ τ₃ : typ} → {var : cpstyp → Set} → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ] → (cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → cpsterm[ var ] (cpsT τ₃) cpsI (App P≤ₐI P≤ₐI P≤ₐI refl refl refl e₁ e₂) κ = CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (cpsP e₁) (cpsP e₂)) cpsI (App P≤ₐI P≤ₐI I≤ₐI refl refl tt e₁ e₂) κ = CPSApp (CPSApp (cpsP e₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ(CPSVar v)))) cpsI (App P≤ₐI I≤ₐI P≤ₐI refl tt refl e₁ e₂) κ = CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (cpsP e₁) cpsI (App P≤ₐI I≤ₐI I≤ₐI refl tt tt e₁ e₂) κ = CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))))))) (cpsP e₁) cpsI (App I≤ₐI P≤ₐI P≤ₐI tt refl refl e₁ e₂) κ = cpsI e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) cpsI (App I≤ₐI P≤ₐI I≤ₐI tt refl tt e₁ e₂) κ = cpsI e₁ (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) cpsI (App I≤ₐI I≤ₐI P≤ₐI tt tt refl e₁ e₂) κ = cpsI e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) cpsI (App I≤ₐI I≤ₐI I≤ₐI tt tt tt e₁ e₂) κ = cpsI e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))))) cpsI (Shift P P refl e₁) κ = CPSLet (CPSVal (CPSFun (λ a → κ (CPSVar a)))) (λ x → cpsP (e₁ x)) cpsI (Shift P I refl e₁) κ = CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (κ (CPSVar a))))))) (λ x → cpsP (e₁ x)) cpsI (Shift I P tt e₁) κ = CPSLet (CPSVal (CPSFun (λ a → κ (CPSVar a)))) (λ x → cpsI (e₁ x) (λ v → CPSVal v)) cpsI (Shift I I tt e₁) κ = CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (κ (CPSVar a))))))) (λ x → cpsI (e₁ x) (λ v → CPSVal v)) cpsPmain : {τ₁ τ₂ : typ} → {var : cpstyp → Set} → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ] → cpsterm[ var ] (cpsT τ₁) cpsPmain t = cpsP t cpsImain : {τ₁ τ₂ τ₃ : typ} → {var : cpstyp → Set} → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ] → cpsterm[ var ] ((cpsT τ₁ ⇒ cpsT τ₂) ⇒ cpsT τ₃) cpsImain t = CPSVal (CPSFun (λ k → cpsI t (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v)))) -- cpsframe data cpsframe[_,_] (var : cpstyp → Set) : cpstyp → cpstyp → Set where CPSApp₁ : {τ₁ τ₂ : cpstyp} → (e₂ : cpsterm[ var ] τ₂) → cpsframe[ var , τ₂ ⇒ τ₁ ] τ₁ CPSApp₂ : {τ₁ τ₂ : cpstyp} → (v₁ : cpsvalue[ var ] (τ₂ ⇒ τ₁)) → cpsframe[ var , τ₂ ] τ₁ cpsframe-plug : {var : cpstyp → Set} → {τ₁ τ₂ : cpstyp} → cpsframe[ var , τ₂ ] τ₁ → cpsterm[ var ] τ₂ → cpsterm[ var ] τ₁ cpsframe-plug (CPSApp₁ e₂) e₁ = CPSApp e₁ e₂ cpsframe-plug (CPSApp₂ v₁) e₂ = CPSApp (CPSVal v₁) e₂ -- cpscontext data cpscontext[_,_] (var : cpstyp → Set) : cpstyp → cpstyp → Set where CPSHole : {τ₁ : cpstyp} → cpscontext[ var , τ₁ ] τ₁ CPSFrame : {τ₁ τ₂ τ₃ : cpstyp} → cpsframe[ var , τ₂ ] τ₃ → cpscontext[ var , τ₁ ] τ₂ → cpscontext[ var , τ₁ ] τ₃ cpscontext-plug : {var : cpstyp → Set} {τ₁ τ₂ : cpstyp} → cpscontext[ var , τ₂ ] τ₁ → cpsterm[ var ] τ₂ → cpsterm[ var ] τ₁ cpscontext-plug CPSHole e₁ = e₁ cpscontext-plug (CPSFrame f p) e₁ = cpsframe-plug f (cpscontext-plug p e₁) mutual data cpsSubstVal {var : cpstyp → Set} : {τ₁ τ₂ : cpstyp} → (var τ₁ → cpsvalue[ var ] τ₂) → cpsvalue[ var ] τ₁ → cpsvalue[ var ] τ₂ → Set where sVar= : {τ₁ : cpstyp} {v : cpsvalue[ var ] τ₁} → cpsSubstVal (λ x → CPSVar x) v v sVar≠ : {τ₁ τ₂ : cpstyp} {v : cpsvalue[ var ] τ₂} {x : var τ₁} → cpsSubstVal (λ _ → CPSVar x) v (CPSVar x) sNum : {τ₁ : cpstyp} {v : cpsvalue[ var ] τ₁} {n : ℕ} → cpsSubstVal (λ _ → CPSNum n) v (CPSNum n) sFun : {τ τ₁ τ₂ : cpstyp} → {e₁ : var τ₁ → var τ → cpsterm[ var ] τ₂} → {v : cpsvalue[ var ] τ₁} → {e₁′ : var τ → cpsterm[ var ] τ₂} → ((x : var τ) → cpsSubst (λ y → (e₁ y) x) v (e₁′ x)) → cpsSubstVal (λ y → CPSFun (e₁ y)) v (CPSFun e₁′) data cpsSubst {var : cpstyp → Set} : {τ₁ τ₂ : cpstyp} → (var τ₁ → cpsterm[ var ] τ₂) → cpsvalue[ var ] τ₁ → cpsterm[ var ] τ₂ → Set where sVal : {τ τ₁ : cpstyp} → {v₁ : var τ → cpsvalue[ var ] τ₁} → {v : cpsvalue[ var ] τ} → {v₁′ : cpsvalue[ var ] τ₁} → cpsSubstVal v₁ v v₁′ → cpsSubst (λ y → CPSVal (v₁ y)) v (CPSVal v₁′) sApp : {τ τ₁ τ₂ : cpstyp} → {e₁ : var τ → cpsterm[ var ] (τ₂ ⇒ τ₁)} → {e₂ : var τ → cpsterm[ var ] τ₂} → {v : cpsvalue[ var ] τ} → {e₁′ : cpsterm[ var ] (τ₂ ⇒ τ₁)} → {e₂′ : cpsterm[ var ] τ₂} → cpsSubst e₁ v e₁′ → cpsSubst e₂ v e₂′ → cpsSubst (λ y → CPSApp (e₁ y) (e₂ y)) v (CPSApp e₁′ e₂′) sLet : {τ τ₁ τ₂ : cpstyp} → {e₁ : var τ₁ → cpsterm[ var ] τ} → {e₂ : var τ₁ → var τ → cpsterm[ var ] τ₂} → {v : cpsvalue[ var ] τ₁} → {e₁′ : cpsterm[ var ] τ} → {e₂′ : var τ → cpsterm[ var ] τ₂} → ((x : var τ) → cpsSubst (λ y → (e₂ y) x) v (e₂′ x)) → ((x : var τ) → cpsSubst (λ y → e₁ y) v e₁′) → cpsSubst (λ y → CPSLet (e₁ y) (e₂ y)) v (CPSLet e₁′ e₂′) data cpsequal {var : cpstyp → Set} : {τ₁ : cpstyp} → cpsterm[ var ] τ₁ → cpsterm[ var ] τ₁ → Set where eqBeta : {τ₁ τ₂ : cpstyp} → {e₁ : var τ₂ → cpsterm[ var ] τ₁} → {v : cpsvalue[ var ] τ₂} → {e₂ : cpsterm[ var ] τ₁} → cpsSubst e₁ v e₂ → cpsequal (CPSApp (CPSVal (CPSFun e₁)) (CPSVal v)) e₂ eqLet : {τ₁ τ₂ : cpstyp} → {v₁ : cpsvalue[ var ] τ₁} → {e₂ : var τ₁ → cpsterm[ var ] τ₂} → {e₂′ : cpsterm[ var ] τ₂} → cpsSubst e₂ v₁ e₂′ → cpsequal (CPSLet (CPSVal v₁) e₂) e₂′ eqOmega : {τ₁ τ₂ : cpstyp} → {con : cpscontext[ var , τ₂ ] τ₁} → {e₁ : cpsterm[ var ] τ₂} → cpsequal (CPSApp (CPSVal (CPSFun (λ x → cpscontext-plug con (CPSVal (CPSVar x))))) e₁) (cpscontext-plug con e₁) eqApp₁ : {τ₁ τ₂ : cpstyp} → {e₁ : cpsterm[ var ] (τ₂ ⇒ τ₁)} → {e₁′ : cpsterm[ var ] (τ₂ ⇒ τ₁)} → {e₂ : cpsterm[ var ] τ₂} → cpsequal e₁ e₁′ → cpsequal (CPSApp e₁ e₂) (CPSApp e₁′ e₂) eqApp₂ : {τ₁ τ₂ : cpstyp} → {e₁ : cpsterm[ var ] (τ₂ ⇒ τ₁)} → {e₂ : cpsterm[ var ] τ₂} → {e₂′ : cpsterm[ var ] τ₂} → cpsequal e₂ e₂′ → cpsequal (CPSApp e₁ e₂) (CPSApp e₁ e₂′) eqFun : {τ₁ τ₂ : cpstyp} → {e₁ : var τ₂ → cpsterm[ var ] τ₁} → {e₂ : var τ₂ → cpsterm[ var ] τ₁} → ((x : var τ₂) → cpsequal (e₁ x) (e₂ x)) → cpsequal (CPSVal (CPSFun (λ x → e₁ x))) (CPSVal (CPSFun (λ x → e₂ x))) eqLet₁ : {τ₁ τ₂ : cpstyp} → {e₁ e₁′ : cpsterm[ var ] τ₁} → (e₂ : var τ₁ → cpsterm[ var ] τ₂) → cpsequal e₁ e₁′ → cpsequal (CPSLet e₁ e₂) (CPSLet e₁′ e₂) eqLet₂ : {τ₁ τ₂ : cpstyp} → (e₁ : cpsterm[ var ] τ₁) → {e₂ e₂′ : var τ₁ → cpsterm[ var ] τ₂} → ((x : var τ₁) → cpsequal (e₂ x) (e₂′ x)) → cpsequal (CPSLet e₁ e₂) (CPSLet e₁ e₂′) eqLet₃ : {τ₁ τ₂ τ₃ : cpstyp} → {e₁ : cpsterm[ var ] τ₁} → {e₂ : var τ₁ → cpsterm[ var ] (τ₂ ⇒ τ₃)} → {e₃ : cpsterm[ var ] τ₂} → cpsequal (CPSApp (CPSLet e₁ (λ x → e₂ x)) e₃) (CPSLet e₁ (λ x → CPSApp (e₂ x) e₃)) eqLetApp : {τ₁ τ₂ : cpstyp} → {v₁ : cpsvalue[ var ] τ₁} → {e₁ : var τ₁ → cpsterm[ var ] τ₂} → cpsequal (CPSLet (CPSVal v₁) (λ x → e₁ x)) (CPSApp (CPSVal (CPSFun (λ x → e₁ x))) (CPSVal v₁)) eqId : {τ₁ : cpstyp} → {e : cpsterm[ var ] τ₁} → cpsequal e e eqTrans : {τ₁ : cpstyp} → (e₁ e₂ e₃ : cpsterm[ var ] τ₁) → cpsequal e₁ e₂ → cpsequal e₂ e₃ → cpsequal e₁ e₃ eqTrans′ : {τ₁ : cpstyp} → (e₁ e₂ e₃ : cpsterm[ var ] τ₁) → cpsequal e₂ e₁ → cpsequal e₂ e₃ → cpsequal e₁ e₃ data cpsEqual {var : cpstyp → Set} : {τ : cpstyp} → cpsterm[ var ] τ → cpsterm[ var ] τ → Set where Eq* : {τ₁ : cpstyp} → {e₁ : cpsterm[ var ] τ₁} → {e₂ : cpsterm[ var ] τ₁} → cpsequal e₁ e₂ → cpsEqual e₁ e₂ -- equational reasoning -- see ≡-Reasoning in Relation.Binary.PropositionalEquality.agda infix 3 _∎ infixr 2 _⟶⟨_⟩_ _⟵⟨_⟩_ _⟷⟨_⟩_ _≡⟨_⟩_ infix 1 begin_ begin_ : {var : cpstyp → Set} {τ₁ : cpstyp} → {e₁ e₂ : cpsterm[ var ] τ₁} → cpsequal e₁ e₂ → cpsequal e₁ e₂ begin_ red = red _⟶⟨_⟩_ : {var : cpstyp → Set} {τ₁ : cpstyp} → (e₁ {e₂ e₃} : cpsterm[ var ] τ₁) → cpsequal e₁ e₂ → cpsequal e₂ e₃ → cpsequal e₁ e₃ _⟶⟨_⟩_ e₁ {e₂} {e₃} e₁-eq-e₂ e₂-eq-e₃ = eqTrans e₁ e₂ e₃ e₁-eq-e₂ e₂-eq-e₃ _⟵⟨_⟩_ : {var : cpstyp → Set} {τ₁ : cpstyp} → (e₁ {e₂ e₃} : cpsterm[ var ] τ₁) → cpsequal e₂ e₁ → cpsequal e₂ e₃ → cpsequal e₁ e₃ _⟵⟨_⟩_ e₁ {e₂} {e₃} e₂-eq-e₁ e₂-eq-e₃ = eqTrans′ e₁ e₂ e₃ e₂-eq-e₁ e₂-eq-e₃ _⟷⟨_⟩_ : {var : cpstyp → Set} {τ₁ : cpstyp} → (e₁ {e₂ e₃} : cpsterm[ var ] τ₁) → cpsequal e₁ e₂ → cpsequal e₂ e₃ → cpsequal e₁ e₃ _⟷⟨_⟩_ e₁ {e₂} {e₃} e₁-eq-e₂ e₂-eq-e₃ = eqTrans e₁ e₂ e₃ e₁-eq-e₂ e₂-eq-e₃ _≡⟨_⟩_ : {var : cpstyp → Set} {τ₁ : cpstyp} → (e₁ {e₂ e₃} : cpsterm[ var ] τ₁) → e₁ ≡ e₂ → cpsequal e₂ e₃ → cpsequal e₁ e₃ _≡⟨_⟩_ e₁ {e₂} {e₃} refl e₂-eq-e₃ = e₂-eq-e₃ _∎ : {var : cpstyp → Set} {τ₁ : cpstyp} → (e : cpsterm[ var ] τ₁) → cpsequal e e _∎ e = eqId -- subst-cont subst-cont : {var : cpstyp → Set} {τ₁ τ₂ : typ} {τ₄ : cpstyp} → (κ₁ : var τ₄ → cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → (v : cpsvalue[ var ] τ₄) → (κ₂ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → Set subst-cont {var} {τ₁} {τ₂} {τ₄} κ₁ v κ₂ = {v₁ : var τ₄ → cpsvalue[ var ] (cpsT τ₁)} → {v₁′ : cpsvalue[ var ] (cpsT τ₁)} → cpsSubstVal v₁ v v₁′ → cpsSubst (λ y → κ₁ y (v₁ y)) v (κ₂ v₁′) mutual SubstV≠ : {var : cpstyp → Set} {τ₁ τ₂ : cpstyp} → {t : cpsvalue[ var ] τ₁} → {v : cpsvalue[ var ] τ₂} → cpsSubstVal (λ y → t) v t SubstV≠ {t = CPSVar x} = sVar≠ SubstV≠ {t = CPSNum n} = sNum SubstV≠ {t = CPSFun e₁} = sFun (λ x → Subst≠) Subst≠ : {var : cpstyp → Set} {τ₁ τ₂ : cpstyp} → {t : cpsterm[ var ] τ₁} → {v : cpsvalue[ var ] τ₂} → cpsSubst (λ y → t) v t Subst≠ {t = CPSVal x} = sVal SubstV≠ Subst≠ {t = CPSApp e₁ e₂} = sApp Subst≠ Subst≠ Subst≠ {t = CPSLet e₁ e₂} = sLet (λ x → Subst≠) (λ x → Subst≠) mutual eSubstVP : {var : cpstyp → Set} {τ₁ τ : typ} → {v₁ : var (cpsT τ) → value[ var ∘ cpsT ] τ₁ cps[τ,τ,P]} → {v₁′ : value[ var ∘ cpsT ] τ₁ cps[τ,τ,P]} → {v : value[ var ∘ cpsT ] τ cps[τ,τ,P]} → SubstVal v₁ v v₁′ → cpsSubstVal (λ y → cpsV {var = var} (v₁ y)) (cpsV v) (cpsV v₁′) eSubstVP SubstVal.sVar= = cpsSubstVal.sVar= eSubstVP SubstVal.sVar≠ = cpsSubstVal.sVar≠ eSubstVP SubstVal.sNum = cpsSubstVal.sNum eSubstVP (sFun P≤ₐP refl sub) = sFun (λ x → eSubstPP (sub x)) eSubstVP (sFun P≤ₐI refl sub) = sFun (λ x → sVal (sFun (λ _ → sApp (sVal sVar≠) (eSubstPP (sub x))))) eSubstVP {var} {τ₁} {τ = τ₂} {v₁} {v₁′} {v} (sFun I≤ₐI tt sub) = sFun (λ x → sVal (sFun (λ x₁ → ekSubstII (λ y x′ → _) (sub x) (λ x₂ → sApp Subst≠ (sVal x₂))))) eSubstPP : {var : cpstyp → Set} {τ₁ τ₂ τ : typ} → {e : var (cpsT τ) → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ]} → {e′ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ]} → {v : value[ var ∘ cpsT ] τ cps[τ,τ,P]} → Subst e v e′ → cpsSubst (λ x → cpsP {var = var} (e x)) (cpsV v) (cpsP e′) eSubstPP (sVal subv) = sVal (eSubstVP subv) eSubstPP (sApp P≤ₐP P≤ₐP P≤ₐP refl refl refl sub₁ sub₂) = sApp (eSubstPP sub₁) (eSubstPP sub₂) eSubstPP (sReset {P} refl sub) = eSubstPP sub eSubstPP (sReset {I} tt sub) = ekSubstII (λ _ x → CPSVal x) sub (λ x → sVal x) ekSubstII : {var : cpstyp → Set} {τ₁ τ₂ τ₃ τ : typ} → {e₁ : var (cpsT τ) → term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]} → {e₂ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]} → {v : value[ var ∘ cpsT ] τ cps[τ,τ,P]} → (κ₁ : var (cpsT τ) → cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → {κ₂ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)} → Subst e₁ v e₂ → subst-cont {τ₁ = τ₁} {τ₂ = τ₂} {τ₄ = (cpsT τ)} κ₁ (cpsV v) κ₂ → cpsSubst (λ y → cpsI {var = var} (e₁ y) (κ₁ y)) (cpsV v) (cpsI e₂ κ₂) ekSubstII κ₁ (sApp {.P} {.P} {.P} P≤ₐI P≤ₐI P≤ₐI refl refl refl sub sub₁) subc = sApp (sVal (sFun (λ x → subc SubstV≠))) (sApp (eSubstPP sub) (eSubstPP sub₁)) ekSubstII κ₁ (sApp {.P} {.P} {.I} P≤ₐI P≤ₐI I≤ₐI refl refl tt sub sub₁) subc = sApp (sApp (eSubstPP sub) (eSubstPP sub₁)) (sVal (sFun (λ x → subc SubstV≠))) ekSubstII κ₁ (sApp {.P} {.I} {.P} P≤ₐI I≤ₐI P≤ₐI refl tt refl sub sub₁) subc = sApp (sVal (sFun (λ x → ekSubstII (λ z v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂))) sub₁ (λ x₁ → sApp (sVal (sFun (λ x₂ → subc SubstV≠))) (sApp Subst≠ (sVal x₁)))))) (eSubstPP sub) ekSubstII κ₁ (sApp {.P} {.I} {.I} P≤ₐI I≤ₐI I≤ₐI refl tt tt sub sub₁) subc = sApp (sVal (sFun (λ x → ekSubstII (λ z v₂ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v))))) sub₁ (λ x₁ → sApp (sApp Subst≠ (sVal x₁)) (sVal (sFun (λ x₂ → subc SubstV≠))))))) (eSubstPP sub) ekSubstII κ₁ (sApp {.I} {.P} {.P} {τ₂ = τ₂} {τ₄ = τ₄} I≤ₐI P≤ₐI P≤ₐI tt refl refl {e₂ = e₂} sub sub₁) subc = ekSubstII (λ z v₁ → CPSApp (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP (e₂ z)))) sub (λ x → sApp (sVal (sFun (λ x₁ → subc SubstV≠))) (sApp (sVal x) (eSubstPP sub₁))) ekSubstII κ₁ (sApp {.I} {.P} {.I} {τ₂ = τ₆} {τ₄ = τ₄} I≤ₐI P≤ₐI I≤ₐI tt refl tt {e₂ = e₂} sub sub₁) subc = ekSubstII (λ z v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP (e₂ z))) (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v))))) sub (λ x → sApp (sApp (sVal x) (eSubstPP sub₁)) (sVal (sFun (λ x₁ → subc SubstV≠)))) ekSubstII {τ₂ = τ₂} κ₁ (sApp {.I} {.I} {.P} {τ₂ = τ₅} {τ₅ = τ₆} I≤ₐI I≤ₐI P≤ₐI tt tt refl {e₂ = e₂} sub sub₁) subc = ekSubstII (λ z v₁ → cpsI (e₂ z) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) sub (λ {v₁} x → ekSubstII (λ z v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v)))) (CPSApp (CPSVal (v₁ z)) (CPSVal v₂))) sub₁ (λ x₁ → sApp (sVal (sFun (λ x₂ → subc SubstV≠))) (sApp (sVal x) (sVal x₁)))) ekSubstII κ₁ (sApp {.I} {.I} {.I} {τ₂ = τ₅} {τ₄ = τ₆} {τ₇} I≤ₐI I≤ₐI I≤ₐI tt tt tt {e₂ = e₂} sub sub₁) subc = ekSubstII (λ z v₁ → cpsI (e₂ z) (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v)))))) sub (λ {v₁} x → ekSubstII (λ z v₂ → CPSApp (CPSApp (CPSVal (v₁ z)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ z (CPSVar v))))) sub₁ (λ x₁ → sApp (sApp (sVal x) (sVal x₁)) (sVal (sFun (λ x₂ → subc SubstV≠))))) ekSubstII κ₁ (sShift {P} {P} refl sub) subc = sLet (λ x₁ → eSubstPP (sub x₁)) (λ x → sVal (sFun (λ x₁ → subc SubstV≠))) ekSubstII κ₁ (sShift {P} {I} refl sub) subc = sLet (λ x₁ → eSubstPP (sub x₁)) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (subc SubstV≠)))))) ekSubstII κ₁ (sShift {I} {P} tt sub) subc = sLet (λ x → ekSubstII (λ _ → CPSVal) (sub x) (λ x₁ → sVal x₁)) (λ x → sVal (sFun (λ x₁ → subc SubstV≠))) ekSubstII κ₁ (sShift {I} {I} tt sub) subc = sLet (λ x → ekSubstII (λ _ → CPSVal) (sub x) (λ x₁ → sVal x₁)) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (subc SubstV≠)))))) κSubstII : {var : cpstyp → Set} {τ₁ τ₂ τ₃ : typ} {τ : cpstyp} → (e : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]) → {v : cpsvalue[ var ] τ} → (κ₁ : var τ → cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → {κ₂ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)} → subst-cont {τ₁ = τ₁} {τ₂ = τ₂} {τ₄ = τ} κ₁ v κ₂ → cpsSubst (λ y → cpsI e (κ₁ y)) v (cpsI e κ₂) κSubstII (App P≤ₐI P≤ₐI P≤ₐI refl refl refl e e₁) κ₁ subc = sApp (sVal (sFun (λ x → subc SubstV≠))) Subst≠ κSubstII (App P≤ₐI P≤ₐI I≤ₐI refl refl tt e e₁) κ₁ subc = sApp Subst≠ (sVal (sFun (λ x → subc SubstV≠))) κSubstII (App P≤ₐI I≤ₐI P≤ₐI refl tt refl e₁ e₂) κ₁ subc = sApp (sVal (sFun (λ x → κSubstII e₂ (λ y v₂ → CPSApp (CPSVal (CPSFun (λ v₁ → κ₁ y (CPSVar v₁)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂))) (λ sub → sApp (sVal (sFun (λ x₁ → subc SubstV≠))) (sApp Subst≠ (sVal sub)))))) Subst≠ κSubstII (App P≤ₐI I≤ₐI I≤ₐI refl tt tt e₁ e₂) κ₁ subc = sApp (sVal (sFun (λ x → κSubstII e₂ (λ y v₂ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v))))) (λ sub → sApp (sApp (sVal SubstV≠) (sVal sub)) (sVal (sFun (λ x₁ → subc SubstV≠))))))) Subst≠ κSubstII (App {τ₂ = τ₂} {τ₄ = τ₄} I≤ₐI P≤ₐI P≤ₐI tt refl refl e₁ e₂) κ₁ subc = κSubstII e₁ (λ y v₁ → CPSApp (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ sub → sApp (sVal (sFun (λ x → subc SubstV≠))) (sApp (sVal sub) Subst≠)) κSubstII (App {τ₂ = τ₅} {τ₄ = τ₄} I≤ₐI P≤ₐI I≤ₐI tt refl tt e₁ e₂) κ₁ subc = κSubstII e₁ (λ y v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v))))) (λ sub → sApp (sApp (sVal sub) Subst≠) (sVal (sFun (λ x → subc SubstV≠)))) κSubstII {τ₂ = τ₂} (App {τ₂ = τ₄} {τ₅ = τ₅} I≤ₐI I≤ₐI P≤ₐI tt tt refl e₁ e₂) κ₁ subc = κSubstII e₁ (λ y v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ {v₁} x → κSubstII e₂ (λ y v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v)))) (CPSApp (CPSVal (v₁ y)) (CPSVal v₂))) (λ sub → sApp (sVal (sFun (λ x₁ → subc SubstV≠))) (sApp (sVal x) (sVal sub)))) κSubstII (App {τ₂ = τ₄} {τ₄ = τ₅} {τ₆} I≤ₐI I≤ₐI I≤ₐI tt tt tt e₁ e₂) κ₁ subc = κSubstII e₁ (λ y v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v)))))) (λ {v₁} sub₁ → κSubstII e₂ (λ y v₂ → CPSApp (CPSApp (CPSVal (v₁ y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ y (CPSVar v))))) (λ sub₂ → sApp (sApp (sVal sub₁) (sVal sub₂)) (sVal (sFun (λ x → subc SubstV≠))))) κSubstII (Shift P P refl e) κ₁ subc = sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → subc SubstV≠))) κSubstII (Shift P I refl e) κ₁ subc = sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (subc SubstV≠)))))) κSubstII (Shift I P tt e) κ₁ subc = sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → subc SubstV≠))) κSubstII (Shift I I tt e) κ₁ subc = sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (subc SubstV≠)))))) mutual SubstV≠DS : {var : typ → Set} → {τ₁ τ₂ : typ} → {t : value[ var ] τ₁ cps[τ,τ,P]} → {v : value[ var ] τ₂ cps[τ,τ,P]} → SubstVal (λ y → t) v t SubstV≠DS {t = Var x} = sVar≠ SubstV≠DS {t = Num n} = sNum SubstV≠DS {t = Fun a₁≤ₐa₂ c e₁} = sFun a₁≤ₐa₂ c (λ _ → Subst≠DS) Subst≠DS : {var : typ → Set} → {τ₁ τ₂ τ₃ τ₄ : typ} → {a : ann} → {t : term[ var ] τ₁ cps[ τ₃ , τ₄ , a ]} → {v : value[ var ] τ₂ cps[τ,τ,P]} → Subst (λ y → t) v t Subst≠DS {t = Val x} = sVal SubstV≠DS Subst≠DS {t = App c₁ c₂ c₃ c₄ c₅ c₆ e₁ e₂} = sApp c₁ c₂ c₃ c₄ c₅ c₆ Subst≠DS Subst≠DS Subst≠DS {t = Reset c t} = sReset c Subst≠DS Subst≠DS {t = Shift a₁ a₂ c e₁} = sShift c (λ k → Subst≠DS) subst-pcontext-plug-P : {var : typ → Set} → {τ₂ τ₄ τ₀ : typ} → (f : pcontext[ var , τ₀ cps[ τ₂ , τ₂ , P ]] τ₄ cps[ τ₂ , τ₂ , P ]) → (v : value[ var ] τ₀ cps[τ,τ,P]) → Subst {τ₁ = τ₀} (λ x₂ → pcontext-plug f (Val (Var x₂))) v (pcontext-plug f (Val v)) subst-pcontext-plug-P (Hole x) x₁ = sVal sVar= subst-pcontext-plug-P (Frame (App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) con) x₁ = sApp P≤ₐP P≤ₐP P≤ₐP refl refl refl (subst-pcontext-plug-P con x₁) Subst≠DS subst-pcontext-plug-P (Frame (App₂ P≤ₐP P≤ₐP refl refl v₁) con) x₁ = sApp P≤ₐa P≤ₐP P≤ₐP refl refl refl Subst≠DS (subst-pcontext-plug-P con x₁) subst-pcontext-plug-I : {var : typ → Set} {τ₂ τ₃ τ₄ τ₀ : typ} → (f : pcontext[ var , τ₀ cps[ τ₂ , τ₂ , P ]] τ₄ cps[ τ₃ , τ₂ , I ]) → (v : value[ var ] τ₀ cps[τ,τ,P]) → Subst (λ x₁ → pcontext-plug f (Val (Var x₁))) v (pcontext-plug f (Val v)) subst-pcontext-plug-I (Frame (App₁ P≤ₐI c₂ c₃ refl c₅ c₆ e₂) con) x = sApp P≤ₐI c₂ c₃ refl c₅ c₆ (subst-pcontext-plug-P con x) Subst≠DS subst-pcontext-plug-I (Frame (App₁ I≤ₐI c₂ c₃ tt c₅ c₆ e₂) con) x = sApp I≤ₐI c₂ c₃ tt c₅ c₆ (subst-pcontext-plug-I con x) Subst≠DS subst-pcontext-plug-I (Frame (App₂ P≤ₐI c₁ refl c₃ v₁) con) x = sApp P≤ₐa P≤ₐI c₁ refl refl c₃ Subst≠DS (subst-pcontext-plug-P con x) subst-pcontext-plug-I (Frame (App₂ I≤ₐI c₁ tt c₃ v₁) con) x = sApp P≤ₐa I≤ₐI c₁ refl tt c₃ Subst≠DS (subst-pcontext-plug-I con x) schematic : {var : cpstyp → Set} {τ₁ τ₂ : typ} → (κ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → Set schematic {var} {τ₁} {τ₂} κ = (v : value[ var ∘ cpsT ] τ₁ cps[τ,τ,P]) → cpsSubst (λ y → κ (CPSVar y)) (cpsV v) (κ (cpsV v)) correctContI : {var : cpstyp → Set} → {τ₁ τ₂ τ₃ : typ} → {e₁ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]} → (κ₁ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → (κ₂ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → schematic {var} {τ₁} {τ₂} κ₁ → schematic {var} {τ₁} {τ₂} κ₂ → ((t : value[ var ∘ cpsT ] τ₁ cps[τ,τ,P]) → cpsequal (κ₁ (cpsV t)) (κ₂ (cpsV t))) → cpsequal (cpsI e₁ κ₁) (cpsI e₁ κ₂) correctContI {e₁ = App P≤ₐI P≤ₐI P≤ₐI refl refl refl e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = eqApp₁ (eqFun (λ x → eq (Var x))) correctContI {e₁ = App P≤ₐI P≤ₐI I≤ₐI refl refl tt e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = eqApp₂ (eqFun (λ x → eq (Var x))) correctContI {e₁ = App P≤ₐI I≤ₐI P≤ₐI refl tt refl e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = eqApp₁ (eqFun (λ x → correctContI {e₁ = e₂} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂))) (λ t → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t → eqApp₁ (eqFun (λ x₁ → eq (Var x₁)))))) correctContI {e₁ = App P≤ₐI I≤ₐI I≤ₐI refl tt tt e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = eqApp₁ (eqFun (λ x → correctContI {e₁ = e₂} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v))))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₂ (CPSVar v))))) (λ t → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → eqApp₂ (eqFun (λ x₁ → eq (Var x₁)))))) correctContI {e₁ = App {τ₂ = τ₂} {τ₄ = τ₄} I≤ₐI P≤ₐI P≤ₐI tt refl refl e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = correctContI {e₁ = e₁} (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ t → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) (λ t → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) (λ t → eqApp₁ (eqFun (λ x → eq (Var x)))) correctContI {e₁ = App {τ₂ = τ₅} {τ₄ = τ₄} I≤ₐI P≤ₐI I≤ₐI tt refl tt e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = correctContI {e₁ = e₁} (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v))))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ₂ (CPSVar v))))) (λ t → (sApp (sApp (sVal sVar=) Subst≠) Subst≠)) (λ t → (sApp (sApp (sVal sVar=) Subst≠) Subst≠)) (λ t → eqApp₂ (eqFun (λ x → eq (Var x)))) correctContI {τ₁ = τ₁} {τ₂} {e₁ = App {τ₂ = τ₄} {τ₅ = τ₅} I≤ₐI I≤ₐI P≤ₐI tt tt refl e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = correctContI {e₁ = e₁} (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ t → (κSubstII e₂ {cpsV t} (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ sub → sApp Subst≠ (sApp (sVal sVar=) (sVal sub))))) (λ t → (κSubstII e₂ {cpsV t} (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ sub → sApp Subst≠ (sApp (sVal sVar=) (sVal sub))))) (λ t → correctContI {e₁ = e₂} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))) (CPSApp (CPSVal (cpsV t)) (CPSVal v₂))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal (cpsV t)) (CPSVal v₂))) (λ t₁ → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t₁ → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t₁ → eqApp₁ (eqFun (λ x → eq (Var x))))) correctContI {τ₁ = τ₁} {τ₂} {e₁ = App {τ₂ = τ₄} {τ₄ = τ₅} {τ₆} I≤ₐI I≤ₐI I≤ₐI tt tt tt e₁ e₂} κ₁ κ₂ sche₁ sche₂ eq = correctContI {e₁ = e₁} (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v)))))) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))))) (λ t → (κSubstII e₂ {cpsV t} (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v))))) (λ sub → sApp (sApp (sVal sVar=) (sVal sub)) Subst≠))) (λ t → (κSubstII e₂ {cpsV t} (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → κ₂ (CPSVar v))))) (λ sub → sApp (sApp (sVal sVar=) (sVal sub)) Subst≠))) (λ t → correctContI {e₁ = e₂} (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV t)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v))))) (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV t)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₂ (CPSVar v))))) (λ t₁ → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₁ → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₁ → eqApp₂ (eqFun (λ x → eq (Var x))))) correctContI {e₁ = Shift P P refl e₁} κ₁ κ₂ sche₁ sche₂ eq = eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eq (Var x))) correctContI {e₁ = Shift P I refl e₁} κ₁ κ₂ sche₁ sche₂ eq = eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eq (Var x))))) correctContI {e₁ = Shift I P tt e₁} κ₁ κ₂ sche₁ sche₂ eq = eqLet₁ (λ x → cpsI (e₁ x) (λ v → CPSVal v)) (eqFun (λ x → eq (Var x))) correctContI {e₁ = Shift I I tt e₁} κ₁ κ₂ sche₁ sche₂ eq = eqLet₁ (λ x → cpsI (e₁ x) (λ v → CPSVal v)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eq (Var x))))) shift-lemma : ∀ {τ τ₁ τ₂ τ₄ τ₅ α} {a a₁ a₂ a₃} {var : cpstyp → Set} (a≤ₐa₃ : a ≤ₐ a₃) (c : τ₅ ≠ τ₂ ⇒ a =i) (c₁ : τ ≠ τ₂ ⇒ a₁ =i) (c₃ : τ₅ ≠ τ₂ ⇒ a₃ =i) (p₁ : pcontext[ var ∘ cpsT , τ₁ cps[ τ₂ , τ₂ , I ]] τ₄ cps[ τ₅ , τ₂ , I ]) (p₂ : pcontext[ var ∘ cpsT , τ₁ cps[ τ₂ , τ₂ , P ]] τ₄ cps[ τ₅ , τ₂ , a ]) → same-pcontext′ p₁ p₂ → ∀ (e₁ : var (cpsT (τ₁ ⇒ τ₂ cps[ α , α , a₂ ])) → term[ var ∘ cpsT ] τ cps[ τ , τ₂ , a₁ ]) (k : cpsvalue[ var ] (cpsT τ₄) → cpsterm[ var ] (cpsT τ₅)) (sch : schematic {var} {τ₄} {τ₅} k) → cpsequal (cpsI {var = var} (pcontext-plug p₁ (Shift a₁ a₂ c₁ e₁)) k) (cpsI (App P≤ₐI I≤ₐI a≤ₐI refl tt c₃ (Val (Fun a≤ₐa₃ c (λ x → pcontext-plug p₂ (Val (Var x))))) (Shift a₁ a₂ c₁ e₁)) k) -- Hole case (8 cases) shift-lemma {a₁ = P} {P} P≤ₐP refl refl refl .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₂ (eqBeta (sVal sVar=)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) (CPSVal (CPSVar z)))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) ∎ shift-lemma {a₁ = P} {P} P≤ₐI refl refl tt .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqBeta (sApp (sVal sVar=) Subst≠))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ y → k (CPSVar y))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → sApp Subst≠ (sVal sVar=))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal (CPSVar y))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ y → k (CPSVar y))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁))))))) (λ v → cpsP (e₁ v))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal (CPSVar y))))))) ∎ shift-lemma {a₁ = P} {I} P≤ₐP refl refl refl .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (k (CPSVar a))))))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sch (Var x)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₂ (eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) (CPSVal (CPSVar z))))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))))) (λ v → cpsP (e₁ v))))) (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) ∎ shift-lemma {a₁ = P} {I} P≤ₐI refl refl tt .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (k (CPSVar a))))))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sch (Var x)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ y → k (CPSVar y)))))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → sApp Subst≠ (sVal sVar=))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z₂ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal (CPSVar y))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ y → k (CPSVar y)))))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁)))))))))) (λ v → cpsP (e₁ v))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar y))))))) ∎ shift-lemma {a₁ = I} {P} P≤ₐP refl tt refl .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsI (e₁ x) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqApp₂ (eqBeta (sVal sVar=)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) (CPSVal (CPSVar z)))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v)))))) (λ v → cpsI (e₁ v) CPSVal)))) (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) ∎ shift-lemma {a₁ = I} {P} P≤ₐI refl tt tt .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsI (e₁ x) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqBeta (sApp (sVal sVar=) Subst≠))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ y → k (CPSVar y))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → sApp Subst≠ (sVal sVar=))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal (CPSVar y))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ y → k (CPSVar y))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁))))))) (λ v → cpsI (e₁ v) CPSVal)))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar y))))))) ∎ shift-lemma {a₁ = I} {I} P≤ₐP refl tt refl .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (k (CPSVar a))))))) (λ x → cpsI (e₁ x) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sch (Var x)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₂ (eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) (CPSVal (CPSVar z))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))))) (λ v → cpsI (e₁ v) CPSVal)))) (CPSVal (CPSFun (λ y → CPSVal (CPSVar y)))) ∎ shift-lemma {a₁ = I} {I} P≤ₐI refl tt tt .(Hole tt) .(Hole refl) (Hole tt refl) e₁ k sch = begin CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (k (CPSVar a))))))) (λ x → cpsI (e₁ x) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sch (Var x)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ y → k (CPSVar y)))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → sApp Subst≠ (sVal sVar=))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z₂ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal (CPSVar y))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ y → k (CPSVar y)))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ y₁ → k (CPSVar y₁)))))))))) (λ v → cpsI (e₁ v) CPSVal)))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar y))))))) ∎ -- Frame - App₁ (10 cases) -- 1/10 shift-lemma {a₁ = a₁} {a₂} P≤ₐP refl c₁ refl .(Frame (App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) p₁) .(Frame (App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI P≤ₐI P≤ₐP P≤ₐP P≤ₐP P≤ₐI P≤ₐI tt refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₁ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) ⟷⟨ shift-lemma P≤ₐP refl c₁ refl p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ x → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₁ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₁ e₁) (λ v₁ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₁ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₁ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)))) (CPSVal v₂))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t → begin (CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ cpscontext-plug (CPSFrame (CPSApp₂ (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)) (cpsP (pcontext-plug p₂ (Val t))) ≡⟨ refl ⟩ (CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂))) ⟵⟨ eqApp₂ (eqBeta (sApp (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)) Subst≠)) ⟩ (CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)))) (CPSVal (cpsV t)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₁ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)))) (CPSVal v₂))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₁ e₁) (λ v₁ → λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₁ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)))) ∎ -- 2/10 shift-lemma {a₁ = a₁} {a₂} P≤ₐI refl c₄ tt .(Frame (App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) p₁) .(Frame (App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI P≤ₐI P≤ₐP P≤ₐP P≤ₐP P≤ₐI P≤ₐI tt refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂)))) ⟷⟨ shift-lemma P≤ₐP refl c₄ refl p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ x → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin (CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) ⟵⟨ eqBeta (sApp (sVal sVar=) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂))))) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)) Subst≠))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var y)))) (cpsP e₂))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) ∎ -- 3/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) p₁) .(Frame (App₁ P≤ₐI P≤ₐI P≤ₐI refl refl refl e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI I≤ₐI tt refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) ⟷⟨ shift-lemma P≤ₐP refl c₄ refl p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ x → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v → k (CPSVar v)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSVal (CPSVar x))))) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)) Subst≠))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁))))) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var y)))) (cpsP e₂))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂))))))) ∎ -- 4/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) p₁) .(Frame (App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI I≤ₐI tt refl refl tt e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) ⟷⟨ shift-lemma I≤ₐI tt c₄ tt p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ x → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)))))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (cpsP e₂)))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)))))) ⟷⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) {κ₂ = λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)} (subst-pcontext-plug-I p₂ t) (λ sub → sApp Subst≠ (sVal sub)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) {v = CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)))} (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (CPSVal z)) ⟷⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v₁)) (cpsP e₂))))) (CPSVal v)) (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (sApp Subst≠ (sApp (sVal sVar=) Subst≠))) (λ u → begin CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v₁)) (cpsP e₂))))) (CPSVal (cpsV u)) ⟶⟨ eqBeta (sApp Subst≠ (sApp (sVal sVar=) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (cpsV u)) (cpsP e₂)) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV u)) (cpsP e₂)) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) {v = (CPSFun (λ v → k (CPSVar v)))} (λ z v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂))) (λ x → sApp (sVal (sFun (λ x₁ → sApp (sVal sVar=) Subst≠))) (sApp (sVal x) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂)))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂))) {κ₂ = λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂))} (subst-pcontext-plug-I p₂ t) (λ sub → sApp Subst≠ (sApp (sVal sub) Subst≠)))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP e₂)))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (cpsP e₂)))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (cpsP e₂)))))))) ∎ -- 5/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂) p₁) .(Frame (App₁ P≤ₐI P≤ₐI I≤ₐI refl refl tt e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI tt refl tt refl e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma P≤ₐP refl c₄ refl p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp (sVal sVar=) Subst≠) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟷⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin (CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ z → k (CPSVar z))))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSVal (CPSVar z))))) ⟵⟨ eqBeta (sApp Subst≠ (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val t))) (cpsP e₂)) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z)))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sApp (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)) Subst≠) Subst≠)))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val (Var y)))) (cpsP e₂)) (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁)))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (pcontext-plug p₂ (Val (Var x)))) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))) ∎ -- 6/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂) p₁) .(Frame (App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂) p₂) (Frame (App₁ I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI I≤ₐI tt refl tt tt e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma I≤ₐI tt c₄ tt p₁ p₂ samep e₁ (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp (sVal sVar=) Subst≠) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))))))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) {κ₂ = λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)} (subst-pcontext-plug-I p₂ t) (λ sub → sApp Subst≠ (sVal sub)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSVal z)) ⟷⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSVal v)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (sApp (sApp (sVal sVar=) Subst≠) Subst≠)) (λ t₁ → begin CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSVal (cpsV t₁)) ⟶⟨ eqBeta (sApp (sApp (sVal sVar=) Subst≠) Subst≠) ⟩ CPSApp (CPSApp (CPSVal (cpsV t₁)) (cpsP e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (CPSVal (cpsV t₁)) (cpsP e₂)) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))) (λ x → sApp (sApp (sVal x) Subst≠) (sVal (sFun (λ x₁ → sApp (sVal sVar=) Subst≠))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v)))))) {κ₂ = λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v)))))} (subst-pcontext-plug-I p₂ t) (λ sub → sApp (sApp (sVal sub) Subst≠) Subst≠))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))) ∎ -- 7/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂) p₁) .(Frame (App₁ P≤ₐI I≤ₐI P≤ₐI refl tt refl e₂) p₂) (Frame (App₁ I≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI tt tt refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) ⟷⟨ shift-lemma P≤ₐP refl c₄ refl p₁ p₂ samep e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ x → (κSubstII e₂ (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val t))) ⟵⟨ eqApp₁ (eqFun (λ x → correctContI {e₁ = e₂} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃))) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃))) (λ x₁ → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x₁ → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t₁ → eqApp₁ (eqFun (λ x₁ → eqBeta (sch (Var x₁))))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val t))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII e₂ {v = CPSFun (λ v → k (CPSVar v))} (λ y → λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃))) (λ x₁ → sApp (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠))) (sApp Subst≠ (sVal x₁)))))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val t)))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val (Var y))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)))))) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) ∎ -- 8/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂) p₁) .(Frame (App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂) p₂) (Frame (App₁ I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI tt tt refl tt e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) ⟷⟨ shift-lemma I≤ₐI tt c₄ tt p₁ p₂ samep e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ x → (κSubstII e₂ (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃))))))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) (subst-pcontext-plug-I p₂ t) (λ sub → sApp Subst≠ (sVal sub)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₁))))) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ y z₁ → CPSApp (CPSVal (CPSVar y)) (CPSVal z₁)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSVal z)) ⟷⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ z₁ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSVal z₁)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃)))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (κSubstII e₂ (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) (sVal x₁))))) (λ t₁ → begin CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSVal (cpsV t₁)) ⟶⟨ eqBeta (κSubstII e₂ (λ v v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃))) ⟷⟨ correctContI {e₁ = e₂} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃))) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t₂ → begin CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal (cpsV t₂))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₂ → k (CPSVar v₂)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal (cpsV t₂))) ∎) ⟩ cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃))) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃)))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃)))) (λ {v} x → κSubstII e₂ (λ z v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (v z)) (CPSVal v₃))) (λ x₁ → sApp (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠))) (sApp (sVal x) (sVal x₁))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃)))) (subst-pcontext-plug-I p₂ t) (λ {v₁} x₁ → ekSubstII {e₁ = λ y → e₂} {e₂ = e₂} {v = t} (λ y → λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (v₁ y)) (CPSVal v₃))) Subst≠DS (λ x₂ → sApp Subst≠ (sApp (sVal x₁) (sVal x₂)))))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))))) ∎ -- 9/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂) p₁) .(Frame (App₁ P≤ₐI I≤ₐI I≤ₐI refl tt tt e₂) p₂) (Frame (App₁ I≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI tt tt tt refl e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) ⟷⟨ shift-lemma P≤ₐP refl c₄ refl p₁ p₂ samep e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) (λ x → (κSubstII e₂ (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x₁ → sApp (sApp (sVal sVar=) (sVal x₁)) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ y v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₁))))))))) (cpsP (pcontext-plug p₂ (Val (Var y))))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin (CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (cpsP (pcontext-plug p₂ (Val t))) ⟵⟨ eqApp₁ (eqFun (λ x → correctContI {e₁ = e₂} (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) (CPSVal (CPSVar v)))))) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) (λ x₁ → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x₁ → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₁ → eqApp₂ (eqFun (λ x₁ → eqBeta (sch (Var x₁))))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) (CPSVal (CPSVar v))))))))) (cpsP (pcontext-plug p₂ (Val t))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII e₂ (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v)))))) (λ x₁ → sApp (sApp Subst≠ (sVal x₁)) (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠))))))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))))) (cpsP (pcontext-plug p₂ (Val t)))))) (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (eSubstPP {e = λ z → pcontext-plug p₂ (Val (Var z))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (cpsP (pcontext-plug p₂ (Val (Var y))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₁))))))))) (cpsP (pcontext-plug p₂ (Val (Var y))))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₁ → k (CPSVar v₁))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (cpsP (pcontext-plug p₂ (Val (Var y))))))))) ∎ -- 10/10 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₄ tt .(Frame (App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂) p₁) .(Frame (App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂) p₂) (Frame (App₁ I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI tt tt tt tt e₂) {p₁} {p₂} samep) e₁ k sch = begin cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₄ e₁)) (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) ⟷⟨ shift-lemma I≤ₐI tt c₄ tt p₁ p₂ samep e₁ (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) (λ x → (κSubstII e₂ (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x₁ → sApp (sApp (sVal sVar=) (sVal x₁)) Subst≠))) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ → λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂)))))))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) (subst-pcontext-plug-I p₂ t) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₁))))) (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ y v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSVal z)) ⟷⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSVal v)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (κSubstII e₂ (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSVal (CPSVar v)))))) (λ x₁ → sApp (sApp (sVal sVar=) (sVal x₁)) Subst≠))) (λ t₁ → begin CPSApp (CPSVal (CPSFun (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSVal (cpsV t₁)) ⟶⟨ eqBeta (κSubstII e₂ (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI e₂ (λ z → CPSApp (CPSApp (CPSVal (cpsV t₁)) (CPSVal z)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) ⟵⟨ correctContI {e₁ = e₂} (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₂ → eqApp₂ (eqFun (λ x → eqBeta (sch (Var x))))) ⟩ cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ y v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))) (λ {v} x → κSubstII e₂ (λ z v₃ → CPSApp (CPSApp (CPSVal (v z)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))) (λ x₁ → sApp (sApp (sVal x) (sVal x₁)) (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠)))))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v)))))))))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v))))))) (subst-pcontext-plug-I p₂ t) (λ {v₁} {v₁′} x₁ → ekSubstII {e₁ = λ y → e₂} {e₂ = e₂} {v = t} (λ y v₃ → CPSApp (CPSApp (CPSVal (v₁ y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v)))))) Subst≠DS (λ x₂ → sApp (sApp (sVal x₁) (sVal x₂)) Subst≠)))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₄ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂)))))))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₄ e₁) (λ v₁ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₁ → cpsI e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))))))))) ∎ -- Frame - App₂ case (6 cases) -- App₂ 1/6 shift-lemma {a₁ = a₁} {a₂} P≤ₐP refl c₂ refl .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) _) .(Frame (App₂ P≤ₐP P≤ₐP refl refl v₁) _) (Frame (App₂ I≤ₐI P≤ₐI P≤ₐP P≤ₐP P≤ₐI P≤ₐI tt refl refl v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₃))) (λ v → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))))) (CPSVal v))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) ⟵⟨ eqApp₂ (eqBeta (sApp Subst≠ (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t)))) ⟩ CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))))) (CPSVal (cpsV t))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))))) (CPSVal v))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ y → CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))))) ∎ -- App₂ 2/6 shift-lemma {a₁ = a₁} {a₂} P≤ₐI refl c₂ tt .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) p₁) .(Frame (App₂ P≤ₐP P≤ₐP refl refl v₁) p₂) (Frame (App₂ I≤ₐI P≤ₐI P≤ₐP P≤ₐP P≤ₐI P≤ₐI tt refl refl v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₃))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ z → k (CPSVar z))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) ⟵⟨ eqBeta (sApp (sVal sVar=) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t))))))) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp Subst≠ (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ z → k (CPSVar z))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) ∎ -- App₂ 3/6 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₂ tt .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) p₁) .(Frame (App₂ P≤ₐI P≤ₐI refl refl v₁) p₂) (Frame (App₂ I≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI I≤ₐI tt refl refl v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₃))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ z → k (CPSVar z))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t))))))) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp Subst≠ (eSubstPP {e = λ x₁ → pcontext-plug p₂ (Val (Var x₁))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))))))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ z → k (CPSVar z))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁))))) (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y)))))))))) ∎ -- App₂ 4/6 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₂ tt .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) p₁) .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) p₂) (Frame (App₂ I≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI tt refl tt v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) ⟷⟨ shift-lemma I≤ₐI tt c₂ tt p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))))))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)))))) (CPSVal (cpsV v₁))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) (subst-pcontext-plug-I p₂ t) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₁))))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ y v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSVal z)) ⟶⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (CPSVal z)) (λ v → CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ t₁ → (CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v₂)))))) (CPSVal (cpsV t₁))) ⟶⟨ eqBeta (sApp Subst≠ (sApp Subst≠ (sVal sVar=))) ⟩ CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (cpsV t₁))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (cpsV t₁))) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (CPSFun (λ z → k (CPSVar z)))) (CPSVal (CPSVar x))))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal v))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₄)))))) (CPSVal (cpsV v₁)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII (pcontext-plug p₂ (Val t)) (λ y v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v₄))) (λ x₁ → sApp (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠))) (sApp Subst≠ (sVal x₁)))))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄)))))) (CPSVal (cpsV v₁))))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sVal (sFun (λ x₁ → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar x₁)) (CPSVal v₄))) (subst-pcontext-plug-I p₂ t) (λ x₂ → sApp Subst≠ (sApp Subst≠ (sVal x₂)))))) Subst≠)))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)))))) (CPSVal (cpsV v₁))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)))))) (CPSVal (cpsV v₁))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)))))) (CPSVal (cpsV v₁))))))) ∎ -- App₂ 5/6 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₂ tt .(Frame (App₂ I≤ₐI I≤ₐI tt tt v₁) p₁) .(Frame (App₂ P≤ₐI I≤ₐI refl tt v₁) p₂) (Frame (App₂ I≤ₐI I≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI tt tt refl v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal z)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal z))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal v₃))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))) (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ y → k (CPSVar y))))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (cpsV t))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {e = λ x → pcontext-plug p₂ (Val (Var x))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (cpsP (pcontext-plug p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ z → k (CPSVar z))))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) (CPSVal (CPSFun (λ z → k (CPSVar z)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) ⟵⟨ eqBeta (sApp Subst≠ (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠)))) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val t)))) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar z)))))))) (CPSVal (CPSFun (λ y → k (CPSVar y)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sApp Subst≠ (eSubstPP {e = λ z → pcontext-plug p₂ (Val (Var z))} {e′ = pcontext-plug p₂ (Val t)} {v = t} (subst-pcontext-plug-P p₂ t))) Subst≠)))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))) (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁)))))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ y → k (CPSVar y)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))) (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁)))))))))) (CPSVal v)) (CPSVal (CPSFun (λ y → k (CPSVar y))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP (pcontext-plug p₂ (Val (Var y))))) (CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar z₁)))))))))) ∎ -- App₂ 6/6 shift-lemma {a₁ = a₁} {a₂} I≤ₐI tt c₂ tt .(Frame (App₂ I≤ₐI I≤ₐI tt tt v₁) p₁) .(Frame (App₂ I≤ₐI I≤ₐI tt tt v₁) p₂) (Frame (App₂ I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI tt tt tt v₁) {p₁} {p₂} samep) e₁ k sch = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (pcontext-plug p₁ (Shift a₁ a₂ c₂ e₁)) (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal z)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma I≤ₐI tt c₂ tt p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ c₂ e₁} (λ z → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal z)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂))))))))) (CPSVal (cpsV v₁))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t → begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v → CPSApp (CPSVal (CPSVar x)) (CPSVal v)) (subst-pcontext-plug-I p₂ t) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₁))))) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) ⟶⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal z)) ⟷⟨ correctContI {e₁ = pcontext-plug p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v₂))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal v)) (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal v)) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₁ → begin CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v₂))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal (cpsV t₁)) ⟶⟨ eqBeta (sApp (sApp Subst≠ (sVal sVar=)) Subst≠) ⟩ CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (cpsV t₁))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (cpsV t₁))) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z))))) ∎) ⟩ cpsI (pcontext-plug p₂ (Val t)) (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal v)) (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ y → k (CPSVar y)))) (CPSVal (CPSVar z)))))) ⟵⟨ eqBeta (κSubstII (pcontext-plug p₂ (Val t)) (λ z v₄ → CPSApp (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (pcontext-plug p₂ (Val t)) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV v₁)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII (pcontext-plug p₂ (Val t)) (λ y v₄ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v)))))) (λ x₁ → sApp (sApp Subst≠ (sVal x₁)) (sVal (sFun (λ x₂ → sApp (sVal sVar=) Subst≠))))))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val t)) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV v₁))))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sVal (sFun (λ x₁ → ekSubstII {e₁ = λ y → pcontext-plug p₂ (Val (Var y))} {e₂ = pcontext-plug p₂ (Val t)} {v = t} (λ y v₄ → CPSApp (CPSApp (CPSVal (CPSVar x₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar x)) (CPSVal (CPSVar v)))))) (subst-pcontext-plug-I p₂ t) (λ x₂ → sApp (sApp Subst≠ (sVal x₂)) Subst≠)))) Subst≠)))) ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV v₁))))))) (CPSVal (cpsV t))) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) ∎) ⟩ cpsI (Shift a₁ a₂ c₂ e₁) (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₂))))))))) (CPSVal (cpsV v₁))))))) (CPSVal v)) (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂))))) ⟵⟨ eqBeta (κSubstII (Shift a₁ a₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ y → cpsI (Shift a₁ a₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ y → CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var y))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV v₁))))))) ∎ -- main correctIP : {var : cpstyp → Set} → {τ₁ τ₂ : typ} → {e₁ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , I ]} → {e₂ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ]} → (κ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → Reduce e₁ e₂ → cpsequal (cpsI e₁ κ) (CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (cpsP e₂)) correctIP κ (RBeta P≤ₐP P≤ₐI refl refl sub) = eqApp₂ (eqBeta (eSubstPP sub)) correctIP {τ₁ = τ₁} {τ₂} {e₂ = e₂} κ (RBeta {τ} {a₃ = .I} {e₁} {v} P≤ₐI I≤ₐI refl tt sub) = begin (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))))) (CPSVal (cpsV v))) (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (eSubstPP sub))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (cpsP e₂)))) (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁)))) ⟶⟨ eqBeta (sApp (sVal sVar=) Subst≠) ⟩ (CPSApp (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁)))) (cpsP e₂)) ∎ mutual correctII : {var : cpstyp → Set} → {τ₁ τ₂ τ₃ : typ} → {e₁ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]} → {e₂ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₃ , I ]} → (κ : cpsvalue[ var ] (cpsT τ₁) → cpsterm[ var ] (cpsT τ₂)) → schematic {τ₁ = τ₁} {τ₂} κ → Reduce e₁ e₂ → cpsequal (cpsI e₁ κ) (cpsI e₂ κ) correctII {e₂ = e₂} κ sche (RBeta {e₁ = e₁} {v₂} I≤ₐI I≤ₐI tt tt sub) = begin CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) (CPSVal (cpsV v₂))) (CPSVal (CPSFun (λ v → κ (CPSVar v)))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII (λ _ v₁ → CPSApp (CPSVal (CPSVar x)) (CPSVal v₁)) sub (λ sub₁ → sApp Subst≠ (sVal sub₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI e₂ (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₁))))) (CPSVal (CPSFun (λ v → κ (CPSVar v)))) ⟶⟨ eqBeta (κSubstII e₂ (λ y v₁ → CPSApp (CPSVal (CPSVar y)) (CPSVal v₁)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI e₂ (λ z → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSVal z)) ⟶⟨ correctContI {e₁ = e₂} (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂)))) (CPSVal v₁)) κ (λ t → (sApp Subst≠ (sVal sVar=))) sche (λ t → eqBeta (sche t)) ⟩ cpsI e₂ κ ∎ correctII κ sche (RFrame (App₁ P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐP I≤ₐI refl refl refl refl e₂) red) = eqApp₂ (eqApp₁ (correctPP red)) correctII κ sche (RFrame (App₁ P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐP I≤ₐI refl refl tt refl e₂) red) = eqApp₁ (eqApp₁ (correctPP red)) correctII κ sche (RFrame (App₁ P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐP I≤ₐI refl tt refl refl e₂) red) = eqApp₂ (correctPP red) correctII κ sche (RFrame (App₁ P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐP I≤ₐI refl tt tt refl e₂) red) = eqApp₂ (correctPP red) correctII κ sche (RFrame {e₁ = e₁} {e₃} (App₁ I≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI I≤ₐI tt refl refl refl e₂) red) = begin cpsI e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) ⟶⟨ correctIP (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) red ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁)))) (CPSApp (CPSVal (CPSVar v)) (cpsP e₂))))) (cpsP e₃) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₁ → κ (CPSVar v₁)))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (cpsP e₃) (cpsP e₂)) ∎ correctII κ sche (RFrame {e₁ = e₁} {e₃} (App₁ I≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI tt refl tt refl e₂) red) = begin cpsI e₁ (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) ⟶⟨ correctIP (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) red ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP e₂)) (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁))))))) (cpsP e₃) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁))))) (CPSFrame (CPSApp₁ (cpsP e₂)) CPSHole)} ⟩ CPSApp (CPSApp (cpsP e₃) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))) ∎ correctII κ sche (RFrame {e₁ = e₁} {e₃} (App₁ I≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI tt tt refl refl e₂) red) = correctIP (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) red correctII κ sche (RFrame {e₁ = e₁} {e₃} (App₁ I≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI tt tt tt refl e₂) red) = correctIP (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))))) red correctII κ sche (RFrame (App₁ I≤ₐI P≤ₐI P≤ₐI I≤ₐI P≤ₐI P≤ₐI I≤ₐI I≤ₐI tt refl refl tt e₂) red) = correctII (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP e₂))) (λ x → sApp Subst≠ (sApp (sVal sVar=) Subst≠)) red correctII κ sche (RFrame (App₁ I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI I≤ₐI tt refl tt tt e₂) red) = correctII (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) (λ x → sApp (sApp (sVal sVar=) Subst≠) Subst≠) red correctII κ sche (RFrame (App₁ I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI tt tt refl tt e₂) red) = correctII (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ x → κSubstII e₂ (λ v v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₁))) (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) (sVal x₁)))) red correctII κ sche (RFrame (App₁ I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI tt tt tt tt e₂) red) = correctII (λ v₁ → cpsI e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂)))))) (λ x → κSubstII e₂ (λ v v₁ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₁)) (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂))))) λ x₁ → sApp (sApp (sVal sVar=) (sVal x₁)) Subst≠) red correctII κ sche (RFrame (App₂ P≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐP I≤ₐI refl refl refl v₁) red) = eqApp₂ (eqApp₂ (correctPP red)) correctII κ sche (RFrame (App₂ P≤ₐI I≤ₐI P≤ₐI I≤ₐI P≤ₐP I≤ₐI refl tt refl v₁) red) = eqApp₁ (eqApp₂ (correctPP red)) correctII κ sche (RFrame {e₁ = e₁} {e₂} (App₂ I≤ₐI P≤ₐI P≤ₐI P≤ₐI P≤ₐI I≤ₐI tt refl refl v₁) red) = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII e₁ {v = cpsV v₁} (λ v₂ v₃ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃))) (λ sub → sApp Subst≠ (sApp (sVal sVar=) (sVal sub)))) ⟩ cpsI e₁ (λ z → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) ⟶⟨ correctIP (λ z → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal z))) red ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂)))) (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v)))))) (cpsP e₂) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₂ → κ (CPSVar v₂)))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal (cpsV v₁)) (cpsP e₂)) ∎ correctII κ sche (RFrame {e₁ = e₁} {e₂} (App₂ I≤ₐI I≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI tt tt refl v₁) red) = begin CPSApp (CPSVal (CPSFun (λ v₂ → cpsI e₁ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))))))) (CPSVal (cpsV v₁)) ⟶⟨ eqBeta (κSubstII e₁ {v = cpsV v₁} (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) (λ sub → sApp (sApp (sVal sVar=) (sVal sub)) Subst≠)) ⟩ cpsI e₁ (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal z)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) ⟶⟨ correctIP (λ z → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal z)) (CPSVal (CPSFun (λ v → κ (CPSVar v))))) red ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂))))))) (cpsP e₂) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁))))) (CPSFrame (CPSApp₂ (cpsV v₁)) CPSHole)} ⟩ CPSApp (CPSApp (CPSVal (cpsV v₁)) (cpsP e₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))) ∎ correctII κ sche (RFrame (App₂ I≤ₐI P≤ₐI I≤ₐI P≤ₐI I≤ₐI I≤ₐI tt refl tt v₁) red) = eqApp₁ (eqFun (λ x → correctII (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁)))) (CPSApp (CPSVal (CPSVar x)) (CPSVal v))) (λ x → sApp Subst≠ (sApp Subst≠ (sVal sVar=))) red)) correctII κ sche (RFrame (App₂ I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI I≤ₐI tt tt tt v₁) red) = eqApp₁ (eqFun (λ x → correctII (λ v → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal v)) (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁))))) (λ x → sApp (sApp Subst≠ (sVal sVar=)) Subst≠) red)) correctPP : {var : cpstyp → Set} → {τ₁ τ₂ : typ} → {e₁ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ]} → {e₂ : term[ var ∘ cpsT ] τ₁ cps[ τ₂ , τ₂ , P ]} → Reduce e₁ e₂ → cpsequal (cpsP {var = var} e₁) (cpsP e₂) correctPP (RBeta P≤ₐP P≤ₐP refl refl sub) = eqBeta (eSubstPP sub) correctPP (RFrame (App₁ P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP refl refl refl refl e₂) red) = eqApp₁ (correctPP red) correctPP (RFrame (App₂ P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP P≤ₐP refl refl refl v₁) red) = eqApp₂ (correctPP red) correctPP (RFrame {a₁ = P} (Reset P≤ₐP refl refl) red) = correctPP red correctPP (RFrame {a₁ = I} {e₁ = e₁} {e₂} (Reset P≤ₐI tt refl) red) = begin cpsI e₁ CPSVal ⟶⟨ correctIP CPSVal red ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (cpsP e₂) ⟶⟨ eqOmega {con = CPSHole} ⟩ cpsP e₂ ∎ correctPP (RFrame {a₁ = I} (Reset I≤ₐI tt tt) red) = correctII CPSVal (λ _ → sVal sVar=) red correctPP RReset = eqId -- 1st correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ (λ v → CPSVal v) (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₂ (eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (cpsP (pcontext-plug p₂ (Val (Var z))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqOmega {con = CPSHole})) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ∎ -- 2nd correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₁))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → ekSubstII (λ x₂ x₃ → CPSApp (CPSVal (CPSVar x₁)) (CPSVal x₃)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal z₂))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₂)) (λ x₁ → sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₁))))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₁ → CPSApp (CPSVal (CPSFun (λ x₂ → CPSVal (CPSVar x₂)))) (CPSVal x₁)) (λ x₁ → CPSVal x₁) (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqOmega {con = CPSHole}))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ x₁ → CPSVal x₁)))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) ∎ -- 3rd correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₂ (eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (cpsP (pcontext-plug p₂ (Val (Var z)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqOmega {con = CPSHole})))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsP (e₁ z)))) (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpscontext-plug CPSHole (cpsP (pcontext-plug p₂ (Val (Var z)))))))))) ∎ -- 4th correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐP} {P≤ₐP} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₂ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₂))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → ekSubstII (λ x₃ x₄ → CPSApp (CPSVal (CPSVar x₂)) (CPSVal x₄)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ z₂ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₃ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal z₃))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₃ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₃)) (λ x₂ → sApp (sVal sVar=) (sVal x₂))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₂)))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₂ → CPSApp (CPSVal (CPSFun (λ x₃ → CPSVal (CPSVar x₃)))) (CPSVal x₂)) (λ x₂ → CPSVal x₂) (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) (λ x₂ → CPSVal x₂))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) ∎ -- 5th correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqOmega {con = CPSHole})) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsP (e₁ z)))) (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) ⟵⟨ eqOmega {con = CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x))))))) ∎ -- 6th correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₁))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → ekSubstII (λ x₂ x₃ → CPSApp (CPSVal (CPSVar x₁)) (CPSVal x₃)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal z₂))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₂)) (λ x₁ → sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₁))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₁ → CPSApp (CPSVal (CPSFun (λ x₂ → CPSVal (CPSVar x₂)))) (CPSVal x₁)) (λ x₁ → CPSVal x₁) (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqOmega {con = CPSHole}))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ x₁ → CPSVal x₁)))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsP (e₁ z)))) (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ x₁ → CPSVal x₁)))) ⟵⟨ eqOmega {con = CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))) ∎ -- 7th correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqOmega {con = CPSHole})))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z)))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsP (e₁ z)))) (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) ⟵⟨ eqOmega {con = CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x)))))))))) ∎ -- 8th correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐP} {P≤ₐI} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₂ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₂))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → ekSubstII (λ x₃ x₄ → CPSApp (CPSVal (CPSVar x₂)) (CPSVal x₄)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ z₂ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₃ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal z₃))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₃ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₃)) (λ x₂ → sApp (sVal sVar=) (sVal x₂))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₂)))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₂ → CPSApp (CPSVal (CPSFun (λ x₃ → CPSVal (CPSVar x₃)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLetApp ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsP (e₁ z)))) (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) ⟵⟨ eqOmega {con = CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (e₁ x)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))))))) ∎ -- 9th correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = P} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v)))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqOmega {con = CPSHole})) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z))))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ _ → eqOmega {con = CPSHole}) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ z → CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (cpsP (e₁ z))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ x → eqBeta (sApp (sVal sVar=) Subst≠)) ⟩ CPSLet (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ z → CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z)))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 10th correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = I} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P P refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₁))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → ekSubstII (λ x₂ x₃ → CPSApp (CPSVal (CPSVar x₁)) (CPSVal x₃)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal z₂))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₂)) (λ x₁ → sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₁))))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₂ → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqOmega {con = CPSHole}))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ x → eqOmega {con = CPSHole}) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ z → CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (cpsP (e₁ z))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ x → eqBeta (sApp (sVal sVar=) Subst≠)) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ z → CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z)))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))))) (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 11th correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = P} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqOmega {con = CPSHole})))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z)))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → cpsP (e₁ z)) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ x → eqOmega {con = CPSHole}) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (cpsP (e₁ z))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ x → eqBeta (sApp (sVal sVar=) Subst≠)) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z)))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x)))))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 12th correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = I} {P≤ₐI} {I≤ₐI} p₁ p₂ samep refl tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift P I refl e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ x → cpsP (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₂ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₂))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))))))))) (λ z → cpsP (e₁ z)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → ekSubstII (λ x₃ x₄ → CPSApp (CPSVal (CPSVar x₂)) (CPSVal x₄)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ z₂ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₃ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal z₃))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₃ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₃)) (λ x₂ → sApp (sVal sVar=) (sVal x₂))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₂)))))))) (λ x → cpsP (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP (e₁ x)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₂ → CPSApp (CPSVal (CPSFun (λ x₃ → CPSVal (CPSVar x₃)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ x → cpsP (e₁ x)) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ x → eqOmega {con = CPSHole}) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ z → CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (cpsP (e₁ z))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ x → eqBeta (sApp (sVal sVar=) Subst≠)) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ z → CPSVal (CPSFun (λ y → CPSApp (CPSVal (CPSVar y)) (cpsP (e₁ z)))))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (e₁ x))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 13th correctPP (RShift {a₂ = P} {a₅ = P} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = P} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift I P tt e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl tt refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsI (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp Subst≠ (sApp (sVal sVar=) Subst≠))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v)))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ x → cpsI (e₁ x) CPSVal) (eqFun (λ x → eqOmega {con = CPSHole})) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z))))) (λ x → cpsI (e₁ x) CPSVal) ⟶⟨ eqLet₁ (λ x → cpsI (e₁ x) CPSVal) (eqFun (λ x → eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ x → cpsI (e₁ x) CPSVal) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ x → correctContI {e₁ = e₁ x} (λ x₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₁)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP (pcontext-plug p₂ (Val (Var z)))))) (λ z → cpsI (e₁ z) (λ x₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₁))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ x → eqBeta (κSubstII (e₁ x) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x₁ → sApp (sVal sVar=) (sVal x₁)))) ⟩ CPSLet (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (λ z → CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 14th correctPP (RShift {a₂ = P} {a₅ = I} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = P} {a₅ = I} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift I P tt e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt tt tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ x → cpsI (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₁))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqApp₁ (eqBeta (sVal (sFun (λ x₁ → ekSubstII (λ x₂ x₃ → CPSApp (CPSVal (CPSVar x₁)) (CPSVal x₃)) (subst-pcontext-plug-I p₂ (Var x)) (λ sub → sApp Subst≠ (sVal sub)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal z₂))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₂ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₂)) (λ x₁ → sApp (sVal sVar=) (sVal x₁))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₁ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₁))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₁ → CPSApp (CPSVal (CPSFun (λ x₂ → CPSVal (CPSVar x₂)))) (CPSVal x₁)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) (λ x → correctContI {e₁ = e₁ x} (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=))) ⟩ CPSLet (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) (λ z → cpsI (e₁ z) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) (λ x → eqBeta (κSubstII (e₁ x) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x₁ → sApp (sVal sVar=) (sVal x₁)))) ⟩ CPSLet (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) (λ z → CPSApp (CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))) (λ z → CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) (CPSVal (CPSFun (λ x → cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 15th correctPP (RShift {a₂ = I} {a₅ = P} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt refl e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = P} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt refl e₁) | refl = begin cpsI (pcontext-plug p₁ (Shift I I tt e₁)) CPSVal ⟶⟨ shift-lemma P≤ₐP refl tt refl p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))))))))) (λ x → cpsI (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar v))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqOmega {con = CPSHole})))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ x → cpsP (pcontext-plug p₂ (Val (Var x)))))) (CPSVal (CPSVar z)))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (eSubstPP (subst-pcontext-plug-P p₂ (Var x))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsP (pcontext-plug p₂ (Val (Var z))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (λ x → correctContI {e₁ = e₁ x} (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=))) ⟩ CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (λ z → cpsI (e₁ z) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (λ x → eqBeta (κSubstII (e₁ x) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x₁ → sApp (sVal sVar=) (sVal x₁)))) ⟩ CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x))))))))) (λ z → CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP (pcontext-plug p₂ (Val (Var x)))))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎ -- 16th correctPP (RShift {a₂ = I} {a₅ = I} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt tt e₁) with wf-pcontext p₂ correctPP (RShift {a₂ = I} {a₅ = I} {I≤ₐI} {I≤ₐI} p₁ p₂ samep tt tt e₁) | tt = begin cpsI (pcontext-plug p₁ (Shift I I tt e₁)) CPSVal ⟶⟨ shift-lemma I≤ₐI tt tt tt p₁ p₂ samep e₁ CPSVal (λ t → (sVal sVar=)) ⟩ CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ x → cpsI (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp (sApp (sVal sVar=) Subst≠) Subst≠))))))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar v₁)) (CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (pcontext-plug p₂ (Val (Var x))) (λ v₂ → CPSApp (CPSVal (CPSVar k)) (CPSVal v₂))))))) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqApp₁ (eqBeta (sVal (sFun (λ x₂ → ekSubstII (λ x₃ x₄ → CPSApp (CPSVal (CPSVar x₂)) (CPSVal x₄)) (subst-pcontext-plug-I p₂ (Var x)) (λ x₃ → sApp Subst≠ (sVal x₃)))))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ z₂ → cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₃ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal z₃))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (eqBeta (κSubstII (pcontext-plug p₂ (Val (Var x))) (λ z z₃ → CPSApp (CPSVal (CPSVar z)) (CPSVal z₃)) (λ x₂ → sApp (sVal sVar=) (sVal x₂))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) (λ z₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal z₂)))))))) (λ z → cpsI (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI (e₁ z) CPSVal) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {e₁ = pcontext-plug p₂ (Val (Var x))} (λ x₃ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSVal x₃)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=)))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (cpsI (pcontext-plug p₂ (Val (Var z))) CPSVal)))))) (λ z → cpsI (e₁ z) CPSVal) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) (λ x → correctContI {e₁ = e₁ x} (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂)) CPSVal (λ t → (sApp Subst≠ (sVal sVar=))) (λ t → (sVal sVar=)) (λ t → eqBeta (sVal sVar=))) ⟩ CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) (λ z → cpsI (e₁ z) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal x₂))) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) (λ x → eqBeta (κSubstII (e₁ x) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x₁ → sApp (sVal sVar=) (sVal x₁)))) ⟩ CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) (λ z → CPSApp (CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal)))))) (λ z → CPSVal (CPSFun (λ y → cpsI (e₁ z) (λ v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ⟶⟨ eqApp₁ eqLetApp ⟩ CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → cpsI (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsI (pcontext-plug p₂ (Val (Var x))) CPSVal))))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ∎