Connes-Kreimer Hopf algebra carrier on n-ary rooted trees #
[MCB25] [foissy-introduction-hopf-algebras-trees]
The Connes-Kreimer Hopf algebra on a tree type T is the formal
R-linear combinations of forests (multisets of trees), with product =
forest disjoint union and coproduct = sum over admissible cuts (defined
in Coproduct/Pruning.lean for Δ^ρ, Coproduct/Trace.lean for Δ^c).
This file provides the carrier and counit generic over a tree type T
(parameterized over Type*) — nothing here pattern-matches on the tree
carrier. The intended specializations:
T = RoseTree α— n-ary rooted trees (the root-level carrier inLinglib/Core/Data/RoseTree/Basic.lean; the sibling coproduct files instantiate here).T = RootedTree.Nonplanar α— n-ary nonplanar rooted trees (Nonplanar α := Quotient RoseTree.instSetoid, a quotient ofRoseTree α).
The product structure (algebra) doesn't depend on which T is used — forests are multisets, multiset addition is commutative (Hopf algebra is commutative). The coproduct depends on the cut substrate of T; see sibling files for specific instantiations.
The one-field structure (Polynomial playbook) #
ConnesKreimer R T wraps AddMonoidAlgebra R (Forest T) as a one-field
structure rather than a def-synonym, for the same reason mathlib's
Polynomial R wraps AddMonoidAlgebra R ℕ:
- the admissible-cut
Bialgebracannot live on the bare carrier — mathlib's group-likeAddMonoidAlgebra.instBialgebraalready occupies it; - a
def-synonym's forwarded instances leave the parent type's instance paths reachable, which produced a genuineSMul ℤdiamond (two routes:Algebra ℤ → Module ℤ → SMul ℤvsAddCommGroup → SubNegMonoid → zsmul), previously worked around by anoncomputable def addCommGroupOfregistered viaattribute [local instance]at three consumer sites.
With the structure, all operations are defined on the toFinsupp field and
the instance stack is built by injective transport from a single bottom
instance (instCommSemiring; a separate AddCommMonoid bottom would itself
be a parallel path). The CommRing/AddCommGroup instance is now a safe
global instance — its zsmul is the pulled-back structural operation and
no alternative path exists, so the diamond is gone by construction.
Consumers should speak the self-contained API — of', ofTree, single,
lift, algHom_ext, addHom_ext, counit — and never name
AddMonoidAlgebra/Finsupp on ConnesKreimer values; toFinsuppAlgEquiv
is the sanctioned escape hatch.
Layer status #
[UPSTREAM] candidate. No sorries.
MCB anchor #
[MCB25] §1.2 "Workspaces: Product and
Coproduct" introduces the Hopf algebra of workspaces; the carrier is
V(𝔉_{SO_0}) = AddMonoidAlgebra R (Multiset (FCM α)). This file
generalizes the carrier to arbitrary tree type T, with binary FCM as
one specialization (eventual Phase B target).
[foissy-introduction-hopf-algebras-trees] §1.2: "The Hopf algebra H_R is the free associative commutative unitary K-algebra generated by T", where T is the set of rooted trees. Same structure here, with T parameterized.
Naming #
Type: RootedTree.ConnesKreimer R T with eponymous namespace
RootedTree.ConnesKreimer. Eponymous-type-and-namespace pattern matches
mathlib idiom (Polynomial, WittVector, PowerSeries, etc.) — no
abbreviation. The eventual upstream-mathlib home would be
Mathlib.RingTheory.HopfAlgebra.RootedTree.ConnesKreimer or similar.
§1: Forest type alias #
A forest is a multiset of trees. Multiset addition is the disjoint union (forest concatenation).
A forest of T-shaped trees: finite multiset.
Equations
- RootedTree.Forest T = Multiset T
Instances For
§2: The Connes-Kreimer Hopf algebra carrier #
The Connes-Kreimer Hopf algebra on tree type T: a one-field wrapper
around AddMonoidAlgebra R (Forest T). As an algebra: product = forest
disjoint union (commutative), unit = empty forest. The Bialgebra
structure (coproduct + coassoc + counit laws) is in sibling files.
- ofFinsupp :: (
- toFinsupp : AddMonoidAlgebra R (Forest T)
The underlying forest-indexed
Finsupp. - )
Instances For
Structural operations #
Each operation is defined on the toFinsupp field; the toFinsupp_*
pushforward lemmas are all rfl and form the simp normal form.
Equations
- RootedTree.ConnesKreimer.instZero = { zero := { toFinsupp := 0 } }
Equations
- RootedTree.ConnesKreimer.instOne = { one := { toFinsupp := 1 } }
Equations
- RootedTree.ConnesKreimer.instAdd = { add := fun (p q : RootedTree.ConnesKreimer R T) => { toFinsupp := p.toFinsupp + q.toFinsupp } }
Equations
- RootedTree.ConnesKreimer.instMul = { mul := fun (p q : RootedTree.ConnesKreimer R T) => { toFinsupp := p.toFinsupp * q.toFinsupp } }
Equations
- RootedTree.ConnesKreimer.smulZeroClass = { smul := fun (s : S) (p : RootedTree.ConnesKreimer R T) => { toFinsupp := s • p.toFinsupp }, smul_zero := ⋯ }
Equations
- RootedTree.ConnesKreimer.instNatCast = { natCast := fun (n : ℕ) => { toFinsupp := ↑n } }
Equations
- RootedTree.ConnesKreimer.instPowNat = { pow := fun (p : RootedTree.ConnesKreimer R T) (n : ℕ) => { toFinsupp := p.toFinsupp ^ n } }
The instance stack #
Built by injective transport from the single bottom instCommSemiring.
Equations
- One or more equations did not get rendered due to their size.
toFinsupp bundled as an AddMonoidHom (transport vehicle).
Equations
- RootedTree.ConnesKreimer.toFinsuppAddHom = { toFun := RootedTree.ConnesKreimer.toFinsupp, map_zero' := ⋯, map_add' := ⋯ }
Instances For
Granular action instances (mirroring Polynomial): keeping these one
synthesis step away from the underlying carrier lets nested-tensor goals
(CK ⊗ (CK ⊗ CK)) resolve without deep pending chains.
Equations
- RootedTree.ConnesKreimer.distribSMul = { toSMulZeroClass := RootedTree.ConnesKreimer.smulZeroClass, smul_add := ⋯ }
Equations
- RootedTree.ConnesKreimer.distribMulAction = { toSMul := RootedTree.ConnesKreimer.smulZeroClass.toSMul, mul_smul := ⋯, one_smul := ⋯, smul_zero := ⋯, smul_add := ⋯ }
Equations
- RootedTree.ConnesKreimer.instModule = { toDistribMulAction := RootedTree.ConnesKreimer.distribMulAction, add_smul := ⋯, zero_smul := ⋯ }
Equations
- One or more equations did not get rendered due to their size.
Coefficient lookup: a Connes-Kreimer element is a function from forests to coefficients.
Equations
- RootedTree.ConnesKreimer.instFunLike = { coe := fun (p : RootedTree.ConnesKreimer R T) => ⇑p.toFinsupp, coe_injective := ⋯ }
Global ring instance (the diamond killer) #
zsmul is the pulled-back structural operation; no parent-type path to
SMul ℤ exists, so the former addCommGroupOf local-instance hack is
unnecessary — and deleted.
Equations
- RootedTree.ConnesKreimer.instNeg = { neg := fun (p : RootedTree.ConnesKreimer R T) => { toFinsupp := -p.toFinsupp } }
Equations
- RootedTree.ConnesKreimer.instSub = { sub := fun (p q : RootedTree.ConnesKreimer R T) => { toFinsupp := p.toFinsupp - q.toFinsupp } }
Equations
- RootedTree.ConnesKreimer.instIntCast = { intCast := fun (z : ℤ) => { toFinsupp := ↑z } }
Equations
- One or more equations did not get rendered due to their size.
The algebra equivalence to the bare carrier #
toFinsupp as an R-algebra equivalence — the sanctioned bridge between
the wrapper and the bare AddMonoidAlgebra.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Basis vector: coefficient r on the forest F.
Equations
- RootedTree.ConnesKreimer.single F r = { toFinsupp := Finsupp.single F r }
Instances For
Linear induction: prove p at 0, under +, and on every single.
Bare embedding: a forest as the basis vector single F 1.
Equations
Instances For
MonoidHom embedding: Multiplicative (Forest T) →* ConnesKreimer R T.
Equations
- RootedTree.ConnesKreimer.of = { toFun := fun (F : Multiplicative (RootedTree.Forest T)) => RootedTree.ConnesKreimer.of' (Multiplicative.toAdd F), map_one' := ⋯, map_mul' := ⋯ }
Instances For
Embed a single tree as a singleton-forest basis vector.
Equations
Instances For
Coefficients #
coeff is the simp-normal spelling of coefficient extraction
(Polynomial.coeff analogue); the FunLike application p F reduces to it.
The coefficient of the forest F.
Instances For
Elements agreeing coefficientwise are equal.
coeff bundled as a linear functional (Polynomial.lcoeff analogue).
Equations
- RootedTree.ConnesKreimer.lcoeff F = { toFun := fun (p : RootedTree.ConnesKreimer R T) => p.coeff F, map_add' := ⋯, map_smul' := ⋯ }
Instances For
§4: lift, algHom_ext, addHom_ext — the self-contained hom API #
Consumers use these instead of reaching for AddMonoidAlgebra.lift /
Finsupp.addHom_ext on the bare carrier.
Lift a monoid hom off the forest monoid to an algebra hom off the
Connes-Kreimer algebra (the wrapper-native AddMonoidAlgebra.lift).
Equations
- RootedTree.ConnesKreimer.lift f = ((AddMonoidAlgebra.lift R A (RootedTree.Forest T)) f).comp ↑RootedTree.ConnesKreimer.toFinsuppAlgEquiv
Instances For
Algebra homs off ConnesKreimer agree if they agree on of'.
ofFinsupp as an AddMonoidHom (transport vehicle for addHom_ext).
Equations
- RootedTree.ConnesKreimer.ofFinsuppAddHom = { toFun := RootedTree.ConnesKreimer.ofFinsupp, map_zero' := ⋯, map_add' := ⋯ }
Instances For
Additive homs off ConnesKreimer agree if they agree on single.
Linear maps off ConnesKreimer agree if they agree on single.
Linear maps off ConnesKreimer agree if they agree on the basis of'.
Linearly extend a function off the forest basis
(wrapper-native Finsupp.lift).
Equations
- RootedTree.ConnesKreimer.linearLift f = (Finsupp.lift M R (RootedTree.Forest T)) f ∘ₗ ↑↑RootedTree.ConnesKreimer.toFinsuppAlgEquiv
Instances For
Transport a forest-monoid hom to an algebra hom between Connes-Kreimer
algebras (wrapper-native AddMonoidAlgebra.mapDomainAlgHom).
Equations
- RootedTree.ConnesKreimer.mapDomainAlgHom f = ((↑RootedTree.ConnesKreimer.toFinsuppAlgEquiv.symm).comp (AddMonoidAlgebra.mapDomainAlgHom R R f)).comp ↑RootedTree.ConnesKreimer.toFinsuppAlgEquiv
Instances For
The forest basis #
The forests, via of', as an R-basis of the Connes-Kreimer algebra
(Polynomial.basisMonomials analogue).
Equations
- RootedTree.ConnesKreimer.basisSingleOne = Finsupp.basisSingleOne.map ↑RootedTree.ConnesKreimer.toFinsuppAlgEquiv.symm
Instances For
§5: Counit #
The counit ε : ConnesKreimer R T → R extracts the coefficient of the empty forest, packaged as an algebra hom.
The counit as a Multiplicative (Forest T) →* R monoid hom.
Uses Multiset.card_eq_zero to avoid requiring DecidableEq T:
test "is empty" via "has cardinality zero" (card is Nat, decidable).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The counit on ConnesKreimer R T as an algebra hom.