Martin Escardo 25 May 2013

This is a variation of the MFPS paper
https://doi.org/10.1016/j.entcs.2013.09.010 in which dialogue trees
are Church encoded.

\begin{code}

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

module EffectfulForcing.MFPSAndVariations.Church where

open import MLTT.Spartan hiding (rec ; _^_) renaming ( to 〈〉)
open import MLTT.Fin
open import EffectfulForcing.MFPSAndVariations.Combinators
open import EffectfulForcing.MFPSAndVariations.Continuity
open import EffectfulForcing.MFPSAndVariations.Dialogue
open import EffectfulForcing.MFPSAndVariations.SystemT

\end{code}

We first discuss Church encoding of dialogue trees, denoted by D⋆.
This is motivated by the recursion (or iteration, actually) principle
for D.

\begin{code}

D-rec : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {A : 𝓣 ̇ }
       (Z  A)  ((Y  A)  X  A)  D X Y Z  A
D-rec η' β' (η z)   = η' z
D-rec η' β' (β φ x) = β'  y  D-rec η' β' (φ y)) x

D⋆ : 𝓤 ̇  𝓥 ̇  𝓦 ̇  𝓣 ̇  𝓤  𝓥  𝓦  𝓣 ̇
D⋆ X Y Z A = (Z  A)  ((Y  A)  X  A)  A

D⋆-rec : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {A : 𝓣 ̇ }
        (Z  A)  ((Y  A)  X  A)  D⋆ X Y Z A  A
D⋆-rec η' β' d = d η' β'

η⋆ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {A : 𝓣 ̇ }
    Z  D⋆ X Y Z A
η⋆ z η' β' = η' z

β⋆ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {A : 𝓣 ̇ }
    (Y  D⋆ X Y Z A)  X  D⋆ X Y Z A
β⋆ Φ x η' β' = β'  y  Φ y η' β') x

church-encode : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {A : 𝓣 ̇ }
               D X Y Z  D⋆ X Y Z A
church-encode = D-rec η⋆ β⋆

\end{code}

To go back, we need to take A = D X Y Z:

\begin{code}

church-decode : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
               D⋆ X Y Z (D X Y Z)  D X Y Z
church-decode = D⋆-rec η β

\end{code}

Hereditarily extensional equality on dialogue trees, to avoid the
axiom of function extensionality:

\begin{code}

data _≣_ {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } : D X Y Z  D X Y Z  𝓤  𝓥  𝓦 ̇ where

 ap-η : {z z' : Z}
       z  z'
       η z  η z'

 ap-β : {φ φ' : Y  D X Y Z}
        {x x' : X}
       ((y : Y)  φ y  φ' y)
       x  x'
       β φ x  β φ' x'

church-correctness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
                     (d : D X Y Z)
                    church-decode (church-encode d)  d
church-correctness (η z)   = ap-η refl
church-correctness (β φ x) = ap-β  y  church-correctness (φ y)) refl

\end{code}

In the following definition we take A = ((X → Y) → Z).

\begin{code}

dialogue⋆ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
           D⋆ X Y Z ((X  Y)  Z)
           (X  Y)  Z
dialogue⋆ = D⋆-rec  z α  z)  φ x α  φ (α x) α)

B⋆ : 𝓦 ̇  𝓣 ̇  𝓦  𝓣 ̇
B⋆ = D⋆  

B↦B⋆ : {X A : Type}  B X  B⋆ X A
B↦B⋆ = church-encode

church-encode-B : {X : 𝓦 ̇ } {A : 𝓣  ̇ }
                 B X
                 B⋆ X A
church-encode-B = church-encode

dialogues-agreement : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
                      (d : D X Y Z)
                      (α : X  Y)
                     dialogue d α  dialogue⋆ (church-encode d) α
dialogues-agreement (η z)   α = refl
dialogues-agreement (β φ x) α = dialogues-agreement (φ (α x)) α

decode⋆ : {X : 𝓦 ̇ }  Baire  B⋆ X (Baire  X)  X
decode⋆ α d = dialogue⋆ d α

kleisli-extension⋆ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓣 ̇ }
                    (X  B⋆ Y A)
                    B⋆ X A
                    B⋆ Y A
kleisli-extension⋆ f d η' β' = d  x  f x η' β') β'

B⋆-functor : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓣 ̇ }  (X  Y)  B⋆ X A  B⋆ Y A
B⋆-functor f = kleisli-extension⋆  x  η⋆ (f x))

B⋆〖_〗 : type  Type  Type
B⋆〖 ι      A = B⋆( ι ) A
B⋆〖 σ  τ  A = B⋆〖 σ  A  B⋆〖 τ  A

Kleisli-extension⋆ : {X A : Type}
                     {σ : type}
                    (X  B⋆〖 σ  A)
                    (B⋆ X A  B⋆〖 σ  A)
Kleisli-extension⋆ {X} {A} {ι}     = kleisli-extension⋆
Kleisli-extension⋆ {X} {A} {σ  τ} =
  λ g d s  Kleisli-extension⋆ {X} {A} {τ}  x  g x s) d

generic⋆ : {A : Type}  B⋆  A  B⋆  A
generic⋆ = kleisli-extension⋆ (β⋆ η⋆)

zero⋆ : {A : Type}  B⋆  A
zero⋆ = η⋆ 0

succ⋆ : {A : Type}  B⋆  A  B⋆  A
succ⋆ = B⋆-functor succ

rec⋆ : {σ : type}
       {A : Type}
      (B⋆  A  B⋆〖 σ  A  B⋆〖 σ  A)
      B⋆〖 σ  A
      B⋆  A  B⋆〖 σ  A
rec⋆ {σ} {A} f x = Kleisli-extension⋆ {} {A} {σ} (rec (f  η⋆) x)

B⋆【_】 : {n : } (Γ : Cxt n) (A : Type)  Type
B⋆【 Γ  A = (i : Fin _)  B⋆〖 Γ [ i ]  A

⟪⟫⋆ : {A : Type}  B⋆【 〈〉  A
⟪⟫⋆ ()

_‚‚⋆_ : {n : } {Γ : Cxt n} {A : Type} {σ : type}
       B⋆【 Γ  A
       B⋆〖 σ  A
       B⋆【 Γ , σ  A
(xs ‚‚⋆ x) 𝟎       = x
(xs ‚‚⋆ x) (suc i) = xs i

B⋆⟦_⟧ : {n : } {Γ : Cxt n} {σ : type} {A : Type}
       T' Γ σ
       B⋆【 Γ  A
       B⋆〖 σ  A
B⋆⟦ Ω                 _ = generic⋆
B⋆⟦ Zero              _ = zero⋆
B⋆⟦ Succ              _ = succ⋆
B⋆⟦ Rec {_} {_} {σ}   _ = rec⋆ {σ}
B⋆⟦ ν i              xs = xs i
B⋆⟦ ƛ t              xs = λ x  B⋆⟦ t  (xs ‚‚⋆ x)
B⋆⟦ t · u            xs = (B⋆⟦ t  xs) (B⋆⟦ u  xs)

dialogue-tree⋆ : {A : Type}  T₀ ((ι  ι)  ι)  B⋆  A
dialogue-tree⋆ t = B⋆⟦ (embed t) · Ω  ⟪⟫⋆

\end{code}