\begin{code}
module PCF.Constants where

open import Data.Bool.Base 
  using (Bool; true; false; if_then_else_)
open import Agda.Builtin.Nat
  using (Nat; _+_; _-_; _==_)

open import PCF.Domain-Notation
  using (η; _♯; fix; ; _⟶_,_)
open import PCF.Types
  using (Types; o; ι; _⇒_; σ; 𝒟)

-- Syntax

data  : Types  Set where
  tt   :  o
  ff   :  o
  ⊃ᵢ   :  (o  ι  ι  ι)
  ⊃ₒ   :  (o  o  o  o)
  Y    : {σ : Types}   ((σ  σ)  σ)
  k    : (n : Nat)   ι
  +1′  :  (ι  ι)
  -1′  :  (ι  ι)
  Z    :  (ι  o)

variable c :  σ

-- Semantics

𝒜⟦_⟧ :  σ  𝒟 σ

𝒜⟦ tt    =  η true
𝒜⟦ ff    =  η false
𝒜⟦ ⊃ᵢ    =  _⟶_,_
𝒜⟦ ⊃ₒ    =  _⟶_,_
𝒜⟦ Y     =  fix
𝒜⟦ k n   =  η n
𝒜⟦ +1′   =   n  η (n + 1)) 
𝒜⟦ -1′   =   n  if n == 0 then  else η (n - 1)) 
𝒜⟦ Z     =   n  η (n == 0)) 
\end{code}