Vincent Rahli 2015, 20 May 2023 The original version of effectful forcing used system T extended with oracles. Here we avoid the oracles by modifying the logical relation. We work with the lambda calculus version of system T. The original 2015 version was for the combinatory version of system T. \begin{code} {-# OPTIONS --safe --without-K #-} module EffectfulForcing.Internal.External where open import MLTT.Spartan hiding (rec ; _^_) renaming (⋆ to 〈〉) open import EffectfulForcing.MFPSAndVariations.Combinators open import EffectfulForcing.MFPSAndVariations.Continuity open import EffectfulForcing.MFPSAndVariations.Dialogue open import EffectfulForcing.MFPSAndVariations.SystemT using (type ; ι ; _⇒_ ; 〖_〗) open import EffectfulForcing.MFPSAndVariations.LambdaCalculusVersionOfMFPS using (B〖_〗 ; Kleisli-extension ; zero' ; succ' ; rec') open import EffectfulForcing.Internal.SystemT B【_】 : (Γ : Cxt) → Type B【 Γ 】 = {σ : type} (i : ∈Cxt σ Γ) → B〖 σ 〗 ⟪⟫ : B【 〈〉 】 ⟪⟫ () _‚‚_ : {Γ : Cxt} {σ : type} → B【 Γ 】 → B〖 σ 〗 → B【 Γ ,, σ 】 (xs ‚‚ x) (∈Cxt0 _) = x (xs ‚‚ x) (∈CxtS _ i) = xs i infixl 6 _‚‚_ B⟦_⟧ : {Γ : Cxt} {σ : type} → T Γ σ → B【 Γ 】 → B〖 σ 〗 B⟦ Zero ⟧ _ = zero' B⟦ Succ t ⟧ xs = succ' (B⟦ t ⟧ xs) B⟦ Rec f g t ⟧ xs = rec' (B⟦ f ⟧ xs) (B⟦ g ⟧ xs) (B⟦ t ⟧ xs) B⟦ ν i ⟧ xs = xs i B⟦ ƛ t ⟧ xs = λ x → B⟦ t ⟧ (xs ‚‚ x) B⟦ t · u ⟧ xs = (B⟦ t ⟧ xs) (B⟦ u ⟧ xs) B⟦_⟧₀ : {σ : type} → T₀ σ → B〖 σ 〗 B⟦ t ⟧₀ = B⟦ t ⟧ ⟪⟫ dialogue-tree : T₀((ι ⇒ ι) ⇒ ι) → B ℕ dialogue-tree t = B⟦ t ⟧₀ generic R : {σ : type} → Baire → 〖 σ 〗 → B〖 σ 〗 → Type R {ι} α n d = n = dialogue d α R {σ ⇒ τ} α f f' = (x : 〖 σ 〗) (x' : B〖 σ 〗) → R {σ} α x x' → R {τ} α (f x) (f' x') R-kleisli-lemma : (σ : type) (α : Baire) (g : ℕ → 〖 σ 〗) (g' : ℕ → B〖 σ 〗) → ((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 Rs : {Γ : Cxt} → Baire → 【 Γ 】 → B【 Γ 】 → Type Rs {Γ} α xs ys = {σ : type} (i : ∈Cxt σ Γ) → R {σ} α (xs i) (ys i) main-lemma : {Γ : Cxt} {σ : type} (t : T Γ σ) (α : Baire) (xs : 【 Γ 】) (ys : B【 Γ 】) → Rs α xs ys → R α (⟦ t ⟧ xs) (B⟦ t ⟧ ys) main-lemma Zero α xs ys cr = refl main-lemma (Succ t) α xs ys cr = succ (⟦ t ⟧ xs) =⟨ ap succ (main-lemma t α xs ys cr) ⟩ succ (dialogue (B⟦ t ⟧ ys) α) =⟨ decode-α-is-natural succ (B⟦ t ⟧ ys) α ⟩ decode α (succ' (B⟦ t ⟧ ys)) ∎ main-lemma (Rec {_} {σ} a b t) α xs ys cr = R-kleisli-lemma σ α g g' rg (⟦ t ⟧ xs) (B⟦ t ⟧ ys) (main-lemma t α xs ys cr) where g : ℕ → 〖 σ 〗 g = rec (⟦ a ⟧ xs) (⟦ b ⟧ xs) g' : ℕ → B〖 σ 〗 g' = rec (B⟦ a ⟧ ys ∘ η) (B⟦ b ⟧ ys) rg : (k : ℕ) → R α (g k) (g' k) rg zero = main-lemma b α xs ys cr rg (succ k) = main-lemma a α xs ys cr k (η k) refl (g k) (g' k) (rg k) main-lemma (ν i) α xs ys cr = cr i main-lemma {Γ} {σ ⇒ τ} (ƛ t) α xs ys cr = lemma where lemma : (x : 〖 σ 〗) (y : B〖 σ 〗) → R α x y → R α (⟦ t ⟧ (xs ‚ x)) (B⟦ t ⟧ (ys ‚‚ y)) lemma x y r = main-lemma t α (xs ‚ x) (ys ‚‚ y) h where h : {σ₁ : type} (i : ∈Cxt σ₁ (Γ ,, σ)) → R α ((xs ‚ x) i) ((ys ‚‚ y) i) h {σ₁} (∈Cxt0 .Γ) = r h {σ₁} (∈CxtS .σ i) = cr i main-lemma (t · u) α xs ys cr = IH-t (⟦ u ⟧ xs) (B⟦ u ⟧ ys) IH-u where IH-t : (x : 〖 _ 〗) (y : B〖 _ 〗) → R α x y → R α (⟦ t ⟧ xs x) (B⟦ t ⟧ ys y) IH-t = main-lemma t α xs ys cr IH-u : R α (⟦ u ⟧ xs) (B⟦ u ⟧ ys) IH-u = main-lemma u α xs ys cr main-lemma-closed : {σ : type} (t : T₀ σ) (α : Baire) → R α ⟦ t ⟧₀ (B⟦ t ⟧₀) main-lemma-closed {σ} t α = main-lemma t α ⟨⟩ ⟪⟫ (λ()) dialogue-tree-correct : (t : T₀ ((ι ⇒ ι) ⇒ ι)) (α : Baire) → ⟦ t ⟧₀ α = dialogue (dialogue-tree t) α dialogue-tree-correct t α = ⟦ t ⟧₀ α =⟨ main-lemma-closed 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 → ℕ) → 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 → ℕ) → T-definable f → is-continuous f eloquence-corollary₀ f d = eloquent-functions-are-continuous f (eloquence-theorem f d) eloquence-corollary₁ : (f : Baire → ℕ) → 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))