\begin{code}
module church-dialogue-internal where
data _≡_ {X : Set} : X → X → Set where
refl : ∀{x : X} → x ≡ x
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
rec : ∀{X : Set} → (X → X) → X → ℕ → X
rec f x zero = x
rec f x (succ n) = f(rec f x n)
data type : Set where
ι : type
_⇒_ : type → type → type
data T : (σ : type) → Set where
Zero : T ι
Succ : T(ι ⇒ ι)
Rec : ∀{σ : type} → T((σ ⇒ σ) ⇒ σ ⇒ ι ⇒ σ)
K : ∀{σ τ : type} → T(σ ⇒ τ ⇒ σ)
S : ∀{ρ σ τ : type} → T((ρ ⇒ σ ⇒ τ) ⇒ (ρ ⇒ σ) ⇒ ρ ⇒ τ)
_·_ : ∀{σ τ : type} → T(σ ⇒ τ) → T σ → T τ
infixr 1 _⇒_
infixl 1 _·_
Ķ : ∀{X Y : Set} → X → Y → X
Ķ x y = x
Ş : ∀{X Y Z : Set} → (X → Y → Z) → (X → Y) → X → Z
Ş f g x = f x (g x)
Set⟦_⟧ : type → Set
Set⟦ ι ⟧ = ℕ
Set⟦ σ ⇒ τ ⟧ = Set⟦ σ ⟧ → Set⟦ τ ⟧
⟦_⟧ : ∀{σ : type} → T σ → Set⟦ σ ⟧
⟦ Zero ⟧ = zero
⟦ Succ ⟧ = succ
⟦ Rec ⟧ = rec
⟦ K ⟧ = Ķ
⟦ S ⟧ = Ş
⟦ t · u ⟧ = ⟦ t ⟧ ⟦ u ⟧
D : type → type → type → type → type
D X Y Z A = (Z ⇒ A) ⇒ ((Y ⇒ A) ⇒ X ⇒ A) ⇒ A
I : ∀{σ : type} → T(σ ⇒ σ)
I {σ} = S · K · (K {σ} {σ})
η : {X Y Z A : type} → T(Z ⇒ D X Y Z A)
η = S · (S · (K · S) · (S · (S · (K · S) · (S · (K · K) · (K · S))) · (S · (S · (K · S) · (S · (K · K) · (K · K))) · (K · I)))) · (S · (S · (K · S) · (S · (K · K) · (K · K))) · (S · (K · K) · I))
η-behaviour : {X Y Z A : type} → ∀ z η' β' → ⟦ η {X} {Y} {Z} {A} ⟧ z η' β' ≡ η' z
η-behaviour z η' β' = refl
β : {X Y Z A : type} → T (((Y ⇒ D X Y Z A) ⇒ X ⇒ D X Y Z A))
β = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))
β-behaviour : {X Y Z A : type} → ∀ φ x η' β' → ⟦ β {X} {Y} {Z} {A} ⟧ φ x η' β' ≡ β' (λ y → φ y η' β') x
β-behaviour φ x η' β' = refl
B : type → type → type
B = D ι ι
kleisli-extension : ∀{X Y A : type} → T((X ⇒ B Y A) ⇒ B X A ⇒ B Y A)
kleisli-extension = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))
kleisli-extension-behaviour : ∀{X Y A : type} → ∀ f d η' β' → ⟦ kleisli-extension {X} {Y} {A} ⟧ f d η' β' ≡ d (λ x → f x η' β') β'
kleisli-extension-behaviour f d η' β' = refl
B-functor : ∀{X Y A : type} → T((X ⇒ Y) ⇒ B X A ⇒ B Y A)
B-functor = S ·(K · kleisli-extension) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · η))) ·(S ·(S ·(K · S) ·(S ·(K · K) · I)) ·(K · I)))
B-functor-behaviour : ∀{X Y A : type} → ∀ f → ⟦ B-functor {X} {Y} {A} ⟧ f ≡ ⟦ kleisli-extension ⟧ (λ x → ⟦ η ⟧ (f x))
B-functor-behaviour f = refl
B-type⟦_⟧ : type → type → type
B-type⟦ ι ⟧ A = B ι A
B-type⟦ σ ⇒ τ ⟧ A = B-type⟦ σ ⟧ A ⇒ B-type⟦ τ ⟧ A
Kleisli-extension : ∀{X A : type} {σ : type} → T((X ⇒ B-type⟦ σ ⟧ A) ⇒ B X A ⇒ B-type⟦ σ ⟧ A)
Kleisli-extension {X} {A} {ι} = kleisli-extension
Kleisli-extension {X} {A} {σ ⇒ τ} = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · (Kleisli-extension {X} {A} {τ})))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I))
Kleisli-extension-behaviour : ∀{X A : type} {σ τ : type} → ∀ g d s
→ ⟦ Kleisli-extension {X} {A} {σ ⇒ τ} ⟧ g d s ≡ ⟦ Kleisli-extension {X} {A} {τ} ⟧ (λ x → g x s) d
Kleisli-extension-behaviour g d s = refl
zero' : {A : type} → T(B ι A)
zero' = η · Zero
succ' : {A : type} → T(B ι A ⇒ B ι A)
succ' = B-functor · Succ
rec' : ∀{σ A : type} → T((B-type⟦ σ ⟧ A ⇒ B-type⟦ σ ⟧ A) ⇒ B-type⟦ σ ⟧ A ⇒ B ι A ⇒ B-type⟦ σ ⟧ A)
rec' {σ} {A} = S · (S · (K · S) · (S · (K · K) · (K · (Kleisli-extension {ι} {A} {σ})))) · (S · (S · (K · S) · (S · (S · (K · S) · (S · (K · K) · (K · Rec))) · (S · (K · K) · I))) · (K · I))
rec'-behaviour : ∀{σ A : type} → ∀ f x → ⟦ rec' {σ} {A} ⟧ f x ≡ ⟦ Kleisli-extension {ι} {A} {σ} ⟧ (rec f x)
rec'-behaviour f x = refl
B⟦_⟧ : ∀{σ : type}{A : type} → T σ → T(B-type⟦ σ ⟧ A)
B⟦ Zero ⟧ = zero'
B⟦ Succ ⟧ = succ'
B⟦ Rec {σ} ⟧ = rec' {σ}
B⟦ K ⟧ = K
B⟦ S ⟧ = S
B⟦ t · u ⟧ = B⟦ t ⟧ · B⟦ u ⟧
generic : {A : type} → T(B ι A ⇒ B ι A)
generic = kleisli-extension · (β · η)
dialogue-tree : {A : type} → T((ι ⇒ ι) ⇒ ι) → T(B ι A)
dialogue-tree t = B⟦ t ⟧ · generic
Add : T(ι ⇒ ι ⇒ ι)
Add = Rec · Succ
Max : T(ι ⇒ ι ⇒ ι)
Max = Add
Mod-cont : T(B ι ((ι ⇒ ι) ⇒ ι) ⇒ (ι ⇒ ι) ⇒ ι)
Mod-cont = S ·(S · I ·(S ·(K · K) ·(S ·(K · K) ·(K · Zero)))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · Max))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · Succ))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I)))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))
Mod-cont-behaviour₀ : ∀ n α → ⟦ Mod-cont ⟧ (⟦ η ⟧ n) α ≡ zero
Mod-cont-behaviour₀ n α = refl
Mod-cont-behaviour₁ : ∀ φ n α → ⟦ Mod-cont ⟧ (⟦ β ⟧ φ n) α ≡ ⟦ Max ⟧ (succ n) (⟦ Mod-cont ⟧ (φ(α n)) α)
Mod-cont-behaviour₁ φ n α = refl
internal-mod-cont : T((ι ⇒ ι) ⇒ ι) → T((ι ⇒ ι) ⇒ ι)
internal-mod-cont t = Mod-cont · (dialogue-tree {(ι ⇒ ι) ⇒ ι} t)
\end{code}
\begin{code}
external-mod-cont : T((ι ⇒ ι) ⇒ ι) → (ℕ → ℕ) → ℕ
external-mod-cont t = ⟦ internal-mod-cont t ⟧
{-# BUILTIN NATURAL ℕ #-}
{-# BUILTIN ZERO zero #-}
{-# BUILTIN SUC succ #-}
number : ℕ → T ι
number zero = Zero
number (succ n) = Succ · (number n)
t₀ : T((ι ⇒ ι) ⇒ ι)
t₀ = K · (number 17)
t₀-interpretation : ⟦ t₀ ⟧ ≡ λ α → 17
t₀-interpretation = refl
example₀ : ℕ
example₀ = external-mod-cont t₀ (λ i → i)
v : ∀{γ : type} → T(γ ⇒ γ)
v = I
infixl 1 _•_
_•_ : ∀{γ σ τ : type} → T(γ ⇒ σ ⇒ τ) → T(γ ⇒ σ) → T(γ ⇒ τ)
f • x = S · f · x
Number : ∀{γ} → ℕ → T(γ ⇒ ι)
Number n = K · (number n)
t₁ : T((ι ⇒ ι) ⇒ ι)
t₁ = v • (Number 17)
t₁-interpretation : ⟦ t₁ ⟧ ≡ λ α → α 17
t₁-interpretation = refl
example₁ : ℕ
example₁ = external-mod-cont t₁ (λ i → i)
t₂ : T((ι ⇒ ι) ⇒ ι)
t₂ = Rec • t₁ • t₁
t₂-interpretation : ⟦ t₂ ⟧ ≡ λ α → rec α (α 17) (α 17)
t₂-interpretation = refl
example₂ : ℕ
example₂ = external-mod-cont t₂ (λ i → i)
infixl 0 _+_
_+_ : ∀{γ} → T(γ ⇒ ι) → T(γ ⇒ ι) → T(γ ⇒ ι)
x + y = K · Add • x • y
t₃ : T((ι ⇒ ι) ⇒ ι)
t₃ = Rec • (v • Number 1) • (v • Number 2 + v • Number 3)
t₃-interpretation : ⟦ t₃ ⟧ ≡ λ α → rec α (α 1) (rec succ (α 2) (α 3))
t₃-interpretation = refl
example₃ : ℕ
example₃ = external-mod-cont t₃ succ
t₄ : T((ι ⇒ ι) ⇒ ι)
t₄ = Rec • ((v • (v • Number 2)) + (v • Number 3)) • t₃
t₄-interpretation : ⟦ t₄ ⟧ ≡ λ α → rec α (rec succ (α (α 2)) (α 3)) (rec α (α 1) (rec succ (α 2) (α 3)))
t₄-interpretation = refl
t₅ : T((ι ⇒ ι) ⇒ ι)
t₅ = Rec • (v • (v • t₂ + t₄)) • (v • Number 2)
t₅-explicitly : t₅ ≡ (S · (S · Rec · (S · I · (S · (S · (K · (Rec · Succ)) · (S · I · (S
· (S · Rec · (S · I · (K · (number 17)))) · (S · I · (K · (number 17))))))
· (S · (S · Rec · (S · (S · (K · (Rec · Succ)) · (S · I · (S · I · (K · (number 2)))))
· (S · I · (K · (number 3))))) · (S · (S · Rec · (S · I · (K · (number 1))))
· (S · (S · (K · (Rec · Succ)) · (S · I · (K · (number 2)))) · (S · I · (K
· (number 3))))))))) · (S · I · (K · (number 2))))
t₅-explicitly = refl
t₅-interpretation : ⟦ t₅ ⟧ ≡ λ α → rec α (α(rec succ (α(rec α (α 17) (α 17)))
(rec α (rec succ (α (α 2)) (α 3))
(rec α (α 1) (rec succ (α 2) (α 3)))))) (α 2)
t₅-interpretation = refl
example₅ : ℕ
example₅ = external-mod-cont t₅ succ
\end{code}