{-# OPTIONS --safe --sized-types #-} module Generic.Simulation.Syntactic where open import Size open import Data.List hiding (lookup) open import Function open import Relation.Binary.PropositionalEquality open import Data.Var.Varlike open import Data.Environment open import Data.Relation as Relation open import Generic.Syntax open import Generic.Semantics open import Generic.Semantics.Syntactic open import Generic.Relator as Relator open import Generic.Simulation as Simulation open Simulation.Simulation module _ {I : Set} {d : Desc I} where RenExt : Simulation d Ren Ren Eqᴿ Eqᴿ RenExt .thᴿ = λ ρ → cong (lookup ρ) RenExt .varᴿ = cong `var RenExt .algᴿ = λ _ _ → cong `con ∘ Relator.reifyᴿ Eqᴿ d (Simulation.reifyᴿ Eqᴿ Eqᴿ (vl^Refl vl^Var)) SubExt : Simulation d Sub Sub Eqᴿ Eqᴿ SubExt .thᴿ = λ ρ → cong (ren ρ) SubExt .varᴿ = id SubExt .algᴿ = λ _ _ → cong `con ∘ Relator.reifyᴿ Eqᴿ d (Simulation.reifyᴿ Eqᴿ Eqᴿ (vl^Refl vl^Tm)) RenSub : Simulation d Ren Sub VarTmᴿ Eqᴿ RenSub .varᴿ = id RenSub .thᴿ = λ ρ → cong (λ t → th^Tm t ρ) RenSub .algᴿ = λ _ _ → cong `con ∘ Relator.reifyᴿ VarTmᴿ d (Simulation.reifyᴿ VarTmᴿ Eqᴿ vl^VarTm) private variable Γ Δ : List I σ : I rensub : (ρ : Thinning Γ Δ) (t : Tm d ∞ σ Γ) → ren ρ t ≡ sub (`var <$> ρ) t rensub ρ = Simulation.sim RenSub (packᴿ λ _ → refl)