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