{-# OPTIONS --safe --sized-types #-} module Generic.Identity where open import Size open import Agda.Builtin.List open import Data.Product hiding (zip) open import Data.Sum open import Data.Var open import Data.Relation as R open import Data.Var.Varlike open import Data.Environment open import Generic.Syntax open import Generic.Semantics open import Generic.Semantics.Syntactic open import Generic.Relator open import Generic.Simulation open import Generic.Simulation.Syntactic open import Function open import Relation.Binary.PropositionalEquality as PEq open import Relation.Binary.PropositionalEquality.WithK open ≡-Reasoning private variable I : Set d : Desc I σ : I Γ : List I i j : Size data _≅_ {d : Desc I} {σ} {Γ} : {s : Size} → Tm d s σ Γ → {t : Size} → Tm d t σ Γ → Set ⟨_⟩_≅_ : {d : Desc I} (e : Desc I) → ⟦ e ⟧ (Scope (Tm d i)) σ Γ → ⟦ e ⟧ (Scope (Tm d j)) σ Γ → Set data _≅_ {d = d} {σ} {Γ} where `var : {k l : Var σ Γ} → k ≡ l → `var {s = i} k ≅ `var {s = j} l `con : {b : ⟦ d ⟧ (Scope (Tm d i)) σ Γ} {c : ⟦ d ⟧ (Scope (Tm d j)) σ Γ} → ⟨ d ⟩ b ≅ c → `con {s = i} b ≅ `con {s = j} c ⟨ e ⟩ b ≅ c = ⟦ e ⟧ᴿ (λ _ _ t u → t ≅ u) b c ≅⇒≡ : ∀ {t u : Tm d ∞ σ Γ} → t ≅ u → t ≡ u ⟨_⟩≅⇒≡ : ∀ e {t u : ⟦ e ⟧ (Scope (Tm d ∞)) σ Γ} → ⟨ e ⟩ t ≅ u → t ≡ u ≅⇒≡ (`var eq) = cong `var eq ≅⇒≡ (`con eq) = cong `con (⟨ _ ⟩≅⇒≡ eq) ⟨ `σ A d ⟩≅⇒≡ (refl , eq) = cong -,_ (⟨ d _ ⟩≅⇒≡ eq) ⟨ `X Δ j d ⟩≅⇒≡ (≅-pr , eq) = cong₂ _,_ (≅⇒≡ ≅-pr) (⟨ d ⟩≅⇒≡ eq) ⟨ `∎ i ⟩≅⇒≡ eq = ≡-irrelevant _ _ module RenId {I : Set} {d : Desc I} where ren-id : ∀ (t : Tm d i σ Γ) {ρ} → R.All Eqᴿ Γ ρ (base vl^Var) → ren ρ t ≅ t ren-body-id : ∀ Δ σ (t : Scope (Tm d i) Δ σ Γ) {ρ} → R.All Eqᴿ Γ ρ (base vl^Var) → reify vl^Var Δ σ (Semantics.body Ren ρ Δ σ t) ≅ t ren-id (`var k) ρᴿ = `var (trans (lookupᴿ ρᴿ k) (lookup-base^Var k)) ren-id (`con t) ρᴿ = `con (subst₂ (⟨ d ⟩_≅_) (sym $ fmap² d (Semantics.body Ren _) (reify vl^Var) _) (fmap-id d _) $ liftᴿ d (λ Δ i t → ren-body-id Δ i t ρᴿ) _) ren-body-id [] σ t = ren-id t ren-body-id {Γ = Γ} Δ@(_ ∷ _) σ t {ρ} ρᴿ = ren-id t eqᴿ where eqᴿ : R.All Eqᴿ _ (lift vl^Var Δ ρ) (base vl^Var) lookupᴿ eqᴿ k with split Δ k | inspect (split Δ) k ... | inj₁ k₁ | PEq.[ eq ] = begin injectˡ Γ (lookup (base vl^Var) k₁) ≡⟨ cong (injectˡ Γ) (lookup-base^Var k₁) ⟩ injectˡ Γ k₁ ≡⟨ sym (lookup-base^Var k) ⟩ lookup (base vl^Var) k ∎ ... | inj₂ k₂ | PEq.[ eq ] = begin injectʳ Δ (lookup (base vl^Var) (lookup ρ k₂)) ≡⟨ cong (injectʳ Δ) (lookup-base^Var _) ⟩ injectʳ Δ (lookup ρ k₂) ≡⟨ cong (injectʳ Δ) (lookupᴿ ρᴿ k₂) ⟩ injectʳ Δ (lookup (base vl^Var) k₂) ≡⟨ cong (injectʳ Δ) (lookup-base^Var k₂) ⟩ k ≡⟨ sym (lookup-base^Var k) ⟩ lookup (base vl^Var) k ∎ module _ {I : Set} {d : Desc I} where ren-id : ∀ {σ Γ} (t : Tm d ∞ σ Γ) → ren (base vl^Var) t ≡ t ren-id t = ≅⇒≡ (RenId.ren-id t (packᴿ λ _ → refl)) ren-id′ : ∀ {σ Γ} (t : Tm d ∞ σ Γ) → ren (pack id) t ≡ t ren-id′ t = ≅⇒≡ (RenId.ren-id t (packᴿ λ v → sym (lookup-base^Var v))) sub-id : ∀ {σ Γ} (t : Tm d ∞ σ Γ) → sub (base vl^Tm) t ≡ t sub-id t = begin sub (base vl^Tm) t ≡⟨ sym $ Simulation.sim RenSub base^VarTmᴿ t ⟩ ren (base vl^Var) t ≡⟨ ren-id t ⟩ t ∎ sub-id′ : ∀ {σ Γ} (t : Tm d ∞ σ Γ) → sub (pack `var) t ≡ t sub-id′ t = begin sub (pack `var) t ≡⟨ sym $ Simulation.sim RenSub (packᴿ λ v → refl) t ⟩ ren (pack id) t ≡⟨ ren-id′ t ⟩ t ∎ lift[]^Tm : ∀ {Γ Δ} (ρ : (Γ ─Env) (Tm d ∞) Δ) → R.All Eqᴿ Γ ρ (lift vl^Tm [] ρ) lookupᴿ (lift[]^Tm ρ) k = sym (ren-id (lookup ρ k)) th^base₁^Var : ∀ {Γ Δ} (ρ : Thinning {I} Γ Δ) → R.All Eqᴿ Γ (th^Env th^Var (base vl^Var) ρ) ρ lookupᴿ (th^base₁^Var ρ) k = cong (lookup ρ) (lookup-base^Var k) th^base₂^Var : ∀ {Γ Δ} (ρ : Thinning {I} Γ Δ) → R.All Eqᴿ Γ (th^Env th^Var ρ (base vl^Var)) ρ lookupᴿ (th^base₂^Var ρ) k = `var-inj (ren-id (`var (lookup ρ k))) th^base^Tm : ∀ {Γ Δ} (ρ : (Γ ─Env) (Tm d ∞) Δ) → R.All Eqᴿ Γ (th^Env th^Tm ρ (base vl^Var)) ρ lookupᴿ (th^base^Tm ρ) k = ren-id (lookup ρ k) th^base^s∙z : ∀ {σ Γ} → R.All Eqᴿ _ (th^Env th^Tm (base vl^Tm) (pack s) ∙ `var z) ((σ ∷ Γ ─Env) (Tm d ∞) (σ ∷ Γ) ∋ pack `var) lookupᴿ th^base^s∙z z = refl lookupᴿ th^base^s∙z (s k) = cong (ren (pack s)) (lookup-base^Tm k)