{-# OPTIONS --rewriting #-}
module Reflect1 where
import DS
import DSK
import CPS
import Reflect1a
import Reflect1b
open import DS-DSK
open import DSK-DS
open import DSK-CPS
open import CPS-DSK
open import TypeIsos
open import Data.Unit
open import Data.Empty
open import Data.Product
open import Function
open import Relation.Binary.PropositionalEquality
correctE : {var : CPS.Ty → Set} {τ α β : DS.Ty} {σ σα σβ : DS.Mc}
{Δ : CPS.Delta} {Θ : CPS.Theta} →
(ΔΘ : CPS.Delta-Theta Δ Θ) →
(e : DS.term[ var ∘ cpskT ∘ knT , τ DS.▷⟨ σα ⟩ α ]⟨ σβ ⟩ β) →
(c : CPS.cont[ var , Δ ]
(cpskT (knT τ) CPS.⇒ cpskMc (knMc σα) ⇒ cpskT (knT α))) →
(m : CPS.mcont[ var , Θ , cpskMc (knMc σ) ] cpskMc (knMc σβ)) →
DS.Reduce
(DS.plugM (embM (dskΔΘ ΔΘ) (dskM m)) (DS.plug (embC (dskC c)) e))
(embE {β = knT β} {σβ = knMc σ}
(dskE {β = cpskT (knT β)} {σβ = cpskMc (knMc σ)}
(cpskE (knE (dskΔΘ ΔΘ) e
(dskC {τ = cpskT (knT τ)}
{α = cpskT (knT α)}
{σ = cpskMc (knMc σα)} c)
(dskM {σ = cpskMc (knMc σ)}
{σβ = cpskMc (knMc σβ)} m)))))
correctE {var} ΔΘ e c m
rewrite Reflect1b.correctE {var ∘ cpskT}
(knE (dskΔΘ ΔΘ) e
(dskC {τ = cpskT (knT _)}
{α = cpskT (knT _)}
{σ = cpskMc (knMc _)} c)
(dskM {σ = cpskMc (knMc _)}
{σβ = cpskMc (knMc _)} m)) =
Reflect1a.correctE {var ∘ cpskT} (dskΔΘ ΔΘ) e
(dskC {τ = cpskT (knT _)}
{α = cpskT (knT _)}
{σ = cpskMc (knMc _)} c)
(dskM {σ = cpskMc (knMc _)}
{σβ = cpskMc (knMc _)} m)