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 ∎