-- Syntax of a second-order language
module SOAS.Metatheory.Syntax {T : Set} where

open import SOAS.Families.Core {T}
open import SOAS.Families.Build

open import SOAS.Common
open import SOAS.Context
open import Categories.Object.Initial
open import SOAS.Construction.Structure
open import SOAS.ContextMaps.Inductive
open import SOAS.Coalgebraic.Strength
open import SOAS.Abstract.ExpStrength
open import SOAS.Metatheory.MetaAlgebra

-- Data characterising a second-order syntax:
-- * a signature endofunctor β…€
-- * coalgebraic and exponential strength
-- * initial (β…€,𝔛)-meta-algebra for each 𝔛
-- + an inductive metavariable constructor for convenience
record Syntax : Set₁ where
  field
    β…€F    : Functor 𝔽amiliesβ‚› 𝔽amiliesβ‚›
    β…€:CS  : CompatStrengths β…€F
    𝕋:Init : (𝔛 : Familyβ‚›) β†’ Initial (𝕄etaAlgebras β…€F 𝔛)
    mvarα΅’  : {𝔛 : Familyβ‚›}{Ο„ : T}{Ξ  Ξ“ : Ctx} (open Initial (𝕋:Init 𝔛))
          β†’ 𝔛 Ο„ Ξ  β†’ Sub (𝐢 βŠ₯) Ξ  Ξ“ β†’ 𝐢 βŠ₯ Ο„ Ξ“

  module _ {𝔛 : Familyβ‚›} where
    open Initial (𝕋:Init 𝔛)

  private
    variable
      Ξ± α₁ Ξ±β‚‚ α₃ Ξ±β‚„ : T
      Ξ“ Ξ  Π₁ Ξ β‚‚ Π₃ Ξ β‚„ : Ctx
      𝔐 : MCtx
    Tm : MCtx β†’ Familyβ‚›
    Tm 𝔐 = 𝐢 (Initial.βŠ₯ (𝕋:Init βˆ₯ 𝔐 βˆ₯))

  -- Shorthands for metavariables associated with a metavariable environment
  infix 100 π”žβŸ¨_ π”ŸβŸ¨_ π” βŸ¨_ π”‘βŸ¨_ π”’βŸ¨_
  infix 100 β—Œα΅ƒβŸ¨_ β—Œα΅‡βŸ¨_ β—ŒαΆœβŸ¨_ β—Œα΅ˆβŸ¨_ β—Œα΅‰βŸ¨_

  π”žβŸ¨_ : Sub (Tm (⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐)) Ξ  Ξ“ β†’ Tm (⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”žβŸ¨ Ξ΅ = mvarα΅’ ↓ Ξ΅

  π”ŸβŸ¨_ : Sub (Tm (⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐)) Ξ  Ξ“
      β†’ Tm (⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”ŸβŸ¨ Ξ΅ = mvarα΅’ (↑ ↓) Ξ΅

  π” βŸ¨_ : Sub (Tm (⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐))  Ξ  Ξ“
      β†’ Tm (⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π” βŸ¨ Ξ΅ = mvarα΅’ (↑ ↑ ↓) Ξ΅

  π”‘βŸ¨_ : Sub (Tm (⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐)) Ξ  Ξ“
      β†’ Tm (⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”‘βŸ¨ Ξ΅ = mvarα΅’ (↑ ↑ ↑ ↓) Ξ΅
  π”’βŸ¨_ : Sub (Tm (⁅ Ξ β‚„ βŠ©β‚™ Ξ±β‚„ ⁆ ⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐)) Ξ  Ξ“
      β†’ Tm (⁅ Ξ β‚„ βŠ©β‚™ Ξ±β‚„ ⁆ ⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ  βŠ©β‚™ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”’βŸ¨ Ξ΅ = mvarα΅’ (↑ ↑ ↑ ↑ ↓) Ξ΅

  -- Shorthands for metavariables with an empty metavariable environment
  π”ž : Tm (⁅ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”ž = π”žβŸ¨ β€’
  π”Ÿ : Tm (⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ± ⁆ 𝔐) Ξ± Ξ“
  π”Ÿ = π”ŸβŸ¨ β€’
  𝔠 : Tm (⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ± ⁆ 𝔐) Ξ± Ξ“
  𝔠 = π” βŸ¨ β€’
  𝔑 : Tm (⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ± ⁆ 𝔐) Ξ± Ξ“
  𝔑 = π”‘βŸ¨ β€’
  𝔒 : Tm (⁅ Ξ β‚„ βŠ©β‚™ Ξ±β‚„ ⁆ ⁅ Π₃ βŠ©β‚™ α₃ ⁆ ⁅ Ξ β‚‚ βŠ©β‚™ Ξ±β‚‚ ⁆ ⁅ Π₁ βŠ©β‚™ α₁ ⁆ ⁅ Ξ± ⁆ 𝔐) Ξ± Ξ“
  𝔒 = π”’βŸ¨ β€’
  
  -- Synonyms for holes
  β—Œα΅ƒ = π”ž ; β—Œα΅‡ = π”Ÿ ; β—ŒαΆœ = 𝔠 ; β—Œα΅ˆ = 𝔑 ; β—Œα΅‰ = 𝔒
  β—Œα΅ƒβŸ¨_ = π”žβŸ¨_ ; β—Œα΅‡βŸ¨_ = π”ŸβŸ¨_ ; β—ŒαΆœβŸ¨_ = π” βŸ¨_ ; β—Œα΅ˆβŸ¨_ = π”‘βŸ¨_ ; β—Œα΅‰βŸ¨_ = π”’βŸ¨_