open import 1Lab.Prelude

open import Data.Partial.Total
open import Data.Partial.Base
open import Data.Vec.Base

open import Realisability.PCA

import Realisability.Data.Pair
import Realisability.PCA.Sugar
module Realisability.PCA.Fixpoint {β„“} (𝔸 : PCA β„“) where
open Realisability.PCA.Sugar 𝔸
open Realisability.Data.Pair 𝔸

private variable x y : β†― ⌞ 𝔸 ⌟

Fixed-point combinators in a PCAπŸ”—

`X : ↯⁺ 𝔸
`X = val ⟨ x ⟩ ⟨ y ⟩ ⟨ z ⟩ y `· (x `· x `· y) `· z

`Z : ↯⁺ 𝔸
`Z = record
  { fst = `X ⋆ `X
  ; snd = subst ⌞_⌟ (sym (abs-Ξ²β‚™ [] (`X ∷ []))) (abs↓ _ _)
  }

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       ∎