Reversal of formal series
Contents
{-# OPTIONS --guardedness --sized-types #-} open import Preliminaries.Base hiding (_++_) open import General.ProductRules module Special.Reversal (R : CommutativeRing) (Σ : Set) (P : ProductRule R) where open import Size open import Preliminaries.Lists open import Preliminaries.Algebra R open import General.Series R Σ open import General.Terms R renaming (_+_ to _[+]_; _*_ to _[*]_; _·_ to _[·]_) hiding (x; y; z; t) open import General.Products R Σ open import General.Automata R Σ P open import General.Reversal R Σ open import General.ReversalEnd R Σ P open Product P -- open Reversal P open import Special.Polynomials R as P renaming (_≈_ to _P≈_) open import Special.ProductRules R private variable i : Size n : ℕ
ΔʳΔˡ : Set ΔʳΔˡ = ∀ a b α → Δʳ b ↑ (Δˡ a ↑ α) P≈ Δˡ a ↑ (Δʳ b ↑ α)
module Assumptions (a b : Σ) where data aXb : Set where y : aXb ay : aXb yb : aXb ayb : aXb z : aXb az : aXb zb : aXb azb : aXb data aX : Set where y : aX ay : aX z : aX az : aX data Xb : Set where y : Xb yb : Xb z : Xb zb : Xb data εXε : Set where y : εXε z : εXε ε→a : Term εXε → Term aX ε→a 0T = 0T ε→a (var y) = var y ε→a (var z) = var z ε→a (c [·] u) = c [·] ε→a u ε→a (u [+] v) = ε→a u [+] ε→a v ε→a (u [*] v) = ε→a u [*] ε→a v ε→b : Term εXε → Term Xb ε→b 0T = 0T ε→b (var y) = var y ε→b (var z) = var z ε→b (c [·] u) = c [·] ε→b u ε→b (u [+] v) = ε→b u [+] ε→b v ε→b (u [*] v) = ε→b u [*] ε→b v a→ab : Term aX → Term aXb a→ab 0T = 0T a→ab (var y) = var y a→ab (var ay) = var ay a→ab (var z) = var z a→ab (var az) = var az a→ab (c [·] u) = c [·] a→ab u a→ab (u [+] v) = a→ab u [+] a→ab v a→ab (u [*] v) = a→ab u [*] a→ab v b→ab : Term Xb → Term aXb b→ab 0T = 0T b→ab (var y) = var y b→ab (var yb) = var yb b→ab (var z) = var z b→ab (var zb) = var zb b→ab (c [·] u) = c [·] b→ab u b→ab (u [+] v) = b→ab u [+] b→ab v b→ab (u [*] v) = b→ab u [*] b→ab v Δˡε : Term εXε → Term aX Δˡε 0T = 0T Δˡε (var y) = var ay Δˡε (var z) = var az Δˡε (c [·] γ) = c [·] Δˡε γ Δˡε (γ [+] δ) = Δˡε γ [+] Δˡε δ Δˡε (γ [*] δ) = [ P ]⟨ ε→a γ , Δˡε γ , ε→a δ , Δˡε δ ⟩ Δʳε : Term εXε → Term Xb Δʳε 0T = 0T Δʳε (var y) = var yb Δʳε (var z) = var zb Δʳε (c [·] γ) = c [·] Δʳε γ Δʳε (γ [+] δ) = Δʳε γ [+] Δʳε δ Δʳε (γ [*] δ) = [ P ]⟨ ε→b γ , Δʳε γ , ε→b δ , Δʳε δ ⟩ Δˡb : Term Xb → Term aXb Δˡb 0T = 0T Δˡb (var y) = var ay Δˡb (var yb) = var ayb Δˡb (var z) = var az Δˡb (var zb) = var azb Δˡb (c [·] γ) = c [·] Δˡb γ Δˡb (γ [+] δ) = Δˡb γ [+] Δˡb δ Δˡb (γ [*] δ) = [ P ]⟨ b→ab γ , Δˡb γ , b→ab δ , Δˡb δ ⟩ Δʳa : Term aX → Term aXb Δʳa 0T = 0T Δʳa (var y) = var yb Δʳa (var ay) = var ayb Δʳa (var z) = var zb Δʳa (var az) = var azb Δʳa (c [·] γ) = c [·] Δʳa γ Δʳa (γ [+] δ) = Δʳa γ [+] Δʳa δ Δʳa (γ [*] δ) = [ P ]⟨ a→ab γ , Δʳa γ , a→ab δ , Δʳa δ ⟩
ΔʳΔˡ-var : Set ΔʳΔˡ-var = ∀ a b → let open Assumptions a b in -------------------------- Δʳa (Δˡε (var y [*] var z)) P≈ Δˡb (Δʳε (var y [*] var z))
module _ (special : Special P) where open import Special.Automata R Σ P special
Proof of ΔʳΔˡ → ⟦ΔʳΔˡ⟧
ΔʳΔˡ→⟦ΔʳΔˡ⟧ : ΔʳΔˡ → ⟦ΔʳΔˡ⟧ ΔʳΔˡ→⟦ΔʳΔˡ⟧ ass a b α = semantic-invariance S (ass a b α)
Proof of ΔʳΔˡ-var → ΔʳΔˡ
ΔʳΔˡ-var→ΔʳΔˡ : ΔʳΔˡ-var → ΔʳΔˡ ΔʳΔˡ-var→ΔʳΔˡ ass-var a b = go where go : ∀ α → Δʳ b ↑ (Δˡ a ↑ α) P≈ Δˡ a ↑ (Δʳ b ↑ α) go 0T = P.≈-refl go (var (_ x[ _ ] _)) = P.≈-refl go (c [·] α) with go α ... | ind = P.·-cong R-refl ind go (α [+] β) with go α | go β ... | ind₀ | ind₁ = ind₀ ⟨ P.+-cong ⟩ ind₁ go (α [*] β) with go α | go β ... | ind₀ | ind₁ = proof where open Assumptions a b -- ε→ab : Term εXε → Term aXb -- ε→ab 0T = 0T -- ε→ab (var y) = var y -- ε→ab (var z) = var z -- ε→ab (c [·] u) = c [·] ε→ab u -- ε→ab (u [+] v) = ε→ab u [+] ε→ab v -- ε→ab (u [*] v) = ε→ab u [*] ε→ab v ρ-ε : Subst εXε *X* ρ-ε y = α ρ-ε z = β ρ-a : Subst aX *X* ρ-a y = α ρ-a ay = Δˡ a ↑ α ρ-a z = β ρ-a az = Δˡ a ↑ β ρ-b : Subst Xb *X* ρ-b y = α ρ-b yb = Δʳ b ↑ α ρ-b z = β ρ-b zb = Δʳ b ↑ β ρ-ab : Subst aXb *X* ρ-ab y = α ρ-ab ay = Δˡ a ↑ α ρ-ab yb = Δʳ b ↑ α ρ-ab ayb = Δʳ b ↑ (Δˡ a ↑ α) ρ-ab z = β ρ-ab az = Δˡ a ↑ β ρ-ab zb = Δʳ b ↑ β ρ-ab azb = Δʳ b ↑ (Δˡ a ↑ β) h-a : (γ : Term εXε) → -------------------------------- subst ρ-ε γ P≈ subst ρ-a (ε→a γ) h-a 0T = P.≈-refl h-a (var y) = P.≈-refl h-a (var z) = P.≈-refl h-a (c [·] γ) = R-refl ⟨ P.·-cong ⟩ h-a γ h-a (γ [+] δ) = h-a γ ⟨ P.+-cong ⟩ h-a δ h-a (γ [*] δ) = h-a γ ⟨ P.*-cong ⟩ h-a δ h-b : (γ : Term εXε) → -------------------------------- subst ρ-ε γ P≈ subst ρ-b (ε→b γ) h-b 0T = P.≈-refl h-b (var y) = P.≈-refl h-b (var z) = P.≈-refl h-b (c [·] γ) = R-refl ⟨ P.·-cong ⟩ h-b γ h-b (γ [+] δ) = h-b γ ⟨ P.+-cong ⟩ h-b δ h-b (γ [*] δ) = h-b γ ⟨ P.*-cong ⟩ h-b δ subst-b→ab : (γ : Term Xb) → -------------------------------- subst ρ-b γ P≈ subst ρ-ab (b→ab γ) subst-b→ab 0T = P.≈-refl subst-b→ab (var y) = P.≈-refl subst-b→ab (var yb) = P.≈-refl subst-b→ab (var z) = P.≈-refl subst-b→ab (var zb) = P.≈-refl subst-b→ab (c [·] γ) = R-refl ⟨ P.·-cong ⟩ subst-b→ab γ subst-b→ab (γ [+] δ) = subst-b→ab γ ⟨ P.+-cong ⟩ subst-b→ab δ subst-b→ab (γ [*] δ) = subst-b→ab γ ⟨ P.*-cong ⟩ subst-b→ab δ subst-a→ab : (γ : Term aX) → -------------------------------- subst ρ-a γ P≈ subst ρ-ab (a→ab γ) subst-a→ab 0T = P.≈-refl subst-a→ab (var y) = P.≈-refl subst-a→ab (var ay) = P.≈-refl subst-a→ab (var z) = P.≈-refl subst-a→ab (var az) = P.≈-refl subst-a→ab (c [·] γ) = R-refl ⟨ P.·-cong ⟩ subst-a→ab γ subst-a→ab (γ [+] δ) = subst-a→ab γ ⟨ P.+-cong ⟩ subst-a→ab δ subst-a→ab (γ [*] δ) = subst-a→ab γ ⟨ P.*-cong ⟩ subst-a→ab δ Δˡε-lem : (γ : Term εXε) → --------------------------------------- Δˡ a ↑ subst ρ-ε γ P≈ subst ρ-a (Δˡε γ) Δˡε-lem 0T = P.≈-refl Δˡε-lem (var y) = P.≈-refl Δˡε-lem (var z) = P.≈-refl Δˡε-lem (c [·] γ) = R-refl ⟨ P.·-cong ⟩ Δˡε-lem γ Δˡε-lem (γ [+] δ) = Δˡε-lem γ ⟨ P.+-cong ⟩ Δˡε-lem δ Δˡε-lem (γ [*] δ) = begin Δˡ a ↑ subst ρ-ε (γ [*] δ) ≈⟨⟩ [ P ]⟨ subst ρ-ε γ , Δˡ a ↑ subst ρ-ε γ , subst ρ-ε δ , Δˡ a ↑ subst ρ-ε δ ⟩ ≈⟨ subst-inv′ᵥ P (h-a γ ∷-≈ Δˡε-lem γ ∷-≈ h-a δ ∷-≈ Δˡε-lem δ ∷-≈ []-≈) ⟩ [ P ]⟨ subst ρ-a (ε→a γ) , subst ρ-a (Δˡε γ) , subst ρ-a (ε→a δ) , subst ρ-a (Δˡε δ) ⟩ ≡⟨ subst-substᵥ P (_ ∷ _ ∷ _ ∷ _ ∷ []) ρ-a ⟨ subst ρ-a [ P ]⟨ ε→a γ , Δˡε γ , ε→a δ , Δˡε δ ⟩ ∎ where open EqP Δʳε-lem : ∀ (γ : Term εXε) → --------------------------------- Δʳ b ↑ (subst ρ-ε γ) P≈ subst ρ-b (Δʳε γ) Δʳε-lem 0T = P.≈-refl Δʳε-lem (var y) = P.≈-refl Δʳε-lem (var z) = P.≈-refl Δʳε-lem (c [·] γ) = R-refl ⟨ P.·-cong ⟩ Δʳε-lem γ Δʳε-lem (γ [+] δ) = Δʳε-lem γ ⟨ P.+-cong ⟩ Δʳε-lem δ Δʳε-lem (γ [*] δ) = begin Δʳ b ↑ subst ρ-ε (γ [*] δ) ≈⟨⟩ [ P ]⟨ subst ρ-ε γ , Δʳ b ↑ subst ρ-ε γ , subst ρ-ε δ , Δʳ b ↑ subst ρ-ε δ ⟩ ≈⟨ subst-inv′ᵥ P (h-b γ ∷-≈ Δʳε-lem γ ∷-≈ h-b δ ∷-≈ Δʳε-lem δ ∷-≈ []-≈) ⟩ [ P ]⟨ subst ρ-b (ε→b γ) , subst ρ-b (Δʳε γ) , subst ρ-b (ε→b δ) , subst ρ-b (Δʳε δ) ⟩ ≡⟨ subst-substᵥ P (_ ∷ _ ∷ _ ∷ _ ∷ []) ρ-b ⟨ subst ρ-b (Δʳε (γ [*] δ)) ∎ where open EqP Δˡb-lem : ∀ (γ : Term Xb) → --------------------------------- Δˡ a ↑ (subst ρ-b γ) P≈ subst ρ-ab (Δˡb γ) Δˡb-lem 0T = P.≈-refl Δˡb-lem (var y) = P.≈-refl Δˡb-lem (var yb) = P.≈-sym ind₀ Δˡb-lem (var z) = P.≈-refl Δˡb-lem (var zb) = P.≈-sym ind₁ Δˡb-lem (c [·] γ) = R-refl ⟨ P.·-cong ⟩ Δˡb-lem γ Δˡb-lem (γ [+] δ) = Δˡb-lem γ ⟨ P.+-cong ⟩ Δˡb-lem δ Δˡb-lem (γ [*] δ) = begin Δˡ a ↑ subst ρ-b (γ [*] δ) ≈⟨⟩ [ P ]⟨ subst ρ-b γ , Δˡ a ↑ subst ρ-b γ , subst ρ-b δ , Δˡ a ↑ subst ρ-b δ ⟩ ≈⟨ subst-inv′ᵥ P (subst-b→ab γ ∷-≈ Δˡb-lem γ ∷-≈ subst-b→ab δ ∷-≈ Δˡb-lem δ ∷-≈ []-≈) ⟩ [ P ]⟨ subst ρ-ab (b→ab γ) , subst ρ-ab (Δˡb γ) , subst ρ-ab (b→ab δ) , subst ρ-ab (Δˡb δ) ⟩ ≡⟨ subst-substᵥ P (_ ∷ _ ∷ _ ∷ _ ∷ []) ρ-ab ⟨ subst ρ-ab (Δˡb (γ [*] δ)) ∎ where open EqP Δʳa-lem : ∀ (γ : Term aX) → --------------------------------- Δʳ b ↑ (subst ρ-a γ) P≈ subst ρ-ab (Δʳa γ) Δʳa-lem 0T = P.≈-refl Δʳa-lem (var y) = P.≈-refl Δʳa-lem (var ay) = P.≈-refl Δʳa-lem (var z) = P.≈-refl Δʳa-lem (var az) = P.≈-refl Δʳa-lem (c [·] γ) = R-refl ⟨ P.·-cong ⟩ Δʳa-lem γ Δʳa-lem (γ [+] δ) = Δʳa-lem γ ⟨ P.+-cong ⟩ Δʳa-lem δ Δʳa-lem (γ [*] δ) = begin Δʳ b ↑ subst ρ-a (γ [*] δ) ≈⟨⟩ [ P ]⟨ subst ρ-a γ , Δʳ b ↑ subst ρ-a γ , subst ρ-a δ , Δʳ b ↑ subst ρ-a δ ⟩ ≈⟨ subst-inv′ᵥ P (subst-a→ab γ ∷-≈ Δʳa-lem γ ∷-≈ subst-a→ab δ ∷-≈ Δʳa-lem δ ∷-≈ []-≈) ⟩ [ P ]⟨ subst ρ-ab (a→ab γ) , subst ρ-ab (Δʳa γ) , subst ρ-ab (a→ab δ) , subst ρ-ab (Δʳa δ) ⟩ ≡⟨ subst-substᵥ P (_ ∷ _ ∷ _ ∷ _ ∷ []) ρ-ab ⟨ subst ρ-ab (Δʳa (γ [*] δ)) ∎ where open EqP proof : Δʳ b ↑ (Δˡ a ↑ (α [*] β)) P≈ Δˡ a ↑ (Δʳ b ↑ (α [*] β)) proof = begin Δʳ b ↑ (Δˡ a ↑ (α [*] β)) ≈⟨⟩ Δʳ b ↑ (Δˡ a ↑ (subst ρ-ε (var y [*] var z))) ≈⟨ invariance (Δʳ b) (Δˡε-lem (var y [*] var z)) ⟩ Δʳ b ↑ (subst ρ-a (Δˡε (var y [*] var z))) ≈⟨ Δʳa-lem (Δˡε (var y [*] var z)) ⟩ subst ρ-ab (Δʳa (Δˡε (var y [*] var z))) ≈⟨ subst-inv ρ-ab (ass-var a b) ⟩ subst ρ-ab (Δˡb (Δʳε (var y [*] var z))) ≈⟨ Δˡb-lem (Δʳε (var y [*] var z)) ⟨ Δˡ a ↑ (subst ρ-b (Δʳε (var y [*] var z))) ≈⟨ invariance (Δˡ a) (Δʳε-lem (var y [*] var z)) ⟨ Δˡ a ↑ (Δʳ b ↑ (subst ρ-ε (var y [*] var z))) ≈⟨⟩ Δˡ a ↑ (Δʳ b ↑ (α [*] β)) ∎ where open EqP
References
Last-modified: Jan 23 14:13:56 2026