------------------------------------------------------------------------
-- Some definitions related to Π-types
------------------------------------------------------------------------

-- Typing rules for the terms given in this module can be found in
-- Definition.Typed.Properties.Admissible.Pi.

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

open import Definition.Untyped M

open import Tools.Fin
open import Tools.Nat

private variable
  n : Nat

opaque

  -- Iterated Π-types.

  Πs : M  M  Con Term n  Term n  Term 0
  Πs p q ε       B = B
  Πs p q (Γ  A) B = Πs p q Γ (Π p , q  A  B)

opaque

  -- Iterated lambdas.

  lams : M  Con Term n  Term n  Term 0
  lams p ε       t = t
  lams p (Γ  _) t = lams p Γ (lam p t)

opaque

  -- Iterated applications.

  apps : M  Con Term n  Term 0  Term n
  apps p ε       t = t
  apps p (Γ  _) t = wk1 (apps p Γ t) ∘⟨ p  var x0