{-
This second-order signature was created from the following second-order syntax description:
syntax PCF
type
N : 0-ary
_↣_ : 2-ary | r30
B : 0-ary
term
app : α ↣ β α -> β | _$_ l20
lam : α.β -> α ↣ β | ƛ_ r10
tr : B
fl : B
ze : N
su : N -> N
pr : N -> N
iz : N -> B | 0?
if : B α α -> α
fix : α.α -> α
theory
(ƛβ) b : α.β a : α |> app (lam(x.b[x]), a) = b[a]
(ƛη) f : α ↣ β |> lam (x. app(f, x)) = f
(zz) |> iz (ze) = tr
(zs) n : N |> iz (su (n)) = fl
(ps) n : N |> pr (su (n)) = n
(ift) t f : α |> if (tr, t, f) = t
(iff) t f : α |> if (fl, t, f) = f
(fix) t : α.α |> fix (x.t[x]) = t[fix (x.t[x])]
-}
module PCF.Signature where
open import SOAS.Context
-- Type declaration
data PCFT : Set where
N : PCFT
_↣_ : PCFT → PCFT → PCFT
B : PCFT
infixr 30 _↣_
open import SOAS.Syntax.Signature PCFT public
open import SOAS.Syntax.Build PCFT public
-- Operator symbols
data PCFₒ : Set where
appₒ lamₒ : {α β : PCFT} → PCFₒ
trₒ flₒ zeₒ suₒ prₒ izₒ : PCFₒ
ifₒ fixₒ : {α : PCFT} → PCFₒ
-- Term signature
PCF:Sig : Signature PCFₒ
PCF:Sig = sig λ
{ (appₒ {α}{β}) → (⊢₀ α ↣ β) , (⊢₀ α) ⟼₂ β
; (lamₒ {α}{β}) → (α ⊢₁ β) ⟼₁ α ↣ β
; trₒ → ⟼₀ B
; flₒ → ⟼₀ B
; zeₒ → ⟼₀ N
; suₒ → (⊢₀ N) ⟼₁ N
; prₒ → (⊢₀ N) ⟼₁ N
; izₒ → (⊢₀ N) ⟼₁ B
; (ifₒ {α}) → (⊢₀ B) , (⊢₀ α) , (⊢₀ α) ⟼₃ α
; (fixₒ {α}) → (α ⊢₁ α) ⟼₁ α
}
open Signature PCF:Sig public