Brendan Hart 2019-2020

We define big step semantics of PCF.Lambda.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import UF.PropTrunc

module PCF.Lambda.BigStep (pt : propositional-truncations-exist) where

open PropositionalTruncation pt

open import MLTT.Spartan
open import PCF.Lambda.AbstractSyntax pt

data _⇓'_ :  {n : } {Γ : Context n} {σ : type}  PCF Γ σ  PCF Γ σ  𝓤₀ ̇ where

  var-id    : {n : } {Γ : Context n} {A : type}
              {i : Γ  A}
             (v i) ⇓' (v i)

  ƛ-id      : {n : } {Γ : Context n} {σ τ : type}
              {t : PCF (Γ  σ) τ}
             ƛ t ⇓' ƛ t

  zero-id   : {n : } {Γ : Context n}
             numeral {n} {Γ} zero ⇓' numeral {n} {Γ} zero

  pred-zero : {n : } {Γ : Context n}
              {M : PCF Γ ι}
             M ⇓' numeral {n} {Γ} zero
             Pred M ⇓' numeral {n} {Γ} zero

  pred-succ : {n : } {Γ : Context n}
              {M : PCF Γ ι}
              {k : }
             M ⇓' numeral {n} {Γ} (succ k)
             Pred M ⇓' numeral {n} {Γ} k

  succ-arg  : {n : } {Γ : Context n}
              {M : PCF Γ ι}
              {k : }
             M ⇓' numeral {n} {Γ} k
             Succ M ⇓' numeral {n} {Γ} (succ k)

  IfZero-zero : {n : } {Γ : Context n}
                {M : PCF Γ ι} {M₁ : PCF Γ ι} {M₂ : PCF Γ ι}
                {V : PCF Γ ι}
               M ⇓' numeral {n} {Γ} zero
               M₁ ⇓' V
               IfZero M M₁ M₂ ⇓' V

  IfZero-succ : {n : } {Γ : Context n}
                {M : PCF Γ ι} {M₁ : PCF Γ ι} {M₂ : PCF Γ ι}
                {V : PCF Γ ι}
                {k : }
               M ⇓' numeral {n} {Γ} (succ k)
               M₂ ⇓' V
               IfZero M M₁ M₂ ⇓' V

  Fix-step  : {n : } {Γ : Context n} {σ : type} {M : PCF Γ (σ  σ)} {V : PCF Γ σ}
             (M · (Fix M)) ⇓' V
             Fix M ⇓' V

  ·-step    : {n : } {Γ : Context n} {σ τ : type}
              {M : PCF Γ (σ  τ)} {E : PCF (Γ  σ) τ} {N : PCF Γ σ}
              {V : PCF Γ τ}
             M ⇓' ƛ E
             (E [ N ]) ⇓' V
             (M · N) ⇓' V

_⇓_ : {n : } {Γ : Context n} {σ : type}  PCF Γ σ  PCF Γ σ  𝓤₀ ̇
M  N =  M ⇓' N 

data Value : {n : } {Γ : Context n} {σ : type}  PCF Γ σ  𝓤₀ ̇ where

  zero-val : {n : } {Γ : Context n}
            Value {n} {Γ} Zero

  succ-val : {n : } {Γ : Context n} {V : PCF Γ ι}
            Value V
            Value (Succ V)

  ƛ-val    : {n : } {Γ : Context n} {σ τ : type} {N : PCF (Γ  σ) τ}
            Value (ƛ N)

  var-val  : {n : } {Γ : Context n} {σ : type}
            (i : Γ  σ)
            Value (v i)

values-dont-reduce-further : {n : } {Γ : Context n} {σ : type}
                            (M : PCF Γ σ)
                            Value M
                            (N : PCF Γ σ)
                            M ⇓' N
                            M  N
values-dont-reduce-further .(v _) x .(v _) var-id = refl
values-dont-reduce-further .(ƛ _) x .(ƛ _) ƛ-id   = refl
values-dont-reduce-further .Zero x .Zero zero-id  = refl
values-dont-reduce-further .(Succ M) (succ-val x)
                           .(Succ (numeral k))
                            (succ-arg {n} {Γ} {M} {k} r) = ap Succ IH
  where
    IH : M  numeral k
    IH = values-dont-reduce-further M x (numeral k) r

⇓-reduces-to-val : {n : } {Γ : Context n} {σ : type}
                   (M N : PCF Γ σ)
                  M ⇓' N
                  Value N
⇓-reduces-to-val (v i)    (v i)  var-id        = var-val i
⇓-reduces-to-val .(ƛ _)   .(ƛ _) ƛ-id          = ƛ-val
⇓-reduces-to-val .Zero    .Zero  zero-id       = zero-val
⇓-reduces-to-val (Pred M) .Zero (pred-zero p)  = ⇓-reduces-to-val M Zero p
⇓-reduces-to-val (Pred M) (N)
                 (pred-succ {_} {_} {_} {k} p) = lemma IH
  where
    IH : Value (Succ (numeral k))
    IH = ⇓-reduces-to-val M (Succ (numeral k)) p

    lemma :  {n} {Γ} {N}  Value {n} {Γ} (Succ N)  Value N
    lemma (succ-val t) = t

⇓-reduces-to-val (Succ M) (Succ N) (succ-arg p)        = succ-val (⇓-reduces-to-val M N p)
⇓-reduces-to-val (IfZero M M₁ M₂) N (IfZero-zero p p₁) = ⇓-reduces-to-val M₁ N p₁
⇓-reduces-to-val (IfZero M M₁ M₂) N (IfZero-succ p p₁) = ⇓-reduces-to-val M₂ N p₁
⇓-reduces-to-val (Fix M) N (Fix-step p) =
 ⇓-reduces-to-val (M · Fix M) N p
⇓-reduces-to-val (L · R) N (·-step {_} {_} {_} {_} {_} {E} p p₁) =
 ⇓-reduces-to-val (E [ R ]) N p₁

⇓-cant-reduce-further : {n : } {Γ : Context n} {σ : type}
                        (M N L : PCF Γ σ)
                       M ⇓' N
                       N ⇓' L
                       N  L
⇓-cant-reduce-further M N L step₁ step₂ =
 values-dont-reduce-further N (⇓-reduces-to-val M N step₁) L step₂

⇓-deterministic : {n : } {Γ : Context n} {σ : type}
                  {M N L : PCF Γ σ}
                 M ⇓' N
                 M ⇓' L
                 N  L
⇓-deterministic var-id var-id = refl
⇓-deterministic ƛ-id              ƛ-id              = refl
⇓-deterministic zero-id           zero-id           = refl
⇓-deterministic (pred-zero step₁) (pred-zero step₂) = refl
⇓-deterministic (pred-zero step₁) (pred-succ {_} {_} {_} {k} step₂) =
 𝟘-elim (peano-axiom-for-PCF IH)
 where
   IH : numeral zero  numeral (succ k)
   IH = ⇓-deterministic step₁ step₂

⇓-deterministic (pred-succ {_} {_} {_} {k} step₁) (pred-zero step₂) =
 𝟘-elim (peano-axiom-for-PCF (IH ⁻¹))
 where
  IH : numeral (succ k)  numeral zero
  IH = ⇓-deterministic step₁ step₂

⇓-deterministic (pred-succ step₁) (pred-succ step₂) =
 succ-removal (⇓-deterministic step₁ step₂)
 where
  succ-removal :  {M N}  Succ M  Succ N  M  N
  succ-removal refl = refl

⇓-deterministic (succ-arg step₁) (succ-arg step₂) =
 ap Succ (⇓-deterministic step₁ step₂)

⇓-deterministic (IfZero-zero step₁ step₃) (IfZero-zero step₂ step₄) =
 ⇓-deterministic step₃ step₄

⇓-deterministic (IfZero-zero step₁ step₃)
                (IfZero-succ {_} {_} {_} {_} {_} {_} {k} step₂ step₄) =
 𝟘-elim (peano-axiom-for-PCF IH)
  where
   IH : numeral zero  numeral (succ k)
   IH = ⇓-deterministic step₁ step₂

⇓-deterministic (IfZero-succ {_} {_} {_} {_} {_} {_} {k} step₁ step₃)
                (IfZero-zero step₂ step₄) =
 𝟘-elim (peano-axiom-for-PCF (IH ⁻¹))
 where
   IH : numeral (succ k)  numeral zero
   IH = ⇓-deterministic step₁ step₂

⇓-deterministic (IfZero-succ step₁ step₃) (IfZero-succ step₂ step₄) =
 ⇓-deterministic step₃ step₄

⇓-deterministic (Fix-step step₁) (Fix-step step₂) =
 ⇓-deterministic step₁ step₂

⇓-deterministic (·-step {_} {_} {_} {_} {_} {E} {N} {L} step₁ step₃)
                (·-step {_} {_} {_} {_} {_} {E₁} {N} {L₁} step₂ step₄) = γ
 where
  IH : ƛ E  ƛ E₁
  IH = ⇓-deterministic step₁ step₂

  ƛ-removal-= :  {A B}  ƛ A  ƛ B  A  B
  ƛ-removal-= refl = refl

  transported-step : (E [ N ]) ⇓' L₁
  transported-step = transport  -  (- [ N ]) ⇓' L₁) (ƛ-removal-= IH ⁻¹) step₄

  γ : L  L₁
  γ = ⇓-deterministic step₃ transported-step

\end{code}