module Realisability.PCA.Fixpoint {ℓ} (𝔸 : PCA ℓ) where
Fixed-point combinators in a PCA🔗
Since partial combinatory
algebras encode untyped higher-order computation, we can import the
definition of fixed-point combinators from untyped
lambda calculus to arbitrary programs in a PCA. The most useful of
these will be the `Z
combinator, which satisfies
and is always defined when applied to a single argument — that is, it
lets us compute ‘functions of at least one argument’ by arbitrary
recursion, such that the recursive function itself is always
defined — though of course applying the recursive function
might still lead to something undefined.
We introduce an intermediate combinator `X
, and define `Z
as the
self-application of `X
.
`X : ↯⁺ 𝔸 `X = val ⟨ x ⟩ ⟨ y ⟩ ⟨ z ⟩ y `· (x `· x `· y) `· z `Z : ↯⁺ 𝔸 `Z = record { fst = `X ⋆ `X ; snd = subst ⌞_⌟ (sym (abs-βₙ [] (`X ∷ []))) (abs↓ _ _) }
This lets us prove the desired properties of `Z
.
abstract `Z↓₁ : ⌞ x ⌟ → ⌞ `Z ⋆ x ⌟ `Z↓₁ {x} xh = subst ⌞_⌟ (sym (abs-βₙ [] ((x , xh) ∷ `X ∷ []))) (abs↓ _ _) `Z-β : ⌞ x ⌟ → ⌞ y ⌟ → `Z ⋆ x ⋆ y ≡ x ⋆ (`Z ⋆ x) ⋆ y `Z-β {x} {y} xh yh = `X ⋆ `X ⋆ x ⋆ y ≡⟨ abs-βₙ [] ((y , yh) ∷ (x , xh) ∷ `X ∷ []) ⟩≡ x ⋆ (`X ⋆ `X ⋆ x) ⋆ y ≡⟨⟩ x ⋆ (`Z ⋆ x) ⋆ y ∎