------------------------------------------------------------------------
-- INCREMENTAL λ-CALCULUS
--
-- Change contexts
--
-- This module specifies how a context of values is merged
-- together with the corresponding context of changes.
--
-- In the PLDI paper, instead of merging the contexts together, we just
-- concatenate them. For example, in the "typing rule" for Derive
-- in Sec. 3.2 of the paper, we write in the conclusion of the rule:
-- "Γ, ΔΓ ⊢ Derive(t) : Δτ". Simple concatenation is possible because
-- the paper uses named variables and assumes that no user variables
-- start with "d". In this formalization, we use de Bruijn indices, so
-- it is easier to alternate values and their changes in the context.
------------------------------------------------------------------------

module Base.Change.Context
    {Type : Set}
    (ΔType : Type  Type) where

open import Base.Syntax.Context Type

-- Transform a context of values into a context of values and
-- changes.
ΔContext : Context  Context
ΔContext  = 
ΔContext (τ  Γ) = ΔType τ  τ  ΔContext Γ

-- like ΔContext, but ΔType τ and τ are swapped
ΔContext′ : Context  Context
ΔContext′  = 
ΔContext′ (τ  Γ) = τ  ΔType τ  ΔContext′ Γ

-- This sub-context relationship explains how to go back from
-- ΔContext Γ to Γ: You have to drop every other binding.
Γ≼ΔΓ :  {Γ}  Γ  ΔContext Γ
Γ≼ΔΓ {} = 
Γ≼ΔΓ {τ  Γ} = drop ΔType τ  keep τ  Γ≼ΔΓ