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

syntax Inception | IA

type
  L : 0-ary
  P : 0-ary
  A : 0-ary

term
  rec : L  P  ->  A
  inc : L.A  P.A  ->  A

theory
  (S) p : P   a : P.A |> inc (l. rec (l, p[]), x. a[x]) = a[p[]]
  (E) a : L.A  |> k : L |- inc (l. a[l], x. rec(k, x)) = a[k]
  (W) m : A  a : P.A  |> inc (l. m[], x. a[x]) = m[]
  (A) p : (L,L).A  a : (L,P).A  b : P.A |>         inc (l. inc (k. p[l, k], x. a[l,x]), y. b[y])       = inc (k. inc(l. p[l,k], y.b[y]), x. inc(l. a[l,x], y.b[y]))
-}

module Inception.Signature where

open import SOAS.Context

-- Type declaration
data IAT : Set where
  L : IAT
  P : IAT
  A : IAT



open import SOAS.Syntax.Signature IAT public
open import SOAS.Syntax.Build IAT public

-- Operator symbols
data IAₒ : Set where
  recₒ incₒ : IAₒ

-- Term signature
IA:Sig : Signature IAₒ
IA:Sig = sig λ
  {  recₒ   (⊢₀ L) , (⊢₀ P) ⟼₂ A
  ;  incₒ   (L ⊢₁ A) , (P ⊢₁ A) ⟼₂ A
  }

open Signature IA:Sig public