{-# OPTIONS --safe --without-K #-}
module IK.Term.Base where

--
-- Implementation of the IK (Intuitionistic K) calculus from
-- "Fitch-Style Modal Lambda Calculi" by Ranald Clouston (2018)
--

open import Data.Product using (Σ ;  ; _×_ ; _,_ ; proj₁ ; proj₂)

open import Type as Type using (Ty ; Ty-Decidable)

open import Context Ty Ty-Decidable as Context

open Context public
open Type    public

-------------------------------------
-- Variables, terms and substitutions
-------------------------------------

data Tm : Ctx  Ty  Set where

  var  : (v : Var Γ a)
       ---------------
        Tm Γ a

  lam  : (t : Tm (Γ `, a) b)
         -------------------
        Tm Γ (a  b)

  app  : (t : Tm Γ (a  b))
        (u : Tm Γ a)
         ------------------
        Tm Γ b

  box   : (t : Tm (Γ #) a)
        ------------------
         Tm Γ ( a)

  unbox : (t : Tm ΓL ( a))
         (e : LFExt Γ (ΓL #) ΓR)
        -------------------------
         Tm Γ a

variable
  t t' t'' t''' : Tm Γ a
  u u' u'' u''' : Tm Γ a

wkTm : Γ  Γ'  Tm Γ a  Tm Γ' a
wkTm w (var x)                = var (wkVar w x)
wkTm w (lam t)                = lam (wkTm (keep w) t)
wkTm w (app t u)              = app (wkTm w t) (wkTm w u)
wkTm w (box t)                = box (wkTm (keep# w) t)
wkTm w (unbox t e)            = unbox (wkTm (sliceLeft e w) t) (wkLFExt e w)

leftWkTm : (t : Tm Γ a)  Tm (Δ ,, Γ) a
leftWkTm (var v)     = var (leftWkVar v)
leftWkTm (lam t)     = lam (leftWkTm t)
leftWkTm (app t u)   = app (leftWkTm t) (leftWkTm u)
leftWkTm (box t)     = box (leftWkTm t)
leftWkTm (unbox t e) = unbox (leftWkTm t) (leftWkLFExt e)

-- extension that "generates a new context frame"
pattern new      = nil
pattern new[_] Γ = nil {Γ}

open Substitution Tm var wkTm  Γ ΓL ΓR  LFExt Γ (ΓL #) ΓR) new  {} {} {_ΓR} {Δ'} _e _w  ←# Δ') sliceLeft  {} {} {_ΓR} {Δ'} _e _w  #→ Δ') wkLFExt public
  renaming (module Composition to SubstitutionComposition)

-- "Left" context of factoring with a substitution (see factorSubₛ and factorExtₛ)
lCtxₛ : (e : LFExt Γ (ΓL #) ΓR) (s : Sub Δ Γ)  Ctx
lCtxₛ nil     (lock {ΔL = ΔL} s e) = ΔL
lCtxₛ (ext e) (s `, t)             = lCtxₛ e s

factorSubₛ :  (e : LFExt Γ (ΓL #) ΓR) (s : Sub Δ Γ)  Sub (lCtxₛ e s) ΓL
factorSubₛ nil     (lock s e) = s
factorSubₛ (ext e) (s `, t)   = factorSubₛ e s

-- "Right" context of factoring with a substitution (see factorExtₛ)
rCtxₛ : (e : LFExt Γ (ΓL #) ΓR) (s : Sub Δ Γ)  Ctx
rCtxₛ nil     (lock {ΔR = ΔR} s e) = ΔR
rCtxₛ (ext e) (s `, t)             = rCtxₛ e s

factorExtₛ :  (e : LFExt Γ (ΓL #) ΓR) (s : Sub Δ Γ)  LFExt Δ (lCtxₛ e s #) (rCtxₛ e s)
factorExtₛ nil     (lock s e) = e
factorExtₛ (ext e) (s `, _)   = factorExtₛ e s

-- apply substitution to a term
substTm : Sub Δ Γ  Tm Γ a  Tm Δ a
substTm s (var x)     = substVar s x
substTm s (lam t)     = lam (substTm (keepₛ s) t)
substTm s (app t u)   = app (substTm s t) (substTm s u)
substTm s (box t)     = box (substTm (keep#ₛ s) t)
substTm s (unbox t e) = unbox (substTm (factorSubₛ e s) t) (factorExtₛ e s)

open SubstitutionComposition substTm lCtxₛ factorSubₛ rCtxₛ factorExtₛ public

Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.