Vincent Rahli, 14 March 2015.

This is a variant of the proof given by Martin Escardo in
https://doi.org/10.1016/j.entcs.2013.09.010 (MFPS XXIX) that does not
use the formal oracle Ω, and instead directly shows the relation
between ⟦_⟧ and B⟦_⟧ (see R's definition and main-lemma).  Then, as
before in dialogue-tree-correct, we use generic sequence to consult
the ``oracle'' α.

\begin{code}

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

module EffectfulForcing.MFPSAndVariations.WithoutOracle where

open import MLTT.Spartan
open import EffectfulForcing.MFPSAndVariations.Combinators
open import EffectfulForcing.MFPSAndVariations.Continuity
open import EffectfulForcing.MFPSAndVariations.Dialogue
open import EffectfulForcing.MFPSAndVariations.CombinatoryT
open import EffectfulForcing.MFPSAndVariations.MFPS-XXIX using (B-Set⟦_⟧ ; Kleisli-extension ; zero' ; succ' ; iter')

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

dialogue-tree : T((ι  ι)  ι)  B 
dialogue-tree t = B⟦ t  generic

R : {σ : type}  Baire  Set⟦ σ   B-Set⟦ σ   Set
R {ι}     α n d  = n  dialogue d α
R {σ  τ} α f f' = (x  : Set⟦ σ )
                   (x' : B-Set⟦ σ )
                  R {σ} α x x'
                  R {τ} α (f x) (f' x')

R-kleisli-lemma : (σ : type)
                  (α : Baire)
                  (g  :   Set⟦ σ )
                  (g' :   B-Set⟦ σ )
                 ((k : )  R α (g k) (g' k))
                 (n  : )
                  (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 
 dialogue (g' n) α                     =⟨ ap  -  dialogue (g' -) α) rn 
 dialogue (g' (dialogue n' α)) α       =⟨ decode-kleisli-extension g' n' α 
 dialogue (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 : T σ) (α : Baire)  R α  t  (B⟦ t )

main-lemma Zero = λ α  refl

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

main-lemma {(σ  .σ)  .σ  ι  .σ} Iter = lemma
 where
  lemma :  (α : Baire)
           (f  : Set⟦ σ   Set⟦ σ )
           (f' : B-Set⟦ σ   B-Set⟦ σ )
         R {σ  σ} α f f'
         (x  : Set⟦ σ )
          (x' : B-Set⟦ σ )
         R {σ} α x x'
         (n  : )
          (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 :   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  α  dialogue (dialogue-tree t) α
dialogue-tree-correct t α =
  t  α                      =⟨ main-lemma t α α generic lemma 
 dialogue (B⟦ t  generic) α  =⟨ refl 
 dialogue (dialogue-tree t) α 
  where
   lemma : (n  : )
           (n' : B )
          n  dialogue n' α
          α n  dialogue (generic n') α
   lemma n n' rn = α n                     =⟨ ap α rn 
                   α (dialogue n' α)       =⟨ generic-diagram α n' 
                   decode α (generic n')   =⟨ refl 
                   dialogue (generic n') α 

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))