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}