{-
This second-order signature was created from the following second-order syntax description:

syntax TLC | Λ

type
  N   : 0-ary
  _↣_ : 2-ary | r30
  𝟙   : 0-ary
  _⊗_ : 2-ary | l40
  𝟘   : 0-ary
  _⊕_ : 2-ary | l30

term
  app   : α ↣ β  α  ->  β | _$_ l20
  lam   : α.β  ->  α ↣ β | ƛ_ r10
  unit  : 𝟙
  pair  : α  β  ->  α ⊗ β | ⟨_,_⟩
  fst   : α ⊗ β  ->  α
  snd   : α ⊗ β  ->  β
  abort : 𝟘  ->  α
  inl   : α  ->  α ⊕ β
  inr   : β  ->  α ⊕ β
  case  : α ⊕ β  α.γ  β.γ  ->  γ
  ze    : N
  su    : N  ->  N
  nrec  : N  α  (α,N).α  ->  α

theory
  (ƛβ) b : α.β  a : α |> app (lam(x.b[x]), a) = b[a]
  (ƛη) f : α ↣ β      |> lam (x. app(f, x))   = f
  (𝟙η) u : 𝟙 |> u = unit
  (fβ) a : α  b : β |> fst (pair(a, b))      = a
  (sβ) a : α  b : β |> snd (pair(a, b))      = b
  (pη) p : α ⊗ β    |> pair (fst(p), snd(p)) = p
  (𝟘η) e : 𝟘  c : α |> abort(e) = c
  (lβ) a : α   f : α.γ  g : β.γ |> case (inl(a), x.f[x], y.g[y])      = f[a]
  (rβ) b : β   f : α.γ  g : β.γ |> case (inr(b), x.f[x], y.g[y])      = g[b]
  (cη) s : α ⊕ β  c : (α ⊕ β).γ |> case (s, x.c[inl(x)], y.c[inr(y)]) = c[s]
  (zeβ) z : α   s : (α,N).α        |> nrec (ze,       z, r m. s[r,m]) = z
  (suβ) z : α   s : (α,N).α  n : N |> nrec (su (n), z, r m. s[r,m]) = s[nrec (n, z, r m. s[r,m]), n]
  (ift) t f : α |> if (true, t, f) = t
  (iff) t f : α |> if (false, t, f) = f
-}

module TLC.Signature where

open import SOAS.Context

-- Type declaration
data ΛT : Set where
  N   : ΛT
  _↣_ : ΛT  ΛT  ΛT
  𝟙   : ΛT
  _⊗_ : ΛT  ΛT  ΛT
  𝟘   : ΛT
  _⊕_ : ΛT  ΛT  ΛT
infixr 30 _↣_
infixl 40 _⊗_
infixl 30 _⊕_

-- Derived types
B : ΛT
B = 𝟙  𝟙

open import SOAS.Syntax.Signature ΛT public
open import SOAS.Syntax.Build ΛT public

-- Operator symbols
data Λₒ : Set where
  appₒ lamₒ pairₒ fstₒ sndₒ inlₒ inrₒ : {α β : ΛT}  Λₒ
  unitₒ zeₒ suₒ : Λₒ
  abortₒ nrecₒ : {α : ΛT}  Λₒ
  caseₒ : {α β γ : ΛT}  Λₒ

-- Term signature
Λ:Sig : Signature Λₒ
Λ:Sig = sig λ
  { (appₒ   {α}{β})     (⊢₀ α  β) , (⊢₀ α) ⟼₂ β
  ; (lamₒ   {α}{β})     (α ⊢₁ β) ⟼₁ α  β
  ;  unitₒ              ⟼₀ 𝟙
  ; (pairₒ  {α}{β})     (⊢₀ α) , (⊢₀ β) ⟼₂ α  β
  ; (fstₒ   {α}{β})     (⊢₀ α  β) ⟼₁ α
  ; (sndₒ   {α}{β})     (⊢₀ α  β) ⟼₁ β
  ; (abortₒ {α})        (⊢₀ 𝟘) ⟼₁ α
  ; (inlₒ   {α}{β})     (⊢₀ α) ⟼₁ α  β
  ; (inrₒ   {α}{β})     (⊢₀ β) ⟼₁ α  β
  ; (caseₒ  {α}{β}{γ})  (⊢₀ α  β) , (α ⊢₁ γ) , (β ⊢₁ γ) ⟼₃ γ
  ;  zeₒ                ⟼₀ N
  ;  suₒ                (⊢₀ N) ⟼₁ N
  ; (nrecₒ  {α})        (⊢₀ N) , (⊢₀ α) , (α , N ⊢₂ α) ⟼₃ α
  }

open Signature Λ:Sig public