Martin Escardo 2012.

Published at https://doi.org/10.1016/j.entcs.2013.09.010 (MFPS XXIX)
with full, selfcontained Agda code.

\begin{code}

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

module EffectfulForcing.MFPSAndVariations.MFPS-XXIX where

open import MLTT.Spartan
open import MLTT.Athenian
open import EffectfulForcing.MFPSAndVariations.Combinators
open import EffectfulForcing.MFPSAndVariations.Continuity
open import EffectfulForcing.MFPSAndVariations.Dialogue
open import EffectfulForcing.MFPSAndVariations.CombinatoryT

\end{code}

The "effectful forcing" dialogue semantics of combinatory System T.

\begin{code}

B-Set⟦_⟧ : type  𝓤₀ ̇
B-Set⟦ ι      = B 
B-Set⟦ σ  τ  = B-Set⟦ σ   B-Set⟦ τ 

Kleisli-extension : {X : 𝓤₀ ̇ } {σ : type}  (X  B-Set⟦ σ )  B X  B-Set⟦ σ 
Kleisli-extension {X} {ι}     = kleisli-extension
Kleisli-extension {X} {σ  τ} = λ g d s  Kleisli-extension {X} {τ}  x  g x s) d

zero' : B 
zero' = η zero

succ' : B   B 
succ' = B-functor succ

iter' : {σ : type}  (B-Set⟦ σ   B-Set⟦ σ )  B-Set⟦ σ   B   B-Set⟦ σ 
iter' f x = Kleisli-extension (iter f x)

B⟦_⟧ : {σ : type}   σ  B-Set⟦ σ 
B⟦ Ω      = generic
B⟦ Zero   = zero'
B⟦ Succ   = succ'
B⟦ Iter   = iter'
B⟦ K      = Ķ
B⟦ S      = Ş
B⟦ t · u  = B⟦ t  B⟦ u 

\end{code}

The dialogue tree of a term of type (ι ⇒ ι) ⇒ ι.

\begin{code}

dialogue-tree : T ((ι  ι)  ι)  B 
dialogue-tree t = B⟦ embedding t · Ω 

\end{code}

A logical relation used to prove the desired property of the dialogue
tree:

\begin{code}

R : {σ : type}  (Baire  Set⟦ σ )  B-Set⟦ σ   𝓤₀ ̇
R {ι}     n n' = (α : Baire)  n α  decode α n'
R {σ  τ} f f' = (x : Baire  Set⟦ σ )(x' : B-Set⟦ σ )
                R {σ} x x'
                R {τ}  α  f α (x α)) (f' x')

R-kleisli-lemma : (σ : type)
                  (g  :   Baire  Set⟦ σ )
                  (g' :   B-Set⟦ σ )
                 ((k : )  R (g k) (g' k))
                 (n  : Baire  )
                  (n' : B )
                 R n n'
                 R  α  g (n α) α) (Kleisli-extension g' n')

R-kleisli-lemma ι g g' rg n n' rn α =
 g (n α) α                          =⟨ rg (n α) α 
 decode α (g' (n α))                =⟨ ap  -  decode α (g' -)) (rn α) 
 decode α (g' (decode α n'))        =⟨ decode-kleisli-extension g' n' α 
 decode α (Kleisli-extension g' n') 

R-kleisli-lemma (σ  τ) g g' rg n n' rn
 = λ y y' ry  R-kleisli-lemma
                τ
                 k α  g k α (y α))
                 k  g' k y')
                 k  rg k y y' ry)
                n
                n'
                rn

main-lemma : {σ : type} (t :  σ)
            R  t ⟧' B⟦ t 

main-lemma Ω n n' rn α =
 α (n α)               =⟨ ap α (rn α) 
 α (decode α n')       =⟨ generic-diagram α n' 
 decode α (generic n') 

main-lemma Zero = λ α  refl

main-lemma Succ n n' rn α =
 succ (n α)            =⟨ ap succ (rn α) 
 succ (decode α n')    =⟨ decode-α-is-natural succ n' α 
 dialogue (succ' n') α 

main-lemma {(σ  .σ)  .σ  ι  .σ} Iter = lemma
 where
  lemma : (f  : Baire  Set⟦ σ   Set⟦ σ )
          (f' : B-Set⟦ σ   B-Set⟦ σ )
         R {σ  σ} f f'
         (x : Baire  Set⟦ σ )
          (x' : B-Set⟦ σ )
         R {σ} x x'
         (n : Baire  )
          (n' : B )
         R {ι} n n'
         R {σ}  α  iter (f α) (x α) (n α)) (Kleisli-extension (iter f' x') n')
  lemma f f' rf x x' rx = R-kleisli-lemma σ g g' rg
    where
     g :   Baire  Set⟦ σ 
     g k α = iter (f α) (x α) k

     g' :   B-Set⟦ σ 
     g' k = iter f' x' k

     rg : (k : )  R (g k) (g' k)
     rg zero     = rx
     rg (succ k) = rf (g k) (g' k) (rg k)

main-lemma K = λ x x' rx y y' ry  rx

main-lemma S = λ f f' rf g g' rg x x' rx
                  rf x x' rx  α  g α (x α)) (g' x') (rg x x' rx)

main-lemma (t · u) = main-lemma t  u ⟧' B⟦ u  (main-lemma u)

dialogue-tree-correct : (t : T ((ι  ι)  ι)) (α : Baire)
                        t  α  decode α (dialogue-tree t)
dialogue-tree-correct t α =
     t  α                    =⟨ ap  g  g α) (preservation t α) 
     embedding t ⟧' α α       =⟨ main-lemma (embedding t · Ω) α 
    decode α (dialogue-tree t) 

eloquence-theorem : (f : Baire  )  is-T-definable f  eloquent f
eloquence-theorem f (t , r) =
 (dialogue-tree t ,
   α  dialogue (dialogue-tree t) α =⟨ (dialogue-tree-correct t α)⁻¹ 
          t  α                      =⟨ ap ((λ -  - α)) r 
         f α                          ))

eloquence-corollary₀ : (f : Baire  )
                      is-T-definable f
                      is-continuous f
eloquence-corollary₀ f d = eloquent-functions-are-continuous
                            f
                            (eloquence-theorem f d)

eloquence-corollary₁ : (f : Baire  )
                      is-T-definable f
                      is-uniformly-continuous (C-restriction f)
eloquence-corollary₁ f d = eloquent-functions-are-UC
                            (C-restriction f)
                            (restriction-is-eloquent f (eloquence-theorem f d))

\end{code}

This concludes the development. Some examples follow.

\begin{code}

module examples where

 mod-cont : T ((ι  ι)  ι)  Baire  List 
 mod-cont t α = pr₁ (eloquence-corollary₀  t  (t , refl) α)

 mod-cont-obs : (t : T ((ι  ι)  ι)) (α : Baire)
               mod-cont t α  pr₁ (dialogue-continuity (dialogue-tree t) α)
 mod-cont-obs t α = refl

 flatten : {X : 𝓤₀ ̇ }  BT X  List X
 flatten [] = []
 flatten (x  t) = x  flatten(t ) ++ flatten(t )

 mod-unif : T ((ι  ι)  ι)  List 
 mod-unif t = flatten (pr₁ (eloquence-corollary₁  t  (t , refl)))

 I : {σ : type}  T (σ  σ)
 I {σ} = S · K · (K {σ} {σ})

 I-behaviour : {σ : type}{x : Set⟦ σ }   I  x  x
 I-behaviour = refl

 numeral :   T ι
 numeral zero     = Zero
 numeral (succ n) = Succ · (numeral n)

 t₀ : T ((ι  ι)  ι)
 t₀ = K · (numeral 17)

 t₀-interpretation :  t₀   λ α  17
 t₀-interpretation = refl

 example₀ : mod-cont t₀  i  i)  []
 example₀ = refl

 example₀' : mod-unif t₀  []
 example₀' = refl

 v : {γ : type}  T (γ  γ)
 v = I

 infixl 1 _•_

 _•_ : {γ σ τ : type}  T (γ  σ  τ)  T (γ  σ)  T (γ  τ)
 f  x = S · f · x

 Numeral :  {γ}    T (γ  ι)
 Numeral n = K · (numeral n)

 t₁ : T ((ι  ι)  ι)
 t₁ = v  (Numeral 17)

 t₁-interpretation :  t₁   λ α  α 17
 t₁-interpretation = refl

 example₁ : mod-unif t₁  17  []
 example₁ = refl

 t₂ : T ((ι  ι)  ι)
 t₂ = Iter  t₁  t₁

 t₂-interpretation :  t₂   λ α  iter α (α 17) (α 17)
 t₂-interpretation = refl

 example₂ : mod-unif t₂  17  17  17  0  1  []
 example₂ = refl

 example₂' : mod-cont t₂  i  i)
            17  17  17  17  17  17  17  17  17
              17  17  17  17  17  17  17  17  17  17  []
 example₂' = refl

 Add : T (ι  ι  ι)
 Add = Iter · Succ

 infixl 0 _+ᵀ_

 _+ᵀ_ :  {γ}  T (γ  ι)  T (γ  ι)  T (γ  ι)
 x +ᵀ y = K · Add  x  y

 t₃ : T ((ι  ι)  ι)
 t₃ = Iter  (v  Numeral 1)  (v  Numeral 2 +ᵀ v  Numeral 3)

 t₃-interpretation :  t₃   λ α  iter α (α 1) (iter succ (α 2) (α 3))
 t₃-interpretation = refl

 example₃ : mod-cont t₃ succ
           3  2  1  2  3  4  5  6  7  8  []
 example₃ = refl

 example₃' : mod-unif t₃
            3  2  1  1  0  1  2  1  0  1  1  0  0  1  1  0  1  []
 example₃' = refl

 max :     
 max 0        y        = y
 max (succ x) 0        = succ x
 max (succ x) (succ y) = succ (max x y)

 Max : List   
 Max []      = 0
 Max (x  s) = max x (Max s)

 t₄ : T ((ι  ι)  ι)
 t₄ = Iter  ((v  (v  Numeral 2)) +ᵀ (v  Numeral 3))  t₃

 t₄-interpretation :  t₄ 
                    λ α  iter
                             α
                             (iter succ (α (α 2)) (α 3))
                             (iter α (α 1) (iter succ (α 2) (α 3)))
 t₄-interpretation = refl

 example₄ : length (mod-unif t₄)  215
 example₄ = refl

 example₄' : Max (mod-unif t₄)  3
 example₄' = refl

 t₅ : T ((ι  ι)  ι)
 t₅ = Iter  (v  (v  t₂ +ᵀ t₄))  (v  Numeral 2)

 t₅-explicitly : t₅ 
  (S · (S · Iter · (S · I · (S · (S · (K · (Iter · Succ))
  · (S · I · (S · (S · Iter · (S · I · (K · (numeral 17))))
  · (S · I · (K · (numeral 17)))))) · (S · (S · Iter · (S · (S
  · (K · (Iter · Succ)) · (S · I · (S · I · (K · (numeral 2)))))
  · (S · I · (K · (numeral 3))))) · (S · (S · Iter · (S · I
  · (K · (numeral 1)))) · (S · (S · (K · (Iter · Succ))
  · (S · I · (K · (numeral 2)))) · (S · I · (K
  · (numeral 3))))))))) · (S · I · (K · (numeral 2))))

 t₅-explicitly = refl

 t₅-interpretation :  t₅ 
                    λ α  iter
                             α
                             (α (iter
                                  succ
                                  (α (iter α (α 17) (α 17)))
                                  (iter
                                    α
                                    (iter succ (α (α 2)) (α 3))
                                    (iter α (α 1) (iter succ (α 2) (α 3))))))
                             (α 2)
 t₅-interpretation = refl

 example₅ : length (mod-unif t₅)  15551
 example₅ = refl

 example₅' : Max (mod-unif t₅)  17
 example₅' = refl

 example₅'' : Max (mod-cont t₅ succ)  57
 example₅'' = refl

\end{code}