Reversal of formal series
In this section we show that the reversal operation is an endomorphism
of the series algebra for every special product P. Together with our
previous results, this implies that
P-finite series are closed under right derivatives when P satisfies
a special product rule.
{-# OPTIONS --guardedness --sized-types #-} open import Preliminaries.Base hiding (_++_) open import General.ProductRules open import Special.Polynomials using (Special) module Special.Reversal (R : CommutativeRing) (Σ : Set) (P : ProductRule R) (special : Special R P) where open import Preliminaries.List 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 import Special.Polynomials R as P renaming (_≈_ to _P≈_) open import Special.Automata R Σ P special private variable i : Size n : ℕ
Commutation properties
We formalise what it means for the left and right transition functions to commute with each other.
ΔʳΔˡ : Set ΔʳΔˡ = ∀ a b α → Δʳ b ↑ (Δˡ a ↑ α) P≈ Δˡ a ↑ (Δʳ b ↑ α)
Proof of ΔʳΔˡ → ⟦ΔʳΔˡ⟧
First of all we show that whenever the left and right transition functions commute, then the semantics of automata is also invariant under commutation of the left and right transition functions. This is an immediate consequence of the invariance of the semantics of automata under term equivalence (under the assumption that the product rule is special).
ΔʳΔˡ→⟦ΔʳΔˡ⟧ : ΔʳΔˡ → ⟦ΔʳΔˡ⟧ ΔʳΔˡ→⟦ΔʳΔˡ⟧ ass a b α = semantic-invariance S (ass a b α)
The condition expressed by ΔʳΔˡ is difficult to check
algorithmically, due to the quantification over all terms α. For this
reason, we introduce another (equivalent) condition that is easier to
check.
The alternative condition ΔʳΔˡ-var
In order to define the simpler condition, we need to state a bunch of definitions.
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 δ ⟩
We are now ready to define the alternative condition.
ΔʳΔˡ-var : Set ΔʳΔˡ-var = ∀ a b → let open Assumptions a b in ---------------------------------------------------------- Δʳa (Δˡε (var y [*] var z)) P≈ Δˡb (Δʳε (var y [*] var z))
Proof of ΔʳΔˡ-var → ΔʳΔˡ
We show that the alternative condition implies the original one.
ΔʳΔˡ-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 ρ-ε : 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
Closure under right derivatives
Putting together the development so far, we show that
ΔʳΔˡ-var implies that P-finite series are closed under
right derivatives.
open import General.FinitelyGenerated R Σ P private variable f : A ⟪ Σ ⟫ k : ℕ ΔʳΔˡ-var→P-fin : ΔʳΔˡ-var → P-fin f k → ∀ b → ----------------------- P-fin (δʳ b f) (k +ℕ k) ΔʳΔˡ-var→P-fin = rev-end→P-fin ∘ ⟦ΔʳΔˡ⟧→rev-end ∘ ΔʳΔˡ→⟦ΔʳΔˡ⟧ ∘ ΔʳΔˡ-var→ΔʳΔˡ
Application to special products
Thanks to ΔʳΔˡ-var→P-fin in order to show that
P-finite series are closed under right derivatives, it suffices to
verify ΔʳΔˡ-var . This is always the case for special
product rules P. Indeed, we have
seen that a special product
rule can be written as a simple product rule
P ≈ α · x * y + β · (x′ * y + x * y′) + γ · x′ * y′,
for some parameters α, β, and γ in R. Consequently, it suffices
to verify ΔʳΔˡ-var for simple product rules. We omit this
straightforward, but tedious calculation.
References
Last-modified: May 21 15:56:06 2026