Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
-- 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₂))
∎