Martin Escardo 2012

\begin{code}

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

module EffectfulForcing.MFPSAndVariations.Dialogue where

open import MLTT.Spartan
open import MLTT.Athenian
open import EffectfulForcing.MFPSAndVariations.Continuity

data D (X : 𝓤 ̇ ) (Y : 𝓥 ̇ ) (Z : 𝓦 ̇ ) : 𝓤  𝓥  𝓦 ̇ where
 η : Z  D X Y Z
 β : (Y  D X Y Z)  X  D X Y Z

dialogue : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
          D X Y Z
          (X  Y)  Z
dialogue (η z)   α = z
dialogue (β φ x) α = dialogue (φ(α x)) α

eloquent : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }  ((X  Y)  Z)  𝓤  𝓥  𝓦 ̇
eloquent f = Σ d  D _ _ _ , dialogue d  f

B : 𝓤 ̇  𝓤 ̇
B = D  

dialogue-continuity : (d : B )  is-continuous (dialogue d)
dialogue-continuity (η n) α = ([] , lemma)
 where
  lemma :  α'  α =⟪ []  α'  n  n
  lemma α' r = refl

dialogue-continuity (β φ i) α = ((i  is) , lemma)
 where
  IH : (i : )  is-continuous (dialogue (φ (α i)))
  IH i = dialogue-continuity (φ (α i))

  is : List 
  is = pr₁ (IH i α)

  lemma : (α' : Baire)
         α =⟪ i  is  α'
         dialogue (φ (α i)) α  dialogue (φ (α' i)) α'
  lemma α' (r  rs) = dialogue (φ (α i)) α  =⟨ pr₂ (IH i α) α' rs 
                      dialogue (φ (α i)) α' =⟨ ap  n  dialogue (φ n) α') r 
                      dialogue (φ (α' i)) α' 

eloquent-functions-are-continuous : (f : Baire  )
                                   eloquent f
                                   is-continuous f
eloquent-functions-are-continuous f (d , e) =
 continuity-extensional (dialogue d) f e (dialogue-continuity d)

C : 𝓤 ̇  𝓤 ̇
C = D  𝟚

dialogue-UC : (d : C )  is-uniformly-continuous (dialogue d)
dialogue-UC (η n)   = ([] , λ α α' n  refl)
dialogue-UC (β φ i) = ((i  s) , lemma)
 where
  IH : (j : 𝟚)  is-uniformly-continuous (dialogue(φ j))
  IH j = dialogue-UC (φ j)

  s : 𝟚  BT 
  s j = pr₁ (IH j)

  lemma :  α α'  α =⟦ i  s  α'  dialogue (φ (α i)) α  dialogue (φ (α' i)) α'
  lemma α α' (r  l) =
   dialogue (φ (α i)) α   =⟨ ap  j  dialogue (φ j) α) r 
   dialogue (φ (α' i)) α  =⟨ pr₂ (IH (α' i)) α α' (l (α' i)) 
   dialogue (φ (α' i)) α' 

eloquent-functions-are-UC : (f : Cantor  )
                           eloquent f
                           is-uniformly-continuous f
eloquent-functions-are-UC f (d , e) =
 UC-extensional (dialogue d) f e (dialogue-UC d)

prune : B   C 
prune (η n)   = η n
prune (β φ i) = β  j  prune (φ (embedding-𝟚-ℕ j))) i

prune-behaviour : (d : B ) (α : Cantor)
                 dialogue (prune d) α  C-restriction (dialogue d) α
prune-behaviour (η n)   α = refl
prune-behaviour (β φ n) α = prune-behaviour (φ (embedding-𝟚-ℕ (α n))) α

restriction-is-eloquent : (f : Baire  )
                         eloquent f
                         eloquent (C-restriction f)
restriction-is-eloquent f (d , c) =
 (prune d ,
   α  dialogue (prune d) α         =⟨ prune-behaviour d α 
         C-restriction (dialogue d) α =⟨ c (embedding-C-B α) 
         f (embedding-C-B α)          ))

\end{code}

B is a monad.

\begin{code}

kleisli-extension : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  (X  B Y)  B X  B Y
kleisli-extension f (η x)   = f x
kleisli-extension f (β φ i) = β  j  kleisli-extension f (φ j)) i

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

decode : {X : 𝓤 ̇ }  Baire  B X  X
decode α d = dialogue d α

decode-α-is-natural : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (g : X  Y) (d : B X) (α : Baire)
                     g (decode α d)  decode α (B-functor g d)
decode-α-is-natural g (η x)   α = refl
decode-α-is-natural g (β φ i) α = decode-α-is-natural g (φ(α i)) α

decode-kleisli-extension : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  B Y) (d : B X) (α : Baire)
                          decode α (f (decode α d))
                          decode α (kleisli-extension f d)
decode-kleisli-extension f (η x)   α = refl
decode-kleisli-extension f (β φ i) α = decode-kleisli-extension f (φ(α i)) α

\end{code}

The generic element.

\begin{code}

generic : B   B 
generic = kleisli-extension (β η)

generic-diagram : (α : Baire) (d : B )
                 α (decode α d)  decode α (generic d)
generic-diagram α (η n)   = refl
generic-diagram α (β φ n) = generic-diagram α (φ (α n))

\end{code}