--------------------------------------------------------------------------------------------------------------- module A201901.Chapter6 where open import Data.Fin using (Fin ; suc ; zero) open import A201901.Prelude public import A201901.Chapter3 import A201901.Chapter5 open A201901.Chapter5 using () renaming (module Functions to Named) open Named using (fv) --------------------------------------------------------------------------------------------------------------- -- -- 6. Nameless representations of terms --------------------------------------------------------------------------------------------------------------- -- -- 6.1. Terms and contexts -- -- -- 6.1.1. Exercise [⋆] -- “For each of the following combinators … write down the corresponding nameless terms.” -- (skipped) --------------------------------------------------------------------------------------------------------------- -- -- 6.1.2. Definition [Terms] -- “Let `T` be the smallest family of sets `{T₀, T₁, T₂, …}` such that …” module Nameless where infixl 7 _$_ data Term : Nat → Set₀ where ν : ∀ {n} → (k : Fin n) → Term n ƛ_ : ∀ {n} → (t : Term (suc n)) → Term n _$_ : ∀ {n} → (t₁ t₂ : Term n) → Term n --------------------------------------------------------------------------------------------------------------- -- -- 6.1.3. Definition -- “Suppose `x₀` through `xₙ` are variable names from `V`. The naming context `Γ = xₙ, xₙ₋₁, …, x₁, x₀` -- assigns to each `xᵢ` the de Bruijn index `i`. … We write `dom(Γ)` for the set `{xₙ, …, x₀}` of variable -- names mentioned in `Γ`.” dom : UniqueList Name → UniqueList Name dom Γ = Γ --------------------------------------------------------------------------------------------------------------- -- -- 6.1.4. Exercise [⋆⋆⋆ ↛] -- “Give an alternative construction of the sets of `n`-terms in the style of Definition 3.2.3, and show (as we -- did in Proposition 3.2.6) that it is equivalent to the one above.” -- (skipped) --------------------------------------------------------------------------------------------------------------- -- -- 6.1.5. Exercise [Recommended, ⋆⋆⋆] -- “1. Define a function `removeNames(Γ, t)` that takes a naming context `Γ` and an ordinary term `t` (with -- `fv(t) ⊆ dom(Γ)`) and yields the corresponding nameless term. -- 2. Define a function `restoreNames(Γ, t)` that takes a nameless term `t` and a naming context `Γ` and -- produces an ordinary term. …” module Exercise615 where open Nameless open Named -- TODO: unfinished -- find : ∀ {a} {A : Set a} → UniqueList A → A → ... -- removeNames : ∀ (Γ : UniqueList Name) (t : Named.Term) → T (fv t ⊆ dom Γ) → Nameless.Term (length (fv t)) -- removeNames Γ (ν x) p = {!!} -- removeNames Γ (ƛ x ∙ t) p = {!!} -- removeNames Γ (t₁ $ t₂) p = {!!}