------------------------------------------------------------------------
-- The term formers ω and Ω
------------------------------------------------------------------------

-- Typing rules for the term formers defined in this module can be
-- found in Definition.Typed.Properties.Admissible.Omega, and usage
-- rules can be found in Graded.Derived.Omega.

module Definition.Untyped.Omega {a} (M : Set a) where

open import Definition.Untyped M
open import Definition.Untyped.Properties M

open import Tools.Fin
open import Tools.Nat
open import Tools.PropositionalEquality
open import Tools.Reasoning.PropositionalEquality

private variable
  n : Nat
  σ : Subst _ _
  ρ : Wk _ _
  p : M

------------------------------------------------------------------------
-- Term formers

opaque

  -- The term former ω.

  ω : M  Term n
  ω p = lam p (var x0 ∘⟨ p  var x0)

opaque

  -- The term former Ω.

  Ω : M  Term n
  Ω p = ω p ∘⟨ p  ω p

------------------------------------------------------------------------
-- Substitution lemmas

opaque
  unfolding ω

  -- A substitution lemma for ω.

  ω-[] : ω p [ σ ]  ω p
  ω-[] = refl

opaque
  unfolding Ω

  -- A substitution lemma for Ω.

  Ω-[] : Ω p [ σ ]  Ω p
  Ω-[] {p} {σ} =
    (ω p [ σ ]) ∘⟨ p  (ω p [ σ ])  ≡⟨ cong₂ _∘⟨ _ ⟩_ ω-[] ω-[] 
    ω p ∘⟨ p  ω p                  

------------------------------------------------------------------------
-- Weakening lemmas

opaque

  -- A weakening lemma for ω.

  wk-ω : wk ρ (ω p)  ω p
  wk-ω {ρ} {p} =
    wk ρ (ω p)         ≡⟨ wk≡subst _ _ 
    ω p [ toSubst ρ ]  ≡⟨ ω-[] 
    ω p                

opaque

  -- A weakening lemma for Ω.

  wk-Ω : wk ρ (Ω p)  Ω p
  wk-Ω {ρ} {p} =
    wk ρ (Ω p)         ≡⟨ wk≡subst _ _ 
    Ω p [ toSubst ρ ]  ≡⟨ Ω-[] 
    Ω p