Skip to content

PCF: A Programming Language for Computable Functions

PCF and its denotational semantics were orginally defined by Dana Scott in 1969 (Scott1993TTA) with combinators (S, K) instead of \(\lambda\)-abstraction. Gordon Plotkin subsequently defined a denotational semantics for PCF including \(\lambda\)-abstraction (Plotkin1977LCP). The Agda modules presented below are an embedding of the latter definition.

PCF is an intrinsically typed language: every well-formed term has a unique type. The following grammar summarises the context-free abstract syntax of types \(\sigma, \tau\) and terms \(M, N\) with variables \(\alpha_i^\sigma\) (\(i \geq 0\)) and constants \(c\). In ยง Abstract Syntax we reflect Plotkin's presentation of PCF more accurately by exploiting Agda's support for dependent types.

\[\begin{align} \sigma, \tau & ::= \iota \mid o \mid (\sigma \to \tau) \\ c & ::= \textit{tt} \mid \textit{ff} \mid {\supset} \mid \textbf{Y} \mid k_n \mid (+1) \mid (-1) \mid \textbf{Z} \\ M, N & ::= \alpha_i^\sigma \mid c \mid (M \, N) \mid (\lambda \alpha_i^\sigma M) \end{align}\]
{-# OPTIONS --rewriting --confluence-check --lossy-unification #-}

module Examples.PCF where

import Examples.PCF.Abstract-Syntax
import Examples.PCF.Domain-Equations
import Examples.PCF.Semantic-Functions