From 7fb8f4a222c9047e5db85f98be4a72f9f2a7f444 Mon Sep 17 00:00:00 2001 From: Chloe Brown Date: Wed, 13 Jul 2022 17:14:25 +0100 Subject: Prove renaming is left congruent. --- src/Data/Type/Properties.agda | 221 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) (limited to 'src') diff --git a/src/Data/Type/Properties.agda b/src/Data/Type/Properties.agda index 0ef018f..8e862ed 100644 --- a/src/Data/Type/Properties.agda +++ b/src/Data/Type/Properties.agda @@ -278,3 +278,224 @@ open IsEquivalence ≈-isEquivalence public ≈-setoid = record { isEquivalence = ≈-isEquivalence } module ≈-Reasoning = Reasoning ≈-setoid + +-- More Properties of rename--------------------------------------------------- + +private + module Rename where + data Case (A : Type) : Set where + do-∘ : (ρs ρs₁ : List Renaming) → Case A + do-congˡ : + ∀ {ρs ρs₁} → + ([ρs]≗[ρs₁] : + ∀ {α} → α ∈ free A → applyRenaming ρs α ≡ applyRenaming ρs₁ α) → + Case A + + Result : Case A → Set + Result {A} (do-∘ ρs ρs₁) = + rename ρs₁ (rename ρs A) ≈ rename (ρs ++ ρs₁) A + Result {A} (do-congˡ {ρs} {ρs₁} [ρs]≗[ρs₁]) = rename ρs A ≈ rename ρs₁ A + + IH : Type → Set + IH A = (case : Case A) → Result case + + lemma₁ : ∀ A ρs → + let α = mkFresh (free A ++ map Subst.from ρs ++ map Subst.to ρs) in + α ≡ applyRenaming ρs α + lemma₁ A ρs = + fromInj₁ + (⊥-elim ∘ + isFresh .distinct (free A ++ map Subst.from ρs ++ map Subst.to ρs) ∘ + ∈-++⁺ʳ (free A) ∘ + ∈-++⁺ˡ) + (applyRenaming⁻¹ ρs refl) + + lemma₂ : ∀ A ρs {α} → + let β = mkFresh (free A ++ map Subst.from ρs ++ map Subst.to ρs) in + α ∈ free A → β ≢ applyRenaming ρs α + lemma₂ A ρs α∈A β≡[ρs]α = + [ β∉αs ∘ ∈-++⁺ˡ ∘ flip (P.subst (_∈ _)) α∈A + , β∉αs ∘ + ∈-++⁺ʳ (free A) ∘ + ∈-++⁺ʳ (map Subst.from ρs) ∘ + P.subst (_∈ _) (sym β≡[ρs]α) ∘ + applyRenaming-lookup ρs + ] (applyRenaming⁻¹ ρs (sym β≡[ρs]α)) + where + αs = free A ++ map Subst.from ρs ++ map Subst.to ρs + β∉αs = isFresh .distinct αs + + rename-helper : + ∀ A → WfRec (_<_ on size) IH A → IH A + rename-helper (var α) hyp (do-∘ ρs ρs₁) = + ≈-reflexive (cong var (applyRenaming-++ ρs ρs₁ α)) + rename-helper (var α) hyp (do-congˡ [ρs]≗[ρs₁]) = + ≈-reflexive (cong var ([ρs]≗[ρs₁] (here refl))) + rename-helper unit hyp (do-∘ ρs ρs₁) = unit + rename-helper unit hyp (do-congˡ [ρs]≗[ρs₁]) = unit + rename-helper (bin ⊗ A B) hyp (do-∘ ρs ρs₁) = + bin (hyp A (m≤m+n _ _) (do-∘ ρs ρs₁)) + (hyp B (m