PLFA agda exercises
CEK machine

Siek, Thiemann, Wadler, 2 Aug 2022

[Currently not compiling]

```
module variants.CEK where

open import Data.Nat using (ℕ; zero; suc; _+_)
open import Data.Bool using (true; false) renaming (Bool to 𝔹)
open import Data.Unit using (⊤; tt)
open import Data.Empty using (⊥; ⊥-elim)
open import Data.Product using (_×_; _,_; proj₁; proj₂; Σ; ∃; Σ-syntax; ∃-syntax)
open import Data.Sum using (_⊎_; inj₁; inj₂) renaming ([_,_] to case-⊎)
open import Relation.Binary.PropositionalEquality
     using (_≡_; _≢_; refl; trans; sym; cong; cong₂; cong-app; subst; inspect)
     renaming ([_] to [[_]])
open import Relation.Nullary using (¬_; Dec; yes; no)
open import Relation.Nullary.Decidable using (⌊_⌋; True; toWitness; fromWitness)
open import variants.Frame
```

Evaluation context as a stack of frames

```
data _==>_ : Type → Type → Set where

  [] : A ==> A

  _∷_ :
      Γ ⊢ A => B
    → B ==> C
      -----------
    → A ==> C

variable
  K : A ==> B
```

Extending a substitution

```
_►_ :
    Γ →ˢ Δ
  → Δ ⊢ A
    ----------
  → Γ ▷ A →ˢ Δ
(σ ► M) Z      =  M
(σ ► M) (S x)  =  σ x
```

CEK configuration
```
record CEK (A : Type) : Set where
  constructor cek
  field
    {Γ′} : Env
    {B′} : Type
    control : Γ′ ⊢ B′
    environment : Γ′ →ˢ ∅
    kontinuation : Γ′ ⊢ B′ ==> A
```

CEK transitions
```
data _~~>_ : CEK A → CEK A → Set where

  CEK-ξ-□· :
      ------------------------------------------------
      cek (L · M) σ K ~~> cek L σ ((□· M) ∷ K)

  CEK-ξ-·□ :
      (v : Value V)
      -----------------------------------------------------
    → cek V σ ((□· M) ∷ K) ~~> cek M σ ((v ·□) ∷ K)

  CEK-β-ƛ :
      (v : Value V)
      --------------------------------------------------------
    → cek V σ (((ƛ N) ·□) ∷ K) ~~> cek N (σ ► V) (▵ K)

  CEK-ξ-`suc□ :
      ------------------------------------------------
      cek (`suc M) σ K ~~> cek M σ (`suc□ ∷ K)

  CEK-κ :
      (v : Value V)
      ------------------------------------------------
    → cek V σ (`suc□ ∷ K) ~~> cek (`suc V) σ K

  CEK-ξ-case□ :
      ----------------------------------------------------------
      cek (case L M N) σ K ~~> cek L σ ((case□ M N) ∷ K)

  CEK-β-zero :
      ---------------------------------------------------
      cek `zero σ ((case□ M N) ∷ K) ~~> cek M σ K

  CEK-β-suc :
      (v : Value V)
      ----------------------------------------------------------------
    → cek (`suc V) σ ((case□ M N) ∷ K) ~~> cek N (σ ► V) (▵ K)

  CEK-μ-· :
     (v : Value V)
     -----------------------------------------------------------------------
   → cek V σ (((μ N) ·□) ∷ K) ~~> cek N (σ ► (μ N)) (▵ ((□· V) ∷ K))

  CEK-μ-case :
     -----------------------------------------------------------------------------
     cek (μ L) σ ((case□ M N) ∷ K) ~~> cek L (σ ► (μ L)) ((case□ M N) ∷ K)
```