-- correctness of selective CPS transformation -- tested on Agda 2.5.2, standard library 0.13 -- (takes a few minutes to type check) module ppl19 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 a₂ τ₂ τ leq c (e₁ y)) v (Fun a₂ τ₂ τ 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₁ -- 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₁) -- 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₂) -- 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₁≤ₐa₃ c₁ e₁)) (Val v₂)) e₁′ RFrame : {τ₁ τ₂ τ₃ τ₄ τ₅ τ₆ : typ} → {a₁ a₂ : ann} → {e₁ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]} → {e₂ : term[ var ] τ₁ cps[ τ₂ , τ₃ , a₁ ]} → {f : frame[ var , τ₁ cps[ τ₂ , τ₃ , a₁ ]] τ₄ cps[ τ₅ , τ₆ , a₂ ]} → 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₂ → (c : τ₁ ≠ τ₂ ⇒ a₁ =i) → (c₅ : τ₄ ≠ τ ⇒ a₅ =i) → (e₁ : var (τ₀ ⇒ τ cps[ α , α , a₂ ]) → term[ var ] τ₁ cps[ τ₁ , τ₂ , a₁ ]) → Reduce {τ₂ = τ₃} (Reset {a₁ = I} τ₄ τ₂ τ₃ 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₃ τ₁ (τ₀ ⇒ τ cps[ α , α , a₂ ]) a₁≤ₐa₃ c e₁)) (Val (Fun a₂ τ τ₀ P≤ₐa refl (λ x → let e = pcontext-plug {τ₁ = τ₄} τ₀ {a = a₅} p₂ (Val (Var x)) in Reset {a₁ = a₅} τ₄ τ α (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 .Nat (Num n) = CPSNum n cpsV τ₁ (Var x) = CPSVar x cpsV .(τ₂ ⇒ τ₁ cps[ τ₃ , τ₃ , P ]) (Fun .P τ₁ τ₂ {τ₃} P≤ₐP refl e₁) = CPSFun (λ x → cpsP τ₁ τ₃ (e₁ x)) cpsV .(τ₂ ⇒ τ₁ cps[ τ₃ , τ₃ , I ]) (Fun .I τ₁ τ₂ {τ₃} P≤ₐI refl e₁) = CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP τ₁ τ₃ (e₁ x))))) cpsV .(τ₂ ⇒ τ₁ cps[ τ₃ , τ₄ , I ]) (Fun .I τ₁ τ₂ {τ₃} {τ₄} 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 (τ₃ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₂ e₁) (cpsP τ₃ τ₂ e₂) cpsP τ₁ τ₂ (Reset {P} .τ₁ .τ₁ .τ₂ refl e₁) = cpsP τ₁ τ₁ e₁ cpsP τ₁ τ₂ (Reset {I} τ₃ .τ₁ .τ₂ tt e₁) = cpsI τ₃ τ₃ τ₁ e₁ (λ v → CPSVal v) 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₂) k = CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (cpsP (τ₂ ⇒ τ₁ cps[ τ₃ , τ₃ , P ]) τ₃ e₁) (cpsP τ₂ τ₃ e₂)) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} P≤ₐI P≤ₐI I≤ₐI refl refl tt e₁ e₂) k = CPSApp (CPSApp (cpsP (τ₄ ⇒ τ₁ cps[ τ₂ , τ₃ , I ]) τ₃ e₁) (cpsP τ₄ τ₃ e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} P≤ₐI I≤ₐI P≤ₐI refl tt refl e₁ e₂) k = CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₄ τ₂ τ₃ e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (cpsP (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₃ e₁) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} {τ₄ = τ₅} P≤ₐI I≤ₐI I≤ₐI refl tt tt e₁ e₂) k = CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₄ τ₅ τ₃ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (cpsP (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) τ₃ e₁) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} I≤ₐI P≤ₐI P≤ₐI tt refl refl e₁ e₂) k = cpsI (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₂ τ₃ e₁ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP τ₄ τ₂ e₂))) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₅} {τ₄ = τ₄} I≤ₐI P≤ₐI I≤ₐI tt refl tt e₁ e₂) k = cpsI (τ₅ ⇒ τ₁ cps[ τ₂ , τ₄ , I ]) τ₄ τ₃ e₁ (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₅ τ₄ e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} {τ₅ = τ₅} I≤ₐI I≤ₐI P≤ₐI tt tt refl e₁ e₂) k = cpsI (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₅ τ₃ e₁ (λ v₁ → cpsI τ₄ τ₂ τ₅ e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) cpsI τ₁ τ₂ τ₃ (App {τ₂ = τ₄} {τ₄ = τ₅} {τ₆} I≤ₐI I≤ₐI I≤ₐI tt tt tt e₁ e₂) k = cpsI (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) τ₆ τ₃ e₁ (λ v₁ → cpsI τ₄ τ₅ τ₆ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) cpsI τ₁ τ₂ τ₃ (Shift P P τ .τ₃ .τ₃ .τ₁ .τ₂ refl e₁) k = CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsP τ₃ τ₃ (e₁ x)) cpsI τ₁ τ₂ τ₃ (Shift P I τ .τ₃ .τ₃ .τ₁ .τ₂ refl e₁) k = CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (k (CPSVar a))))))) (λ x → cpsP τ₃ τ₃ (e₁ x)) cpsI τ₁ τ₂ τ₃ (Shift I P τ τ₄ .τ₃ .τ₁ .τ₂ tt e₁) k = CPSLet (CPSVal (CPSFun (λ a → k (CPSVar a)))) (λ x → cpsI τ₄ τ₄ τ₃ (e₁ x) (λ v → CPSVal v)) cpsI τ₁ τ₂ τ₃ (Shift I I τ τ₄ .τ₃ .τ₁ .τ₂ tt e₁) k = CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (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₂ τ₁ τ₂ x x₁ x₂} = sFun x x₁ (λ x₃ → 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 τ₁ τ₂ τ₃ x t} = sReset x Subst≠DS Subst≠DS {t = Shift a₁ a₂ τ τ₁ τ₂ τ₃ τ₄ x x₁} = sShift x (λ 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 {τ = cpsT (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ])} e₂ {(cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) 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 {τ = cpsT (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ])} e₂ {(cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) 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 (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) t)) (CPSVal v₂))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ₂ (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) 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 {τ = cpsT (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ])} e₂ {(cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) 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 {τ = cpsT (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ])} e₂ {(cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) 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 (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) t)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ₁ (CPSVar v))))) (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₁ cps[ τ₂ , τ₅ , I ]) 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} (pcontext-plug τ₁ p₁ (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₁ e₁)) k) (cpsI τ₄ τ₅ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt c₃ (Val (Fun a₃ τ₄ τ₁ 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≤ₐP refl refl refl .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (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} {I} P≤ₐI refl refl tt .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ z → cpsP τ₃ τ₃ (e₁ z)) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ (CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ x → cpsP τ₃ τ₃ (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x)))))))) ∎ shift-lemma {.τ₃} {τ₁} {τ₂} {τ₃} {α = α} {a₁ = P} {I} {P} P≤ₐP refl refl refl .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (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 (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (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} {I} {I} P≤ₐI refl refl tt .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ z₂ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ 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 (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ x → cpsP τ₃ τ₃ (e₁ x))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x)))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {α = α} {a₁ = I} {P} {P} P≤ₐP refl tt refl .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (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 (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a)))))) (λ x → cpsI τ τ τ₃ (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {α = α} {a₁ = I} {P} {I} P≤ₐI refl tt tt .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ z → cpsI τ τ τ₃ (e₁ z) CPSVal) ⟵⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ (CPSApp (CPSVal (CPSFun (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → k (CPSVar v))))))) (λ x → cpsI τ τ τ₃ (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x)))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {α = α} {a₁ = I} {I} {P} P≤ₐP refl tt refl .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSVar x)))) (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 (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))))))))) (λ x → cpsI τ τ τ₃ (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSVar x))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {α = α} {a₁ = I} {I} {I} P≤ₐI refl tt tt .(Hole tt) .(Hole refl) Hole 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 (λ v → k (CPSVar v)))) (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 (λ z₂ → CPSApp (CPSVal (CPSVar z₂)) (CPSVal (CPSVar z))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x))))))) (CPSVal (CPSVar z))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ 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 (λ v₁ → CPSLet (CPSVal (CPSFun (λ a → CPSVal (CPSFun (λ k′ → CPSApp (CPSVal (CPSVar k′)) (CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal (CPSVar a))) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))))) (λ x → cpsI τ τ τ₃ (e₁ x) CPSVal)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar x)))))))) ∎ -- Frame/App₁ case (10 cases) shift-lemma {τ} {τ₁} {.τ₄} {.τ₄} {τ₅} {.τ₄} {α} {.P} {a₁} {a₂} {.P} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂)} {.(App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂)} (App₁ {τ₂} {τ₄} {.P} {.P} P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (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≠))) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂))) ≡⟨ refl ⟩ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP τ₂ τ₄ e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ correctContI {var} {τ₁} {τ₄} {τ₄} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ (CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂))) ⟵⟨ eqApp₂ (eqBeta (sApp (eSubstPP {var} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (λ v₁ → cpsI τ₁ τ₄ τ₄ (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)))))) (CPSVal (CPSFun (λ x → CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (cpsP τ₂ τ₄ e₂))))) ∎ shift-lemma {τ} {τ₁} {.τ₄} {.τ₄} {τ₅} {.τ₄} {α} {.P} {a₁} {a₂} {.I} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂)} {.(App₁ P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂)} (App₁ {τ₂} {τ₄} {.P} {.P} P≤ₐP P≤ₐP P≤ₐP refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (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≠))) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂))) ≡⟨ refl ⟩ 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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP τ₂ τ₄ e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ correctContI {var} {τ₁} {τ₄} {τ₄} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) ⟵⟨ eqBeta (sApp (sVal sVar=) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (λ v₁ → cpsI τ₁ τ₄ τ₄ (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (cpsP τ₂ τ₄ e₂)))))))) ∎ shift-lemma {τ} {τ₁} {.τ₄} {.τ₄} {τ₅} {.τ₄} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂)} {.(App₁ P≤ₐI P≤ₐI P≤ₐI refl refl refl e₂)} (App₁ {τ₂} {τ₄} {.P} {.P} P≤ₐI P≤ₐI P≤ₐI refl refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (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≠))) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₄ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂))) ≡⟨ refl ⟩ 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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (CPSVar v)) (cpsP τ₂ τ₄ e₂))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ correctContI {var} {τ₁} {τ₄} {τ₄} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) ≡⟨ refl ⟩ cpscontext-plug (CPSFrame (CPSApp₂ (CPSFun (λ v → k (CPSVar v)))) CPSHole) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v → k (CPSVar v)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSVal (CPSVar z))))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (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 (λ v₁ → cpsI τ₁ τ₄ τ₄ (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (cpsP τ₂ τ₄ e₂)))))))) ∎ shift-lemma {τ} {τ₁} {τ₃} {.τ₃} {τ₅} {.τ₄} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .I} {f₁ = .(App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂)} {.(App₁ I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂)} (App₁ {τ₂} {τ₄} {.P} {.P} I≤ₐI P≤ₐI P≤ₐI tt refl refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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≠))) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁)) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂))) ≡⟨ refl ⟩ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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₂)))))) ⟷⟨ correctContI {var} {τ₁} {τ₃} {τ₃} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 {var} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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)) ⟷⟨ correctContI {var} {τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]} {τ₄} {τ₃} {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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) u))) ⟶⟨ eqBeta (sApp Subst≠ (sApp (sVal sVar=) Subst≠)) ⟩ CPSApp (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) u)) (cpsP τ₂ τ₄ e₂)) ≡⟨ refl ⟩ cpscontext-plug (CPSFrame (CPSApp₂ (CPSFun (λ v₂ → k (CPSVar v₂)))) CPSHole) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) u)) (cpsP τ₂ τ₄ e₂)) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ (CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) u)) (cpsP τ₂ τ₄ e₂))) ∎) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 (λ z → cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSFun (λ v₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v₁))))) (CPSApp (CPSVal v) (cpsP τ₂ τ₄ e₂)))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (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 (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (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 (λ v₁ → cpsI τ₁ τ₃ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₄ , τ₄ , P ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂))))))))) ∎ shift-lemma {τ} {τ₁} {.τ₄} {.τ₄} {τ₅} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂)} {.(App₁ P≤ₐI P≤ₐI I≤ₐI refl refl tt e₂)} (App₁ {τ₂} {τ₄} {.P} {.I} P≤ₐI P≤ₐI I≤ₐI refl refl tt e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₄ (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≠)) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₄ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ≡⟨ refl ⟩ (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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (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₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (CPSVar v)) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ correctContI {var} {τ₁} {τ₄} {τ₄} {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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ z → k (CPSVar z))))) (CPSFrame (CPSApp₁ (cpsP τ₂ τ₄ e₂)) CPSHole)} ⟩ cpscontext-plug (CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))) (CPSFrame (CPSApp₁ (cpsP τ₂ τ₄ e₂)) CPSHole)) (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ (CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃))))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (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 (λ z → CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val t))) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sApp (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (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₁ → CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (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 (λ v₁ → cpsI τ₁ τ₄ τ₄ (Shift a₁ a₂ α τ τ₄ τ₁ τ₄ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (cpsP (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ (pcontext-plug τ₁ p₂ (Val (Var x)))) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))) ∎ shift-lemma {τ} {τ₁} {τ₃} {.τ₃} {τ₅} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .I} {f₁ = .(App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂)} {.(App₁ I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂)} (App₁ {τ₂} {τ₄} {.P} {.I} I≤ₐI P≤ₐI I≤ₐI tt refl tt e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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≠)) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ≡⟨ refl ⟩ 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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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₃)))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 {var} {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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 {var} (pcontext-plug τ₁ p₂ (Val t)) (λ z v → CPSApp (CPSVal (CPSVar z)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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)) ⟷⟨ 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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) t₁))) ⟶⟨ eqBeta (sApp (sApp (sVal sVar=) Subst≠) Subst≠) ⟩ CPSApp (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) t₁)) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v₃ → k (CPSVar v₃)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ (CPSApp (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) t₁)) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) ∎) ⟩ cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 {var} (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 (λ z → cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (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 (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (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 (λ v₁ → cpsI τ₁ τ₃ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₅ cps[ τ₈ , τ₄ , I ]) τ₄ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → CPSApp (CPSApp (CPSVal v₁) (cpsP τ₂ τ₄ e₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {.τ₂} {τ₄} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂)} {.(App₁ P≤ₐI I≤ₐI P≤ₐI refl tt refl e₂)} (App₁ {τ₃} {.τ₈} {.I} {.P} P≤ₐI I≤ₐI P≤ₐI refl tt refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ τ₂ (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 {var} 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ τ₂ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₂ τ₁ τ₂ c₄ e₁)) (λ v₁ → cpsI τ₃ τ₈ τ₂ e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) ⟶⟨ 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₁) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → cpsI τ₃ τ₈ τ₂ e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) (CPSApp (CPSVal (cpsV (τ₁ ⇒ τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ] cps[ τ₂ , τ₂ , P ]) (Fun P (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ 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 (cpsV (τ₁ ⇒ τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ] cps[ τ₂ , τ₂ , P ]) (Fun P (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₁ P≤ₐP refl (λ x → 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val t))) ⟵⟨ eqApp₁ (eqFun (λ x → correctContI {var} {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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val t))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII {var} 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 (λ z → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₃ τ₈ τ₂ e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val t)))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (eSubstPP {var} {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 (λ 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))))))))) (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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (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 (λ v₁ → cpsI τ₁ τ₂ τ₂ (Shift a₁ a₂ α τ τ₂ τ₁ τ₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) ∎ shift-lemma {τ} {τ₁} {τ₃} {.τ₃} {τ₄} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₅ = τ₅} {a₂ = .I} {f₁ = .(App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂)} {.(App₁ I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂)} (App₁ {τ₂} {.τ₈} {.I} {.P} I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 {var} 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁)) (λ v₁ → cpsI τ₂ τ₈ τ₅ e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) ≡⟨ refl ⟩ 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII {var} (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₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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₃))))))) ⟷⟨ correctContI {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 {var} {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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ z₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal _))))) (CPSVal (CPSFun (λ v → cpsI τ₂ τ₈ τ₅ e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)))))) ⟶⟨ eqBeta (κSubstII {var} (pcontext-plug τ₁ p₂ (Val t)) (λ y z₁ → CPSApp (CPSVal (CPSVar y)) (CPSVal z₁)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 {var} 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁))) ⟶⟨ eqBeta (κSubstII {var} 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁)) (CPSVal v₃))) ⟷⟨ correctContI {e₁ = e₂} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁)) (CPSVal v₃))) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁)) (CPSVal (cpsV τ₂ t₂)))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ v₂ → k (CPSVar v₂)))) CPSHole} ⟩ (CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁)) (CPSVal (cpsV τ₂ t₂)))) ∎) ⟩ (cpsI τ₂ τ₈ τ₅ e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) t₁)) (CPSVal v₃)))) ∎) ⟩ cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 {var} (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 {var} 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 (λ z → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ v₁ → cpsI τ₂ τ₈ τ₅ e₂ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal v₁) (CPSVal v₃))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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₃)))) {κ₂ = λ 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 {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 (cpsV τ₁ t))) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ∎) ⟩ cpsI τ₁ τ₃ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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 {var} (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 (λ v₁ → cpsI τ₁ τ₃ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₈ , P ]) τ₅ τ₃ (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₂)))))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {.τ₂} {τ₄} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {a₂ = .P} {f₁ = .(App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂)} {.(App₁ P≤ₐI I≤ₐI I≤ₐI refl tt tt e₂)} (App₁ {τ₃} {τ₅} {.I} {.I} P≤ₐI I≤ₐI I≤ₐI refl tt tt e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ τ₂ (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 {var} 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ τ₂ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₂ τ₁ τ₂ c₄ e₁)) (λ v₁ → cpsI τ₃ τ₅ τ₂ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) ≡⟨ refl ⟩ 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII {var} (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₁) (λ 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₂))) ⟷⟨ 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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (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 (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (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 (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (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 (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val t))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII {var} 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 (λ z → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₃ τ₅ τ₂ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val t)))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₃ τ₅ τ₂ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))))))))) (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 (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₁ → cpsI τ₁ τ₂ τ₂ (Shift a₁ a₂ α τ τ₂ τ₁ τ₂ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₁ → cpsI τ₃ τ₅ τ₂ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (cpsP (τ₃ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₂ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) ∎ shift-lemma {τ} {τ₁} {τ₃} {.τ₃} {τ₄} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₅ = τ₆} {a₂ = .I} {f₁ = .(App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂)} {.(App₁ I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂)} (App₁ {τ₂} {τ₅} {.I} {.I} I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂) {p₁} {p₂} samep) e₁ k sch = begin (cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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 {var} e₂ (λ v₂ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x₁ → sApp (sApp (sVal sVar=) (sVal x₁)) Subst≠))) ⟩ cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁)) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))) ≡⟨ refl ⟩ 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal v))))))) ⟶⟨ eqBeta (κSubstII {var} (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₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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₄))))))))) ⟷⟨ correctContI {var} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁} (λ v₂ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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 (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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 {var} {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) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal v))))) (CPSVal (CPSFun (λ v → cpsI τ₂ τ₅ τ₆ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟶⟨ eqBeta (κSubstII {var} (pcontext-plug τ₁ p₂ (Val t)) (λ y v → CPSApp (CPSVal (CPSVar y)) (CPSVal v)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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)) ⟷⟨ correctContI {var} {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 {var} 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) t₁))) ⟶⟨ eqBeta (κSubstII {var} 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₂ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) ⟵⟨ correctContI {var} {e₁ = e₂} (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) 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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) t₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))))) ∎) ⟩ cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (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 {var} (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 {var} 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 (λ z → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val t)) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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))))))) {κ₂ = λ 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 {var} {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)))))) {κ₂ = λ v₃ → CPSApp (CPSApp (CPSVal v₁′) (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 (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (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 (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₃ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))))) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₁ → cpsI τ₁ τ₃ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₃ c₄ e₁) (λ v₂ → CPSApp (CPSApp (CPSVal (CPSVar v₁)) (CPSVal v₂)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → cpsI (τ₂ ⇒ τ₄ cps[ τ₈ , τ₅ , I ]) τ₆ τ₃ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₁ → cpsI τ₂ τ₅ τ₆ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))))) ∎ -- Frame/App₂ case (6 cases) shift-lemma {τ} {τ₁} {.τ₈} {τ₃} {τ₅} {τ₈} {α} {.P} {a₁} {a₂} {.P} {var} P≤ₐP refl c₂ refl .(Frame (App₂ I≤ₐI P≤ₐI tt refl v₁) p₁) .(Frame (App₂ P≤ₐP P≤ₐP refl refl v₁) p₂) (Frame {τ₄} {.τ₈} {.τ₅} {.τ₈} {.P} {.P} {.(App₂ I≤ₐI P≤ₐI tt refl v₁)} {.(App₂ P≤ₐP P≤ₐP refl refl v₁)} (App₂ P≤ₐP P≤ₐP 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁))) ⟶⟨ eqBeta (κSubstII {var} (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₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ cpsI τ₄ τ₈ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ≡⟨ refl ⟩ 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII {var} (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI τ₁ τ₈ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₃))) ⟷⟨ correctContI {var} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (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 (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x))))))) (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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val t)))) ⟵⟨ eqApp₂ (eqBeta (sApp Subst≠ (eSubstPP {var} {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 → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x))))))) (CPSVal (cpsV τ₁ t)))) ∎) ⟩ cpsI τ₁ τ₈ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSFun (λ x → CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x))))))) (CPSVal v₃))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₂ → cpsI τ₁ τ₈ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))))) ∎ shift-lemma {τ} {τ₁} {.τ₈} {τ₃} {τ₅} {τ₈} {α} {.P} {a₁} {a₂} {.I} {var} 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 {τ₄} {.τ₈} {.τ₅} {.τ₈} {.P} {.P} {.(App₂ I≤ₐI P≤ₐI tt refl v₁)} {.(App₂ P≤ₐP P≤ₐP refl refl v₁)} (App₂ P≤ₐP P≤ₐP 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁))) ⟶⟨ eqBeta (κSubstII {var} (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₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ cpsI τ₄ τ₈ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ≡⟨ refl ⟩ 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII {var} (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI τ₁ τ₈ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₃))) ⟷⟨ correctContI {var} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (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 (CPSVal (CPSVar k₁)) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) 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 → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) CPSHole)} ⟩ CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val t)))) ⟵⟨ eqBeta (sApp (sVal sVar=) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSVar z)) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val t))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp Subst≠ (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) (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 (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₂ → cpsI τ₁ τ₈ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₈ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSVar k₁)) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (cpsP τ₄ τ₈ (pcontext-plug τ₁ p₂ (Val (Var x))))))))))) ∎ shift-lemma {τ} {τ₁} {.τ₅} {τ₃} {τ₆} {.τ₅} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₄} {τ₅} {.τ₆} {.τ₅} {.P} {.I} {.(App₂ I≤ₐI P≤ₐI tt refl v₁)} {.(App₂ P≤ₐI P≤ₐI refl refl v₁)} (App₂ P≤ₐI P≤ₐI 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 (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) 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₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal v₃))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ cpsI τ₄ τ₅ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal v₃))) ≡⟨ refl ⟩ 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 (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (CPSFun (λ x → cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))) ⟶⟨ eqBeta (κSubstII {var} (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃))) (λ x → sApp Subst≠ (sApp (sVal sVar=) (sVal x)))) ⟩ cpsI τ₁ τ₅ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₃))) ⟷⟨ correctContI {var} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (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 (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) 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 → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (CPSVar v)))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal (cpsV τ₁ t)))) ⟶⟨ eqApp₂ (eqBeta (eSubstPP {var} {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 (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (CPSVal (CPSVar v)))))) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t))) ⟶⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) (CPSFrame (CPSApp₂ (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) CPSHole)} ⟩ cpscontext-plug (CPSFrame (CPSApp₂ (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSFrame (CPSApp₂ (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) CPSHole)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) ≡⟨ refl ⟩ cpscontext-plug (CPSFrame (CPSApp₂ (CPSFun (λ v → k (CPSVar v)))) CPSHole) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSVal (CPSVar z))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → sApp (sVal sVar=) Subst≠))) Subst≠) ⟩ CPSApp (CPSVal (CPSFun (λ z → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp Subst≠ (sApp Subst≠ (eSubstPP {var} {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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) (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 (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))))))) (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 (λ v₂ → cpsI τ₁ τ₅ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (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 (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₅ , τ₅ , P ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x))))))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {τ₅} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₄} {.τ₈} {.τ₅} {.τ₈} {.I} {.I} {.(App₂ I≤ₐI P≤ₐI tt refl v₁)} {.(App₂ I≤ₐI P≤ₐI tt refl v₁)} (App₂ I≤ₐI P≤ₐI 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 (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁))) ⟶⟨ eqBeta (κSubstII {var} (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₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ⟷⟨ shift-lemma I≤ₐI tt c₂ tt p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) (λ x → (sApp Subst≠ (sApp Subst≠ (sVal sVar=)))) ⟩ cpsI τ₄ τ₈ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I τ₄ τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₂ e₁)) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → k (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₃))) ≡⟨ refl ⟩ 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) 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 {var} (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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ 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 (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v))))))) ⟷⟨ correctContI {var} {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 (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v))))))) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v))))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ 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 (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v)))))) ⟶⟨ eqBeta (κSubstII {var} (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)) (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v₂)))))) (CPSVal v)) ⟶⟨ correctContI {var} {e₁ = pcontext-plug τ₁ p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v₂)))))) (CPSVal v)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (CPSVar v₂)))))) (CPSVal (cpsV τ₄ t₁))) ⟶⟨ eqBeta (sApp Subst≠ (sApp Subst≠ (sVal sVar=))) ⟩ CPSApp (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (cpsV τ₄ t₁))) ⟵⟨ eqOmega {con = CPSFrame (CPSApp₂ (CPSFun (λ z → k (CPSVar z)))) CPSHole} ⟩ (CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal (cpsV τ₄ t₁)))) ∎) ⟩ cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) (CPSVal v₄))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ z → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII {var} (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 (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sVal (sFun (λ x₁ → ekSubstII {var} {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₄))) {κ₂ = λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) 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₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₂ → cpsI τ₁ τ₂ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₈ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))) (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₈ , P ]) v₁)))))))) ∎ shift-lemma {τ} {τ₁} {.τ₅} {τ₃} {τ₆} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₄} {τ₅} {.τ₆} {.τ₈} {.P} {.I} {.(App₂ I≤ₐI I≤ₐI tt tt v₁)} {.(App₂ P≤ₐI I≤ₐI refl tt v₁)} (App₂ P≤ₐI I≤ₐI 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 (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁))) ⟶⟨ eqBeta (κSubstII {var} (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₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma P≤ₐP refl c₂ refl p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) ⟩ cpsI τ₄ τ₅ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₁ P≤ₐP refl (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ≡⟨ refl ⟩ CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₁ τ₅ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) 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 {var} (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ y v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) 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₁) (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x)))))) (CPSVal v₃))) ⟷⟨ correctContI {var} {e₁ = Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁} (λ v₃ → CPSApp (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x))))) (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 (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) 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 (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) 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 (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) CPSHole)} ⟩ cpscontext-plug (CPSFrame (CPSApp₁ (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))) (CPSFrame (CPSApp₂ (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) CPSHole)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t))) ≡⟨ refl ⟩ CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) (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 (λ z → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val t)))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v)))))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x))))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (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₁ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x))))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v)))))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₂ → cpsI τ₁ τ₅ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₅ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₆ cps[ τ₈ , τ₅ , I ]) v₁)) (cpsP τ₄ τ₅ (pcontext-plug τ₁ p₂ (Val (Var x))))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))))) ∎ shift-lemma {τ} {τ₁} {τ₂} {τ₃} {τ₅} {τ₈} {α} {.I} {a₁} {a₂} {.I} {var} 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 {τ₄} {τ₆} {.τ₅} {.τ₈} {.I} {.I} {.(App₂ I≤ₐI I≤ₐI tt tt v₁)} {.(App₂ I≤ₐI I≤ₐI tt tt v₁)} (App₂ I≤ₐI I≤ₐI 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁))) ⟶⟨ eqBeta (κSubstII {var} (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₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟷⟨ shift-lemma I≤ₐI tt c₂ tt p₁ p₂ samep e₁ (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) ⟩ cpsI τ₄ τ₆ τ₃ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I τ₄ τ₁ I≤ₐI tt (λ x → pcontext-plug τ₁ p₂ (Val (Var x))))) (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₂ e₁)) (λ v₃ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ≡⟨ refl ⟩ (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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) 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 {var} (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₂ e₁) (λ y v₃ → CPSApp (CPSApp (CPSVal (CPSVar y)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (λ x → sApp (sApp (sVal sVar=) (sVal x)) Subst≠)) ⟩ 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 (CPSVar k₁)) (CPSVal v))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟷⟨ correctContI {var} {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 (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) 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 (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))))))) ⟶⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → ekSubstII {var} {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) (λ x₁ → sApp Subst≠ (sVal x₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) ⟶⟨ eqBeta (κSubstII {var} (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)) (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v₂))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal v)) ⟷⟨ correctContI {var} {e₁ = pcontext-plug τ₁ p₂ (Val t)} (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v₂))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal v)) (λ v₄ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) (λ x → (sApp Subst≠ (sVal sVar=))) (λ x → (sApp (sApp Subst≠ (sVal sVar=)) Subst≠)) (λ t₁ → begin (CPSApp (CPSVal (CPSFun (λ v₂ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (CPSVar v₂))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄))))))) (CPSVal (cpsV τ₄ t₁))) ⟶⟨ eqBeta (sApp (sApp Subst≠ (sVal sVar=)) Subst≠) ⟩ CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (cpsV τ₄ t₁))) (CPSVal (CPSFun (λ v₄ → k (CPSVar v₄)))) ⟵⟨ eqApp₂ (eqFun (λ x → eqBeta (sch (Var x)))) ⟩ (CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal (cpsV τ₄ t₁))) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) ∎) ⟩ cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSApp (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v)))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ z → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSFun (λ v₂ → k (CPSVar v₂)))) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)) ⟵⟨ eqBeta (sApp (sVal (sFun (λ x → κSubstII {var} (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 (λ z → CPSApp (CPSVal (CPSFun (λ z₁ → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val t)) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar z₁)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar z)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁))))) (CPSVal (CPSFun (λ v → k (CPSVar v)))) ⟵⟨ eqApp₁ (eqBeta (sVal (sFun (λ x → sApp (sVal (sFun (λ x₁ → ekSubstII {var} {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)))))) {κ₂ = λ 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 (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) 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₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₄ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₄)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁))))))) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v))))) ⟵⟨ eqBeta (κSubstII {var} (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 (λ v₂ → cpsI τ₁ τ₂ τ₃ (Shift a₁ a₂ α τ τ₃ τ₁ τ₂ c₂ e₁) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → k (CPSVar v)))))))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k₁ → CPSApp (CPSVal (CPSFun (λ v₂ → cpsI τ₄ τ₆ τ₂ (pcontext-plug τ₁ p₂ (Val (Var x))) (λ v₃ → CPSApp (CPSApp (CPSVal (CPSVar v₂)) (CPSVal v₃)) (CPSVal (CPSFun (λ v → CPSApp (CPSVal (CPSVar k₁)) (CPSVal (CPSVar v))))))))) (CPSVal (cpsV (τ₄ ⇒ τ₅ cps[ τ₈ , τ₆ , I ]) v₁)))))))) ∎ -- main 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 {var} {τ₁} {τ₂} κ → 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₁)) {κ₂ = λ x₁ → CPSApp (CPSVal (CPSVar x)) (CPSVal x₁)} sub (λ sub₁ → sApp Subst≠ (sVal sub₁)))))) ⟩ CPSApp (CPSVal (CPSFun (λ z → cpsI τ₁ τ₂ τ₃ e₂ (λ x₁ → CPSApp (CPSVal (CPSVar z)) (CPSVal x₁))))) (CPSVal (CPSFun (λ v₁ → κ (CPSVar v₁)))) ⟶⟨ eqBeta (κSubstII {τ = cpsT τ₁ ⇒ cpsT τ₂} e₂ (λ y v₁ → CPSApp (CPSVal (CPSVar y)) (CPSVal v₁)) (λ x → sApp (sVal sVar=) (sVal x))) ⟩ cpsI τ₁ τ₂ τ₃ e₂ (λ v₁ → CPSApp (CPSVal (CPSFun (λ v₂ → κ (CPSVar v₂)))) (CPSVal v₁)) ⟶⟨ 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 {τ₂ = τ₂} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₃} P≤ₐI P≤ₐI P≤ₐI refl refl refl e₂} red) = eqApp₂ (eqApp₁ (correctPP (τ₃ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₂ red)) correctII {τ₁ = τ₁} {τ₃} {.τ₂} κ sche (RFrame {τ₂ = τ₂} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₄} P≤ₐI P≤ₐI I≤ₐI refl refl tt e₂} red) = eqApp₁ (eqApp₁ (correctPP (τ₄ ⇒ τ₁ cps[ τ₃ , τ₂ , I ]) τ₂ red)) correctII {τ₁ = τ₁} {τ₂} {.τ₃} κ sche (RFrame {τ₂ = τ₃} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₄} P≤ₐI I≤ₐI P≤ₐI refl tt refl e₂} red) = eqApp₂ (correctPP (τ₄ ⇒ τ₁ cps[ τ₂ , τ₂ , P ]) τ₃ red) correctII {τ₁ = τ₁} {τ₃} {.τ₂} κ sche (RFrame {τ₂ = τ₂} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₄} {τ₄ = τ₅} P≤ₐI I≤ₐI I≤ₐI refl tt tt e₂} red) = eqApp₂ (correctPP (τ₄ ⇒ τ₁ cps[ τ₃ , τ₅ , I ]) τ₂ red) correctII {τ₁ = τ₁} {.τ₄} {τ₃} κ sche (RFrame {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₂} {τ₄ = τ₄} I≤ₐI P≤ₐI P≤ₐI tt refl refl 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 {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₃} {τ₄ = τ₄} I≤ₐI P≤ₐI I≤ₐI tt refl 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 {τ₂ = τ₄} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₃} I≤ₐI I≤ₐI P≤ₐI tt tt refl e₂} red) = correctII (λ v₁ → cpsI τ₃ τ₂ τ₄ e₂ (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → κ (CPSVar v)))) (CPSApp (CPSVal v₁) (CPSVal v₂)))) (λ x → (κSubstII {τ = cpsT (τ₃ ⇒ τ₁ cps[ τ₂ , τ₂ , P ])} 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 {τ₂ = τ₅} {e₁ = e₁} {e₃} {App₁ {τ₂ = τ₃} {τ₄ = τ₄} I≤ₐI I≤ₐI I≤ₐI tt tt tt e₂} red) = correctII (λ v₁ → cpsI τ₃ τ₄ τ₅ e₂ (λ v₂ → CPSApp (CPSApp (CPSVal v₁) (CPSVal v₂)) (CPSVal (CPSFun (λ v → κ (CPSVar v)))))) (λ x → (κSubstII {τ = cpsT (τ₃ ⇒ τ₁ cps[ τ₂ , τ₄ , I ])} 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 {τ₁} {τ₂} {e₁ = e₁} {e₂} {App₂ P≤ₐI P≤ₐI refl refl v₁} red) = eqApp₂ (eqApp₂ (correctPP τ₁ τ₂ red)) correctII {τ₁ = τ₄} {.τ₂} {τ₃} κ sche (RFrame {τ₁} {τ₂} {e₁ = e₁} {e₂} {App₂ I≤ₐI P≤ₐI tt refl 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 {τ₁} {τ₂} {e₁ = e₁} {e₂} {App₂ P≤ₐI I≤ₐI refl tt v₁} red) = eqApp₁ (eqApp₂ (correctPP τ₁ τ₂ red)) correctII {τ₁ = τ₄} {τ₅} {τ₃} κ sche (RFrame {τ₂ = τ₂} {e₁ = e₁} {e₂} {App₂ I≤ₐI I≤ₐI tt tt v₁} red) = eqApp₁ (eqFun (λ x → correctII (λ x₁ → CPSApp (CPSApp (CPSVal (CPSVar x)) (CPSVal x₁)) (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 {e₁ = e₁} {e₂} {App₁ {τ₂ = τ₂} P≤ₐP P≤ₐP P≤ₐP refl refl refl e₃} red) = eqApp₁ (correctPP (τ₂ ⇒ τ₈ cps[ τ₉ , τ₉ , P ]) τ₉ red) correctPP τ₈ τ₉ (RFrame {τ₁} {e₁ = e₁} {e₂} {App₂ P≤ₐP P≤ₐP refl refl v₁} red) = eqApp₂ (correctPP τ₁ τ₉ red) correctPP τ₈ τ₉ (RFrame {a₁ = P} {e₁ = e₁} {e₂} {Reset refl} red) = correctPP τ₈ τ₈ red correctPP τ₈ τ₉ (RFrame {τ₁} {a₁ = I} {e₁ = e₁} {e₂} {Reset tt} red) = correctII CPSVal (λ t → (sVal sVar=)) red correctPP τ₈ τ₉ (RReset {v₁ = v₁}) = eqId -- 1st correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {P} {.P} {.P} {P} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {P} {.P} {.P} {P} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) (λ v → CPSVal v)) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ (λ v → CPSVal v) (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) (λ v → CPSVal v) ≡⟨ refl ⟩ 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 → cpscontext-plug CPSHole (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 {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {P} {.P} {.P} {I} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {P} {.P} {.P} {I} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSApp (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (CPSVal (CPSVar z))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ v₂ → CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSVal v₂))))) (λ x → cpsP τ₈ τ₈ (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP τ₈ τ₈ (e₁ x)) (eqFun (λ x → correctContI {τ₁ = τ₄} {τ₄} {τ} {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 {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {I} {.P} {.P} {P} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {I} {.P} {.P} {P} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal ≡⟨ refl ⟩ 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₁)) (cpscontext-plug CPSHole (cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var z)))))))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ eqLetApp ⟩ (CPSApp (CPSVal (CPSFun (λ x → cpsP τ₈ τ₈ (e₁ x)))) (CPSVal (CPSFun (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var x)))))))))) ∎ -- 4th correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {I} {.P} {.P} {I} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {I} {.P} {.P} {I} {P≤ₐP} {P≤ₐP} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ≡⟨ refl ⟩ 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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₃ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSVal x₃)))))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP τ₈ τ₈ (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {τ₁ = τ₄} {τ₄} {τ} {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 {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {P} {.P} {.I} {P} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {P} {.P} {.I} {P} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI a≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal ≡⟨ refl ⟩ 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 → cpscontext-plug CPSHole (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 {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {P} {.P} {.I} {I} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {P} {.P} {.I} {I} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ≡⟨ refl ⟩ 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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSVal x₂))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP τ₈ τ₈ (e₁ z)) (eqFun (λ x → correctContI {τ₁ = τ₄} {τ₄} {τ} {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 {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {I} {.P} {.I} {P} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {I} {.P} {.I} {P} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sVal (sFun (λ x₂ → sApp Subst≠ (sApp Subst≠ (sApp (sVal sVar=) Subst≠)))))))) ⟩ CPSLet (CPSVal (CPSFun (λ z → CPSVal (CPSFun (λ z₁ → CPSApp (CPSVal (CPSVar z₁)) (CPSApp (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (CPSVal (CPSVar 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₁)) (cpscontext-plug CPSHole (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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 {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {I} {.P} {.I} {I} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {I} {.P} {.I} {I} {P≤ₐP} {P≤ₐI} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI a≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₃ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSVal x₃)))))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ eqLet₁ (λ z → cpsP τ₈ τ₈ (e₁ z)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {τ₁ = τ₄} {τ₄} {τ} {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 {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {P} {.I} {.I} {P} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {P} {.I} {.I} {P} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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 → cpscontext-plug CPSHole (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (CPSVal (CPSVar z)))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ 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)))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟵⟨ eqLet₂ (CPSVal (CPSFun (λ z → cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var z)))))) (λ x → eqOmega {con = CPSHole}) ⟩ CPSLet (CPSVal (CPSFun (λ z → cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var z)))))) (λ z → CPSApp (CPSVal (CPSFun (λ x → cpscontext-plug CPSHole (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)))))) (λ x → CPSApp (CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP τ₈ τ₈ (e₁ x))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var x)))))) (λ x → CPSVal (CPSFun (λ k → CPSApp (CPSVal (CPSVar k)) (cpsP τ₈ τ₈ (e₁ x)))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v)))) ⟶⟨ 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 {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {P} {.I} {.I} {I} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {P} {.I} {.I} {I} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P P α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSVal x₂))))) (λ z → cpsP τ₈ τ₈ (e₁ z)) ⟶⟨ eqLet₁ (λ x → cpsP τ₈ τ₈ (e₁ x)) (eqFun (λ x → correctContI {τ₁ = τ₄} {τ₄} {τ} {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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 {τ₀} {.τ₈} {τ₄ = τ₄} {.τ₄} {α} {.P} {I} {.I} {.I} {P} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {.τ₄} {α} {.P} {I} {.I} {.I} {P} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl refl refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ₄ refl e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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₁)) (cpscontext-plug CPSHole (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 {τ₀} {.τ₈} {τ₄ = τ₄} {τ} {α} {.P} {I} {.I} {.I} {I} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {.τ₈} {_} {_} {τ₄} {τ} {α} {.P} {I} {.I} {.I} {I} {P≤ₐI} {I≤ₐI} p₁ p₂ same refl tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt refl tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift P I α τ₈ τ₈ τ₀ τ refl e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₃ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSVal x₃)))))))) (λ x → cpsP τ₈ τ₈ (e₁ x)) ⟶⟨ eqLet₁ (λ x → cpsP τ₈ τ₈ (e₁ x)) (eqFun (λ x → eqFun (λ x₁ → eqApp₂ (correctContI {τ₁ = τ₄} {τ₄} {τ} {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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 → cpscontext-plug CPSHole (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 {τ₀} {τ₁} {τ₄ = τ₄} {.τ₄} {α} {.I} {P} {.I} {.I} {P} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {τ₁} {_} {_} {τ₄} {.τ₄} {α} {.I} {P} {.I} {.I} {P} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift I P α τ₁ τ₈ τ₀ τ₄ tt e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl tt refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift I P α τ₁ τ₈ τ₀ τ₄ tt e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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 → cpscontext-plug CPSHole (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (CPSVal (CPSVar z)))))) (λ z → cpsI τ₁ τ₁ τ₈ (e₁ z) 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)))))) (λ z → cpsI τ₁ τ₁ τ₈ (e₁ z) 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 {τ = cpsT τ₁ ⇒ cpsT τ₁} (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)))))) (λ x → CPSApp (CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsP τ₄ τ₄ (pcontext-plug τ₀ p₂ (Val (Var x)))))) (λ x → CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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 {τ₀} {τ₁} {τ₄ = τ₄} {τ} {α} {.I} {P} {.I} {.I} {I} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {τ₁} {_} {_} {τ₄} {τ} {α} {.I} {P} {.I} {.I} {I} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift I P α τ₁ τ₈ τ₀ τ tt e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt tt tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift I P α τ₁ τ₈ τ₀ τ tt e₁)) CPSVal ⟶⟨ eqBeta (sLet (λ x → Subst≠) (λ x → sVal (sFun (λ x₁ → sApp (sApp (sVal sVar=) Subst≠) Subst≠)))) ⟩ CPSLet (CPSVal (CPSFun (λ v → CPSApp (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₂ → CPSApp (CPSVal (CPSFun (λ v₁ → CPSVal (CPSVar v₁)))) (CPSVal x₂))))) (λ z → cpsI τ₁ τ₁ τ₈ (e₁ z) CPSVal) ⟶⟨ eqLet₁ (λ z → cpsI τ₁ τ₁ τ₈ (e₁ z) CPSVal) (eqFun (λ x → correctContI {τ₁ = τ₄} {τ₄} {τ} {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 {τ = cpsT τ₁ ⇒ cpsT τ₁} (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))) (λ x → CPSApp (CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (CPSVal v))))) (CPSVal (CPSFun (λ v → CPSVal (CPSVar v))))) ⟵⟨ eqLet₃ ⟩ CPSApp (CPSLet (CPSVal (CPSFun (λ x → cpsI τ₄ τ₄ τ (pcontext-plug τ₀ p₂ (Val (Var x))) CPSVal))) (λ x → CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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 {τ₀} {τ₁} {τ₄ = τ₄} {.τ₄} {α} {.I} {I} {.I} {.I} {P} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt refl e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {τ₁} {_} {_} {τ₄} {.τ₄} {α} {.I} {I} {.I} {.I} {P} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt refl e₁) | refl = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift I I α τ₁ τ₈ τ₀ τ₄ tt e₁)) CPSVal) ⟶⟨ shift-lemma P≤ₐP refl tt refl p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI P≤ₐI refl tt refl (Val (Fun P τ₄ τ₀ P≤ₐP refl (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift I I α τ₁ τ₈ τ₀ τ₄ tt e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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₁)) (cpscontext-plug CPSHole (CPSApp (CPSVal (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ₄ , P ]) (Fun P τ₄ τ₀ P≤ₐP refl (λ x → 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 {τ = cpsT τ₁ ⇒ cpsT τ₁} (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))))))))) (λ x → CPSApp (CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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))))))))) (λ x → CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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 {τ₀} {τ₁} {τ₄ = τ₄} {τ} {α} {.I} {I} {.I} {.I} {I} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt tt e₁) with wf-pcontext p₂ correctPP τ₈ τ₉ (RShift {τ₀} {τ₁} {_} {_} {τ₄} {τ} {α} {.I} {I} {.I} {.I} {I} {I≤ₐI} {I≤ₐI} p₁ p₂ same tt tt e₁) | tt = begin (cpsI τ₄ τ₄ τ₈ (pcontext-plug τ₀ p₁ (Shift I I α τ₁ τ₈ τ₀ τ tt e₁)) CPSVal) ⟶⟨ shift-lemma I≤ₐI tt tt tt p₁ p₂ same e₁ CPSVal (λ t → (sVal sVar=)) ⟩ cpsI τ₄ τ₄ τ₈ (App P≤ₐI I≤ₐI I≤ₐI refl tt tt (Val (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x))))) (Shift I I α τ₁ τ₈ τ₀ τ tt e₁)) CPSVal ⟶⟨ 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 (cpsV (τ₀ ⇒ τ₄ cps[ τ₄ , τ , I ]) (Fun I τ₄ τ₀ I≤ₐI tt (λ x → pcontext-plug τ₀ p₂ (Val (Var x)))))) (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 {τ = cpsT τ₄ ⇒ cpsT τ₄} (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))) (λ x₃ → CPSApp (CPSVal (CPSFun (λ v₂ → CPSVal (CPSVar v₂)))) (CPSVal x₃)))))))) (λ 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 {τ = cpsT τ₁ ⇒ cpsT τ₁} (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)))))) (λ x → CPSApp (CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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)))))) (λ x → CPSVal (CPSFun (λ k → cpsI τ₁ τ₁ τ₈ (e₁ x) (λ v → CPSApp (CPSVal (CPSVar k)) (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))))) ∎ 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 {a₃ = .P} 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₂)) ∎