{-# OPTIONS --safe --without-K #-}
module IS4.Term.Base where
--
-- Implementation of the IS4 (Intuitionistic S4) calculus from
-- "Fitch-Style Modal Lambda Calculi" by Ranald Clouston (2018)
--
open import Data.Product using (∃ ; _×_ ; _,_ ; -,_ ; proj₁ ; proj₂)
open import Relation.Binary.PropositionalEquality using (sym ; subst)
open import Type as Type using (Ty ; Ty-Decidable)
import Context Ty Ty-Decidable as Context
open Context public hiding (ext#)
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 : CExt Γ ΓL ΓR)
--------------------
→ Tm Γ a
variable
t t' t'' t''' : Tm Γ a
u u' u'' u''' : Tm Γ a
pattern var0 = var v0
pattern var1 = var v1
pattern var2 = var v2
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 (factorWk e w) t) (factorExt e w)
-- extension that "generates a new context frame"
new : CExt (Γ #) Γ ([] #) -- Γ R Γ #
new = ext#- nil
new[_] = λ Γ → new {Γ}
open Substitution Tm var wkTm CExt new lCtx factorWk rCtx factorExt public
renaming (module Composition to SubstitutionComposition)
-- "Left" context of factoring with a substitution (see factorSubₛ and factorExtₛ)
lCtxₛ : (e : CExt Γ ΓL ΓR) (s : Sub Δ Γ) → Ctx
lCtxₛ {Δ = Δ} nil s = Δ
lCtxₛ (ext e) (s `, t) = lCtxₛ e s
lCtxₛ (ext#- e) (lock s e') = lCtxₛ e s
factorSubₛ : (e : CExt Γ ΓL ΓR) (s : Sub Δ Γ) → Sub (lCtxₛ e s) ΓL
factorSubₛ nil s = s
factorSubₛ (ext e) (s `, t) = factorSubₛ e s
factorSubₛ (ext#- e) (lock s e') = factorSubₛ e s
-- "Right" context of factoring with a substitution (see factorExtₛ)
rCtxₛ : (e : CExt Γ ΓL ΓR) (s : Sub Δ Γ) → Ctx
rCtxₛ nil s = []
rCtxₛ (ext e) (s `, t) = rCtxₛ e s
rCtxₛ (ext#- e) (lock {ΔR = ΔR} s e') = rCtxₛ e s ,, ΔR
factorExtₛ : (e : CExt Γ ΓL ΓR) (s : Sub Δ Γ) → CExt Δ (lCtxₛ e s) (rCtxₛ e s)
factorExtₛ nil s = nil
factorExtₛ (ext e) (s `, _) = factorExtₛ e s
factorExtₛ (ext#- e) (lock s e') = extRAssoc (factorExtₛ e s) e'
-- 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.