import Graded.Modality
open import Graded.Usage.Restrictions
module Graded.Substitution
{a} {M : Set a}
(open Graded.Modality M)
(š : Modality)
(R : Usage-restrictions M)
where
open Modality š
open import Definition.Untyped M
using (Subst ; tail ; head ; Wk ; id ; step ; lift)
open import Graded.Context š
open import Graded.Usage š R
open import Graded.Usage.Weakening š R
open import Graded.Mode š
open import Tools.Fin
open import Tools.Nat using (Nat; 1+)
infixl 50 _<*_
infixr 50 _*>_
infix 20 ā„_ā„
infixl 30 _ā_
private
variable
k m n : Nat
data Substā : (m n : Nat) ā Set a where
[] : Substā m 0
_ā_ : Substā m n ā Conā m ā Substā m (1+ n)
private
variable
ĪØ Φ : Substā m n
εā : Substā 0 n
εā {n = 0} = []
εā {n = 1+ n} = εā ā ε
_*>_ : (ĪØ : Substā m n) ā (γ : Conā m) ā Conā n
[] *> γ = ε
(ĪØ ā Ī“) *> γ = ĪØ *> γ ā γ * Ī“
_<*_ : (γ : Conā n) ā (ĪØ : Substā m n) ā Conā m
ε <* [] = šį¶
(γ ā p) <* (ĪØ ā Ī“) = p Ā·į¶ Ī“ +į¶ (γ <* ĪØ)
substā : (ĪØ : Substā m n) ā (γ : Conā n) ā Conā m
substā ĪØ γ = γ <* ĪØ
_<*>_ : (ĪØ : Substā m k) (Φ : Substā k n) ā Substā m n
ĪØ <*> [] = []
ĪØ <*> (Φ ā Ī“) = (ĪØ <*> Φ) ā (Ī“ <* ĪØ)
_ā¶[_]_ : Substā m n ā Mode-vector n ā Subst m n ā Set a
_ā¶[_]_ {n = n} ĪØ γ Ļ =
(x : Fin n) ā ((šį¶ , x ā ā γ x ā) <* ĪØ) āø[ γ x ] Ļ x
ā„_ā„ :
⦠has-star : Has-star semiring-with-meet ⦠ā
Subst m n ā Mode-vector n ā Substā m n
ā„_ā„ {n = 0} _ _ = []
ā„_ā„ {n = 1+ n} Ļ ms = ā„ tail Ļ ā„ (tailįµ ms) ā ā head Ļ ā (headįµ ms)
wk1Substā : Substā m n ā Substā (1+ m) n
wk1Substā [] = []
wk1Substā (ĪØ ā Ī“) = (wk1Substā ĪØ) ā wkConā (step id) Ī“
liftSubstā : Substā m n ā Substā (1+ m) (1+ n)
liftSubstā ĪØ = (wk1Substā ĪØ) ā (šį¶ ā š)
idSubstā : Substā n n
idSubstā {n = 0} = []
idSubstā {n = 1+ n} = liftSubstā idSubstā
wkSubstā : (Ļ : Wk m n) ā Substā m n
wkSubstā id = idSubstā
wkSubstā (step Ļ) = wk1Substā (wkSubstā Ļ)
wkSubstā (lift Ļ) = liftSubstā (wkSubstā Ļ)
consSubstā : (ĪØ : Substā m n) ā (γ : Conā m) ā Substā m (1+ n)
consSubstā = _ā_
sgSubstā : (γ : Conā n) ā Substā n (1+ n)
sgSubstā = consSubstā idSubstā